Statistics
| Branch: | Revision:

root / target-sparc / translate.c @ d084469c

History | View | Annotate | Download (186.8 kB)

1 7a3f1944 bellard
/*
2 7a3f1944 bellard
   SPARC translation
3 7a3f1944 bellard

4 7a3f1944 bellard
   Copyright (C) 2003 Thomas M. Ogrisegg <tom@fnord.at>
5 3475187d bellard
   Copyright (C) 2003-2005 Fabrice Bellard
6 7a3f1944 bellard

7 7a3f1944 bellard
   This library is free software; you can redistribute it and/or
8 7a3f1944 bellard
   modify it under the terms of the GNU Lesser General Public
9 7a3f1944 bellard
   License as published by the Free Software Foundation; either
10 7a3f1944 bellard
   version 2 of the License, or (at your option) any later version.
11 7a3f1944 bellard

12 7a3f1944 bellard
   This library is distributed in the hope that it will be useful,
13 7a3f1944 bellard
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14 7a3f1944 bellard
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 7a3f1944 bellard
   Lesser General Public License for more details.
16 7a3f1944 bellard

17 7a3f1944 bellard
   You should have received a copy of the GNU Lesser General Public
18 7a3f1944 bellard
   License along with this library; if not, write to the Free Software
19 fad6cb1a aurel32
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA  02110-1301 USA
20 7a3f1944 bellard
 */
21 7a3f1944 bellard
22 7a3f1944 bellard
#include <stdarg.h>
23 7a3f1944 bellard
#include <stdlib.h>
24 7a3f1944 bellard
#include <stdio.h>
25 7a3f1944 bellard
#include <string.h>
26 7a3f1944 bellard
#include <inttypes.h>
27 7a3f1944 bellard
28 7a3f1944 bellard
#include "cpu.h"
29 7a3f1944 bellard
#include "exec-all.h"
30 7a3f1944 bellard
#include "disas.h"
31 1a2fb1c0 blueswir1
#include "helper.h"
32 57fec1fe bellard
#include "tcg-op.h"
33 7a3f1944 bellard
34 a7812ae4 pbrook
#define GEN_HELPER 1
35 a7812ae4 pbrook
#include "helper.h"
36 a7812ae4 pbrook
37 7a3f1944 bellard
#define DEBUG_DISAS
38 7a3f1944 bellard
39 72cbca10 bellard
#define DYNAMIC_PC  1 /* dynamic pc value */
40 72cbca10 bellard
#define JUMP_PC     2 /* dynamic pc value which takes only two values
41 72cbca10 bellard
                         according to jump_pc[T2] */
42 72cbca10 bellard
43 1a2fb1c0 blueswir1
/* global register indexes */
44 a7812ae4 pbrook
static TCGv_ptr cpu_env, cpu_regwptr;
45 8393617c Blue Swirl
static TCGv cpu_cc_src, cpu_cc_src2, cpu_cc_dst, cpu_cc_op;
46 a7812ae4 pbrook
static TCGv_i32 cpu_psr;
47 a7812ae4 pbrook
static TCGv cpu_fsr, cpu_pc, cpu_npc, cpu_gregs[8];
48 255e1fcb blueswir1
static TCGv cpu_y;
49 255e1fcb blueswir1
#ifndef CONFIG_USER_ONLY
50 255e1fcb blueswir1
static TCGv cpu_tbr;
51 255e1fcb blueswir1
#endif
52 6ae20372 blueswir1
static TCGv cpu_cond, cpu_src1, cpu_src2, cpu_dst, cpu_addr, cpu_val;
53 dc99a3f2 blueswir1
#ifdef TARGET_SPARC64
54 a7812ae4 pbrook
static TCGv_i32 cpu_xcc, cpu_asi, cpu_fprs;
55 a7812ae4 pbrook
static TCGv cpu_gsr;
56 255e1fcb blueswir1
static TCGv cpu_tick_cmpr, cpu_stick_cmpr, cpu_hstick_cmpr;
57 a7812ae4 pbrook
static TCGv cpu_hintp, cpu_htba, cpu_hver, cpu_ssr, cpu_ver;
58 a7812ae4 pbrook
static TCGv_i32 cpu_softint;
59 255e1fcb blueswir1
#else
60 255e1fcb blueswir1
static TCGv cpu_wim;
61 dc99a3f2 blueswir1
#endif
62 1a2fb1c0 blueswir1
/* local register indexes (only used inside old micro ops) */
63 a7812ae4 pbrook
static TCGv cpu_tmp0;
64 a7812ae4 pbrook
static TCGv_i32 cpu_tmp32;
65 a7812ae4 pbrook
static TCGv_i64 cpu_tmp64;
66 714547bb blueswir1
/* Floating point registers */
67 a7812ae4 pbrook
static TCGv_i32 cpu_fpr[TARGET_FPREGS];
68 1a2fb1c0 blueswir1
69 2e70f6ef pbrook
#include "gen-icount.h"
70 2e70f6ef pbrook
71 7a3f1944 bellard
typedef struct DisasContext {
72 0f8a249a blueswir1
    target_ulong pc;    /* current Program Counter: integer or DYNAMIC_PC */
73 0f8a249a blueswir1
    target_ulong npc;   /* next PC: integer or DYNAMIC_PC or JUMP_PC */
74 72cbca10 bellard
    target_ulong jump_pc[2]; /* used when JUMP_PC pc value is used */
75 cf495bcf bellard
    int is_br;
76 e8af50a3 bellard
    int mem_idx;
77 a80dde08 bellard
    int fpu_enabled;
78 2cade6a3 blueswir1
    int address_mask_32bit;
79 8393617c Blue Swirl
    uint32_t cc_op;  /* current CC operation */
80 cf495bcf bellard
    struct TranslationBlock *tb;
81 5578ceab blueswir1
    sparc_def_t *def;
82 7a3f1944 bellard
} DisasContext;
83 7a3f1944 bellard
84 3475187d bellard
// This function uses non-native bit order
85 dc1a6971 Blue Swirl
#define GET_FIELD(X, FROM, TO)                                  \
86 dc1a6971 Blue Swirl
    ((X) >> (31 - (TO)) & ((1 << ((TO) - (FROM) + 1)) - 1))
87 7a3f1944 bellard
88 3475187d bellard
// This function uses the order in the manuals, i.e. bit 0 is 2^0
89 dc1a6971 Blue Swirl
#define GET_FIELD_SP(X, FROM, TO)               \
90 3475187d bellard
    GET_FIELD(X, 31 - (TO), 31 - (FROM))
91 3475187d bellard
92 3475187d bellard
#define GET_FIELDs(x,a,b) sign_extend (GET_FIELD(x,a,b), (b) - (a) + 1)
93 46d38ba8 blueswir1
#define GET_FIELD_SPs(x,a,b) sign_extend (GET_FIELD_SP(x,a,b), ((b) - (a) + 1))
94 3475187d bellard
95 3475187d bellard
#ifdef TARGET_SPARC64
96 0387d928 blueswir1
#define DFPREG(r) (((r & 1) << 5) | (r & 0x1e))
97 1f587329 blueswir1
#define QFPREG(r) (((r & 1) << 5) | (r & 0x1c))
98 3475187d bellard
#else
99 c185970a blueswir1
#define DFPREG(r) (r & 0x1e)
100 1f587329 blueswir1
#define QFPREG(r) (r & 0x1c)
101 3475187d bellard
#endif
102 3475187d bellard
103 b158a785 blueswir1
#define UA2005_HTRAP_MASK 0xff
104 b158a785 blueswir1
#define V8_TRAP_MASK 0x7f
105 b158a785 blueswir1
106 3475187d bellard
static int sign_extend(int x, int len)
107 3475187d bellard
{
108 3475187d bellard
    len = 32 - len;
109 3475187d bellard
    return (x << len) >> len;
110 3475187d bellard
}
111 3475187d bellard
112 7a3f1944 bellard
#define IS_IMM (insn & (1<<13))
113 7a3f1944 bellard
114 ff07ec83 blueswir1
/* floating point registers moves */
115 ff07ec83 blueswir1
static void gen_op_load_fpr_DT0(unsigned int src)
116 ff07ec83 blueswir1
{
117 714547bb blueswir1
    tcg_gen_st_i32(cpu_fpr[src], cpu_env, offsetof(CPUSPARCState, dt0) +
118 77f193da blueswir1
                   offsetof(CPU_DoubleU, l.upper));
119 714547bb blueswir1
    tcg_gen_st_i32(cpu_fpr[src + 1], cpu_env, offsetof(CPUSPARCState, dt0) +
120 77f193da blueswir1
                   offsetof(CPU_DoubleU, l.lower));
121 ff07ec83 blueswir1
}
122 ff07ec83 blueswir1
123 ff07ec83 blueswir1
static void gen_op_load_fpr_DT1(unsigned int src)
124 ff07ec83 blueswir1
{
125 714547bb blueswir1
    tcg_gen_st_i32(cpu_fpr[src], cpu_env, offsetof(CPUSPARCState, dt1) +
126 77f193da blueswir1
                   offsetof(CPU_DoubleU, l.upper));
127 714547bb blueswir1
    tcg_gen_st_i32(cpu_fpr[src + 1], cpu_env, offsetof(CPUSPARCState, dt1) +
128 77f193da blueswir1
                   offsetof(CPU_DoubleU, l.lower));
129 ff07ec83 blueswir1
}
130 ff07ec83 blueswir1
131 ff07ec83 blueswir1
static void gen_op_store_DT0_fpr(unsigned int dst)
132 ff07ec83 blueswir1
{
133 714547bb blueswir1
    tcg_gen_ld_i32(cpu_fpr[dst], cpu_env, offsetof(CPUSPARCState, dt0) +
134 77f193da blueswir1
                   offsetof(CPU_DoubleU, l.upper));
135 714547bb blueswir1
    tcg_gen_ld_i32(cpu_fpr[dst + 1], cpu_env, offsetof(CPUSPARCState, dt0) +
136 77f193da blueswir1
                   offsetof(CPU_DoubleU, l.lower));
137 ff07ec83 blueswir1
}
138 ff07ec83 blueswir1
139 ff07ec83 blueswir1
static void gen_op_load_fpr_QT0(unsigned int src)
140 ff07ec83 blueswir1
{
141 714547bb blueswir1
    tcg_gen_st_i32(cpu_fpr[src], cpu_env, offsetof(CPUSPARCState, qt0) +
142 77f193da blueswir1
                   offsetof(CPU_QuadU, l.upmost));
143 714547bb blueswir1
    tcg_gen_st_i32(cpu_fpr[src + 1], cpu_env, offsetof(CPUSPARCState, qt0) +
144 77f193da blueswir1
                   offsetof(CPU_QuadU, l.upper));
145 714547bb blueswir1
    tcg_gen_st_i32(cpu_fpr[src + 2], cpu_env, offsetof(CPUSPARCState, qt0) +
146 77f193da blueswir1
                   offsetof(CPU_QuadU, l.lower));
147 714547bb blueswir1
    tcg_gen_st_i32(cpu_fpr[src + 3], cpu_env, offsetof(CPUSPARCState, qt0) +
148 77f193da blueswir1
                   offsetof(CPU_QuadU, l.lowest));
149 ff07ec83 blueswir1
}
150 ff07ec83 blueswir1
151 ff07ec83 blueswir1
static void gen_op_load_fpr_QT1(unsigned int src)
152 ff07ec83 blueswir1
{
153 714547bb blueswir1
    tcg_gen_st_i32(cpu_fpr[src], cpu_env, offsetof(CPUSPARCState, qt1) +
154 77f193da blueswir1
                   offsetof(CPU_QuadU, l.upmost));
155 714547bb blueswir1
    tcg_gen_st_i32(cpu_fpr[src + 1], cpu_env, offsetof(CPUSPARCState, qt1) +
156 77f193da blueswir1
                   offsetof(CPU_QuadU, l.upper));
157 714547bb blueswir1
    tcg_gen_st_i32(cpu_fpr[src + 2], cpu_env, offsetof(CPUSPARCState, qt1) +
158 77f193da blueswir1
                   offsetof(CPU_QuadU, l.lower));
159 714547bb blueswir1
    tcg_gen_st_i32(cpu_fpr[src + 3], cpu_env, offsetof(CPUSPARCState, qt1) +
160 77f193da blueswir1
                   offsetof(CPU_QuadU, l.lowest));
161 ff07ec83 blueswir1
}
162 ff07ec83 blueswir1
163 ff07ec83 blueswir1
static void gen_op_store_QT0_fpr(unsigned int dst)
164 ff07ec83 blueswir1
{
165 714547bb blueswir1
    tcg_gen_ld_i32(cpu_fpr[dst], cpu_env, offsetof(CPUSPARCState, qt0) +
166 77f193da blueswir1
                   offsetof(CPU_QuadU, l.upmost));
167 714547bb blueswir1
    tcg_gen_ld_i32(cpu_fpr[dst + 1], cpu_env, offsetof(CPUSPARCState, qt0) +
168 77f193da blueswir1
                   offsetof(CPU_QuadU, l.upper));
169 714547bb blueswir1
    tcg_gen_ld_i32(cpu_fpr[dst + 2], cpu_env, offsetof(CPUSPARCState, qt0) +
170 77f193da blueswir1
                   offsetof(CPU_QuadU, l.lower));
171 714547bb blueswir1
    tcg_gen_ld_i32(cpu_fpr[dst + 3], cpu_env, offsetof(CPUSPARCState, qt0) +
172 77f193da blueswir1
                   offsetof(CPU_QuadU, l.lowest));
173 ff07ec83 blueswir1
}
174 1f587329 blueswir1
175 81ad8ba2 blueswir1
/* moves */
176 81ad8ba2 blueswir1
#ifdef CONFIG_USER_ONLY
177 3475187d bellard
#define supervisor(dc) 0
178 81ad8ba2 blueswir1
#ifdef TARGET_SPARC64
179 e9ebed4d blueswir1
#define hypervisor(dc) 0
180 81ad8ba2 blueswir1
#endif
181 3475187d bellard
#else
182 6f27aba6 blueswir1
#define supervisor(dc) (dc->mem_idx >= 1)
183 81ad8ba2 blueswir1
#ifdef TARGET_SPARC64
184 81ad8ba2 blueswir1
#define hypervisor(dc) (dc->mem_idx == 2)
185 6f27aba6 blueswir1
#else
186 3475187d bellard
#endif
187 81ad8ba2 blueswir1
#endif
188 81ad8ba2 blueswir1
189 2cade6a3 blueswir1
#ifdef TARGET_SPARC64
190 2cade6a3 blueswir1
#ifndef TARGET_ABI32
191 2cade6a3 blueswir1
#define AM_CHECK(dc) ((dc)->address_mask_32bit)
192 1a2fb1c0 blueswir1
#else
193 2cade6a3 blueswir1
#define AM_CHECK(dc) (1)
194 2cade6a3 blueswir1
#endif
195 1a2fb1c0 blueswir1
#endif
196 3391c818 blueswir1
197 2cade6a3 blueswir1
static inline void gen_address_mask(DisasContext *dc, TCGv addr)
198 2cade6a3 blueswir1
{
199 2cade6a3 blueswir1
#ifdef TARGET_SPARC64
200 2cade6a3 blueswir1
    if (AM_CHECK(dc))
201 2cade6a3 blueswir1
        tcg_gen_andi_tl(addr, addr, 0xffffffffULL);
202 2cade6a3 blueswir1
#endif
203 2cade6a3 blueswir1
}
204 2cade6a3 blueswir1
205 1a2fb1c0 blueswir1
static inline void gen_movl_reg_TN(int reg, TCGv tn)
206 81ad8ba2 blueswir1
{
207 1a2fb1c0 blueswir1
    if (reg == 0)
208 1a2fb1c0 blueswir1
        tcg_gen_movi_tl(tn, 0);
209 1a2fb1c0 blueswir1
    else if (reg < 8)
210 f5069b26 blueswir1
        tcg_gen_mov_tl(tn, cpu_gregs[reg]);
211 1a2fb1c0 blueswir1
    else {
212 1a2fb1c0 blueswir1
        tcg_gen_ld_tl(tn, cpu_regwptr, (reg - 8) * sizeof(target_ulong));
213 81ad8ba2 blueswir1
    }
214 81ad8ba2 blueswir1
}
215 81ad8ba2 blueswir1
216 1a2fb1c0 blueswir1
static inline void gen_movl_TN_reg(int reg, TCGv tn)
217 81ad8ba2 blueswir1
{
218 1a2fb1c0 blueswir1
    if (reg == 0)
219 1a2fb1c0 blueswir1
        return;
220 1a2fb1c0 blueswir1
    else if (reg < 8)
221 f5069b26 blueswir1
        tcg_gen_mov_tl(cpu_gregs[reg], tn);
222 1a2fb1c0 blueswir1
    else {
223 1a2fb1c0 blueswir1
        tcg_gen_st_tl(tn, cpu_regwptr, (reg - 8) * sizeof(target_ulong));
224 81ad8ba2 blueswir1
    }
225 81ad8ba2 blueswir1
}
226 81ad8ba2 blueswir1
227 5fafdf24 ths
static inline void gen_goto_tb(DisasContext *s, int tb_num,
228 6e256c93 bellard
                               target_ulong pc, target_ulong npc)
229 6e256c93 bellard
{
230 6e256c93 bellard
    TranslationBlock *tb;
231 6e256c93 bellard
232 6e256c93 bellard
    tb = s->tb;
233 6e256c93 bellard
    if ((pc & TARGET_PAGE_MASK) == (tb->pc & TARGET_PAGE_MASK) &&
234 6e256c93 bellard
        (npc & TARGET_PAGE_MASK) == (tb->pc & TARGET_PAGE_MASK))  {
235 6e256c93 bellard
        /* jump to same page: we can use a direct jump */
236 57fec1fe bellard
        tcg_gen_goto_tb(tb_num);
237 2f5680ee blueswir1
        tcg_gen_movi_tl(cpu_pc, pc);
238 2f5680ee blueswir1
        tcg_gen_movi_tl(cpu_npc, npc);
239 57fec1fe bellard
        tcg_gen_exit_tb((long)tb + tb_num);
240 6e256c93 bellard
    } else {
241 6e256c93 bellard
        /* jump to another page: currently not optimized */
242 2f5680ee blueswir1
        tcg_gen_movi_tl(cpu_pc, pc);
243 2f5680ee blueswir1
        tcg_gen_movi_tl(cpu_npc, npc);
244 57fec1fe bellard
        tcg_gen_exit_tb(0);
245 6e256c93 bellard
    }
246 6e256c93 bellard
}
247 6e256c93 bellard
248 19f329ad blueswir1
// XXX suboptimal
249 a7812ae4 pbrook
static inline void gen_mov_reg_N(TCGv reg, TCGv_i32 src)
250 19f329ad blueswir1
{
251 8911f501 blueswir1
    tcg_gen_extu_i32_tl(reg, src);
252 4b8b8b76 blueswir1
    tcg_gen_shri_tl(reg, reg, PSR_NEG_SHIFT);
253 19f329ad blueswir1
    tcg_gen_andi_tl(reg, reg, 0x1);
254 19f329ad blueswir1
}
255 19f329ad blueswir1
256 a7812ae4 pbrook
static inline void gen_mov_reg_Z(TCGv reg, TCGv_i32 src)
257 19f329ad blueswir1
{
258 8911f501 blueswir1
    tcg_gen_extu_i32_tl(reg, src);
259 4b8b8b76 blueswir1
    tcg_gen_shri_tl(reg, reg, PSR_ZERO_SHIFT);
260 19f329ad blueswir1
    tcg_gen_andi_tl(reg, reg, 0x1);
261 19f329ad blueswir1
}
262 19f329ad blueswir1
263 a7812ae4 pbrook
static inline void gen_mov_reg_V(TCGv reg, TCGv_i32 src)
264 19f329ad blueswir1
{
265 8911f501 blueswir1
    tcg_gen_extu_i32_tl(reg, src);
266 4b8b8b76 blueswir1
    tcg_gen_shri_tl(reg, reg, PSR_OVF_SHIFT);
267 19f329ad blueswir1
    tcg_gen_andi_tl(reg, reg, 0x1);
268 19f329ad blueswir1
}
269 19f329ad blueswir1
270 a7812ae4 pbrook
static inline void gen_mov_reg_C(TCGv reg, TCGv_i32 src)
271 19f329ad blueswir1
{
272 8911f501 blueswir1
    tcg_gen_extu_i32_tl(reg, src);
273 4b8b8b76 blueswir1
    tcg_gen_shri_tl(reg, reg, PSR_CARRY_SHIFT);
274 19f329ad blueswir1
    tcg_gen_andi_tl(reg, reg, 0x1);
275 19f329ad blueswir1
}
276 19f329ad blueswir1
277 dc99a3f2 blueswir1
static inline void gen_add_tv(TCGv dst, TCGv src1, TCGv src2)
278 dc99a3f2 blueswir1
{
279 a7812ae4 pbrook
    TCGv r_temp;
280 a7812ae4 pbrook
    TCGv_i32 r_const;
281 dc99a3f2 blueswir1
    int l1;
282 dc99a3f2 blueswir1
283 dc99a3f2 blueswir1
    l1 = gen_new_label();
284 dc99a3f2 blueswir1
285 a7812ae4 pbrook
    r_temp = tcg_temp_new();
286 dc99a3f2 blueswir1
    tcg_gen_xor_tl(r_temp, src1, src2);
287 2576d836 blueswir1
    tcg_gen_not_tl(r_temp, r_temp);
288 0425bee5 blueswir1
    tcg_gen_xor_tl(cpu_tmp0, src1, dst);
289 0425bee5 blueswir1
    tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0);
290 dd5e6304 blueswir1
    tcg_gen_andi_tl(r_temp, r_temp, (1ULL << 31));
291 cb63669a pbrook
    tcg_gen_brcondi_tl(TCG_COND_EQ, r_temp, 0, l1);
292 2ea815ca blueswir1
    r_const = tcg_const_i32(TT_TOVF);
293 a7812ae4 pbrook
    gen_helper_raise_exception(r_const);
294 a7812ae4 pbrook
    tcg_temp_free_i32(r_const);
295 dc99a3f2 blueswir1
    gen_set_label(l1);
296 2ea815ca blueswir1
    tcg_temp_free(r_temp);
297 dc99a3f2 blueswir1
}
298 dc99a3f2 blueswir1
299 dc99a3f2 blueswir1
static inline void gen_tag_tv(TCGv src1, TCGv src2)
300 dc99a3f2 blueswir1
{
301 dc99a3f2 blueswir1
    int l1;
302 a7812ae4 pbrook
    TCGv_i32 r_const;
303 dc99a3f2 blueswir1
304 dc99a3f2 blueswir1
    l1 = gen_new_label();
305 0425bee5 blueswir1
    tcg_gen_or_tl(cpu_tmp0, src1, src2);
306 0425bee5 blueswir1
    tcg_gen_andi_tl(cpu_tmp0, cpu_tmp0, 0x3);
307 cb63669a pbrook
    tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_tmp0, 0, l1);
308 2ea815ca blueswir1
    r_const = tcg_const_i32(TT_TOVF);
309 a7812ae4 pbrook
    gen_helper_raise_exception(r_const);
310 a7812ae4 pbrook
    tcg_temp_free_i32(r_const);
311 dc99a3f2 blueswir1
    gen_set_label(l1);
312 dc99a3f2 blueswir1
}
313 dc99a3f2 blueswir1
314 41d72852 Blue Swirl
static inline void gen_op_addi_cc(TCGv dst, TCGv src1, target_long src2)
315 41d72852 Blue Swirl
{
316 41d72852 Blue Swirl
    tcg_gen_mov_tl(cpu_cc_src, src1);
317 41d72852 Blue Swirl
    tcg_gen_movi_tl(cpu_cc_src2, src2);
318 41d72852 Blue Swirl
    tcg_gen_addi_tl(cpu_cc_dst, cpu_cc_src, src2);
319 bdf9f35d Blue Swirl
    tcg_gen_mov_tl(dst, cpu_cc_dst);
320 41d72852 Blue Swirl
}
321 41d72852 Blue Swirl
322 4af984a7 blueswir1
static inline void gen_op_add_cc(TCGv dst, TCGv src1, TCGv src2)
323 dc99a3f2 blueswir1
{
324 4af984a7 blueswir1
    tcg_gen_mov_tl(cpu_cc_src, src1);
325 6f551262 blueswir1
    tcg_gen_mov_tl(cpu_cc_src2, src2);
326 5c6a0628 blueswir1
    tcg_gen_add_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
327 bdf9f35d Blue Swirl
    tcg_gen_mov_tl(dst, cpu_cc_dst);
328 41d72852 Blue Swirl
}
329 41d72852 Blue Swirl
330 41d72852 Blue Swirl
static inline void gen_op_addxi_cc(TCGv dst, TCGv src1, target_long src2)
331 dc99a3f2 blueswir1
{
332 4af984a7 blueswir1
    tcg_gen_mov_tl(cpu_cc_src, src1);
333 41d72852 Blue Swirl
    tcg_gen_movi_tl(cpu_cc_src2, src2);
334 dc99a3f2 blueswir1
    gen_mov_reg_C(cpu_tmp0, cpu_psr);
335 5c6a0628 blueswir1
    tcg_gen_add_tl(cpu_cc_dst, cpu_cc_src, cpu_tmp0);
336 41d72852 Blue Swirl
    tcg_gen_addi_tl(cpu_cc_dst, cpu_cc_dst, src2);
337 789c91ef Blue Swirl
    tcg_gen_mov_tl(dst, cpu_cc_dst);
338 41d72852 Blue Swirl
}
339 41d72852 Blue Swirl
340 41d72852 Blue Swirl
static inline void gen_op_addx_cc(TCGv dst, TCGv src1, TCGv src2)
341 41d72852 Blue Swirl
{
342 41d72852 Blue Swirl
    tcg_gen_mov_tl(cpu_cc_src, src1);
343 41d72852 Blue Swirl
    tcg_gen_mov_tl(cpu_cc_src2, src2);
344 41d72852 Blue Swirl
    gen_mov_reg_C(cpu_tmp0, cpu_psr);
345 41d72852 Blue Swirl
    tcg_gen_add_tl(cpu_cc_dst, cpu_cc_src, cpu_tmp0);
346 41d72852 Blue Swirl
    tcg_gen_add_tl(cpu_cc_dst, cpu_cc_dst, cpu_cc_src2);
347 789c91ef Blue Swirl
    tcg_gen_mov_tl(dst, cpu_cc_dst);
348 dc99a3f2 blueswir1
}
349 dc99a3f2 blueswir1
350 4af984a7 blueswir1
static inline void gen_op_tadd_cc(TCGv dst, TCGv src1, TCGv src2)
351 dc99a3f2 blueswir1
{
352 4af984a7 blueswir1
    tcg_gen_mov_tl(cpu_cc_src, src1);
353 6f551262 blueswir1
    tcg_gen_mov_tl(cpu_cc_src2, src2);
354 5c6a0628 blueswir1
    tcg_gen_add_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
355 5c6a0628 blueswir1
    tcg_gen_mov_tl(dst, cpu_cc_dst);
356 dc99a3f2 blueswir1
}
357 dc99a3f2 blueswir1
358 4af984a7 blueswir1
static inline void gen_op_tadd_ccTV(TCGv dst, TCGv src1, TCGv src2)
359 dc99a3f2 blueswir1
{
360 4af984a7 blueswir1
    tcg_gen_mov_tl(cpu_cc_src, src1);
361 6f551262 blueswir1
    tcg_gen_mov_tl(cpu_cc_src2, src2);
362 6f551262 blueswir1
    gen_tag_tv(cpu_cc_src, cpu_cc_src2);
363 5c6a0628 blueswir1
    tcg_gen_add_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
364 5c6a0628 blueswir1
    gen_add_tv(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
365 5c6a0628 blueswir1
    tcg_gen_mov_tl(dst, cpu_cc_dst);
366 dc99a3f2 blueswir1
}
367 dc99a3f2 blueswir1
368 dc99a3f2 blueswir1
static inline void gen_sub_tv(TCGv dst, TCGv src1, TCGv src2)
369 dc99a3f2 blueswir1
{
370 a7812ae4 pbrook
    TCGv r_temp;
371 a7812ae4 pbrook
    TCGv_i32 r_const;
372 dc99a3f2 blueswir1
    int l1;
373 dc99a3f2 blueswir1
374 dc99a3f2 blueswir1
    l1 = gen_new_label();
375 dc99a3f2 blueswir1
376 a7812ae4 pbrook
    r_temp = tcg_temp_new();
377 dc99a3f2 blueswir1
    tcg_gen_xor_tl(r_temp, src1, src2);
378 0425bee5 blueswir1
    tcg_gen_xor_tl(cpu_tmp0, src1, dst);
379 0425bee5 blueswir1
    tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0);
380 dd5e6304 blueswir1
    tcg_gen_andi_tl(r_temp, r_temp, (1ULL << 31));
381 cb63669a pbrook
    tcg_gen_brcondi_tl(TCG_COND_EQ, r_temp, 0, l1);
382 2ea815ca blueswir1
    r_const = tcg_const_i32(TT_TOVF);
383 a7812ae4 pbrook
    gen_helper_raise_exception(r_const);
384 a7812ae4 pbrook
    tcg_temp_free_i32(r_const);
385 dc99a3f2 blueswir1
    gen_set_label(l1);
386 2ea815ca blueswir1
    tcg_temp_free(r_temp);
387 dc99a3f2 blueswir1
}
388 dc99a3f2 blueswir1
389 d4b0d468 Blue Swirl
static inline void gen_op_subi_cc(TCGv dst, TCGv src1, target_long src2, DisasContext *dc)
390 41d72852 Blue Swirl
{
391 41d72852 Blue Swirl
    tcg_gen_mov_tl(cpu_cc_src, src1);
392 41d72852 Blue Swirl
    tcg_gen_movi_tl(cpu_cc_src2, src2);
393 719f66a7 Blue Swirl
    if (src2 == 0) {
394 d4b0d468 Blue Swirl
        tcg_gen_mov_tl(cpu_cc_dst, src1);
395 d4b0d468 Blue Swirl
        tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC);
396 d4b0d468 Blue Swirl
        dc->cc_op = CC_OP_LOGIC;
397 719f66a7 Blue Swirl
    } else {
398 719f66a7 Blue Swirl
        tcg_gen_subi_tl(cpu_cc_dst, cpu_cc_src, src2);
399 d4b0d468 Blue Swirl
        tcg_gen_movi_i32(cpu_cc_op, CC_OP_SUB);
400 d4b0d468 Blue Swirl
        dc->cc_op = CC_OP_SUB;
401 719f66a7 Blue Swirl
    }
402 d4b0d468 Blue Swirl
    tcg_gen_mov_tl(dst, cpu_cc_dst);
403 41d72852 Blue Swirl
}
404 41d72852 Blue Swirl
405 41d72852 Blue Swirl
static inline void gen_op_sub_cc(TCGv dst, TCGv src1, TCGv src2)
406 dc99a3f2 blueswir1
{
407 4af984a7 blueswir1
    tcg_gen_mov_tl(cpu_cc_src, src1);
408 6f551262 blueswir1
    tcg_gen_mov_tl(cpu_cc_src2, src2);
409 41d72852 Blue Swirl
    tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
410 d4b0d468 Blue Swirl
    tcg_gen_mov_tl(dst, cpu_cc_dst);
411 41d72852 Blue Swirl
}
412 41d72852 Blue Swirl
413 41d72852 Blue Swirl
static inline void gen_op_subxi_cc(TCGv dst, TCGv src1, target_long src2)
414 41d72852 Blue Swirl
{
415 41d72852 Blue Swirl
    tcg_gen_mov_tl(cpu_cc_src, src1);
416 41d72852 Blue Swirl
    tcg_gen_movi_tl(cpu_cc_src2, src2);
417 dc99a3f2 blueswir1
    gen_mov_reg_C(cpu_tmp0, cpu_psr);
418 5c6a0628 blueswir1
    tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_src, cpu_tmp0);
419 41d72852 Blue Swirl
    tcg_gen_subi_tl(cpu_cc_dst, cpu_cc_dst, src2);
420 2ca1d92b Blue Swirl
    tcg_gen_mov_tl(dst, cpu_cc_dst);
421 41d72852 Blue Swirl
}
422 41d72852 Blue Swirl
423 41d72852 Blue Swirl
static inline void gen_op_subx_cc(TCGv dst, TCGv src1, TCGv src2)
424 41d72852 Blue Swirl
{
425 41d72852 Blue Swirl
    tcg_gen_mov_tl(cpu_cc_src, src1);
426 41d72852 Blue Swirl
    tcg_gen_mov_tl(cpu_cc_src2, src2);
427 41d72852 Blue Swirl
    gen_mov_reg_C(cpu_tmp0, cpu_psr);
428 41d72852 Blue Swirl
    tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_src, cpu_tmp0);
429 41d72852 Blue Swirl
    tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_dst, cpu_cc_src2);
430 2ca1d92b Blue Swirl
    tcg_gen_mov_tl(dst, cpu_cc_dst);
431 dc99a3f2 blueswir1
}
432 dc99a3f2 blueswir1
433 4af984a7 blueswir1
static inline void gen_op_tsub_cc(TCGv dst, TCGv src1, TCGv src2)
434 dc99a3f2 blueswir1
{
435 4af984a7 blueswir1
    tcg_gen_mov_tl(cpu_cc_src, src1);
436 6f551262 blueswir1
    tcg_gen_mov_tl(cpu_cc_src2, src2);
437 5c6a0628 blueswir1
    tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
438 5c6a0628 blueswir1
    tcg_gen_mov_tl(dst, cpu_cc_dst);
439 dc99a3f2 blueswir1
}
440 dc99a3f2 blueswir1
441 4af984a7 blueswir1
static inline void gen_op_tsub_ccTV(TCGv dst, TCGv src1, TCGv src2)
442 dc99a3f2 blueswir1
{
443 4af984a7 blueswir1
    tcg_gen_mov_tl(cpu_cc_src, src1);
444 6f551262 blueswir1
    tcg_gen_mov_tl(cpu_cc_src2, src2);
445 6f551262 blueswir1
    gen_tag_tv(cpu_cc_src, cpu_cc_src2);
446 5c6a0628 blueswir1
    tcg_gen_sub_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
447 5c6a0628 blueswir1
    gen_sub_tv(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
448 5c6a0628 blueswir1
    tcg_gen_mov_tl(dst, cpu_cc_dst);
449 dc99a3f2 blueswir1
}
450 dc99a3f2 blueswir1
451 4af984a7 blueswir1
static inline void gen_op_mulscc(TCGv dst, TCGv src1, TCGv src2)
452 d9bdab86 blueswir1
{
453 105a1f04 blueswir1
    TCGv r_temp;
454 6f551262 blueswir1
    int l1;
455 d9bdab86 blueswir1
456 d9bdab86 blueswir1
    l1 = gen_new_label();
457 a7812ae4 pbrook
    r_temp = tcg_temp_new();
458 d9bdab86 blueswir1
459 d9bdab86 blueswir1
    /* old op:
460 d9bdab86 blueswir1
    if (!(env->y & 1))
461 d9bdab86 blueswir1
        T1 = 0;
462 d9bdab86 blueswir1
    */
463 72ccba79 blueswir1
    tcg_gen_andi_tl(cpu_cc_src, src1, 0xffffffff);
464 255e1fcb blueswir1
    tcg_gen_andi_tl(r_temp, cpu_y, 0x1);
465 72ccba79 blueswir1
    tcg_gen_andi_tl(cpu_cc_src2, src2, 0xffffffff);
466 105a1f04 blueswir1
    tcg_gen_brcondi_tl(TCG_COND_NE, r_temp, 0, l1);
467 d9bdab86 blueswir1
    tcg_gen_movi_tl(cpu_cc_src2, 0);
468 6f551262 blueswir1
    gen_set_label(l1);
469 d9bdab86 blueswir1
470 d9bdab86 blueswir1
    // b2 = T0 & 1;
471 d9bdab86 blueswir1
    // env->y = (b2 << 31) | (env->y >> 1);
472 105a1f04 blueswir1
    tcg_gen_andi_tl(r_temp, cpu_cc_src, 0x1);
473 105a1f04 blueswir1
    tcg_gen_shli_tl(r_temp, r_temp, 31);
474 255e1fcb blueswir1
    tcg_gen_shri_tl(cpu_tmp0, cpu_y, 1);
475 72ccba79 blueswir1
    tcg_gen_andi_tl(cpu_tmp0, cpu_tmp0, 0x7fffffff);
476 5068cbd9 blueswir1
    tcg_gen_or_tl(cpu_tmp0, cpu_tmp0, r_temp);
477 5068cbd9 blueswir1
    tcg_gen_andi_tl(cpu_y, cpu_tmp0, 0xffffffff);
478 d9bdab86 blueswir1
479 d9bdab86 blueswir1
    // b1 = N ^ V;
480 d9bdab86 blueswir1
    gen_mov_reg_N(cpu_tmp0, cpu_psr);
481 d9bdab86 blueswir1
    gen_mov_reg_V(r_temp, cpu_psr);
482 d9bdab86 blueswir1
    tcg_gen_xor_tl(cpu_tmp0, cpu_tmp0, r_temp);
483 2ea815ca blueswir1
    tcg_temp_free(r_temp);
484 d9bdab86 blueswir1
485 d9bdab86 blueswir1
    // T0 = (b1 << 31) | (T0 >> 1);
486 d9bdab86 blueswir1
    // src1 = T0;
487 d9bdab86 blueswir1
    tcg_gen_shli_tl(cpu_tmp0, cpu_tmp0, 31);
488 6f551262 blueswir1
    tcg_gen_shri_tl(cpu_cc_src, cpu_cc_src, 1);
489 d9bdab86 blueswir1
    tcg_gen_or_tl(cpu_cc_src, cpu_cc_src, cpu_tmp0);
490 d9bdab86 blueswir1
491 5c6a0628 blueswir1
    tcg_gen_add_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
492 d9bdab86 blueswir1
493 5c6a0628 blueswir1
    tcg_gen_mov_tl(dst, cpu_cc_dst);
494 d9bdab86 blueswir1
}
495 d9bdab86 blueswir1
496 4af984a7 blueswir1
static inline void gen_op_umul(TCGv dst, TCGv src1, TCGv src2)
497 8879d139 blueswir1
{
498 a7812ae4 pbrook
    TCGv_i64 r_temp, r_temp2;
499 8879d139 blueswir1
500 a7812ae4 pbrook
    r_temp = tcg_temp_new_i64();
501 a7812ae4 pbrook
    r_temp2 = tcg_temp_new_i64();
502 8879d139 blueswir1
503 527067d8 blueswir1
    tcg_gen_extu_tl_i64(r_temp, src2);
504 527067d8 blueswir1
    tcg_gen_extu_tl_i64(r_temp2, src1);
505 8879d139 blueswir1
    tcg_gen_mul_i64(r_temp2, r_temp, r_temp2);
506 8879d139 blueswir1
507 8879d139 blueswir1
    tcg_gen_shri_i64(r_temp, r_temp2, 32);
508 105a1f04 blueswir1
    tcg_gen_trunc_i64_tl(cpu_tmp0, r_temp);
509 a7812ae4 pbrook
    tcg_temp_free_i64(r_temp);
510 255e1fcb blueswir1
    tcg_gen_andi_tl(cpu_y, cpu_tmp0, 0xffffffff);
511 8879d139 blueswir1
#ifdef TARGET_SPARC64
512 4af984a7 blueswir1
    tcg_gen_mov_i64(dst, r_temp2);
513 8879d139 blueswir1
#else
514 4af984a7 blueswir1
    tcg_gen_trunc_i64_tl(dst, r_temp2);
515 8879d139 blueswir1
#endif
516 a7812ae4 pbrook
    tcg_temp_free_i64(r_temp2);
517 8879d139 blueswir1
}
518 8879d139 blueswir1
519 4af984a7 blueswir1
static inline void gen_op_smul(TCGv dst, TCGv src1, TCGv src2)
520 8879d139 blueswir1
{
521 a7812ae4 pbrook
    TCGv_i64 r_temp, r_temp2;
522 8879d139 blueswir1
523 a7812ae4 pbrook
    r_temp = tcg_temp_new_i64();
524 a7812ae4 pbrook
    r_temp2 = tcg_temp_new_i64();
525 8879d139 blueswir1
526 527067d8 blueswir1
    tcg_gen_ext_tl_i64(r_temp, src2);
527 527067d8 blueswir1
    tcg_gen_ext_tl_i64(r_temp2, src1);
528 8879d139 blueswir1
    tcg_gen_mul_i64(r_temp2, r_temp, r_temp2);
529 8879d139 blueswir1
530 8879d139 blueswir1
    tcg_gen_shri_i64(r_temp, r_temp2, 32);
531 105a1f04 blueswir1
    tcg_gen_trunc_i64_tl(cpu_tmp0, r_temp);
532 a7812ae4 pbrook
    tcg_temp_free_i64(r_temp);
533 255e1fcb blueswir1
    tcg_gen_andi_tl(cpu_y, cpu_tmp0, 0xffffffff);
534 8879d139 blueswir1
#ifdef TARGET_SPARC64
535 4af984a7 blueswir1
    tcg_gen_mov_i64(dst, r_temp2);
536 8879d139 blueswir1
#else
537 4af984a7 blueswir1
    tcg_gen_trunc_i64_tl(dst, r_temp2);
538 8879d139 blueswir1
#endif
539 a7812ae4 pbrook
    tcg_temp_free_i64(r_temp2);
540 8879d139 blueswir1
}
541 8879d139 blueswir1
542 1a7b60e7 blueswir1
#ifdef TARGET_SPARC64
543 8911f501 blueswir1
static inline void gen_trap_ifdivzero_tl(TCGv divisor)
544 1a7b60e7 blueswir1
{
545 a7812ae4 pbrook
    TCGv_i32 r_const;
546 1a7b60e7 blueswir1
    int l1;
547 1a7b60e7 blueswir1
548 1a7b60e7 blueswir1
    l1 = gen_new_label();
549 cb63669a pbrook
    tcg_gen_brcondi_tl(TCG_COND_NE, divisor, 0, l1);
550 2ea815ca blueswir1
    r_const = tcg_const_i32(TT_DIV_ZERO);
551 a7812ae4 pbrook
    gen_helper_raise_exception(r_const);
552 a7812ae4 pbrook
    tcg_temp_free_i32(r_const);
553 1a7b60e7 blueswir1
    gen_set_label(l1);
554 1a7b60e7 blueswir1
}
555 1a7b60e7 blueswir1
556 4af984a7 blueswir1
static inline void gen_op_sdivx(TCGv dst, TCGv src1, TCGv src2)
557 1a7b60e7 blueswir1
{
558 1a7b60e7 blueswir1
    int l1, l2;
559 1a7b60e7 blueswir1
560 1a7b60e7 blueswir1
    l1 = gen_new_label();
561 1a7b60e7 blueswir1
    l2 = gen_new_label();
562 6f551262 blueswir1
    tcg_gen_mov_tl(cpu_cc_src, src1);
563 6f551262 blueswir1
    tcg_gen_mov_tl(cpu_cc_src2, src2);
564 5c6a0628 blueswir1
    gen_trap_ifdivzero_tl(cpu_cc_src2);
565 cb63669a pbrook
    tcg_gen_brcondi_tl(TCG_COND_NE, cpu_cc_src, INT64_MIN, l1);
566 cb63669a pbrook
    tcg_gen_brcondi_tl(TCG_COND_NE, cpu_cc_src2, -1, l1);
567 4af984a7 blueswir1
    tcg_gen_movi_i64(dst, INT64_MIN);
568 06b3e1b3 blueswir1
    tcg_gen_br(l2);
569 1a7b60e7 blueswir1
    gen_set_label(l1);
570 6f551262 blueswir1
    tcg_gen_div_i64(dst, cpu_cc_src, cpu_cc_src2);
571 1a7b60e7 blueswir1
    gen_set_label(l2);
572 1a7b60e7 blueswir1
}
573 1a7b60e7 blueswir1
#endif
574 1a7b60e7 blueswir1
575 19f329ad blueswir1
// 1
576 19f329ad blueswir1
static inline void gen_op_eval_ba(TCGv dst)
577 19f329ad blueswir1
{
578 19f329ad blueswir1
    tcg_gen_movi_tl(dst, 1);
579 19f329ad blueswir1
}
580 19f329ad blueswir1
581 19f329ad blueswir1
// Z
582 a7812ae4 pbrook
static inline void gen_op_eval_be(TCGv dst, TCGv_i32 src)
583 19f329ad blueswir1
{
584 19f329ad blueswir1
    gen_mov_reg_Z(dst, src);
585 19f329ad blueswir1
}
586 19f329ad blueswir1
587 19f329ad blueswir1
// Z | (N ^ V)
588 a7812ae4 pbrook
static inline void gen_op_eval_ble(TCGv dst, TCGv_i32 src)
589 19f329ad blueswir1
{
590 0425bee5 blueswir1
    gen_mov_reg_N(cpu_tmp0, src);
591 19f329ad blueswir1
    gen_mov_reg_V(dst, src);
592 0425bee5 blueswir1
    tcg_gen_xor_tl(dst, dst, cpu_tmp0);
593 0425bee5 blueswir1
    gen_mov_reg_Z(cpu_tmp0, src);
594 0425bee5 blueswir1
    tcg_gen_or_tl(dst, dst, cpu_tmp0);
595 19f329ad blueswir1
}
596 19f329ad blueswir1
597 19f329ad blueswir1
// N ^ V
598 a7812ae4 pbrook
static inline void gen_op_eval_bl(TCGv dst, TCGv_i32 src)
599 19f329ad blueswir1
{
600 0425bee5 blueswir1
    gen_mov_reg_V(cpu_tmp0, src);
601 19f329ad blueswir1
    gen_mov_reg_N(dst, src);
602 0425bee5 blueswir1
    tcg_gen_xor_tl(dst, dst, cpu_tmp0);
603 19f329ad blueswir1
}
604 19f329ad blueswir1
605 19f329ad blueswir1
// C | Z
606 a7812ae4 pbrook
static inline void gen_op_eval_bleu(TCGv dst, TCGv_i32 src)
607 19f329ad blueswir1
{
608 0425bee5 blueswir1
    gen_mov_reg_Z(cpu_tmp0, src);
609 19f329ad blueswir1
    gen_mov_reg_C(dst, src);
610 0425bee5 blueswir1
    tcg_gen_or_tl(dst, dst, cpu_tmp0);
611 19f329ad blueswir1
}
612 19f329ad blueswir1
613 19f329ad blueswir1
// C
614 a7812ae4 pbrook
static inline void gen_op_eval_bcs(TCGv dst, TCGv_i32 src)
615 19f329ad blueswir1
{
616 19f329ad blueswir1
    gen_mov_reg_C(dst, src);
617 19f329ad blueswir1
}
618 19f329ad blueswir1
619 19f329ad blueswir1
// V
620 a7812ae4 pbrook
static inline void gen_op_eval_bvs(TCGv dst, TCGv_i32 src)
621 19f329ad blueswir1
{
622 19f329ad blueswir1
    gen_mov_reg_V(dst, src);
623 19f329ad blueswir1
}
624 19f329ad blueswir1
625 19f329ad blueswir1
// 0
626 19f329ad blueswir1
static inline void gen_op_eval_bn(TCGv dst)
627 19f329ad blueswir1
{
628 19f329ad blueswir1
    tcg_gen_movi_tl(dst, 0);
629 19f329ad blueswir1
}
630 19f329ad blueswir1
631 19f329ad blueswir1
// N
632 a7812ae4 pbrook
static inline void gen_op_eval_bneg(TCGv dst, TCGv_i32 src)
633 19f329ad blueswir1
{
634 19f329ad blueswir1
    gen_mov_reg_N(dst, src);
635 19f329ad blueswir1
}
636 19f329ad blueswir1
637 19f329ad blueswir1
// !Z
638 a7812ae4 pbrook
static inline void gen_op_eval_bne(TCGv dst, TCGv_i32 src)
639 19f329ad blueswir1
{
640 19f329ad blueswir1
    gen_mov_reg_Z(dst, src);
641 19f329ad blueswir1
    tcg_gen_xori_tl(dst, dst, 0x1);
642 19f329ad blueswir1
}
643 19f329ad blueswir1
644 19f329ad blueswir1
// !(Z | (N ^ V))
645 a7812ae4 pbrook
static inline void gen_op_eval_bg(TCGv dst, TCGv_i32 src)
646 19f329ad blueswir1
{
647 0425bee5 blueswir1
    gen_mov_reg_N(cpu_tmp0, src);
648 19f329ad blueswir1
    gen_mov_reg_V(dst, src);
649 0425bee5 blueswir1
    tcg_gen_xor_tl(dst, dst, cpu_tmp0);
650 0425bee5 blueswir1
    gen_mov_reg_Z(cpu_tmp0, src);
651 0425bee5 blueswir1
    tcg_gen_or_tl(dst, dst, cpu_tmp0);
652 19f329ad blueswir1
    tcg_gen_xori_tl(dst, dst, 0x1);
653 19f329ad blueswir1
}
654 19f329ad blueswir1
655 19f329ad blueswir1
// !(N ^ V)
656 a7812ae4 pbrook
static inline void gen_op_eval_bge(TCGv dst, TCGv_i32 src)
657 19f329ad blueswir1
{
658 0425bee5 blueswir1
    gen_mov_reg_V(cpu_tmp0, src);
659 19f329ad blueswir1
    gen_mov_reg_N(dst, src);
660 0425bee5 blueswir1
    tcg_gen_xor_tl(dst, dst, cpu_tmp0);
661 19f329ad blueswir1
    tcg_gen_xori_tl(dst, dst, 0x1);
662 19f329ad blueswir1
}
663 19f329ad blueswir1
664 19f329ad blueswir1
// !(C | Z)
665 a7812ae4 pbrook
static inline void gen_op_eval_bgu(TCGv dst, TCGv_i32 src)
666 19f329ad blueswir1
{
667 0425bee5 blueswir1
    gen_mov_reg_Z(cpu_tmp0, src);
668 19f329ad blueswir1
    gen_mov_reg_C(dst, src);
669 0425bee5 blueswir1
    tcg_gen_or_tl(dst, dst, cpu_tmp0);
670 19f329ad blueswir1
    tcg_gen_xori_tl(dst, dst, 0x1);
671 19f329ad blueswir1
}
672 19f329ad blueswir1
673 19f329ad blueswir1
// !C
674 a7812ae4 pbrook
static inline void gen_op_eval_bcc(TCGv dst, TCGv_i32 src)
675 19f329ad blueswir1
{
676 19f329ad blueswir1
    gen_mov_reg_C(dst, src);
677 19f329ad blueswir1
    tcg_gen_xori_tl(dst, dst, 0x1);
678 19f329ad blueswir1
}
679 19f329ad blueswir1
680 19f329ad blueswir1
// !N
681 a7812ae4 pbrook
static inline void gen_op_eval_bpos(TCGv dst, TCGv_i32 src)
682 19f329ad blueswir1
{
683 19f329ad blueswir1
    gen_mov_reg_N(dst, src);
684 19f329ad blueswir1
    tcg_gen_xori_tl(dst, dst, 0x1);
685 19f329ad blueswir1
}
686 19f329ad blueswir1
687 19f329ad blueswir1
// !V
688 a7812ae4 pbrook
static inline void gen_op_eval_bvc(TCGv dst, TCGv_i32 src)
689 19f329ad blueswir1
{
690 19f329ad blueswir1
    gen_mov_reg_V(dst, src);
691 19f329ad blueswir1
    tcg_gen_xori_tl(dst, dst, 0x1);
692 19f329ad blueswir1
}
693 19f329ad blueswir1
694 19f329ad blueswir1
/*
695 19f329ad blueswir1
  FPSR bit field FCC1 | FCC0:
696 19f329ad blueswir1
   0 =
697 19f329ad blueswir1
   1 <
698 19f329ad blueswir1
   2 >
699 19f329ad blueswir1
   3 unordered
700 19f329ad blueswir1
*/
701 19f329ad blueswir1
static inline void gen_mov_reg_FCC0(TCGv reg, TCGv src,
702 19f329ad blueswir1
                                    unsigned int fcc_offset)
703 19f329ad blueswir1
{
704 ba6a9d8c blueswir1
    tcg_gen_shri_tl(reg, src, FSR_FCC0_SHIFT + fcc_offset);
705 19f329ad blueswir1
    tcg_gen_andi_tl(reg, reg, 0x1);
706 19f329ad blueswir1
}
707 19f329ad blueswir1
708 19f329ad blueswir1
static inline void gen_mov_reg_FCC1(TCGv reg, TCGv src,
709 19f329ad blueswir1
                                    unsigned int fcc_offset)
710 19f329ad blueswir1
{
711 ba6a9d8c blueswir1
    tcg_gen_shri_tl(reg, src, FSR_FCC1_SHIFT + fcc_offset);
712 19f329ad blueswir1
    tcg_gen_andi_tl(reg, reg, 0x1);
713 19f329ad blueswir1
}
714 19f329ad blueswir1
715 19f329ad blueswir1
// !0: FCC0 | FCC1
716 19f329ad blueswir1
static inline void gen_op_eval_fbne(TCGv dst, TCGv src,
717 19f329ad blueswir1
                                    unsigned int fcc_offset)
718 19f329ad blueswir1
{
719 19f329ad blueswir1
    gen_mov_reg_FCC0(dst, src, fcc_offset);
720 0425bee5 blueswir1
    gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset);
721 0425bee5 blueswir1
    tcg_gen_or_tl(dst, dst, cpu_tmp0);
722 19f329ad blueswir1
}
723 19f329ad blueswir1
724 19f329ad blueswir1
// 1 or 2: FCC0 ^ FCC1
725 19f329ad blueswir1
static inline void gen_op_eval_fblg(TCGv dst, TCGv src,
726 19f329ad blueswir1
                                    unsigned int fcc_offset)
727 19f329ad blueswir1
{
728 19f329ad blueswir1
    gen_mov_reg_FCC0(dst, src, fcc_offset);
729 0425bee5 blueswir1
    gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset);
730 0425bee5 blueswir1
    tcg_gen_xor_tl(dst, dst, cpu_tmp0);
731 19f329ad blueswir1
}
732 19f329ad blueswir1
733 19f329ad blueswir1
// 1 or 3: FCC0
734 19f329ad blueswir1
static inline void gen_op_eval_fbul(TCGv dst, TCGv src,
735 19f329ad blueswir1
                                    unsigned int fcc_offset)
736 19f329ad blueswir1
{
737 19f329ad blueswir1
    gen_mov_reg_FCC0(dst, src, fcc_offset);
738 19f329ad blueswir1
}
739 19f329ad blueswir1
740 19f329ad blueswir1
// 1: FCC0 & !FCC1
741 19f329ad blueswir1
static inline void gen_op_eval_fbl(TCGv dst, TCGv src,
742 19f329ad blueswir1
                                    unsigned int fcc_offset)
743 19f329ad blueswir1
{
744 19f329ad blueswir1
    gen_mov_reg_FCC0(dst, src, fcc_offset);
745 0425bee5 blueswir1
    gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset);
746 0425bee5 blueswir1
    tcg_gen_xori_tl(cpu_tmp0, cpu_tmp0, 0x1);
747 0425bee5 blueswir1
    tcg_gen_and_tl(dst, dst, cpu_tmp0);
748 19f329ad blueswir1
}
749 19f329ad blueswir1
750 19f329ad blueswir1
// 2 or 3: FCC1
751 19f329ad blueswir1
static inline void gen_op_eval_fbug(TCGv dst, TCGv src,
752 19f329ad blueswir1
                                    unsigned int fcc_offset)
753 19f329ad blueswir1
{
754 19f329ad blueswir1
    gen_mov_reg_FCC1(dst, src, fcc_offset);
755 19f329ad blueswir1
}
756 19f329ad blueswir1
757 19f329ad blueswir1
// 2: !FCC0 & FCC1
758 19f329ad blueswir1
static inline void gen_op_eval_fbg(TCGv dst, TCGv src,
759 19f329ad blueswir1
                                    unsigned int fcc_offset)
760 19f329ad blueswir1
{
761 19f329ad blueswir1
    gen_mov_reg_FCC0(dst, src, fcc_offset);
762 19f329ad blueswir1
    tcg_gen_xori_tl(dst, dst, 0x1);
763 0425bee5 blueswir1
    gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset);
764 0425bee5 blueswir1
    tcg_gen_and_tl(dst, dst, cpu_tmp0);
765 19f329ad blueswir1
}
766 19f329ad blueswir1
767 19f329ad blueswir1
// 3: FCC0 & FCC1
768 19f329ad blueswir1
static inline void gen_op_eval_fbu(TCGv dst, TCGv src,
769 19f329ad blueswir1
                                    unsigned int fcc_offset)
770 19f329ad blueswir1
{
771 19f329ad blueswir1
    gen_mov_reg_FCC0(dst, src, fcc_offset);
772 0425bee5 blueswir1
    gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset);
773 0425bee5 blueswir1
    tcg_gen_and_tl(dst, dst, cpu_tmp0);
774 19f329ad blueswir1
}
775 19f329ad blueswir1
776 19f329ad blueswir1
// 0: !(FCC0 | FCC1)
777 19f329ad blueswir1
static inline void gen_op_eval_fbe(TCGv dst, TCGv src,
778 19f329ad blueswir1
                                    unsigned int fcc_offset)
779 19f329ad blueswir1
{
780 19f329ad blueswir1
    gen_mov_reg_FCC0(dst, src, fcc_offset);
781 0425bee5 blueswir1
    gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset);
782 0425bee5 blueswir1
    tcg_gen_or_tl(dst, dst, cpu_tmp0);
783 19f329ad blueswir1
    tcg_gen_xori_tl(dst, dst, 0x1);
784 19f329ad blueswir1
}
785 19f329ad blueswir1
786 19f329ad blueswir1
// 0 or 3: !(FCC0 ^ FCC1)
787 19f329ad blueswir1
static inline void gen_op_eval_fbue(TCGv dst, TCGv src,
788 19f329ad blueswir1
                                    unsigned int fcc_offset)
789 19f329ad blueswir1
{
790 19f329ad blueswir1
    gen_mov_reg_FCC0(dst, src, fcc_offset);
791 0425bee5 blueswir1
    gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset);
792 0425bee5 blueswir1
    tcg_gen_xor_tl(dst, dst, cpu_tmp0);
793 19f329ad blueswir1
    tcg_gen_xori_tl(dst, dst, 0x1);
794 19f329ad blueswir1
}
795 19f329ad blueswir1
796 19f329ad blueswir1
// 0 or 2: !FCC0
797 19f329ad blueswir1
static inline void gen_op_eval_fbge(TCGv dst, TCGv src,
798 19f329ad blueswir1
                                    unsigned int fcc_offset)
799 19f329ad blueswir1
{
800 19f329ad blueswir1
    gen_mov_reg_FCC0(dst, src, fcc_offset);
801 19f329ad blueswir1
    tcg_gen_xori_tl(dst, dst, 0x1);
802 19f329ad blueswir1
}
803 19f329ad blueswir1
804 19f329ad blueswir1
// !1: !(FCC0 & !FCC1)
805 19f329ad blueswir1
static inline void gen_op_eval_fbuge(TCGv dst, TCGv src,
806 19f329ad blueswir1
                                    unsigned int fcc_offset)
807 19f329ad blueswir1
{
808 19f329ad blueswir1
    gen_mov_reg_FCC0(dst, src, fcc_offset);
809 0425bee5 blueswir1
    gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset);
810 0425bee5 blueswir1
    tcg_gen_xori_tl(cpu_tmp0, cpu_tmp0, 0x1);
811 0425bee5 blueswir1
    tcg_gen_and_tl(dst, dst, cpu_tmp0);
812 19f329ad blueswir1
    tcg_gen_xori_tl(dst, dst, 0x1);
813 19f329ad blueswir1
}
814 19f329ad blueswir1
815 19f329ad blueswir1
// 0 or 1: !FCC1
816 19f329ad blueswir1
static inline void gen_op_eval_fble(TCGv dst, TCGv src,
817 19f329ad blueswir1
                                    unsigned int fcc_offset)
818 19f329ad blueswir1
{
819 19f329ad blueswir1
    gen_mov_reg_FCC1(dst, src, fcc_offset);
820 19f329ad blueswir1
    tcg_gen_xori_tl(dst, dst, 0x1);
821 19f329ad blueswir1
}
822 19f329ad blueswir1
823 19f329ad blueswir1
// !2: !(!FCC0 & FCC1)
824 19f329ad blueswir1
static inline void gen_op_eval_fbule(TCGv dst, TCGv src,
825 19f329ad blueswir1
                                    unsigned int fcc_offset)
826 19f329ad blueswir1
{
827 19f329ad blueswir1
    gen_mov_reg_FCC0(dst, src, fcc_offset);
828 19f329ad blueswir1
    tcg_gen_xori_tl(dst, dst, 0x1);
829 0425bee5 blueswir1
    gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset);
830 0425bee5 blueswir1
    tcg_gen_and_tl(dst, dst, cpu_tmp0);
831 19f329ad blueswir1
    tcg_gen_xori_tl(dst, dst, 0x1);
832 19f329ad blueswir1
}
833 19f329ad blueswir1
834 19f329ad blueswir1
// !3: !(FCC0 & FCC1)
835 19f329ad blueswir1
static inline void gen_op_eval_fbo(TCGv dst, TCGv src,
836 19f329ad blueswir1
                                    unsigned int fcc_offset)
837 19f329ad blueswir1
{
838 19f329ad blueswir1
    gen_mov_reg_FCC0(dst, src, fcc_offset);
839 0425bee5 blueswir1
    gen_mov_reg_FCC1(cpu_tmp0, src, fcc_offset);
840 0425bee5 blueswir1
    tcg_gen_and_tl(dst, dst, cpu_tmp0);
841 19f329ad blueswir1
    tcg_gen_xori_tl(dst, dst, 0x1);
842 19f329ad blueswir1
}
843 19f329ad blueswir1
844 46525e1f blueswir1
static inline void gen_branch2(DisasContext *dc, target_ulong pc1,
845 19f329ad blueswir1
                               target_ulong pc2, TCGv r_cond)
846 83469015 bellard
{
847 83469015 bellard
    int l1;
848 83469015 bellard
849 83469015 bellard
    l1 = gen_new_label();
850 83469015 bellard
851 cb63669a pbrook
    tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond, 0, l1);
852 83469015 bellard
853 6e256c93 bellard
    gen_goto_tb(dc, 0, pc1, pc1 + 4);
854 83469015 bellard
855 83469015 bellard
    gen_set_label(l1);
856 6e256c93 bellard
    gen_goto_tb(dc, 1, pc2, pc2 + 4);
857 83469015 bellard
}
858 83469015 bellard
859 46525e1f blueswir1
static inline void gen_branch_a(DisasContext *dc, target_ulong pc1,
860 19f329ad blueswir1
                                target_ulong pc2, TCGv r_cond)
861 83469015 bellard
{
862 83469015 bellard
    int l1;
863 83469015 bellard
864 83469015 bellard
    l1 = gen_new_label();
865 83469015 bellard
866 cb63669a pbrook
    tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond, 0, l1);
867 83469015 bellard
868 6e256c93 bellard
    gen_goto_tb(dc, 0, pc2, pc1);
869 83469015 bellard
870 83469015 bellard
    gen_set_label(l1);
871 6e256c93 bellard
    gen_goto_tb(dc, 1, pc2 + 4, pc2 + 8);
872 83469015 bellard
}
873 83469015 bellard
874 19f329ad blueswir1
static inline void gen_generic_branch(target_ulong npc1, target_ulong npc2,
875 19f329ad blueswir1
                                      TCGv r_cond)
876 83469015 bellard
{
877 83469015 bellard
    int l1, l2;
878 83469015 bellard
879 83469015 bellard
    l1 = gen_new_label();
880 83469015 bellard
    l2 = gen_new_label();
881 19f329ad blueswir1
882 cb63669a pbrook
    tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond, 0, l1);
883 83469015 bellard
884 2f5680ee blueswir1
    tcg_gen_movi_tl(cpu_npc, npc1);
885 06b3e1b3 blueswir1
    tcg_gen_br(l2);
886 83469015 bellard
887 83469015 bellard
    gen_set_label(l1);
888 2f5680ee blueswir1
    tcg_gen_movi_tl(cpu_npc, npc2);
889 83469015 bellard
    gen_set_label(l2);
890 83469015 bellard
}
891 83469015 bellard
892 4af984a7 blueswir1
/* call this function before using the condition register as it may
893 4af984a7 blueswir1
   have been set for a jump */
894 4af984a7 blueswir1
static inline void flush_cond(DisasContext *dc, TCGv cond)
895 83469015 bellard
{
896 83469015 bellard
    if (dc->npc == JUMP_PC) {
897 4af984a7 blueswir1
        gen_generic_branch(dc->jump_pc[0], dc->jump_pc[1], cond);
898 83469015 bellard
        dc->npc = DYNAMIC_PC;
899 83469015 bellard
    }
900 83469015 bellard
}
901 83469015 bellard
902 4af984a7 blueswir1
static inline void save_npc(DisasContext *dc, TCGv cond)
903 72cbca10 bellard
{
904 72cbca10 bellard
    if (dc->npc == JUMP_PC) {
905 4af984a7 blueswir1
        gen_generic_branch(dc->jump_pc[0], dc->jump_pc[1], cond);
906 72cbca10 bellard
        dc->npc = DYNAMIC_PC;
907 72cbca10 bellard
    } else if (dc->npc != DYNAMIC_PC) {
908 2f5680ee blueswir1
        tcg_gen_movi_tl(cpu_npc, dc->npc);
909 72cbca10 bellard
    }
910 72cbca10 bellard
}
911 72cbca10 bellard
912 4af984a7 blueswir1
static inline void save_state(DisasContext *dc, TCGv cond)
913 72cbca10 bellard
{
914 2f5680ee blueswir1
    tcg_gen_movi_tl(cpu_pc, dc->pc);
915 4af984a7 blueswir1
    save_npc(dc, cond);
916 72cbca10 bellard
}
917 72cbca10 bellard
918 4af984a7 blueswir1
static inline void gen_mov_pc_npc(DisasContext *dc, TCGv cond)
919 0bee699e bellard
{
920 0bee699e bellard
    if (dc->npc == JUMP_PC) {
921 4af984a7 blueswir1
        gen_generic_branch(dc->jump_pc[0], dc->jump_pc[1], cond);
922 48d5c82b blueswir1
        tcg_gen_mov_tl(cpu_pc, cpu_npc);
923 0bee699e bellard
        dc->pc = DYNAMIC_PC;
924 0bee699e bellard
    } else if (dc->npc == DYNAMIC_PC) {
925 48d5c82b blueswir1
        tcg_gen_mov_tl(cpu_pc, cpu_npc);
926 0bee699e bellard
        dc->pc = DYNAMIC_PC;
927 0bee699e bellard
    } else {
928 0bee699e bellard
        dc->pc = dc->npc;
929 0bee699e bellard
    }
930 0bee699e bellard
}
931 0bee699e bellard
932 38bc628b blueswir1
static inline void gen_op_next_insn(void)
933 38bc628b blueswir1
{
934 48d5c82b blueswir1
    tcg_gen_mov_tl(cpu_pc, cpu_npc);
935 48d5c82b blueswir1
    tcg_gen_addi_tl(cpu_npc, cpu_npc, 4);
936 38bc628b blueswir1
}
937 38bc628b blueswir1
938 8393617c Blue Swirl
static inline void gen_cond(TCGv r_dst, unsigned int cc, unsigned int cond,
939 8393617c Blue Swirl
                            DisasContext *dc)
940 19f329ad blueswir1
{
941 a7812ae4 pbrook
    TCGv_i32 r_src;
942 3475187d bellard
943 3475187d bellard
#ifdef TARGET_SPARC64
944 19f329ad blueswir1
    if (cc)
945 dc99a3f2 blueswir1
        r_src = cpu_xcc;
946 19f329ad blueswir1
    else
947 dc99a3f2 blueswir1
        r_src = cpu_psr;
948 3475187d bellard
#else
949 dc99a3f2 blueswir1
    r_src = cpu_psr;
950 3475187d bellard
#endif
951 8393617c Blue Swirl
    switch (dc->cc_op) {
952 8393617c Blue Swirl
    case CC_OP_FLAGS:
953 8393617c Blue Swirl
        break;
954 8393617c Blue Swirl
    default:
955 8393617c Blue Swirl
        gen_helper_compute_psr();
956 8393617c Blue Swirl
        dc->cc_op = CC_OP_FLAGS;
957 8393617c Blue Swirl
        break;
958 8393617c Blue Swirl
    }
959 19f329ad blueswir1
    switch (cond) {
960 19f329ad blueswir1
    case 0x0:
961 19f329ad blueswir1
        gen_op_eval_bn(r_dst);
962 19f329ad blueswir1
        break;
963 19f329ad blueswir1
    case 0x1:
964 19f329ad blueswir1
        gen_op_eval_be(r_dst, r_src);
965 19f329ad blueswir1
        break;
966 19f329ad blueswir1
    case 0x2:
967 19f329ad blueswir1
        gen_op_eval_ble(r_dst, r_src);
968 19f329ad blueswir1
        break;
969 19f329ad blueswir1
    case 0x3:
970 19f329ad blueswir1
        gen_op_eval_bl(r_dst, r_src);
971 19f329ad blueswir1
        break;
972 19f329ad blueswir1
    case 0x4:
973 19f329ad blueswir1
        gen_op_eval_bleu(r_dst, r_src);
974 19f329ad blueswir1
        break;
975 19f329ad blueswir1
    case 0x5:
976 19f329ad blueswir1
        gen_op_eval_bcs(r_dst, r_src);
977 19f329ad blueswir1
        break;
978 19f329ad blueswir1
    case 0x6:
979 19f329ad blueswir1
        gen_op_eval_bneg(r_dst, r_src);
980 19f329ad blueswir1
        break;
981 19f329ad blueswir1
    case 0x7:
982 19f329ad blueswir1
        gen_op_eval_bvs(r_dst, r_src);
983 19f329ad blueswir1
        break;
984 19f329ad blueswir1
    case 0x8:
985 19f329ad blueswir1
        gen_op_eval_ba(r_dst);
986 19f329ad blueswir1
        break;
987 19f329ad blueswir1
    case 0x9:
988 19f329ad blueswir1
        gen_op_eval_bne(r_dst, r_src);
989 19f329ad blueswir1
        break;
990 19f329ad blueswir1
    case 0xa:
991 19f329ad blueswir1
        gen_op_eval_bg(r_dst, r_src);
992 19f329ad blueswir1
        break;
993 19f329ad blueswir1
    case 0xb:
994 19f329ad blueswir1
        gen_op_eval_bge(r_dst, r_src);
995 19f329ad blueswir1
        break;
996 19f329ad blueswir1
    case 0xc:
997 19f329ad blueswir1
        gen_op_eval_bgu(r_dst, r_src);
998 19f329ad blueswir1
        break;
999 19f329ad blueswir1
    case 0xd:
1000 19f329ad blueswir1
        gen_op_eval_bcc(r_dst, r_src);
1001 19f329ad blueswir1
        break;
1002 19f329ad blueswir1
    case 0xe:
1003 19f329ad blueswir1
        gen_op_eval_bpos(r_dst, r_src);
1004 19f329ad blueswir1
        break;
1005 19f329ad blueswir1
    case 0xf:
1006 19f329ad blueswir1
        gen_op_eval_bvc(r_dst, r_src);
1007 19f329ad blueswir1
        break;
1008 19f329ad blueswir1
    }
1009 19f329ad blueswir1
}
1010 7a3f1944 bellard
1011 19f329ad blueswir1
static inline void gen_fcond(TCGv r_dst, unsigned int cc, unsigned int cond)
1012 e8af50a3 bellard
{
1013 19f329ad blueswir1
    unsigned int offset;
1014 19f329ad blueswir1
1015 19f329ad blueswir1
    switch (cc) {
1016 19f329ad blueswir1
    default:
1017 19f329ad blueswir1
    case 0x0:
1018 19f329ad blueswir1
        offset = 0;
1019 19f329ad blueswir1
        break;
1020 19f329ad blueswir1
    case 0x1:
1021 19f329ad blueswir1
        offset = 32 - 10;
1022 19f329ad blueswir1
        break;
1023 19f329ad blueswir1
    case 0x2:
1024 19f329ad blueswir1
        offset = 34 - 10;
1025 19f329ad blueswir1
        break;
1026 19f329ad blueswir1
    case 0x3:
1027 19f329ad blueswir1
        offset = 36 - 10;
1028 19f329ad blueswir1
        break;
1029 19f329ad blueswir1
    }
1030 19f329ad blueswir1
1031 19f329ad blueswir1
    switch (cond) {
1032 19f329ad blueswir1
    case 0x0:
1033 19f329ad blueswir1
        gen_op_eval_bn(r_dst);
1034 19f329ad blueswir1
        break;
1035 19f329ad blueswir1
    case 0x1:
1036 87e92502 blueswir1
        gen_op_eval_fbne(r_dst, cpu_fsr, offset);
1037 19f329ad blueswir1
        break;
1038 19f329ad blueswir1
    case 0x2:
1039 87e92502 blueswir1
        gen_op_eval_fblg(r_dst, cpu_fsr, offset);
1040 19f329ad blueswir1
        break;
1041 19f329ad blueswir1
    case 0x3:
1042 87e92502 blueswir1
        gen_op_eval_fbul(r_dst, cpu_fsr, offset);
1043 19f329ad blueswir1
        break;
1044 19f329ad blueswir1
    case 0x4:
1045 87e92502 blueswir1
        gen_op_eval_fbl(r_dst, cpu_fsr, offset);
1046 19f329ad blueswir1
        break;
1047 19f329ad blueswir1
    case 0x5:
1048 87e92502 blueswir1
        gen_op_eval_fbug(r_dst, cpu_fsr, offset);
1049 19f329ad blueswir1
        break;
1050 19f329ad blueswir1
    case 0x6:
1051 87e92502 blueswir1
        gen_op_eval_fbg(r_dst, cpu_fsr, offset);
1052 19f329ad blueswir1
        break;
1053 19f329ad blueswir1
    case 0x7:
1054 87e92502 blueswir1
        gen_op_eval_fbu(r_dst, cpu_fsr, offset);
1055 19f329ad blueswir1
        break;
1056 19f329ad blueswir1
    case 0x8:
1057 19f329ad blueswir1
        gen_op_eval_ba(r_dst);
1058 19f329ad blueswir1
        break;
1059 19f329ad blueswir1
    case 0x9:
1060 87e92502 blueswir1
        gen_op_eval_fbe(r_dst, cpu_fsr, offset);
1061 19f329ad blueswir1
        break;
1062 19f329ad blueswir1
    case 0xa:
1063 87e92502 blueswir1
        gen_op_eval_fbue(r_dst, cpu_fsr, offset);
1064 19f329ad blueswir1
        break;
1065 19f329ad blueswir1
    case 0xb:
1066 87e92502 blueswir1
        gen_op_eval_fbge(r_dst, cpu_fsr, offset);
1067 19f329ad blueswir1
        break;
1068 19f329ad blueswir1
    case 0xc:
1069 87e92502 blueswir1
        gen_op_eval_fbuge(r_dst, cpu_fsr, offset);
1070 19f329ad blueswir1
        break;
1071 19f329ad blueswir1
    case 0xd:
1072 87e92502 blueswir1
        gen_op_eval_fble(r_dst, cpu_fsr, offset);
1073 19f329ad blueswir1
        break;
1074 19f329ad blueswir1
    case 0xe:
1075 87e92502 blueswir1
        gen_op_eval_fbule(r_dst, cpu_fsr, offset);
1076 19f329ad blueswir1
        break;
1077 19f329ad blueswir1
    case 0xf:
1078 87e92502 blueswir1
        gen_op_eval_fbo(r_dst, cpu_fsr, offset);
1079 19f329ad blueswir1
        break;
1080 19f329ad blueswir1
    }
1081 e8af50a3 bellard
}
1082 00f219bf blueswir1
1083 19f329ad blueswir1
#ifdef TARGET_SPARC64
1084 00f219bf blueswir1
// Inverted logic
1085 00f219bf blueswir1
static const int gen_tcg_cond_reg[8] = {
1086 00f219bf blueswir1
    -1,
1087 00f219bf blueswir1
    TCG_COND_NE,
1088 00f219bf blueswir1
    TCG_COND_GT,
1089 00f219bf blueswir1
    TCG_COND_GE,
1090 00f219bf blueswir1
    -1,
1091 00f219bf blueswir1
    TCG_COND_EQ,
1092 00f219bf blueswir1
    TCG_COND_LE,
1093 00f219bf blueswir1
    TCG_COND_LT,
1094 00f219bf blueswir1
};
1095 19f329ad blueswir1
1096 4af984a7 blueswir1
static inline void gen_cond_reg(TCGv r_dst, int cond, TCGv r_src)
1097 19f329ad blueswir1
{
1098 19f329ad blueswir1
    int l1;
1099 19f329ad blueswir1
1100 19f329ad blueswir1
    l1 = gen_new_label();
1101 0425bee5 blueswir1
    tcg_gen_movi_tl(r_dst, 0);
1102 cb63669a pbrook
    tcg_gen_brcondi_tl(gen_tcg_cond_reg[cond], r_src, 0, l1);
1103 19f329ad blueswir1
    tcg_gen_movi_tl(r_dst, 1);
1104 19f329ad blueswir1
    gen_set_label(l1);
1105 19f329ad blueswir1
}
1106 3475187d bellard
#endif
1107 cf495bcf bellard
1108 0bee699e bellard
/* XXX: potentially incorrect if dynamic npc */
1109 4af984a7 blueswir1
static void do_branch(DisasContext *dc, int32_t offset, uint32_t insn, int cc,
1110 4af984a7 blueswir1
                      TCGv r_cond)
1111 7a3f1944 bellard
{
1112 cf495bcf bellard
    unsigned int cond = GET_FIELD(insn, 3, 6), a = (insn & (1 << 29));
1113 af7bf89b bellard
    target_ulong target = dc->pc + offset;
1114 5fafdf24 ths
1115 cf495bcf bellard
    if (cond == 0x0) {
1116 0f8a249a blueswir1
        /* unconditional not taken */
1117 0f8a249a blueswir1
        if (a) {
1118 0f8a249a blueswir1
            dc->pc = dc->npc + 4;
1119 0f8a249a blueswir1
            dc->npc = dc->pc + 4;
1120 0f8a249a blueswir1
        } else {
1121 0f8a249a blueswir1
            dc->pc = dc->npc;
1122 0f8a249a blueswir1
            dc->npc = dc->pc + 4;
1123 0f8a249a blueswir1
        }
1124 cf495bcf bellard
    } else if (cond == 0x8) {
1125 0f8a249a blueswir1
        /* unconditional taken */
1126 0f8a249a blueswir1
        if (a) {
1127 0f8a249a blueswir1
            dc->pc = target;
1128 0f8a249a blueswir1
            dc->npc = dc->pc + 4;
1129 0f8a249a blueswir1
        } else {
1130 0f8a249a blueswir1
            dc->pc = dc->npc;
1131 0f8a249a blueswir1
            dc->npc = target;
1132 0f8a249a blueswir1
        }
1133 cf495bcf bellard
    } else {
1134 4af984a7 blueswir1
        flush_cond(dc, r_cond);
1135 8393617c Blue Swirl
        gen_cond(r_cond, cc, cond, dc);
1136 0f8a249a blueswir1
        if (a) {
1137 4af984a7 blueswir1
            gen_branch_a(dc, target, dc->npc, r_cond);
1138 cf495bcf bellard
            dc->is_br = 1;
1139 0f8a249a blueswir1
        } else {
1140 cf495bcf bellard
            dc->pc = dc->npc;
1141 72cbca10 bellard
            dc->jump_pc[0] = target;
1142 72cbca10 bellard
            dc->jump_pc[1] = dc->npc + 4;
1143 72cbca10 bellard
            dc->npc = JUMP_PC;
1144 0f8a249a blueswir1
        }
1145 cf495bcf bellard
    }
1146 7a3f1944 bellard
}
1147 7a3f1944 bellard
1148 0bee699e bellard
/* XXX: potentially incorrect if dynamic npc */
1149 4af984a7 blueswir1
static void do_fbranch(DisasContext *dc, int32_t offset, uint32_t insn, int cc,
1150 4af984a7 blueswir1
                      TCGv r_cond)
1151 e8af50a3 bellard
{
1152 e8af50a3 bellard
    unsigned int cond = GET_FIELD(insn, 3, 6), a = (insn & (1 << 29));
1153 af7bf89b bellard
    target_ulong target = dc->pc + offset;
1154 af7bf89b bellard
1155 e8af50a3 bellard
    if (cond == 0x0) {
1156 0f8a249a blueswir1
        /* unconditional not taken */
1157 0f8a249a blueswir1
        if (a) {
1158 0f8a249a blueswir1
            dc->pc = dc->npc + 4;
1159 0f8a249a blueswir1
            dc->npc = dc->pc + 4;
1160 0f8a249a blueswir1
        } else {
1161 0f8a249a blueswir1
            dc->pc = dc->npc;
1162 0f8a249a blueswir1
            dc->npc = dc->pc + 4;
1163 0f8a249a blueswir1
        }
1164 e8af50a3 bellard
    } else if (cond == 0x8) {
1165 0f8a249a blueswir1
        /* unconditional taken */
1166 0f8a249a blueswir1
        if (a) {
1167 0f8a249a blueswir1
            dc->pc = target;
1168 0f8a249a blueswir1
            dc->npc = dc->pc + 4;
1169 0f8a249a blueswir1
        } else {
1170 0f8a249a blueswir1
            dc->pc = dc->npc;
1171 0f8a249a blueswir1
            dc->npc = target;
1172 0f8a249a blueswir1
        }
1173 e8af50a3 bellard
    } else {
1174 4af984a7 blueswir1
        flush_cond(dc, r_cond);
1175 4af984a7 blueswir1
        gen_fcond(r_cond, cc, cond);
1176 0f8a249a blueswir1
        if (a) {
1177 4af984a7 blueswir1
            gen_branch_a(dc, target, dc->npc, r_cond);
1178 e8af50a3 bellard
            dc->is_br = 1;
1179 0f8a249a blueswir1
        } else {
1180 e8af50a3 bellard
            dc->pc = dc->npc;
1181 e8af50a3 bellard
            dc->jump_pc[0] = target;
1182 e8af50a3 bellard
            dc->jump_pc[1] = dc->npc + 4;
1183 e8af50a3 bellard
            dc->npc = JUMP_PC;
1184 0f8a249a blueswir1
        }
1185 e8af50a3 bellard
    }
1186 e8af50a3 bellard
}
1187 e8af50a3 bellard
1188 3475187d bellard
#ifdef TARGET_SPARC64
1189 3475187d bellard
/* XXX: potentially incorrect if dynamic npc */
1190 4af984a7 blueswir1
static void do_branch_reg(DisasContext *dc, int32_t offset, uint32_t insn,
1191 4af984a7 blueswir1
                          TCGv r_cond, TCGv r_reg)
1192 7a3f1944 bellard
{
1193 3475187d bellard
    unsigned int cond = GET_FIELD_SP(insn, 25, 27), a = (insn & (1 << 29));
1194 3475187d bellard
    target_ulong target = dc->pc + offset;
1195 3475187d bellard
1196 4af984a7 blueswir1
    flush_cond(dc, r_cond);
1197 4af984a7 blueswir1
    gen_cond_reg(r_cond, cond, r_reg);
1198 3475187d bellard
    if (a) {
1199 4af984a7 blueswir1
        gen_branch_a(dc, target, dc->npc, r_cond);
1200 0f8a249a blueswir1
        dc->is_br = 1;
1201 3475187d bellard
    } else {
1202 0f8a249a blueswir1
        dc->pc = dc->npc;
1203 0f8a249a blueswir1
        dc->jump_pc[0] = target;
1204 0f8a249a blueswir1
        dc->jump_pc[1] = dc->npc + 4;
1205 0f8a249a blueswir1
        dc->npc = JUMP_PC;
1206 3475187d bellard
    }
1207 7a3f1944 bellard
}
1208 7a3f1944 bellard
1209 a7812ae4 pbrook
static inline void gen_op_fcmps(int fccno, TCGv_i32 r_rs1, TCGv_i32 r_rs2)
1210 7e8c2b6c blueswir1
{
1211 714547bb blueswir1
    switch (fccno) {
1212 714547bb blueswir1
    case 0:
1213 a7812ae4 pbrook
        gen_helper_fcmps(r_rs1, r_rs2);
1214 714547bb blueswir1
        break;
1215 714547bb blueswir1
    case 1:
1216 a7812ae4 pbrook
        gen_helper_fcmps_fcc1(r_rs1, r_rs2);
1217 714547bb blueswir1
        break;
1218 714547bb blueswir1
    case 2:
1219 a7812ae4 pbrook
        gen_helper_fcmps_fcc2(r_rs1, r_rs2);
1220 714547bb blueswir1
        break;
1221 714547bb blueswir1
    case 3:
1222 a7812ae4 pbrook
        gen_helper_fcmps_fcc3(r_rs1, r_rs2);
1223 714547bb blueswir1
        break;
1224 714547bb blueswir1
    }
1225 7e8c2b6c blueswir1
}
1226 7e8c2b6c blueswir1
1227 7e8c2b6c blueswir1
static inline void gen_op_fcmpd(int fccno)
1228 7e8c2b6c blueswir1
{
1229 a7812ae4 pbrook
    switch (fccno) {
1230 a7812ae4 pbrook
    case 0:
1231 a7812ae4 pbrook
        gen_helper_fcmpd();
1232 a7812ae4 pbrook
        break;
1233 a7812ae4 pbrook
    case 1:
1234 a7812ae4 pbrook
        gen_helper_fcmpd_fcc1();
1235 a7812ae4 pbrook
        break;
1236 a7812ae4 pbrook
    case 2:
1237 a7812ae4 pbrook
        gen_helper_fcmpd_fcc2();
1238 a7812ae4 pbrook
        break;
1239 a7812ae4 pbrook
    case 3:
1240 a7812ae4 pbrook
        gen_helper_fcmpd_fcc3();
1241 a7812ae4 pbrook
        break;
1242 a7812ae4 pbrook
    }
1243 7e8c2b6c blueswir1
}
1244 7e8c2b6c blueswir1
1245 7e8c2b6c blueswir1
static inline void gen_op_fcmpq(int fccno)
1246 7e8c2b6c blueswir1
{
1247 a7812ae4 pbrook
    switch (fccno) {
1248 a7812ae4 pbrook
    case 0:
1249 a7812ae4 pbrook
        gen_helper_fcmpq();
1250 a7812ae4 pbrook
        break;
1251 a7812ae4 pbrook
    case 1:
1252 a7812ae4 pbrook
        gen_helper_fcmpq_fcc1();
1253 a7812ae4 pbrook
        break;
1254 a7812ae4 pbrook
    case 2:
1255 a7812ae4 pbrook
        gen_helper_fcmpq_fcc2();
1256 a7812ae4 pbrook
        break;
1257 a7812ae4 pbrook
    case 3:
1258 a7812ae4 pbrook
        gen_helper_fcmpq_fcc3();
1259 a7812ae4 pbrook
        break;
1260 a7812ae4 pbrook
    }
1261 7e8c2b6c blueswir1
}
1262 7e8c2b6c blueswir1
1263 a7812ae4 pbrook
static inline void gen_op_fcmpes(int fccno, TCGv_i32 r_rs1, TCGv_i32 r_rs2)
1264 7e8c2b6c blueswir1
{
1265 714547bb blueswir1
    switch (fccno) {
1266 714547bb blueswir1
    case 0:
1267 a7812ae4 pbrook
        gen_helper_fcmpes(r_rs1, r_rs2);
1268 714547bb blueswir1
        break;
1269 714547bb blueswir1
    case 1:
1270 a7812ae4 pbrook
        gen_helper_fcmpes_fcc1(r_rs1, r_rs2);
1271 714547bb blueswir1
        break;
1272 714547bb blueswir1
    case 2:
1273 a7812ae4 pbrook
        gen_helper_fcmpes_fcc2(r_rs1, r_rs2);
1274 714547bb blueswir1
        break;
1275 714547bb blueswir1
    case 3:
1276 a7812ae4 pbrook
        gen_helper_fcmpes_fcc3(r_rs1, r_rs2);
1277 714547bb blueswir1
        break;
1278 714547bb blueswir1
    }
1279 7e8c2b6c blueswir1
}
1280 7e8c2b6c blueswir1
1281 7e8c2b6c blueswir1
static inline void gen_op_fcmped(int fccno)
1282 7e8c2b6c blueswir1
{
1283 a7812ae4 pbrook
    switch (fccno) {
1284 a7812ae4 pbrook
    case 0:
1285 a7812ae4 pbrook
        gen_helper_fcmped();
1286 a7812ae4 pbrook
        break;
1287 a7812ae4 pbrook
    case 1:
1288 a7812ae4 pbrook
        gen_helper_fcmped_fcc1();
1289 a7812ae4 pbrook
        break;
1290 a7812ae4 pbrook
    case 2:
1291 a7812ae4 pbrook
        gen_helper_fcmped_fcc2();
1292 a7812ae4 pbrook
        break;
1293 a7812ae4 pbrook
    case 3:
1294 a7812ae4 pbrook
        gen_helper_fcmped_fcc3();
1295 a7812ae4 pbrook
        break;
1296 a7812ae4 pbrook
    }
1297 7e8c2b6c blueswir1
}
1298 7e8c2b6c blueswir1
1299 7e8c2b6c blueswir1
static inline void gen_op_fcmpeq(int fccno)
1300 7e8c2b6c blueswir1
{
1301 a7812ae4 pbrook
    switch (fccno) {
1302 a7812ae4 pbrook
    case 0:
1303 a7812ae4 pbrook
        gen_helper_fcmpeq();
1304 a7812ae4 pbrook
        break;
1305 a7812ae4 pbrook
    case 1:
1306 a7812ae4 pbrook
        gen_helper_fcmpeq_fcc1();
1307 a7812ae4 pbrook
        break;
1308 a7812ae4 pbrook
    case 2:
1309 a7812ae4 pbrook
        gen_helper_fcmpeq_fcc2();
1310 a7812ae4 pbrook
        break;
1311 a7812ae4 pbrook
    case 3:
1312 a7812ae4 pbrook
        gen_helper_fcmpeq_fcc3();
1313 a7812ae4 pbrook
        break;
1314 a7812ae4 pbrook
    }
1315 7e8c2b6c blueswir1
}
1316 7e8c2b6c blueswir1
1317 7e8c2b6c blueswir1
#else
1318 7e8c2b6c blueswir1
1319 714547bb blueswir1
static inline void gen_op_fcmps(int fccno, TCGv r_rs1, TCGv r_rs2)
1320 7e8c2b6c blueswir1
{
1321 a7812ae4 pbrook
    gen_helper_fcmps(r_rs1, r_rs2);
1322 7e8c2b6c blueswir1
}
1323 7e8c2b6c blueswir1
1324 7e8c2b6c blueswir1
static inline void gen_op_fcmpd(int fccno)
1325 7e8c2b6c blueswir1
{
1326 a7812ae4 pbrook
    gen_helper_fcmpd();
1327 7e8c2b6c blueswir1
}
1328 7e8c2b6c blueswir1
1329 7e8c2b6c blueswir1
static inline void gen_op_fcmpq(int fccno)
1330 7e8c2b6c blueswir1
{
1331 a7812ae4 pbrook
    gen_helper_fcmpq();
1332 7e8c2b6c blueswir1
}
1333 7e8c2b6c blueswir1
1334 714547bb blueswir1
static inline void gen_op_fcmpes(int fccno, TCGv r_rs1, TCGv r_rs2)
1335 7e8c2b6c blueswir1
{
1336 a7812ae4 pbrook
    gen_helper_fcmpes(r_rs1, r_rs2);
1337 7e8c2b6c blueswir1
}
1338 7e8c2b6c blueswir1
1339 7e8c2b6c blueswir1
static inline void gen_op_fcmped(int fccno)
1340 7e8c2b6c blueswir1
{
1341 a7812ae4 pbrook
    gen_helper_fcmped();
1342 7e8c2b6c blueswir1
}
1343 7e8c2b6c blueswir1
1344 7e8c2b6c blueswir1
static inline void gen_op_fcmpeq(int fccno)
1345 7e8c2b6c blueswir1
{
1346 a7812ae4 pbrook
    gen_helper_fcmpeq();
1347 7e8c2b6c blueswir1
}
1348 7e8c2b6c blueswir1
#endif
1349 7e8c2b6c blueswir1
1350 134d77a1 blueswir1
static inline void gen_op_fpexception_im(int fsr_flags)
1351 134d77a1 blueswir1
{
1352 a7812ae4 pbrook
    TCGv_i32 r_const;
1353 2ea815ca blueswir1
1354 47ad35f1 blueswir1
    tcg_gen_andi_tl(cpu_fsr, cpu_fsr, FSR_FTT_NMASK);
1355 87e92502 blueswir1
    tcg_gen_ori_tl(cpu_fsr, cpu_fsr, fsr_flags);
1356 2ea815ca blueswir1
    r_const = tcg_const_i32(TT_FP_EXCP);
1357 a7812ae4 pbrook
    gen_helper_raise_exception(r_const);
1358 a7812ae4 pbrook
    tcg_temp_free_i32(r_const);
1359 134d77a1 blueswir1
}
1360 134d77a1 blueswir1
1361 4af984a7 blueswir1
static int gen_trap_ifnofpu(DisasContext *dc, TCGv r_cond)
1362 a80dde08 bellard
{
1363 a80dde08 bellard
#if !defined(CONFIG_USER_ONLY)
1364 a80dde08 bellard
    if (!dc->fpu_enabled) {
1365 a7812ae4 pbrook
        TCGv_i32 r_const;
1366 2ea815ca blueswir1
1367 4af984a7 blueswir1
        save_state(dc, r_cond);
1368 2ea815ca blueswir1
        r_const = tcg_const_i32(TT_NFPU_INSN);
1369 a7812ae4 pbrook
        gen_helper_raise_exception(r_const);
1370 a7812ae4 pbrook
        tcg_temp_free_i32(r_const);
1371 a80dde08 bellard
        dc->is_br = 1;
1372 a80dde08 bellard
        return 1;
1373 a80dde08 bellard
    }
1374 a80dde08 bellard
#endif
1375 a80dde08 bellard
    return 0;
1376 a80dde08 bellard
}
1377 a80dde08 bellard
1378 7e8c2b6c blueswir1
static inline void gen_op_clear_ieee_excp_and_FTT(void)
1379 7e8c2b6c blueswir1
{
1380 47ad35f1 blueswir1
    tcg_gen_andi_tl(cpu_fsr, cpu_fsr, FSR_FTT_CEXC_NMASK);
1381 7e8c2b6c blueswir1
}
1382 7e8c2b6c blueswir1
1383 7e8c2b6c blueswir1
static inline void gen_clear_float_exceptions(void)
1384 7e8c2b6c blueswir1
{
1385 a7812ae4 pbrook
    gen_helper_clear_float_exceptions();
1386 7e8c2b6c blueswir1
}
1387 7e8c2b6c blueswir1
1388 1a2fb1c0 blueswir1
/* asi moves */
1389 1a2fb1c0 blueswir1
#ifdef TARGET_SPARC64
1390 a7812ae4 pbrook
static inline TCGv_i32 gen_get_asi(int insn, TCGv r_addr)
1391 1a2fb1c0 blueswir1
{
1392 95f9397c blueswir1
    int asi;
1393 a7812ae4 pbrook
    TCGv_i32 r_asi;
1394 1a2fb1c0 blueswir1
1395 1a2fb1c0 blueswir1
    if (IS_IMM) {
1396 a7812ae4 pbrook
        r_asi = tcg_temp_new_i32();
1397 255e1fcb blueswir1
        tcg_gen_mov_i32(r_asi, cpu_asi);
1398 1a2fb1c0 blueswir1
    } else {
1399 1a2fb1c0 blueswir1
        asi = GET_FIELD(insn, 19, 26);
1400 0425bee5 blueswir1
        r_asi = tcg_const_i32(asi);
1401 1a2fb1c0 blueswir1
    }
1402 0425bee5 blueswir1
    return r_asi;
1403 0425bee5 blueswir1
}
1404 0425bee5 blueswir1
1405 77f193da blueswir1
static inline void gen_ld_asi(TCGv dst, TCGv addr, int insn, int size,
1406 77f193da blueswir1
                              int sign)
1407 0425bee5 blueswir1
{
1408 a7812ae4 pbrook
    TCGv_i32 r_asi, r_size, r_sign;
1409 0425bee5 blueswir1
1410 4af984a7 blueswir1
    r_asi = gen_get_asi(insn, addr);
1411 2ea815ca blueswir1
    r_size = tcg_const_i32(size);
1412 2ea815ca blueswir1
    r_sign = tcg_const_i32(sign);
1413 a7812ae4 pbrook
    gen_helper_ld_asi(dst, addr, r_asi, r_size, r_sign);
1414 a7812ae4 pbrook
    tcg_temp_free_i32(r_sign);
1415 a7812ae4 pbrook
    tcg_temp_free_i32(r_size);
1416 a7812ae4 pbrook
    tcg_temp_free_i32(r_asi);
1417 1a2fb1c0 blueswir1
}
1418 1a2fb1c0 blueswir1
1419 4af984a7 blueswir1
static inline void gen_st_asi(TCGv src, TCGv addr, int insn, int size)
1420 1a2fb1c0 blueswir1
{
1421 a7812ae4 pbrook
    TCGv_i32 r_asi, r_size;
1422 1a2fb1c0 blueswir1
1423 4af984a7 blueswir1
    r_asi = gen_get_asi(insn, addr);
1424 2ea815ca blueswir1
    r_size = tcg_const_i32(size);
1425 a7812ae4 pbrook
    gen_helper_st_asi(addr, src, r_asi, r_size);
1426 a7812ae4 pbrook
    tcg_temp_free_i32(r_size);
1427 a7812ae4 pbrook
    tcg_temp_free_i32(r_asi);
1428 1a2fb1c0 blueswir1
}
1429 1a2fb1c0 blueswir1
1430 4af984a7 blueswir1
static inline void gen_ldf_asi(TCGv addr, int insn, int size, int rd)
1431 1a2fb1c0 blueswir1
{
1432 a7812ae4 pbrook
    TCGv_i32 r_asi, r_size, r_rd;
1433 1a2fb1c0 blueswir1
1434 4af984a7 blueswir1
    r_asi = gen_get_asi(insn, addr);
1435 2ea815ca blueswir1
    r_size = tcg_const_i32(size);
1436 2ea815ca blueswir1
    r_rd = tcg_const_i32(rd);
1437 a7812ae4 pbrook
    gen_helper_ldf_asi(addr, r_asi, r_size, r_rd);
1438 a7812ae4 pbrook
    tcg_temp_free_i32(r_rd);
1439 a7812ae4 pbrook
    tcg_temp_free_i32(r_size);
1440 a7812ae4 pbrook
    tcg_temp_free_i32(r_asi);
1441 1a2fb1c0 blueswir1
}
1442 1a2fb1c0 blueswir1
1443 4af984a7 blueswir1
static inline void gen_stf_asi(TCGv addr, int insn, int size, int rd)
1444 1a2fb1c0 blueswir1
{
1445 a7812ae4 pbrook
    TCGv_i32 r_asi, r_size, r_rd;
1446 1a2fb1c0 blueswir1
1447 31741a27 blueswir1
    r_asi = gen_get_asi(insn, addr);
1448 2ea815ca blueswir1
    r_size = tcg_const_i32(size);
1449 2ea815ca blueswir1
    r_rd = tcg_const_i32(rd);
1450 a7812ae4 pbrook
    gen_helper_stf_asi(addr, r_asi, r_size, r_rd);
1451 a7812ae4 pbrook
    tcg_temp_free_i32(r_rd);
1452 a7812ae4 pbrook
    tcg_temp_free_i32(r_size);
1453 a7812ae4 pbrook
    tcg_temp_free_i32(r_asi);
1454 1a2fb1c0 blueswir1
}
1455 1a2fb1c0 blueswir1
1456 4af984a7 blueswir1
static inline void gen_swap_asi(TCGv dst, TCGv addr, int insn)
1457 1a2fb1c0 blueswir1
{
1458 a7812ae4 pbrook
    TCGv_i32 r_asi, r_size, r_sign;
1459 1a2fb1c0 blueswir1
1460 4af984a7 blueswir1
    r_asi = gen_get_asi(insn, addr);
1461 2ea815ca blueswir1
    r_size = tcg_const_i32(4);
1462 2ea815ca blueswir1
    r_sign = tcg_const_i32(0);
1463 a7812ae4 pbrook
    gen_helper_ld_asi(cpu_tmp64, addr, r_asi, r_size, r_sign);
1464 a7812ae4 pbrook
    tcg_temp_free_i32(r_sign);
1465 a7812ae4 pbrook
    gen_helper_st_asi(addr, dst, r_asi, r_size);
1466 a7812ae4 pbrook
    tcg_temp_free_i32(r_size);
1467 a7812ae4 pbrook
    tcg_temp_free_i32(r_asi);
1468 8d96d209 blueswir1
    tcg_gen_trunc_i64_tl(dst, cpu_tmp64);
1469 1a2fb1c0 blueswir1
}
1470 1a2fb1c0 blueswir1
1471 db166940 blueswir1
static inline void gen_ldda_asi(TCGv hi, TCGv addr, int insn, int rd)
1472 1a2fb1c0 blueswir1
{
1473 a7812ae4 pbrook
    TCGv_i32 r_asi, r_rd;
1474 1a2fb1c0 blueswir1
1475 4af984a7 blueswir1
    r_asi = gen_get_asi(insn, addr);
1476 db166940 blueswir1
    r_rd = tcg_const_i32(rd);
1477 a7812ae4 pbrook
    gen_helper_ldda_asi(addr, r_asi, r_rd);
1478 a7812ae4 pbrook
    tcg_temp_free_i32(r_rd);
1479 a7812ae4 pbrook
    tcg_temp_free_i32(r_asi);
1480 0425bee5 blueswir1
}
1481 0425bee5 blueswir1
1482 4af984a7 blueswir1
static inline void gen_stda_asi(TCGv hi, TCGv addr, int insn, int rd)
1483 0425bee5 blueswir1
{
1484 a7812ae4 pbrook
    TCGv_i32 r_asi, r_size;
1485 a7ec4229 blueswir1
1486 a7ec4229 blueswir1
    gen_movl_reg_TN(rd + 1, cpu_tmp0);
1487 ab508019 blueswir1
    tcg_gen_concat_tl_i64(cpu_tmp64, cpu_tmp0, hi);
1488 4af984a7 blueswir1
    r_asi = gen_get_asi(insn, addr);
1489 2ea815ca blueswir1
    r_size = tcg_const_i32(8);
1490 a7812ae4 pbrook
    gen_helper_st_asi(addr, cpu_tmp64, r_asi, r_size);
1491 a7812ae4 pbrook
    tcg_temp_free_i32(r_size);
1492 a7812ae4 pbrook
    tcg_temp_free_i32(r_asi);
1493 1a2fb1c0 blueswir1
}
1494 1a2fb1c0 blueswir1
1495 77f193da blueswir1
static inline void gen_cas_asi(TCGv dst, TCGv addr, TCGv val2, int insn,
1496 77f193da blueswir1
                               int rd)
1497 1a2fb1c0 blueswir1
{
1498 a7812ae4 pbrook
    TCGv r_val1;
1499 a7812ae4 pbrook
    TCGv_i32 r_asi;
1500 1a2fb1c0 blueswir1
1501 a7812ae4 pbrook
    r_val1 = tcg_temp_new();
1502 1a2fb1c0 blueswir1
    gen_movl_reg_TN(rd, r_val1);
1503 4af984a7 blueswir1
    r_asi = gen_get_asi(insn, addr);
1504 a7812ae4 pbrook
    gen_helper_cas_asi(dst, addr, r_val1, val2, r_asi);
1505 a7812ae4 pbrook
    tcg_temp_free_i32(r_asi);
1506 2ea815ca blueswir1
    tcg_temp_free(r_val1);
1507 1a2fb1c0 blueswir1
}
1508 1a2fb1c0 blueswir1
1509 77f193da blueswir1
static inline void gen_casx_asi(TCGv dst, TCGv addr, TCGv val2, int insn,
1510 77f193da blueswir1
                                int rd)
1511 1a2fb1c0 blueswir1
{
1512 a7812ae4 pbrook
    TCGv_i32 r_asi;
1513 1a2fb1c0 blueswir1
1514 8911f501 blueswir1
    gen_movl_reg_TN(rd, cpu_tmp64);
1515 4af984a7 blueswir1
    r_asi = gen_get_asi(insn, addr);
1516 a7812ae4 pbrook
    gen_helper_casx_asi(dst, addr, cpu_tmp64, val2, r_asi);
1517 a7812ae4 pbrook
    tcg_temp_free_i32(r_asi);
1518 1a2fb1c0 blueswir1
}
1519 1a2fb1c0 blueswir1
1520 1a2fb1c0 blueswir1
#elif !defined(CONFIG_USER_ONLY)
1521 1a2fb1c0 blueswir1
1522 77f193da blueswir1
static inline void gen_ld_asi(TCGv dst, TCGv addr, int insn, int size,
1523 77f193da blueswir1
                              int sign)
1524 1a2fb1c0 blueswir1
{
1525 a7812ae4 pbrook
    TCGv_i32 r_asi, r_size, r_sign;
1526 1a2fb1c0 blueswir1
1527 2ea815ca blueswir1
    r_asi = tcg_const_i32(GET_FIELD(insn, 19, 26));
1528 2ea815ca blueswir1
    r_size = tcg_const_i32(size);
1529 2ea815ca blueswir1
    r_sign = tcg_const_i32(sign);
1530 a7812ae4 pbrook
    gen_helper_ld_asi(cpu_tmp64, addr, r_asi, r_size, r_sign);
1531 2ea815ca blueswir1
    tcg_temp_free(r_sign);
1532 2ea815ca blueswir1
    tcg_temp_free(r_size);
1533 2ea815ca blueswir1
    tcg_temp_free(r_asi);
1534 4af984a7 blueswir1
    tcg_gen_trunc_i64_tl(dst, cpu_tmp64);
1535 1a2fb1c0 blueswir1
}
1536 1a2fb1c0 blueswir1
1537 4af984a7 blueswir1
static inline void gen_st_asi(TCGv src, TCGv addr, int insn, int size)
1538 1a2fb1c0 blueswir1
{
1539 a7812ae4 pbrook
    TCGv_i32 r_asi, r_size;
1540 1a2fb1c0 blueswir1
1541 4af984a7 blueswir1
    tcg_gen_extu_tl_i64(cpu_tmp64, src);
1542 2ea815ca blueswir1
    r_asi = tcg_const_i32(GET_FIELD(insn, 19, 26));
1543 2ea815ca blueswir1
    r_size = tcg_const_i32(size);
1544 a7812ae4 pbrook
    gen_helper_st_asi(addr, cpu_tmp64, r_asi, r_size);
1545 2ea815ca blueswir1
    tcg_temp_free(r_size);
1546 2ea815ca blueswir1
    tcg_temp_free(r_asi);
1547 1a2fb1c0 blueswir1
}
1548 1a2fb1c0 blueswir1
1549 4af984a7 blueswir1
static inline void gen_swap_asi(TCGv dst, TCGv addr, int insn)
1550 1a2fb1c0 blueswir1
{
1551 a7812ae4 pbrook
    TCGv_i32 r_asi, r_size, r_sign;
1552 a7812ae4 pbrook
    TCGv_i64 r_val;
1553 1a2fb1c0 blueswir1
1554 2ea815ca blueswir1
    r_asi = tcg_const_i32(GET_FIELD(insn, 19, 26));
1555 2ea815ca blueswir1
    r_size = tcg_const_i32(4);
1556 2ea815ca blueswir1
    r_sign = tcg_const_i32(0);
1557 a7812ae4 pbrook
    gen_helper_ld_asi(cpu_tmp64, addr, r_asi, r_size, r_sign);
1558 2ea815ca blueswir1
    tcg_temp_free(r_sign);
1559 a7812ae4 pbrook
    r_val = tcg_temp_new_i64();
1560 a7812ae4 pbrook
    tcg_gen_extu_tl_i64(r_val, dst);
1561 a7812ae4 pbrook
    gen_helper_st_asi(addr, r_val, r_asi, r_size);
1562 a7812ae4 pbrook
    tcg_temp_free_i64(r_val);
1563 2ea815ca blueswir1
    tcg_temp_free(r_size);
1564 2ea815ca blueswir1
    tcg_temp_free(r_asi);
1565 8d96d209 blueswir1
    tcg_gen_trunc_i64_tl(dst, cpu_tmp64);
1566 1a2fb1c0 blueswir1
}
1567 1a2fb1c0 blueswir1
1568 db166940 blueswir1
static inline void gen_ldda_asi(TCGv hi, TCGv addr, int insn, int rd)
1569 1a2fb1c0 blueswir1
{
1570 a7812ae4 pbrook
    TCGv_i32 r_asi, r_size, r_sign;
1571 1a2fb1c0 blueswir1
1572 2ea815ca blueswir1
    r_asi = tcg_const_i32(GET_FIELD(insn, 19, 26));
1573 2ea815ca blueswir1
    r_size = tcg_const_i32(8);
1574 2ea815ca blueswir1
    r_sign = tcg_const_i32(0);
1575 a7812ae4 pbrook
    gen_helper_ld_asi(cpu_tmp64, addr, r_asi, r_size, r_sign);
1576 2ea815ca blueswir1
    tcg_temp_free(r_sign);
1577 2ea815ca blueswir1
    tcg_temp_free(r_size);
1578 2ea815ca blueswir1
    tcg_temp_free(r_asi);
1579 db166940 blueswir1
    tcg_gen_trunc_i64_tl(cpu_tmp0, cpu_tmp64);
1580 db166940 blueswir1
    gen_movl_TN_reg(rd + 1, cpu_tmp0);
1581 8911f501 blueswir1
    tcg_gen_shri_i64(cpu_tmp64, cpu_tmp64, 32);
1582 4af984a7 blueswir1
    tcg_gen_trunc_i64_tl(hi, cpu_tmp64);
1583 db166940 blueswir1
    gen_movl_TN_reg(rd, hi);
1584 0425bee5 blueswir1
}
1585 0425bee5 blueswir1
1586 4af984a7 blueswir1
static inline void gen_stda_asi(TCGv hi, TCGv addr, int insn, int rd)
1587 0425bee5 blueswir1
{
1588 a7812ae4 pbrook
    TCGv_i32 r_asi, r_size;
1589 a7ec4229 blueswir1
1590 a7ec4229 blueswir1
    gen_movl_reg_TN(rd + 1, cpu_tmp0);
1591 ab508019 blueswir1
    tcg_gen_concat_tl_i64(cpu_tmp64, cpu_tmp0, hi);
1592 2ea815ca blueswir1
    r_asi = tcg_const_i32(GET_FIELD(insn, 19, 26));
1593 2ea815ca blueswir1
    r_size = tcg_const_i32(8);
1594 a7812ae4 pbrook
    gen_helper_st_asi(addr, cpu_tmp64, r_asi, r_size);
1595 2ea815ca blueswir1
    tcg_temp_free(r_size);
1596 2ea815ca blueswir1
    tcg_temp_free(r_asi);
1597 1a2fb1c0 blueswir1
}
1598 1a2fb1c0 blueswir1
#endif
1599 1a2fb1c0 blueswir1
1600 1a2fb1c0 blueswir1
#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64)
1601 4af984a7 blueswir1
static inline void gen_ldstub_asi(TCGv dst, TCGv addr, int insn)
1602 1a2fb1c0 blueswir1
{
1603 a7812ae4 pbrook
    TCGv_i64 r_val;
1604 a7812ae4 pbrook
    TCGv_i32 r_asi, r_size;
1605 1a2fb1c0 blueswir1
1606 4af984a7 blueswir1
    gen_ld_asi(dst, addr, insn, 1, 0);
1607 1a2fb1c0 blueswir1
1608 2ea815ca blueswir1
    r_val = tcg_const_i64(0xffULL);
1609 2ea815ca blueswir1
    r_asi = tcg_const_i32(GET_FIELD(insn, 19, 26));
1610 2ea815ca blueswir1
    r_size = tcg_const_i32(1);
1611 a7812ae4 pbrook
    gen_helper_st_asi(addr, r_val, r_asi, r_size);
1612 a7812ae4 pbrook
    tcg_temp_free_i32(r_size);
1613 a7812ae4 pbrook
    tcg_temp_free_i32(r_asi);
1614 a7812ae4 pbrook
    tcg_temp_free_i64(r_val);
1615 1a2fb1c0 blueswir1
}
1616 1a2fb1c0 blueswir1
#endif
1617 1a2fb1c0 blueswir1
1618 9322a4bf blueswir1
static inline TCGv get_src1(unsigned int insn, TCGv def)
1619 9322a4bf blueswir1
{
1620 9322a4bf blueswir1
    TCGv r_rs1 = def;
1621 9322a4bf blueswir1
    unsigned int rs1;
1622 9322a4bf blueswir1
1623 9322a4bf blueswir1
    rs1 = GET_FIELD(insn, 13, 17);
1624 9322a4bf blueswir1
    if (rs1 == 0)
1625 5c6a0628 blueswir1
        r_rs1 = tcg_const_tl(0); // XXX how to free?
1626 9322a4bf blueswir1
    else if (rs1 < 8)
1627 5c6a0628 blueswir1
        r_rs1 = cpu_gregs[rs1];
1628 9322a4bf blueswir1
    else
1629 9322a4bf blueswir1
        tcg_gen_ld_tl(def, cpu_regwptr, (rs1 - 8) * sizeof(target_ulong));
1630 9322a4bf blueswir1
    return r_rs1;
1631 9322a4bf blueswir1
}
1632 9322a4bf blueswir1
1633 a49d9390 blueswir1
static inline TCGv get_src2(unsigned int insn, TCGv def)
1634 a49d9390 blueswir1
{
1635 a49d9390 blueswir1
    TCGv r_rs2 = def;
1636 a49d9390 blueswir1
1637 a49d9390 blueswir1
    if (IS_IMM) { /* immediate */
1638 67526b20 Blue Swirl
        target_long simm;
1639 67526b20 Blue Swirl
1640 67526b20 Blue Swirl
        simm = GET_FIELDs(insn, 19, 31);
1641 67526b20 Blue Swirl
        r_rs2 = tcg_const_tl(simm); // XXX how to free?
1642 a49d9390 blueswir1
    } else { /* register */
1643 67526b20 Blue Swirl
        unsigned int rs2;
1644 67526b20 Blue Swirl
1645 a49d9390 blueswir1
        rs2 = GET_FIELD(insn, 27, 31);
1646 a49d9390 blueswir1
        if (rs2 == 0)
1647 2ea815ca blueswir1
            r_rs2 = tcg_const_tl(0); // XXX how to free?
1648 a49d9390 blueswir1
        else if (rs2 < 8)
1649 a49d9390 blueswir1
            r_rs2 = cpu_gregs[rs2];
1650 a49d9390 blueswir1
        else
1651 a49d9390 blueswir1
            tcg_gen_ld_tl(def, cpu_regwptr, (rs2 - 8) * sizeof(target_ulong));
1652 a49d9390 blueswir1
    }
1653 a49d9390 blueswir1
    return r_rs2;
1654 a49d9390 blueswir1
}
1655 a49d9390 blueswir1
1656 64a88d5d blueswir1
#define CHECK_IU_FEATURE(dc, FEATURE)                      \
1657 5578ceab blueswir1
    if (!((dc)->def->features & CPU_FEATURE_ ## FEATURE))  \
1658 64a88d5d blueswir1
        goto illegal_insn;
1659 64a88d5d blueswir1
#define CHECK_FPU_FEATURE(dc, FEATURE)                     \
1660 5578ceab blueswir1
    if (!((dc)->def->features & CPU_FEATURE_ ## FEATURE))  \
1661 64a88d5d blueswir1
        goto nfpu_insn;
1662 64a88d5d blueswir1
1663 0bee699e bellard
/* before an instruction, dc->pc must be static */
1664 cf495bcf bellard
static void disas_sparc_insn(DisasContext * dc)
1665 cf495bcf bellard
{
1666 cf495bcf bellard
    unsigned int insn, opc, rs1, rs2, rd;
1667 67526b20 Blue Swirl
    target_long simm;
1668 7a3f1944 bellard
1669 8fec2b8c aliguori
    if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP)))
1670 a8c768c0 blueswir1
        tcg_gen_debug_insn_start(dc->pc);
1671 0fa85d43 bellard
    insn = ldl_code(dc->pc);
1672 cf495bcf bellard
    opc = GET_FIELD(insn, 0, 1);
1673 7a3f1944 bellard
1674 cf495bcf bellard
    rd = GET_FIELD(insn, 2, 6);
1675 6ae20372 blueswir1
1676 a7812ae4 pbrook
    cpu_src1 = tcg_temp_new(); // const
1677 a7812ae4 pbrook
    cpu_src2 = tcg_temp_new(); // const
1678 6ae20372 blueswir1
1679 cf495bcf bellard
    switch (opc) {
1680 0f8a249a blueswir1
    case 0:                     /* branches/sethi */
1681 0f8a249a blueswir1
        {
1682 0f8a249a blueswir1
            unsigned int xop = GET_FIELD(insn, 7, 9);
1683 0f8a249a blueswir1
            int32_t target;
1684 0f8a249a blueswir1
            switch (xop) {
1685 3475187d bellard
#ifdef TARGET_SPARC64
1686 0f8a249a blueswir1
            case 0x1:           /* V9 BPcc */
1687 0f8a249a blueswir1
                {
1688 0f8a249a blueswir1
                    int cc;
1689 0f8a249a blueswir1
1690 0f8a249a blueswir1
                    target = GET_FIELD_SP(insn, 0, 18);
1691 0f8a249a blueswir1
                    target = sign_extend(target, 18);
1692 0f8a249a blueswir1
                    target <<= 2;
1693 0f8a249a blueswir1
                    cc = GET_FIELD_SP(insn, 20, 21);
1694 0f8a249a blueswir1
                    if (cc == 0)
1695 6ae20372 blueswir1
                        do_branch(dc, target, insn, 0, cpu_cond);
1696 0f8a249a blueswir1
                    else if (cc == 2)
1697 6ae20372 blueswir1
                        do_branch(dc, target, insn, 1, cpu_cond);
1698 0f8a249a blueswir1
                    else
1699 0f8a249a blueswir1
                        goto illegal_insn;
1700 0f8a249a blueswir1
                    goto jmp_insn;
1701 0f8a249a blueswir1
                }
1702 0f8a249a blueswir1
            case 0x3:           /* V9 BPr */
1703 0f8a249a blueswir1
                {
1704 0f8a249a blueswir1
                    target = GET_FIELD_SP(insn, 0, 13) |
1705 13846e70 bellard
                        (GET_FIELD_SP(insn, 20, 21) << 14);
1706 0f8a249a blueswir1
                    target = sign_extend(target, 16);
1707 0f8a249a blueswir1
                    target <<= 2;
1708 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
1709 6ae20372 blueswir1
                    do_branch_reg(dc, target, insn, cpu_cond, cpu_src1);
1710 0f8a249a blueswir1
                    goto jmp_insn;
1711 0f8a249a blueswir1
                }
1712 0f8a249a blueswir1
            case 0x5:           /* V9 FBPcc */
1713 0f8a249a blueswir1
                {
1714 0f8a249a blueswir1
                    int cc = GET_FIELD_SP(insn, 20, 21);
1715 6ae20372 blueswir1
                    if (gen_trap_ifnofpu(dc, cpu_cond))
1716 a80dde08 bellard
                        goto jmp_insn;
1717 0f8a249a blueswir1
                    target = GET_FIELD_SP(insn, 0, 18);
1718 0f8a249a blueswir1
                    target = sign_extend(target, 19);
1719 0f8a249a blueswir1
                    target <<= 2;
1720 6ae20372 blueswir1
                    do_fbranch(dc, target, insn, cc, cpu_cond);
1721 0f8a249a blueswir1
                    goto jmp_insn;
1722 0f8a249a blueswir1
                }
1723 a4d17f19 blueswir1
#else
1724 0f8a249a blueswir1
            case 0x7:           /* CBN+x */
1725 0f8a249a blueswir1
                {
1726 0f8a249a blueswir1
                    goto ncp_insn;
1727 0f8a249a blueswir1
                }
1728 0f8a249a blueswir1
#endif
1729 0f8a249a blueswir1
            case 0x2:           /* BN+x */
1730 0f8a249a blueswir1
                {
1731 0f8a249a blueswir1
                    target = GET_FIELD(insn, 10, 31);
1732 0f8a249a blueswir1
                    target = sign_extend(target, 22);
1733 0f8a249a blueswir1
                    target <<= 2;
1734 6ae20372 blueswir1
                    do_branch(dc, target, insn, 0, cpu_cond);
1735 0f8a249a blueswir1
                    goto jmp_insn;
1736 0f8a249a blueswir1
                }
1737 0f8a249a blueswir1
            case 0x6:           /* FBN+x */
1738 0f8a249a blueswir1
                {
1739 6ae20372 blueswir1
                    if (gen_trap_ifnofpu(dc, cpu_cond))
1740 a80dde08 bellard
                        goto jmp_insn;
1741 0f8a249a blueswir1
                    target = GET_FIELD(insn, 10, 31);
1742 0f8a249a blueswir1
                    target = sign_extend(target, 22);
1743 0f8a249a blueswir1
                    target <<= 2;
1744 6ae20372 blueswir1
                    do_fbranch(dc, target, insn, 0, cpu_cond);
1745 0f8a249a blueswir1
                    goto jmp_insn;
1746 0f8a249a blueswir1
                }
1747 0f8a249a blueswir1
            case 0x4:           /* SETHI */
1748 0f8a249a blueswir1
                if (rd) { // nop
1749 0f8a249a blueswir1
                    uint32_t value = GET_FIELD(insn, 10, 31);
1750 2ea815ca blueswir1
                    TCGv r_const;
1751 2ea815ca blueswir1
1752 2ea815ca blueswir1
                    r_const = tcg_const_tl(value << 10);
1753 2ea815ca blueswir1
                    gen_movl_TN_reg(rd, r_const);
1754 2ea815ca blueswir1
                    tcg_temp_free(r_const);
1755 0f8a249a blueswir1
                }
1756 0f8a249a blueswir1
                break;
1757 0f8a249a blueswir1
            case 0x0:           /* UNIMPL */
1758 0f8a249a blueswir1
            default:
1759 3475187d bellard
                goto illegal_insn;
1760 0f8a249a blueswir1
            }
1761 0f8a249a blueswir1
            break;
1762 0f8a249a blueswir1
        }
1763 0f8a249a blueswir1
        break;
1764 dc1a6971 Blue Swirl
    case 1:                     /*CALL*/
1765 dc1a6971 Blue Swirl
        {
1766 0f8a249a blueswir1
            target_long target = GET_FIELDs(insn, 2, 31) << 2;
1767 2ea815ca blueswir1
            TCGv r_const;
1768 cf495bcf bellard
1769 2ea815ca blueswir1
            r_const = tcg_const_tl(dc->pc);
1770 2ea815ca blueswir1
            gen_movl_TN_reg(15, r_const);
1771 2ea815ca blueswir1
            tcg_temp_free(r_const);
1772 0f8a249a blueswir1
            target += dc->pc;
1773 6ae20372 blueswir1
            gen_mov_pc_npc(dc, cpu_cond);
1774 0f8a249a blueswir1
            dc->npc = target;
1775 0f8a249a blueswir1
        }
1776 0f8a249a blueswir1
        goto jmp_insn;
1777 0f8a249a blueswir1
    case 2:                     /* FPU & Logical Operations */
1778 0f8a249a blueswir1
        {
1779 0f8a249a blueswir1
            unsigned int xop = GET_FIELD(insn, 7, 12);
1780 0f8a249a blueswir1
            if (xop == 0x3a) {  /* generate trap */
1781 cf495bcf bellard
                int cond;
1782 3475187d bellard
1783 9322a4bf blueswir1
                cpu_src1 = get_src1(insn, cpu_src1);
1784 0f8a249a blueswir1
                if (IS_IMM) {
1785 0f8a249a blueswir1
                    rs2 = GET_FIELD(insn, 25, 31);
1786 6ae20372 blueswir1
                    tcg_gen_addi_tl(cpu_dst, cpu_src1, rs2);
1787 cf495bcf bellard
                } else {
1788 cf495bcf bellard
                    rs2 = GET_FIELD(insn, 27, 31);
1789 0f8a249a blueswir1
                    if (rs2 != 0) {
1790 6ae20372 blueswir1
                        gen_movl_reg_TN(rs2, cpu_src2);
1791 6ae20372 blueswir1
                        tcg_gen_add_tl(cpu_dst, cpu_src1, cpu_src2);
1792 6f551262 blueswir1
                    } else
1793 6f551262 blueswir1
                        tcg_gen_mov_tl(cpu_dst, cpu_src1);
1794 cf495bcf bellard
                }
1795 cf495bcf bellard
                cond = GET_FIELD(insn, 3, 6);
1796 cf495bcf bellard
                if (cond == 0x8) {
1797 6ae20372 blueswir1
                    save_state(dc, cpu_cond);
1798 b158a785 blueswir1
                    if ((dc->def->features & CPU_FEATURE_HYPV) &&
1799 b158a785 blueswir1
                        supervisor(dc))
1800 b158a785 blueswir1
                        tcg_gen_andi_tl(cpu_dst, cpu_dst, UA2005_HTRAP_MASK);
1801 b158a785 blueswir1
                    else
1802 b158a785 blueswir1
                        tcg_gen_andi_tl(cpu_dst, cpu_dst, V8_TRAP_MASK);
1803 b158a785 blueswir1
                    tcg_gen_addi_tl(cpu_dst, cpu_dst, TT_TRAP);
1804 a7812ae4 pbrook
                    tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_dst);
1805 a7812ae4 pbrook
                    gen_helper_raise_exception(cpu_tmp32);
1806 af7bf89b bellard
                } else if (cond != 0) {
1807 a7812ae4 pbrook
                    TCGv r_cond = tcg_temp_new();
1808 b158a785 blueswir1
                    int l1;
1809 3475187d bellard
#ifdef TARGET_SPARC64
1810 0f8a249a blueswir1
                    /* V9 icc/xcc */
1811 0f8a249a blueswir1
                    int cc = GET_FIELD_SP(insn, 11, 12);
1812 748b9d8e blueswir1
1813 6ae20372 blueswir1
                    save_state(dc, cpu_cond);
1814 0f8a249a blueswir1
                    if (cc == 0)
1815 8393617c Blue Swirl
                        gen_cond(r_cond, 0, cond, dc);
1816 0f8a249a blueswir1
                    else if (cc == 2)
1817 8393617c Blue Swirl
                        gen_cond(r_cond, 1, cond, dc);
1818 0f8a249a blueswir1
                    else
1819 0f8a249a blueswir1
                        goto illegal_insn;
1820 3475187d bellard
#else
1821 6ae20372 blueswir1
                    save_state(dc, cpu_cond);
1822 8393617c Blue Swirl
                    gen_cond(r_cond, 0, cond, dc);
1823 3475187d bellard
#endif
1824 b158a785 blueswir1
                    l1 = gen_new_label();
1825 b158a785 blueswir1
                    tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond, 0, l1);
1826 b158a785 blueswir1
1827 b158a785 blueswir1
                    if ((dc->def->features & CPU_FEATURE_HYPV) &&
1828 b158a785 blueswir1
                        supervisor(dc))
1829 b158a785 blueswir1
                        tcg_gen_andi_tl(cpu_dst, cpu_dst, UA2005_HTRAP_MASK);
1830 b158a785 blueswir1
                    else
1831 b158a785 blueswir1
                        tcg_gen_andi_tl(cpu_dst, cpu_dst, V8_TRAP_MASK);
1832 b158a785 blueswir1
                    tcg_gen_addi_tl(cpu_dst, cpu_dst, TT_TRAP);
1833 a7812ae4 pbrook
                    tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_dst);
1834 a7812ae4 pbrook
                    gen_helper_raise_exception(cpu_tmp32);
1835 b158a785 blueswir1
1836 b158a785 blueswir1
                    gen_set_label(l1);
1837 2ea815ca blueswir1
                    tcg_temp_free(r_cond);
1838 cf495bcf bellard
                }
1839 a80dde08 bellard
                gen_op_next_insn();
1840 57fec1fe bellard
                tcg_gen_exit_tb(0);
1841 a80dde08 bellard
                dc->is_br = 1;
1842 a80dde08 bellard
                goto jmp_insn;
1843 cf495bcf bellard
            } else if (xop == 0x28) {
1844 cf495bcf bellard
                rs1 = GET_FIELD(insn, 13, 17);
1845 cf495bcf bellard
                switch(rs1) {
1846 cf495bcf bellard
                case 0: /* rdy */
1847 65fe7b09 blueswir1
#ifndef TARGET_SPARC64
1848 65fe7b09 blueswir1
                case 0x01 ... 0x0e: /* undefined in the SPARCv8
1849 65fe7b09 blueswir1
                                       manual, rdy on the microSPARC
1850 65fe7b09 blueswir1
                                       II */
1851 65fe7b09 blueswir1
                case 0x0f:          /* stbar in the SPARCv8 manual,
1852 65fe7b09 blueswir1
                                       rdy on the microSPARC II */
1853 65fe7b09 blueswir1
                case 0x10 ... 0x1f: /* implementation-dependent in the
1854 65fe7b09 blueswir1
                                       SPARCv8 manual, rdy on the
1855 65fe7b09 blueswir1
                                       microSPARC II */
1856 65fe7b09 blueswir1
#endif
1857 255e1fcb blueswir1
                    gen_movl_TN_reg(rd, cpu_y);
1858 cf495bcf bellard
                    break;
1859 3475187d bellard
#ifdef TARGET_SPARC64
1860 0f8a249a blueswir1
                case 0x2: /* V9 rdccr */
1861 8393617c Blue Swirl
                    gen_helper_compute_psr();
1862 a7812ae4 pbrook
                    gen_helper_rdccr(cpu_dst);
1863 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
1864 3475187d bellard
                    break;
1865 0f8a249a blueswir1
                case 0x3: /* V9 rdasi */
1866 255e1fcb blueswir1
                    tcg_gen_ext_i32_tl(cpu_dst, cpu_asi);
1867 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
1868 3475187d bellard
                    break;
1869 0f8a249a blueswir1
                case 0x4: /* V9 rdtick */
1870 ccd4a219 blueswir1
                    {
1871 a7812ae4 pbrook
                        TCGv_ptr r_tickptr;
1872 ccd4a219 blueswir1
1873 a7812ae4 pbrook
                        r_tickptr = tcg_temp_new_ptr();
1874 ccd4a219 blueswir1
                        tcg_gen_ld_ptr(r_tickptr, cpu_env,
1875 ccd4a219 blueswir1
                                       offsetof(CPUState, tick));
1876 a7812ae4 pbrook
                        gen_helper_tick_get_count(cpu_dst, r_tickptr);
1877 a7812ae4 pbrook
                        tcg_temp_free_ptr(r_tickptr);
1878 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
1879 ccd4a219 blueswir1
                    }
1880 3475187d bellard
                    break;
1881 0f8a249a blueswir1
                case 0x5: /* V9 rdpc */
1882 2ea815ca blueswir1
                    {
1883 2ea815ca blueswir1
                        TCGv r_const;
1884 2ea815ca blueswir1
1885 2ea815ca blueswir1
                        r_const = tcg_const_tl(dc->pc);
1886 2ea815ca blueswir1
                        gen_movl_TN_reg(rd, r_const);
1887 2ea815ca blueswir1
                        tcg_temp_free(r_const);
1888 2ea815ca blueswir1
                    }
1889 0f8a249a blueswir1
                    break;
1890 0f8a249a blueswir1
                case 0x6: /* V9 rdfprs */
1891 255e1fcb blueswir1
                    tcg_gen_ext_i32_tl(cpu_dst, cpu_fprs);
1892 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
1893 3475187d bellard
                    break;
1894 65fe7b09 blueswir1
                case 0xf: /* V9 membar */
1895 65fe7b09 blueswir1
                    break; /* no effect */
1896 0f8a249a blueswir1
                case 0x13: /* Graphics Status */
1897 6ae20372 blueswir1
                    if (gen_trap_ifnofpu(dc, cpu_cond))
1898 725cb90b bellard
                        goto jmp_insn;
1899 255e1fcb blueswir1
                    gen_movl_TN_reg(rd, cpu_gsr);
1900 725cb90b bellard
                    break;
1901 9d926598 blueswir1
                case 0x16: /* Softint */
1902 9d926598 blueswir1
                    tcg_gen_ext_i32_tl(cpu_dst, cpu_softint);
1903 9d926598 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
1904 9d926598 blueswir1
                    break;
1905 0f8a249a blueswir1
                case 0x17: /* Tick compare */
1906 255e1fcb blueswir1
                    gen_movl_TN_reg(rd, cpu_tick_cmpr);
1907 83469015 bellard
                    break;
1908 0f8a249a blueswir1
                case 0x18: /* System tick */
1909 ccd4a219 blueswir1
                    {
1910 a7812ae4 pbrook
                        TCGv_ptr r_tickptr;
1911 ccd4a219 blueswir1
1912 a7812ae4 pbrook
                        r_tickptr = tcg_temp_new_ptr();
1913 ccd4a219 blueswir1
                        tcg_gen_ld_ptr(r_tickptr, cpu_env,
1914 ccd4a219 blueswir1
                                       offsetof(CPUState, stick));
1915 a7812ae4 pbrook
                        gen_helper_tick_get_count(cpu_dst, r_tickptr);
1916 a7812ae4 pbrook
                        tcg_temp_free_ptr(r_tickptr);
1917 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
1918 ccd4a219 blueswir1
                    }
1919 83469015 bellard
                    break;
1920 0f8a249a blueswir1
                case 0x19: /* System tick compare */
1921 255e1fcb blueswir1
                    gen_movl_TN_reg(rd, cpu_stick_cmpr);
1922 83469015 bellard
                    break;
1923 0f8a249a blueswir1
                case 0x10: /* Performance Control */
1924 0f8a249a blueswir1
                case 0x11: /* Performance Instrumentation Counter */
1925 0f8a249a blueswir1
                case 0x12: /* Dispatch Control */
1926 0f8a249a blueswir1
                case 0x14: /* Softint set, WO */
1927 0f8a249a blueswir1
                case 0x15: /* Softint clear, WO */
1928 3475187d bellard
#endif
1929 3475187d bellard
                default:
1930 cf495bcf bellard
                    goto illegal_insn;
1931 cf495bcf bellard
                }
1932 e8af50a3 bellard
#if !defined(CONFIG_USER_ONLY)
1933 e9ebed4d blueswir1
            } else if (xop == 0x29) { /* rdpsr / UA2005 rdhpr */
1934 3475187d bellard
#ifndef TARGET_SPARC64
1935 0f8a249a blueswir1
                if (!supervisor(dc))
1936 0f8a249a blueswir1
                    goto priv_insn;
1937 8393617c Blue Swirl
                gen_helper_compute_psr();
1938 8393617c Blue Swirl
                dc->cc_op = CC_OP_FLAGS;
1939 a7812ae4 pbrook
                gen_helper_rdpsr(cpu_dst);
1940 e9ebed4d blueswir1
#else
1941 fb79ceb9 blueswir1
                CHECK_IU_FEATURE(dc, HYPV);
1942 e9ebed4d blueswir1
                if (!hypervisor(dc))
1943 e9ebed4d blueswir1
                    goto priv_insn;
1944 e9ebed4d blueswir1
                rs1 = GET_FIELD(insn, 13, 17);
1945 e9ebed4d blueswir1
                switch (rs1) {
1946 e9ebed4d blueswir1
                case 0: // hpstate
1947 e9ebed4d blueswir1
                    // gen_op_rdhpstate();
1948 e9ebed4d blueswir1
                    break;
1949 e9ebed4d blueswir1
                case 1: // htstate
1950 e9ebed4d blueswir1
                    // gen_op_rdhtstate();
1951 e9ebed4d blueswir1
                    break;
1952 e9ebed4d blueswir1
                case 3: // hintp
1953 255e1fcb blueswir1
                    tcg_gen_mov_tl(cpu_dst, cpu_hintp);
1954 e9ebed4d blueswir1
                    break;
1955 e9ebed4d blueswir1
                case 5: // htba
1956 255e1fcb blueswir1
                    tcg_gen_mov_tl(cpu_dst, cpu_htba);
1957 e9ebed4d blueswir1
                    break;
1958 e9ebed4d blueswir1
                case 6: // hver
1959 255e1fcb blueswir1
                    tcg_gen_mov_tl(cpu_dst, cpu_hver);
1960 e9ebed4d blueswir1
                    break;
1961 e9ebed4d blueswir1
                case 31: // hstick_cmpr
1962 255e1fcb blueswir1
                    tcg_gen_mov_tl(cpu_dst, cpu_hstick_cmpr);
1963 e9ebed4d blueswir1
                    break;
1964 e9ebed4d blueswir1
                default:
1965 e9ebed4d blueswir1
                    goto illegal_insn;
1966 e9ebed4d blueswir1
                }
1967 e9ebed4d blueswir1
#endif
1968 6ae20372 blueswir1
                gen_movl_TN_reg(rd, cpu_dst);
1969 e8af50a3 bellard
                break;
1970 3475187d bellard
            } else if (xop == 0x2a) { /* rdwim / V9 rdpr */
1971 0f8a249a blueswir1
                if (!supervisor(dc))
1972 0f8a249a blueswir1
                    goto priv_insn;
1973 3475187d bellard
#ifdef TARGET_SPARC64
1974 3475187d bellard
                rs1 = GET_FIELD(insn, 13, 17);
1975 0f8a249a blueswir1
                switch (rs1) {
1976 0f8a249a blueswir1
                case 0: // tpc
1977 375ee38b blueswir1
                    {
1978 a7812ae4 pbrook
                        TCGv_ptr r_tsptr;
1979 375ee38b blueswir1
1980 a7812ae4 pbrook
                        r_tsptr = tcg_temp_new_ptr();
1981 375ee38b blueswir1
                        tcg_gen_ld_ptr(r_tsptr, cpu_env,
1982 375ee38b blueswir1
                                       offsetof(CPUState, tsptr));
1983 a7812ae4 pbrook
                        tcg_gen_ld_tl(cpu_tmp0, r_tsptr,
1984 375ee38b blueswir1
                                      offsetof(trap_state, tpc));
1985 a7812ae4 pbrook
                        tcg_temp_free_ptr(r_tsptr);
1986 375ee38b blueswir1
                    }
1987 0f8a249a blueswir1
                    break;
1988 0f8a249a blueswir1
                case 1: // tnpc
1989 375ee38b blueswir1
                    {
1990 a7812ae4 pbrook
                        TCGv_ptr r_tsptr;
1991 375ee38b blueswir1
1992 a7812ae4 pbrook
                        r_tsptr = tcg_temp_new_ptr();
1993 375ee38b blueswir1
                        tcg_gen_ld_ptr(r_tsptr, cpu_env,
1994 375ee38b blueswir1
                                       offsetof(CPUState, tsptr));
1995 ece43b8d blueswir1
                        tcg_gen_ld_tl(cpu_tmp0, r_tsptr,
1996 375ee38b blueswir1
                                      offsetof(trap_state, tnpc));
1997 a7812ae4 pbrook
                        tcg_temp_free_ptr(r_tsptr);
1998 375ee38b blueswir1
                    }
1999 0f8a249a blueswir1
                    break;
2000 0f8a249a blueswir1
                case 2: // tstate
2001 375ee38b blueswir1
                    {
2002 a7812ae4 pbrook
                        TCGv_ptr r_tsptr;
2003 375ee38b blueswir1
2004 a7812ae4 pbrook
                        r_tsptr = tcg_temp_new_ptr();
2005 375ee38b blueswir1
                        tcg_gen_ld_ptr(r_tsptr, cpu_env,
2006 375ee38b blueswir1
                                       offsetof(CPUState, tsptr));
2007 ece43b8d blueswir1
                        tcg_gen_ld_tl(cpu_tmp0, r_tsptr,
2008 375ee38b blueswir1
                                      offsetof(trap_state, tstate));
2009 a7812ae4 pbrook
                        tcg_temp_free_ptr(r_tsptr);
2010 375ee38b blueswir1
                    }
2011 0f8a249a blueswir1
                    break;
2012 0f8a249a blueswir1
                case 3: // tt
2013 375ee38b blueswir1
                    {
2014 a7812ae4 pbrook
                        TCGv_ptr r_tsptr;
2015 375ee38b blueswir1
2016 a7812ae4 pbrook
                        r_tsptr = tcg_temp_new_ptr();
2017 375ee38b blueswir1
                        tcg_gen_ld_ptr(r_tsptr, cpu_env,
2018 375ee38b blueswir1
                                       offsetof(CPUState, tsptr));
2019 a7812ae4 pbrook
                        tcg_gen_ld_i32(cpu_tmp32, r_tsptr,
2020 375ee38b blueswir1
                                       offsetof(trap_state, tt));
2021 a7812ae4 pbrook
                        tcg_temp_free_ptr(r_tsptr);
2022 a7812ae4 pbrook
                        tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2023 375ee38b blueswir1
                    }
2024 0f8a249a blueswir1
                    break;
2025 0f8a249a blueswir1
                case 4: // tick
2026 ccd4a219 blueswir1
                    {
2027 a7812ae4 pbrook
                        TCGv_ptr r_tickptr;
2028 ccd4a219 blueswir1
2029 a7812ae4 pbrook
                        r_tickptr = tcg_temp_new_ptr();
2030 ccd4a219 blueswir1
                        tcg_gen_ld_ptr(r_tickptr, cpu_env,
2031 ccd4a219 blueswir1
                                       offsetof(CPUState, tick));
2032 a7812ae4 pbrook
                        gen_helper_tick_get_count(cpu_tmp0, r_tickptr);
2033 ece43b8d blueswir1
                        gen_movl_TN_reg(rd, cpu_tmp0);
2034 a7812ae4 pbrook
                        tcg_temp_free_ptr(r_tickptr);
2035 ccd4a219 blueswir1
                    }
2036 0f8a249a blueswir1
                    break;
2037 0f8a249a blueswir1
                case 5: // tba
2038 255e1fcb blueswir1
                    tcg_gen_mov_tl(cpu_tmp0, cpu_tbr);
2039 0f8a249a blueswir1
                    break;
2040 0f8a249a blueswir1
                case 6: // pstate
2041 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2042 77f193da blueswir1
                                   offsetof(CPUSPARCState, pstate));
2043 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2044 0f8a249a blueswir1
                    break;
2045 0f8a249a blueswir1
                case 7: // tl
2046 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2047 77f193da blueswir1
                                   offsetof(CPUSPARCState, tl));
2048 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2049 0f8a249a blueswir1
                    break;
2050 0f8a249a blueswir1
                case 8: // pil
2051 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2052 77f193da blueswir1
                                   offsetof(CPUSPARCState, psrpil));
2053 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2054 0f8a249a blueswir1
                    break;
2055 0f8a249a blueswir1
                case 9: // cwp
2056 a7812ae4 pbrook
                    gen_helper_rdcwp(cpu_tmp0);
2057 0f8a249a blueswir1
                    break;
2058 0f8a249a blueswir1
                case 10: // cansave
2059 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2060 77f193da blueswir1
                                   offsetof(CPUSPARCState, cansave));
2061 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2062 0f8a249a blueswir1
                    break;
2063 0f8a249a blueswir1
                case 11: // canrestore
2064 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2065 77f193da blueswir1
                                   offsetof(CPUSPARCState, canrestore));
2066 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2067 0f8a249a blueswir1
                    break;
2068 0f8a249a blueswir1
                case 12: // cleanwin
2069 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2070 77f193da blueswir1
                                   offsetof(CPUSPARCState, cleanwin));
2071 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2072 0f8a249a blueswir1
                    break;
2073 0f8a249a blueswir1
                case 13: // otherwin
2074 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2075 77f193da blueswir1
                                   offsetof(CPUSPARCState, otherwin));
2076 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2077 0f8a249a blueswir1
                    break;
2078 0f8a249a blueswir1
                case 14: // wstate
2079 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2080 77f193da blueswir1
                                   offsetof(CPUSPARCState, wstate));
2081 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2082 0f8a249a blueswir1
                    break;
2083 e9ebed4d blueswir1
                case 16: // UA2005 gl
2084 fb79ceb9 blueswir1
                    CHECK_IU_FEATURE(dc, GL);
2085 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2086 77f193da blueswir1
                                   offsetof(CPUSPARCState, gl));
2087 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2088 e9ebed4d blueswir1
                    break;
2089 e9ebed4d blueswir1
                case 26: // UA2005 strand status
2090 fb79ceb9 blueswir1
                    CHECK_IU_FEATURE(dc, HYPV);
2091 e9ebed4d blueswir1
                    if (!hypervisor(dc))
2092 e9ebed4d blueswir1
                        goto priv_insn;
2093 527067d8 blueswir1
                    tcg_gen_mov_tl(cpu_tmp0, cpu_ssr);
2094 e9ebed4d blueswir1
                    break;
2095 0f8a249a blueswir1
                case 31: // ver
2096 255e1fcb blueswir1
                    tcg_gen_mov_tl(cpu_tmp0, cpu_ver);
2097 0f8a249a blueswir1
                    break;
2098 0f8a249a blueswir1
                case 15: // fq
2099 0f8a249a blueswir1
                default:
2100 0f8a249a blueswir1
                    goto illegal_insn;
2101 0f8a249a blueswir1
                }
2102 3475187d bellard
#else
2103 255e1fcb blueswir1
                tcg_gen_ext_i32_tl(cpu_tmp0, cpu_wim);
2104 3475187d bellard
#endif
2105 ece43b8d blueswir1
                gen_movl_TN_reg(rd, cpu_tmp0);
2106 e8af50a3 bellard
                break;
2107 3475187d bellard
            } else if (xop == 0x2b) { /* rdtbr / V9 flushw */
2108 3475187d bellard
#ifdef TARGET_SPARC64
2109 c5f2f668 blueswir1
                save_state(dc, cpu_cond);
2110 a7812ae4 pbrook
                gen_helper_flushw();
2111 3475187d bellard
#else
2112 0f8a249a blueswir1
                if (!supervisor(dc))
2113 0f8a249a blueswir1
                    goto priv_insn;
2114 255e1fcb blueswir1
                gen_movl_TN_reg(rd, cpu_tbr);
2115 3475187d bellard
#endif
2116 e8af50a3 bellard
                break;
2117 e8af50a3 bellard
#endif
2118 0f8a249a blueswir1
            } else if (xop == 0x34) {   /* FPU Operations */
2119 6ae20372 blueswir1
                if (gen_trap_ifnofpu(dc, cpu_cond))
2120 a80dde08 bellard
                    goto jmp_insn;
2121 0f8a249a blueswir1
                gen_op_clear_ieee_excp_and_FTT();
2122 e8af50a3 bellard
                rs1 = GET_FIELD(insn, 13, 17);
2123 0f8a249a blueswir1
                rs2 = GET_FIELD(insn, 27, 31);
2124 0f8a249a blueswir1
                xop = GET_FIELD(insn, 18, 26);
2125 0f8a249a blueswir1
                switch (xop) {
2126 dc1a6971 Blue Swirl
                case 0x1: /* fmovs */
2127 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_fpr[rs2]);
2128 dc1a6971 Blue Swirl
                    break;
2129 dc1a6971 Blue Swirl
                case 0x5: /* fnegs */
2130 dc1a6971 Blue Swirl
                    gen_helper_fnegs(cpu_fpr[rd], cpu_fpr[rs2]);
2131 dc1a6971 Blue Swirl
                    break;
2132 dc1a6971 Blue Swirl
                case 0x9: /* fabss */
2133 dc1a6971 Blue Swirl
                    gen_helper_fabss(cpu_fpr[rd], cpu_fpr[rs2]);
2134 dc1a6971 Blue Swirl
                    break;
2135 dc1a6971 Blue Swirl
                case 0x29: /* fsqrts */
2136 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FSQRT);
2137 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2138 dc1a6971 Blue Swirl
                    gen_helper_fsqrts(cpu_tmp32, cpu_fpr[rs2]);
2139 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2140 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
2141 dc1a6971 Blue Swirl
                    break;
2142 dc1a6971 Blue Swirl
                case 0x2a: /* fsqrtd */
2143 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FSQRT);
2144 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2145 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2146 dc1a6971 Blue Swirl
                    gen_helper_fsqrtd();
2147 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2148 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2149 dc1a6971 Blue Swirl
                    break;
2150 dc1a6971 Blue Swirl
                case 0x2b: /* fsqrtq */
2151 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2152 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT1(QFPREG(rs2));
2153 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2154 dc1a6971 Blue Swirl
                    gen_helper_fsqrtq();
2155 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2156 dc1a6971 Blue Swirl
                    gen_op_store_QT0_fpr(QFPREG(rd));
2157 dc1a6971 Blue Swirl
                    break;
2158 dc1a6971 Blue Swirl
                case 0x41: /* fadds */
2159 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2160 dc1a6971 Blue Swirl
                    gen_helper_fadds(cpu_tmp32, cpu_fpr[rs1], cpu_fpr[rs2]);
2161 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2162 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
2163 dc1a6971 Blue Swirl
                    break;
2164 dc1a6971 Blue Swirl
                case 0x42: /* faddd */
2165 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT0(DFPREG(rs1));
2166 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2167 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2168 dc1a6971 Blue Swirl
                    gen_helper_faddd();
2169 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2170 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2171 dc1a6971 Blue Swirl
                    break;
2172 dc1a6971 Blue Swirl
                case 0x43: /* faddq */
2173 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2174 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT0(QFPREG(rs1));
2175 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT1(QFPREG(rs2));
2176 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2177 dc1a6971 Blue Swirl
                    gen_helper_faddq();
2178 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2179 dc1a6971 Blue Swirl
                    gen_op_store_QT0_fpr(QFPREG(rd));
2180 dc1a6971 Blue Swirl
                    break;
2181 dc1a6971 Blue Swirl
                case 0x45: /* fsubs */
2182 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2183 dc1a6971 Blue Swirl
                    gen_helper_fsubs(cpu_tmp32, cpu_fpr[rs1], cpu_fpr[rs2]);
2184 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2185 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
2186 dc1a6971 Blue Swirl
                    break;
2187 dc1a6971 Blue Swirl
                case 0x46: /* fsubd */
2188 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT0(DFPREG(rs1));
2189 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2190 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2191 dc1a6971 Blue Swirl
                    gen_helper_fsubd();
2192 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2193 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2194 dc1a6971 Blue Swirl
                    break;
2195 dc1a6971 Blue Swirl
                case 0x47: /* fsubq */
2196 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2197 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT0(QFPREG(rs1));
2198 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT1(QFPREG(rs2));
2199 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2200 dc1a6971 Blue Swirl
                    gen_helper_fsubq();
2201 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2202 dc1a6971 Blue Swirl
                    gen_op_store_QT0_fpr(QFPREG(rd));
2203 dc1a6971 Blue Swirl
                    break;
2204 dc1a6971 Blue Swirl
                case 0x49: /* fmuls */
2205 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FMUL);
2206 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2207 dc1a6971 Blue Swirl
                    gen_helper_fmuls(cpu_tmp32, cpu_fpr[rs1], cpu_fpr[rs2]);
2208 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2209 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
2210 dc1a6971 Blue Swirl
                    break;
2211 dc1a6971 Blue Swirl
                case 0x4a: /* fmuld */
2212 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FMUL);
2213 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT0(DFPREG(rs1));
2214 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2215 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2216 dc1a6971 Blue Swirl
                    gen_helper_fmuld();
2217 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2218 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2219 dc1a6971 Blue Swirl
                    break;
2220 dc1a6971 Blue Swirl
                case 0x4b: /* fmulq */
2221 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2222 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FMUL);
2223 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT0(QFPREG(rs1));
2224 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT1(QFPREG(rs2));
2225 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2226 dc1a6971 Blue Swirl
                    gen_helper_fmulq();
2227 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2228 dc1a6971 Blue Swirl
                    gen_op_store_QT0_fpr(QFPREG(rd));
2229 dc1a6971 Blue Swirl
                    break;
2230 dc1a6971 Blue Swirl
                case 0x4d: /* fdivs */
2231 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2232 dc1a6971 Blue Swirl
                    gen_helper_fdivs(cpu_tmp32, cpu_fpr[rs1], cpu_fpr[rs2]);
2233 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2234 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
2235 dc1a6971 Blue Swirl
                    break;
2236 dc1a6971 Blue Swirl
                case 0x4e: /* fdivd */
2237 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT0(DFPREG(rs1));
2238 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2239 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2240 dc1a6971 Blue Swirl
                    gen_helper_fdivd();
2241 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2242 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2243 dc1a6971 Blue Swirl
                    break;
2244 dc1a6971 Blue Swirl
                case 0x4f: /* fdivq */
2245 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2246 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT0(QFPREG(rs1));
2247 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT1(QFPREG(rs2));
2248 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2249 dc1a6971 Blue Swirl
                    gen_helper_fdivq();
2250 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2251 dc1a6971 Blue Swirl
                    gen_op_store_QT0_fpr(QFPREG(rd));
2252 dc1a6971 Blue Swirl
                    break;
2253 dc1a6971 Blue Swirl
                case 0x69: /* fsmuld */
2254 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FSMULD);
2255 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2256 dc1a6971 Blue Swirl
                    gen_helper_fsmuld(cpu_fpr[rs1], cpu_fpr[rs2]);
2257 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2258 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2259 dc1a6971 Blue Swirl
                    break;
2260 dc1a6971 Blue Swirl
                case 0x6e: /* fdmulq */
2261 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2262 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT0(DFPREG(rs1));
2263 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2264 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2265 dc1a6971 Blue Swirl
                    gen_helper_fdmulq();
2266 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2267 dc1a6971 Blue Swirl
                    gen_op_store_QT0_fpr(QFPREG(rd));
2268 dc1a6971 Blue Swirl
                    break;
2269 dc1a6971 Blue Swirl
                case 0xc4: /* fitos */
2270 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2271 dc1a6971 Blue Swirl
                    gen_helper_fitos(cpu_tmp32, cpu_fpr[rs2]);
2272 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2273 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
2274 dc1a6971 Blue Swirl
                    break;
2275 dc1a6971 Blue Swirl
                case 0xc6: /* fdtos */
2276 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2277 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2278 dc1a6971 Blue Swirl
                    gen_helper_fdtos(cpu_tmp32);
2279 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2280 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
2281 dc1a6971 Blue Swirl
                    break;
2282 dc1a6971 Blue Swirl
                case 0xc7: /* fqtos */
2283 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2284 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT1(QFPREG(rs2));
2285 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2286 dc1a6971 Blue Swirl
                    gen_helper_fqtos(cpu_tmp32);
2287 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2288 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
2289 dc1a6971 Blue Swirl
                    break;
2290 dc1a6971 Blue Swirl
                case 0xc8: /* fitod */
2291 dc1a6971 Blue Swirl
                    gen_helper_fitod(cpu_fpr[rs2]);
2292 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2293 dc1a6971 Blue Swirl
                    break;
2294 dc1a6971 Blue Swirl
                case 0xc9: /* fstod */
2295 dc1a6971 Blue Swirl
                    gen_helper_fstod(cpu_fpr[rs2]);
2296 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2297 dc1a6971 Blue Swirl
                    break;
2298 dc1a6971 Blue Swirl
                case 0xcb: /* fqtod */
2299 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2300 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT1(QFPREG(rs2));
2301 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2302 dc1a6971 Blue Swirl
                    gen_helper_fqtod();
2303 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2304 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2305 dc1a6971 Blue Swirl
                    break;
2306 dc1a6971 Blue Swirl
                case 0xcc: /* fitoq */
2307 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2308 dc1a6971 Blue Swirl
                    gen_helper_fitoq(cpu_fpr[rs2]);
2309 dc1a6971 Blue Swirl
                    gen_op_store_QT0_fpr(QFPREG(rd));
2310 dc1a6971 Blue Swirl
                    break;
2311 dc1a6971 Blue Swirl
                case 0xcd: /* fstoq */
2312 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2313 dc1a6971 Blue Swirl
                    gen_helper_fstoq(cpu_fpr[rs2]);
2314 dc1a6971 Blue Swirl
                    gen_op_store_QT0_fpr(QFPREG(rd));
2315 dc1a6971 Blue Swirl
                    break;
2316 dc1a6971 Blue Swirl
                case 0xce: /* fdtoq */
2317 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2318 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2319 dc1a6971 Blue Swirl
                    gen_helper_fdtoq();
2320 dc1a6971 Blue Swirl
                    gen_op_store_QT0_fpr(QFPREG(rd));
2321 dc1a6971 Blue Swirl
                    break;
2322 dc1a6971 Blue Swirl
                case 0xd1: /* fstoi */
2323 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2324 dc1a6971 Blue Swirl
                    gen_helper_fstoi(cpu_tmp32, cpu_fpr[rs2]);
2325 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2326 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
2327 dc1a6971 Blue Swirl
                    break;
2328 dc1a6971 Blue Swirl
                case 0xd2: /* fdtoi */
2329 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2330 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2331 dc1a6971 Blue Swirl
                    gen_helper_fdtoi(cpu_tmp32);
2332 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2333 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
2334 dc1a6971 Blue Swirl
                    break;
2335 dc1a6971 Blue Swirl
                case 0xd3: /* fqtoi */
2336 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2337 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT1(QFPREG(rs2));
2338 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2339 dc1a6971 Blue Swirl
                    gen_helper_fqtoi(cpu_tmp32);
2340 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2341 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
2342 dc1a6971 Blue Swirl
                    break;
2343 3475187d bellard
#ifdef TARGET_SPARC64
2344 dc1a6971 Blue Swirl
                case 0x2: /* V9 fmovd */
2345 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs2)]);
2346 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[DFPREG(rd) + 1],
2347 dc1a6971 Blue Swirl
                                    cpu_fpr[DFPREG(rs2) + 1]);
2348 dc1a6971 Blue Swirl
                    break;
2349 dc1a6971 Blue Swirl
                case 0x3: /* V9 fmovq */
2350 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2351 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[QFPREG(rd)], cpu_fpr[QFPREG(rs2)]);
2352 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 1],
2353 dc1a6971 Blue Swirl
                                    cpu_fpr[QFPREG(rs2) + 1]);
2354 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 2],
2355 dc1a6971 Blue Swirl
                                    cpu_fpr[QFPREG(rs2) + 2]);
2356 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 3],
2357 dc1a6971 Blue Swirl
                                    cpu_fpr[QFPREG(rs2) + 3]);
2358 dc1a6971 Blue Swirl
                    break;
2359 dc1a6971 Blue Swirl
                case 0x6: /* V9 fnegd */
2360 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2361 dc1a6971 Blue Swirl
                    gen_helper_fnegd();
2362 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2363 dc1a6971 Blue Swirl
                    break;
2364 dc1a6971 Blue Swirl
                case 0x7: /* V9 fnegq */
2365 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2366 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT1(QFPREG(rs2));
2367 dc1a6971 Blue Swirl
                    gen_helper_fnegq();
2368 dc1a6971 Blue Swirl
                    gen_op_store_QT0_fpr(QFPREG(rd));
2369 dc1a6971 Blue Swirl
                    break;
2370 dc1a6971 Blue Swirl
                case 0xa: /* V9 fabsd */
2371 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2372 dc1a6971 Blue Swirl
                    gen_helper_fabsd();
2373 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2374 dc1a6971 Blue Swirl
                    break;
2375 dc1a6971 Blue Swirl
                case 0xb: /* V9 fabsq */
2376 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2377 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT1(QFPREG(rs2));
2378 dc1a6971 Blue Swirl
                    gen_helper_fabsq();
2379 dc1a6971 Blue Swirl
                    gen_op_store_QT0_fpr(QFPREG(rd));
2380 dc1a6971 Blue Swirl
                    break;
2381 dc1a6971 Blue Swirl
                case 0x81: /* V9 fstox */
2382 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2383 dc1a6971 Blue Swirl
                    gen_helper_fstox(cpu_fpr[rs2]);
2384 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2385 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2386 dc1a6971 Blue Swirl
                    break;
2387 dc1a6971 Blue Swirl
                case 0x82: /* V9 fdtox */
2388 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2389 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2390 dc1a6971 Blue Swirl
                    gen_helper_fdtox();
2391 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2392 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2393 dc1a6971 Blue Swirl
                    break;
2394 dc1a6971 Blue Swirl
                case 0x83: /* V9 fqtox */
2395 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2396 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT1(QFPREG(rs2));
2397 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2398 dc1a6971 Blue Swirl
                    gen_helper_fqtox();
2399 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2400 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2401 dc1a6971 Blue Swirl
                    break;
2402 dc1a6971 Blue Swirl
                case 0x84: /* V9 fxtos */
2403 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2404 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2405 dc1a6971 Blue Swirl
                    gen_helper_fxtos(cpu_tmp32);
2406 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2407 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
2408 dc1a6971 Blue Swirl
                    break;
2409 dc1a6971 Blue Swirl
                case 0x88: /* V9 fxtod */
2410 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2411 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2412 dc1a6971 Blue Swirl
                    gen_helper_fxtod();
2413 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2414 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2415 dc1a6971 Blue Swirl
                    break;
2416 dc1a6971 Blue Swirl
                case 0x8c: /* V9 fxtoq */
2417 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2418 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2419 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2420 dc1a6971 Blue Swirl
                    gen_helper_fxtoq();
2421 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2422 dc1a6971 Blue Swirl
                    gen_op_store_QT0_fpr(QFPREG(rd));
2423 dc1a6971 Blue Swirl
                    break;
2424 1f587329 blueswir1
#endif
2425 dc1a6971 Blue Swirl
                default:
2426 dc1a6971 Blue Swirl
                    goto illegal_insn;
2427 0f8a249a blueswir1
                }
2428 0f8a249a blueswir1
            } else if (xop == 0x35) {   /* FPU Operations */
2429 3475187d bellard
#ifdef TARGET_SPARC64
2430 0f8a249a blueswir1
                int cond;
2431 3475187d bellard
#endif
2432 6ae20372 blueswir1
                if (gen_trap_ifnofpu(dc, cpu_cond))
2433 a80dde08 bellard
                    goto jmp_insn;
2434 0f8a249a blueswir1
                gen_op_clear_ieee_excp_and_FTT();
2435 cf495bcf bellard
                rs1 = GET_FIELD(insn, 13, 17);
2436 0f8a249a blueswir1
                rs2 = GET_FIELD(insn, 27, 31);
2437 0f8a249a blueswir1
                xop = GET_FIELD(insn, 18, 26);
2438 3475187d bellard
#ifdef TARGET_SPARC64
2439 0f8a249a blueswir1
                if ((xop & 0x11f) == 0x005) { // V9 fmovsr
2440 dcf24905 blueswir1
                    int l1;
2441 dcf24905 blueswir1
2442 dcf24905 blueswir1
                    l1 = gen_new_label();
2443 0f8a249a blueswir1
                    cond = GET_FIELD_SP(insn, 14, 17);
2444 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
2445 cb63669a pbrook
                    tcg_gen_brcondi_tl(gen_tcg_cond_reg[cond], cpu_src1,
2446 cb63669a pbrook
                                       0, l1);
2447 714547bb blueswir1
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_fpr[rs2]);
2448 dcf24905 blueswir1
                    gen_set_label(l1);
2449 0f8a249a blueswir1
                    break;
2450 0f8a249a blueswir1
                } else if ((xop & 0x11f) == 0x006) { // V9 fmovdr
2451 dcf24905 blueswir1
                    int l1;
2452 dcf24905 blueswir1
2453 dcf24905 blueswir1
                    l1 = gen_new_label();
2454 0f8a249a blueswir1
                    cond = GET_FIELD_SP(insn, 14, 17);
2455 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
2456 cb63669a pbrook
                    tcg_gen_brcondi_tl(gen_tcg_cond_reg[cond], cpu_src1,
2457 cb63669a pbrook
                                       0, l1);
2458 714547bb blueswir1
                    tcg_gen_mov_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs2)]);
2459 714547bb blueswir1
                    tcg_gen_mov_i32(cpu_fpr[DFPREG(rd) + 1], cpu_fpr[DFPREG(rs2) + 1]);
2460 dcf24905 blueswir1
                    gen_set_label(l1);
2461 0f8a249a blueswir1
                    break;
2462 0f8a249a blueswir1
                } else if ((xop & 0x11f) == 0x007) { // V9 fmovqr
2463 dcf24905 blueswir1
                    int l1;
2464 dcf24905 blueswir1
2465 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2466 dcf24905 blueswir1
                    l1 = gen_new_label();
2467 1f587329 blueswir1
                    cond = GET_FIELD_SP(insn, 14, 17);
2468 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
2469 cb63669a pbrook
                    tcg_gen_brcondi_tl(gen_tcg_cond_reg[cond], cpu_src1,
2470 cb63669a pbrook
                                       0, l1);
2471 714547bb blueswir1
                    tcg_gen_mov_i32(cpu_fpr[QFPREG(rd)], cpu_fpr[QFPREG(rs2)]);
2472 714547bb blueswir1
                    tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 1], cpu_fpr[QFPREG(rs2) + 1]);
2473 714547bb blueswir1
                    tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 2], cpu_fpr[QFPREG(rs2) + 2]);
2474 714547bb blueswir1
                    tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 3], cpu_fpr[QFPREG(rs2) + 3]);
2475 dcf24905 blueswir1
                    gen_set_label(l1);
2476 1f587329 blueswir1
                    break;
2477 0f8a249a blueswir1
                }
2478 0f8a249a blueswir1
#endif
2479 0f8a249a blueswir1
                switch (xop) {
2480 3475187d bellard
#ifdef TARGET_SPARC64
2481 714547bb blueswir1
#define FMOVSCC(fcc)                                                    \
2482 19f329ad blueswir1
                    {                                                   \
2483 0425bee5 blueswir1
                        TCGv r_cond;                                    \
2484 19f329ad blueswir1
                        int l1;                                         \
2485 19f329ad blueswir1
                                                                        \
2486 19f329ad blueswir1
                        l1 = gen_new_label();                           \
2487 dc1a6971 Blue Swirl
                        r_cond = tcg_temp_new();                        \
2488 19f329ad blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);              \
2489 19f329ad blueswir1
                        gen_fcond(r_cond, fcc, cond);                   \
2490 cb63669a pbrook
                        tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond,         \
2491 cb63669a pbrook
                                           0, l1);                      \
2492 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[rd], cpu_fpr[rs2]);     \
2493 714547bb blueswir1
                        gen_set_label(l1);                              \
2494 714547bb blueswir1
                        tcg_temp_free(r_cond);                          \
2495 714547bb blueswir1
                    }
2496 714547bb blueswir1
#define FMOVDCC(fcc)                                                    \
2497 714547bb blueswir1
                    {                                                   \
2498 714547bb blueswir1
                        TCGv r_cond;                                    \
2499 714547bb blueswir1
                        int l1;                                         \
2500 714547bb blueswir1
                                                                        \
2501 714547bb blueswir1
                        l1 = gen_new_label();                           \
2502 dc1a6971 Blue Swirl
                        r_cond = tcg_temp_new();                        \
2503 714547bb blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);              \
2504 714547bb blueswir1
                        gen_fcond(r_cond, fcc, cond);                   \
2505 714547bb blueswir1
                        tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond,         \
2506 714547bb blueswir1
                                           0, l1);                      \
2507 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[DFPREG(rd)],            \
2508 714547bb blueswir1
                                        cpu_fpr[DFPREG(rs2)]);          \
2509 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[DFPREG(rd) + 1],        \
2510 714547bb blueswir1
                                        cpu_fpr[DFPREG(rs2) + 1]);      \
2511 714547bb blueswir1
                        gen_set_label(l1);                              \
2512 714547bb blueswir1
                        tcg_temp_free(r_cond);                          \
2513 714547bb blueswir1
                    }
2514 714547bb blueswir1
#define FMOVQCC(fcc)                                                    \
2515 714547bb blueswir1
                    {                                                   \
2516 714547bb blueswir1
                        TCGv r_cond;                                    \
2517 714547bb blueswir1
                        int l1;                                         \
2518 714547bb blueswir1
                                                                        \
2519 714547bb blueswir1
                        l1 = gen_new_label();                           \
2520 dc1a6971 Blue Swirl
                        r_cond = tcg_temp_new();                        \
2521 714547bb blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);              \
2522 714547bb blueswir1
                        gen_fcond(r_cond, fcc, cond);                   \
2523 714547bb blueswir1
                        tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond,         \
2524 714547bb blueswir1
                                           0, l1);                      \
2525 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[QFPREG(rd)],            \
2526 714547bb blueswir1
                                        cpu_fpr[QFPREG(rs2)]);          \
2527 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 1],        \
2528 714547bb blueswir1
                                        cpu_fpr[QFPREG(rs2) + 1]);      \
2529 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 2],        \
2530 714547bb blueswir1
                                        cpu_fpr[QFPREG(rs2) + 2]);      \
2531 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 3],        \
2532 714547bb blueswir1
                                        cpu_fpr[QFPREG(rs2) + 3]);      \
2533 19f329ad blueswir1
                        gen_set_label(l1);                              \
2534 2ea815ca blueswir1
                        tcg_temp_free(r_cond);                          \
2535 19f329ad blueswir1
                    }
2536 0f8a249a blueswir1
                    case 0x001: /* V9 fmovscc %fcc0 */
2537 714547bb blueswir1
                        FMOVSCC(0);
2538 0f8a249a blueswir1
                        break;
2539 0f8a249a blueswir1
                    case 0x002: /* V9 fmovdcc %fcc0 */
2540 714547bb blueswir1
                        FMOVDCC(0);
2541 0f8a249a blueswir1
                        break;
2542 0f8a249a blueswir1
                    case 0x003: /* V9 fmovqcc %fcc0 */
2543 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2544 714547bb blueswir1
                        FMOVQCC(0);
2545 1f587329 blueswir1
                        break;
2546 0f8a249a blueswir1
                    case 0x041: /* V9 fmovscc %fcc1 */
2547 714547bb blueswir1
                        FMOVSCC(1);
2548 0f8a249a blueswir1
                        break;
2549 0f8a249a blueswir1
                    case 0x042: /* V9 fmovdcc %fcc1 */
2550 714547bb blueswir1
                        FMOVDCC(1);
2551 0f8a249a blueswir1
                        break;
2552 0f8a249a blueswir1
                    case 0x043: /* V9 fmovqcc %fcc1 */
2553 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2554 714547bb blueswir1
                        FMOVQCC(1);
2555 1f587329 blueswir1
                        break;
2556 0f8a249a blueswir1
                    case 0x081: /* V9 fmovscc %fcc2 */
2557 714547bb blueswir1
                        FMOVSCC(2);
2558 0f8a249a blueswir1
                        break;
2559 0f8a249a blueswir1
                    case 0x082: /* V9 fmovdcc %fcc2 */
2560 714547bb blueswir1
                        FMOVDCC(2);
2561 0f8a249a blueswir1
                        break;
2562 0f8a249a blueswir1
                    case 0x083: /* V9 fmovqcc %fcc2 */
2563 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2564 714547bb blueswir1
                        FMOVQCC(2);
2565 1f587329 blueswir1
                        break;
2566 0f8a249a blueswir1
                    case 0x0c1: /* V9 fmovscc %fcc3 */
2567 714547bb blueswir1
                        FMOVSCC(3);
2568 0f8a249a blueswir1
                        break;
2569 0f8a249a blueswir1
                    case 0x0c2: /* V9 fmovdcc %fcc3 */
2570 714547bb blueswir1
                        FMOVDCC(3);
2571 0f8a249a blueswir1
                        break;
2572 0f8a249a blueswir1
                    case 0x0c3: /* V9 fmovqcc %fcc3 */
2573 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2574 714547bb blueswir1
                        FMOVQCC(3);
2575 1f587329 blueswir1
                        break;
2576 714547bb blueswir1
#undef FMOVSCC
2577 714547bb blueswir1
#undef FMOVDCC
2578 714547bb blueswir1
#undef FMOVQCC
2579 714547bb blueswir1
#define FMOVSCC(icc)                                                    \
2580 714547bb blueswir1
                    {                                                   \
2581 714547bb blueswir1
                        TCGv r_cond;                                    \
2582 714547bb blueswir1
                        int l1;                                         \
2583 714547bb blueswir1
                                                                        \
2584 714547bb blueswir1
                        l1 = gen_new_label();                           \
2585 dc1a6971 Blue Swirl
                        r_cond = tcg_temp_new();                        \
2586 714547bb blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);              \
2587 8393617c Blue Swirl
                        gen_cond(r_cond, icc, cond, dc);                \
2588 714547bb blueswir1
                        tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond,         \
2589 714547bb blueswir1
                                           0, l1);                      \
2590 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[rd], cpu_fpr[rs2]);     \
2591 714547bb blueswir1
                        gen_set_label(l1);                              \
2592 714547bb blueswir1
                        tcg_temp_free(r_cond);                          \
2593 714547bb blueswir1
                    }
2594 714547bb blueswir1
#define FMOVDCC(icc)                                                    \
2595 714547bb blueswir1
                    {                                                   \
2596 714547bb blueswir1
                        TCGv r_cond;                                    \
2597 714547bb blueswir1
                        int l1;                                         \
2598 714547bb blueswir1
                                                                        \
2599 714547bb blueswir1
                        l1 = gen_new_label();                           \
2600 dc1a6971 Blue Swirl
                        r_cond = tcg_temp_new();                        \
2601 714547bb blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);              \
2602 8393617c Blue Swirl
                        gen_cond(r_cond, icc, cond, dc);                \
2603 714547bb blueswir1
                        tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond,         \
2604 714547bb blueswir1
                                           0, l1);                      \
2605 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[DFPREG(rd)],            \
2606 714547bb blueswir1
                                        cpu_fpr[DFPREG(rs2)]);          \
2607 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[DFPREG(rd) + 1],        \
2608 714547bb blueswir1
                                        cpu_fpr[DFPREG(rs2) + 1]);      \
2609 714547bb blueswir1
                        gen_set_label(l1);                              \
2610 714547bb blueswir1
                        tcg_temp_free(r_cond);                          \
2611 714547bb blueswir1
                    }
2612 714547bb blueswir1
#define FMOVQCC(icc)                                                    \
2613 714547bb blueswir1
                    {                                                   \
2614 714547bb blueswir1
                        TCGv r_cond;                                    \
2615 714547bb blueswir1
                        int l1;                                         \
2616 714547bb blueswir1
                                                                        \
2617 714547bb blueswir1
                        l1 = gen_new_label();                           \
2618 dc1a6971 Blue Swirl
                        r_cond = tcg_temp_new();                        \
2619 714547bb blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);              \
2620 8393617c Blue Swirl
                        gen_cond(r_cond, icc, cond, dc);                \
2621 714547bb blueswir1
                        tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond,         \
2622 714547bb blueswir1
                                           0, l1);                      \
2623 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[QFPREG(rd)],            \
2624 714547bb blueswir1
                                        cpu_fpr[QFPREG(rs2)]);          \
2625 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 1],        \
2626 714547bb blueswir1
                                        cpu_fpr[QFPREG(rs2) + 1]);      \
2627 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 2],        \
2628 714547bb blueswir1
                                        cpu_fpr[QFPREG(rs2) + 2]);      \
2629 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 3],        \
2630 714547bb blueswir1
                                        cpu_fpr[QFPREG(rs2) + 3]);      \
2631 714547bb blueswir1
                        gen_set_label(l1);                              \
2632 714547bb blueswir1
                        tcg_temp_free(r_cond);                          \
2633 714547bb blueswir1
                    }
2634 19f329ad blueswir1
2635 0f8a249a blueswir1
                    case 0x101: /* V9 fmovscc %icc */
2636 714547bb blueswir1
                        FMOVSCC(0);
2637 0f8a249a blueswir1
                        break;
2638 0f8a249a blueswir1
                    case 0x102: /* V9 fmovdcc %icc */
2639 714547bb blueswir1
                        FMOVDCC(0);
2640 0f8a249a blueswir1
                    case 0x103: /* V9 fmovqcc %icc */
2641 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2642 714547bb blueswir1
                        FMOVQCC(0);
2643 1f587329 blueswir1
                        break;
2644 0f8a249a blueswir1
                    case 0x181: /* V9 fmovscc %xcc */
2645 714547bb blueswir1
                        FMOVSCC(1);
2646 0f8a249a blueswir1
                        break;
2647 0f8a249a blueswir1
                    case 0x182: /* V9 fmovdcc %xcc */
2648 714547bb blueswir1
                        FMOVDCC(1);
2649 0f8a249a blueswir1
                        break;
2650 0f8a249a blueswir1
                    case 0x183: /* V9 fmovqcc %xcc */
2651 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2652 714547bb blueswir1
                        FMOVQCC(1);
2653 1f587329 blueswir1
                        break;
2654 714547bb blueswir1
#undef FMOVSCC
2655 714547bb blueswir1
#undef FMOVDCC
2656 714547bb blueswir1
#undef FMOVQCC
2657 1f587329 blueswir1
#endif
2658 1f587329 blueswir1
                    case 0x51: /* fcmps, V9 %fcc */
2659 714547bb blueswir1
                        gen_op_fcmps(rd & 3, cpu_fpr[rs1], cpu_fpr[rs2]);
2660 0f8a249a blueswir1
                        break;
2661 1f587329 blueswir1
                    case 0x52: /* fcmpd, V9 %fcc */
2662 0f8a249a blueswir1
                        gen_op_load_fpr_DT0(DFPREG(rs1));
2663 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
2664 7e8c2b6c blueswir1
                        gen_op_fcmpd(rd & 3);
2665 0f8a249a blueswir1
                        break;
2666 1f587329 blueswir1
                    case 0x53: /* fcmpq, V9 %fcc */
2667 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2668 1f587329 blueswir1
                        gen_op_load_fpr_QT0(QFPREG(rs1));
2669 1f587329 blueswir1
                        gen_op_load_fpr_QT1(QFPREG(rs2));
2670 7e8c2b6c blueswir1
                        gen_op_fcmpq(rd & 3);
2671 1f587329 blueswir1
                        break;
2672 0f8a249a blueswir1
                    case 0x55: /* fcmpes, V9 %fcc */
2673 714547bb blueswir1
                        gen_op_fcmpes(rd & 3, cpu_fpr[rs1], cpu_fpr[rs2]);
2674 0f8a249a blueswir1
                        break;
2675 0f8a249a blueswir1
                    case 0x56: /* fcmped, V9 %fcc */
2676 0f8a249a blueswir1
                        gen_op_load_fpr_DT0(DFPREG(rs1));
2677 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
2678 7e8c2b6c blueswir1
                        gen_op_fcmped(rd & 3);
2679 0f8a249a blueswir1
                        break;
2680 1f587329 blueswir1
                    case 0x57: /* fcmpeq, V9 %fcc */
2681 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2682 1f587329 blueswir1
                        gen_op_load_fpr_QT0(QFPREG(rs1));
2683 1f587329 blueswir1
                        gen_op_load_fpr_QT1(QFPREG(rs2));
2684 7e8c2b6c blueswir1
                        gen_op_fcmpeq(rd & 3);
2685 1f587329 blueswir1
                        break;
2686 0f8a249a blueswir1
                    default:
2687 0f8a249a blueswir1
                        goto illegal_insn;
2688 0f8a249a blueswir1
                }
2689 0f8a249a blueswir1
            } else if (xop == 0x2) {
2690 0f8a249a blueswir1
                // clr/mov shortcut
2691 e80cfcfc bellard
2692 e80cfcfc bellard
                rs1 = GET_FIELD(insn, 13, 17);
2693 0f8a249a blueswir1
                if (rs1 == 0) {
2694 1a2fb1c0 blueswir1
                    // or %g0, x, y -> mov T0, x; mov y, T0
2695 0f8a249a blueswir1
                    if (IS_IMM) {       /* immediate */
2696 2ea815ca blueswir1
                        TCGv r_const;
2697 2ea815ca blueswir1
2698 67526b20 Blue Swirl
                        simm = GET_FIELDs(insn, 19, 31);
2699 67526b20 Blue Swirl
                        r_const = tcg_const_tl(simm);
2700 2ea815ca blueswir1
                        gen_movl_TN_reg(rd, r_const);
2701 2ea815ca blueswir1
                        tcg_temp_free(r_const);
2702 0f8a249a blueswir1
                    } else {            /* register */
2703 0f8a249a blueswir1
                        rs2 = GET_FIELD(insn, 27, 31);
2704 6ae20372 blueswir1
                        gen_movl_reg_TN(rs2, cpu_dst);
2705 9c6c6662 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
2706 0f8a249a blueswir1
                    }
2707 0f8a249a blueswir1
                } else {
2708 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
2709 0f8a249a blueswir1
                    if (IS_IMM) {       /* immediate */
2710 67526b20 Blue Swirl
                        simm = GET_FIELDs(insn, 19, 31);
2711 67526b20 Blue Swirl
                        tcg_gen_ori_tl(cpu_dst, cpu_src1, simm);
2712 9c6c6662 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
2713 0f8a249a blueswir1
                    } else {            /* register */
2714 0f8a249a blueswir1
                        // or x, %g0, y -> mov T1, x; mov y, T1
2715 0f8a249a blueswir1
                        rs2 = GET_FIELD(insn, 27, 31);
2716 0f8a249a blueswir1
                        if (rs2 != 0) {
2717 6ae20372 blueswir1
                            gen_movl_reg_TN(rs2, cpu_src2);
2718 6ae20372 blueswir1
                            tcg_gen_or_tl(cpu_dst, cpu_src1, cpu_src2);
2719 9c6c6662 blueswir1
                            gen_movl_TN_reg(rd, cpu_dst);
2720 6f551262 blueswir1
                        } else
2721 9c6c6662 blueswir1
                            gen_movl_TN_reg(rd, cpu_src1);
2722 0f8a249a blueswir1
                    }
2723 0f8a249a blueswir1
                }
2724 83469015 bellard
#ifdef TARGET_SPARC64
2725 0f8a249a blueswir1
            } else if (xop == 0x25) { /* sll, V9 sllx */
2726 9322a4bf blueswir1
                cpu_src1 = get_src1(insn, cpu_src1);
2727 0f8a249a blueswir1
                if (IS_IMM) {   /* immediate */
2728 67526b20 Blue Swirl
                    simm = GET_FIELDs(insn, 20, 31);
2729 1a2fb1c0 blueswir1
                    if (insn & (1 << 12)) {
2730 67526b20 Blue Swirl
                        tcg_gen_shli_i64(cpu_dst, cpu_src1, simm & 0x3f);
2731 1a2fb1c0 blueswir1
                    } else {
2732 67526b20 Blue Swirl
                        tcg_gen_shli_i64(cpu_dst, cpu_src1, simm & 0x1f);
2733 1a2fb1c0 blueswir1
                    }
2734 0f8a249a blueswir1
                } else {                /* register */
2735 83469015 bellard
                    rs2 = GET_FIELD(insn, 27, 31);
2736 6ae20372 blueswir1
                    gen_movl_reg_TN(rs2, cpu_src2);
2737 1a2fb1c0 blueswir1
                    if (insn & (1 << 12)) {
2738 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_tmp0, cpu_src2, 0x3f);
2739 1a2fb1c0 blueswir1
                    } else {
2740 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_tmp0, cpu_src2, 0x1f);
2741 1a2fb1c0 blueswir1
                    }
2742 01b1fa6d blueswir1
                    tcg_gen_shl_i64(cpu_dst, cpu_src1, cpu_tmp0);
2743 83469015 bellard
                }
2744 6ae20372 blueswir1
                gen_movl_TN_reg(rd, cpu_dst);
2745 0f8a249a blueswir1
            } else if (xop == 0x26) { /* srl, V9 srlx */
2746 9322a4bf blueswir1
                cpu_src1 = get_src1(insn, cpu_src1);
2747 0f8a249a blueswir1
                if (IS_IMM) {   /* immediate */
2748 67526b20 Blue Swirl
                    simm = GET_FIELDs(insn, 20, 31);
2749 1a2fb1c0 blueswir1
                    if (insn & (1 << 12)) {
2750 67526b20 Blue Swirl
                        tcg_gen_shri_i64(cpu_dst, cpu_src1, simm & 0x3f);
2751 1a2fb1c0 blueswir1
                    } else {
2752 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_dst, cpu_src1, 0xffffffffULL);
2753 67526b20 Blue Swirl
                        tcg_gen_shri_i64(cpu_dst, cpu_dst, simm & 0x1f);
2754 1a2fb1c0 blueswir1
                    }
2755 0f8a249a blueswir1
                } else {                /* register */
2756 83469015 bellard
                    rs2 = GET_FIELD(insn, 27, 31);
2757 6ae20372 blueswir1
                    gen_movl_reg_TN(rs2, cpu_src2);
2758 1a2fb1c0 blueswir1
                    if (insn & (1 << 12)) {
2759 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_tmp0, cpu_src2, 0x3f);
2760 6ae20372 blueswir1
                        tcg_gen_shr_i64(cpu_dst, cpu_src1, cpu_tmp0);
2761 1a2fb1c0 blueswir1
                    } else {
2762 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_tmp0, cpu_src2, 0x1f);
2763 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_dst, cpu_src1, 0xffffffffULL);
2764 6ae20372 blueswir1
                        tcg_gen_shr_i64(cpu_dst, cpu_dst, cpu_tmp0);
2765 1a2fb1c0 blueswir1
                    }
2766 83469015 bellard
                }
2767 6ae20372 blueswir1
                gen_movl_TN_reg(rd, cpu_dst);
2768 0f8a249a blueswir1
            } else if (xop == 0x27) { /* sra, V9 srax */
2769 9322a4bf blueswir1
                cpu_src1 = get_src1(insn, cpu_src1);
2770 0f8a249a blueswir1
                if (IS_IMM) {   /* immediate */
2771 67526b20 Blue Swirl
                    simm = GET_FIELDs(insn, 20, 31);
2772 1a2fb1c0 blueswir1
                    if (insn & (1 << 12)) {
2773 67526b20 Blue Swirl
                        tcg_gen_sari_i64(cpu_dst, cpu_src1, simm & 0x3f);
2774 1a2fb1c0 blueswir1
                    } else {
2775 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_dst, cpu_src1, 0xffffffffULL);
2776 527067d8 blueswir1
                        tcg_gen_ext32s_i64(cpu_dst, cpu_dst);
2777 67526b20 Blue Swirl
                        tcg_gen_sari_i64(cpu_dst, cpu_dst, simm & 0x1f);
2778 1a2fb1c0 blueswir1
                    }
2779 0f8a249a blueswir1
                } else {                /* register */
2780 83469015 bellard
                    rs2 = GET_FIELD(insn, 27, 31);
2781 6ae20372 blueswir1
                    gen_movl_reg_TN(rs2, cpu_src2);
2782 1a2fb1c0 blueswir1
                    if (insn & (1 << 12)) {
2783 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_tmp0, cpu_src2, 0x3f);
2784 6ae20372 blueswir1
                        tcg_gen_sar_i64(cpu_dst, cpu_src1, cpu_tmp0);
2785 1a2fb1c0 blueswir1
                    } else {
2786 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_tmp0, cpu_src2, 0x1f);
2787 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_dst, cpu_src1, 0xffffffffULL);
2788 527067d8 blueswir1
                        tcg_gen_ext32s_i64(cpu_dst, cpu_dst);
2789 6ae20372 blueswir1
                        tcg_gen_sar_i64(cpu_dst, cpu_dst, cpu_tmp0);
2790 1a2fb1c0 blueswir1
                    }
2791 83469015 bellard
                }
2792 6ae20372 blueswir1
                gen_movl_TN_reg(rd, cpu_dst);
2793 83469015 bellard
#endif
2794 fcc72045 blueswir1
            } else if (xop < 0x36) {
2795 cf495bcf bellard
                if (xop < 0x20) {
2796 41d72852 Blue Swirl
                    cpu_src1 = get_src1(insn, cpu_src1);
2797 41d72852 Blue Swirl
                    cpu_src2 = get_src2(insn, cpu_src2);
2798 cf495bcf bellard
                    switch (xop & ~0x10) {
2799 b89e94af Blue Swirl
                    case 0x0: /* add */
2800 41d72852 Blue Swirl
                        if (IS_IMM) {
2801 41d72852 Blue Swirl
                            simm = GET_FIELDs(insn, 19, 31);
2802 41d72852 Blue Swirl
                            if (xop & 0x10) {
2803 41d72852 Blue Swirl
                                gen_op_addi_cc(cpu_dst, cpu_src1, simm);
2804 bdf9f35d Blue Swirl
                                tcg_gen_movi_i32(cpu_cc_op, CC_OP_ADD);
2805 bdf9f35d Blue Swirl
                                dc->cc_op = CC_OP_ADD;
2806 41d72852 Blue Swirl
                            } else {
2807 41d72852 Blue Swirl
                                tcg_gen_addi_tl(cpu_dst, cpu_src1, simm);
2808 41d72852 Blue Swirl
                            }
2809 41d72852 Blue Swirl
                        } else {
2810 41d72852 Blue Swirl
                            if (xop & 0x10) {
2811 41d72852 Blue Swirl
                                gen_op_add_cc(cpu_dst, cpu_src1, cpu_src2);
2812 bdf9f35d Blue Swirl
                                tcg_gen_movi_i32(cpu_cc_op, CC_OP_ADD);
2813 bdf9f35d Blue Swirl
                                dc->cc_op = CC_OP_ADD;
2814 41d72852 Blue Swirl
                            } else {
2815 41d72852 Blue Swirl
                                tcg_gen_add_tl(cpu_dst, cpu_src1, cpu_src2);
2816 41d72852 Blue Swirl
                            }
2817 41d72852 Blue Swirl
                        }
2818 cf495bcf bellard
                        break;
2819 b89e94af Blue Swirl
                    case 0x1: /* and */
2820 41d72852 Blue Swirl
                        if (IS_IMM) {
2821 41d72852 Blue Swirl
                            simm = GET_FIELDs(insn, 19, 31);
2822 41d72852 Blue Swirl
                            tcg_gen_andi_tl(cpu_dst, cpu_src1, simm);
2823 41d72852 Blue Swirl
                        } else {
2824 41d72852 Blue Swirl
                            tcg_gen_and_tl(cpu_dst, cpu_src1, cpu_src2);
2825 41d72852 Blue Swirl
                        }
2826 41d72852 Blue Swirl
                        if (xop & 0x10) {
2827 38482a77 Blue Swirl
                            tcg_gen_mov_tl(cpu_cc_dst, cpu_dst);
2828 38482a77 Blue Swirl
                            tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC);
2829 38482a77 Blue Swirl
                            dc->cc_op = CC_OP_LOGIC;
2830 41d72852 Blue Swirl
                        }
2831 cf495bcf bellard
                        break;
2832 b89e94af Blue Swirl
                    case 0x2: /* or */
2833 41d72852 Blue Swirl
                        if (IS_IMM) {
2834 41d72852 Blue Swirl
                            simm = GET_FIELDs(insn, 19, 31);
2835 41d72852 Blue Swirl
                            tcg_gen_ori_tl(cpu_dst, cpu_src1, simm);
2836 41d72852 Blue Swirl
                        } else {
2837 41d72852 Blue Swirl
                            tcg_gen_or_tl(cpu_dst, cpu_src1, cpu_src2);
2838 41d72852 Blue Swirl
                        }
2839 8393617c Blue Swirl
                        if (xop & 0x10) {
2840 38482a77 Blue Swirl
                            tcg_gen_mov_tl(cpu_cc_dst, cpu_dst);
2841 38482a77 Blue Swirl
                            tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC);
2842 38482a77 Blue Swirl
                            dc->cc_op = CC_OP_LOGIC;
2843 8393617c Blue Swirl
                        }
2844 0f8a249a blueswir1
                        break;
2845 b89e94af Blue Swirl
                    case 0x3: /* xor */
2846 41d72852 Blue Swirl
                        if (IS_IMM) {
2847 41d72852 Blue Swirl
                            simm = GET_FIELDs(insn, 19, 31);
2848 41d72852 Blue Swirl
                            tcg_gen_xori_tl(cpu_dst, cpu_src1, simm);
2849 41d72852 Blue Swirl
                        } else {
2850 41d72852 Blue Swirl
                            tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_src2);
2851 41d72852 Blue Swirl
                        }
2852 8393617c Blue Swirl
                        if (xop & 0x10) {
2853 38482a77 Blue Swirl
                            tcg_gen_mov_tl(cpu_cc_dst, cpu_dst);
2854 38482a77 Blue Swirl
                            tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC);
2855 38482a77 Blue Swirl
                            dc->cc_op = CC_OP_LOGIC;
2856 8393617c Blue Swirl
                        }
2857 cf495bcf bellard
                        break;
2858 b89e94af Blue Swirl
                    case 0x4: /* sub */
2859 41d72852 Blue Swirl
                        if (IS_IMM) {
2860 41d72852 Blue Swirl
                            simm = GET_FIELDs(insn, 19, 31);
2861 41d72852 Blue Swirl
                            if (xop & 0x10) {
2862 d4b0d468 Blue Swirl
                                gen_op_subi_cc(cpu_dst, cpu_src1, simm, dc);
2863 41d72852 Blue Swirl
                            } else {
2864 41d72852 Blue Swirl
                                tcg_gen_subi_tl(cpu_dst, cpu_src1, simm);
2865 41d72852 Blue Swirl
                            }
2866 41d72852 Blue Swirl
                        } else {
2867 41d72852 Blue Swirl
                            if (xop & 0x10) {
2868 41d72852 Blue Swirl
                                gen_op_sub_cc(cpu_dst, cpu_src1, cpu_src2);
2869 d4b0d468 Blue Swirl
                                tcg_gen_movi_i32(cpu_cc_op, CC_OP_SUB);
2870 d4b0d468 Blue Swirl
                                dc->cc_op = CC_OP_SUB;
2871 41d72852 Blue Swirl
                            } else {
2872 41d72852 Blue Swirl
                                tcg_gen_sub_tl(cpu_dst, cpu_src1, cpu_src2);
2873 41d72852 Blue Swirl
                            }
2874 41d72852 Blue Swirl
                        }
2875 cf495bcf bellard
                        break;
2876 b89e94af Blue Swirl
                    case 0x5: /* andn */
2877 41d72852 Blue Swirl
                        if (IS_IMM) {
2878 41d72852 Blue Swirl
                            simm = GET_FIELDs(insn, 19, 31);
2879 41d72852 Blue Swirl
                            tcg_gen_andi_tl(cpu_dst, cpu_src1, ~simm);
2880 41d72852 Blue Swirl
                        } else {
2881 41d72852 Blue Swirl
                            tcg_gen_andc_tl(cpu_dst, cpu_src1, cpu_src2);
2882 41d72852 Blue Swirl
                        }
2883 8393617c Blue Swirl
                        if (xop & 0x10) {
2884 38482a77 Blue Swirl
                            tcg_gen_mov_tl(cpu_cc_dst, cpu_dst);
2885 38482a77 Blue Swirl
                            tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC);
2886 38482a77 Blue Swirl
                            dc->cc_op = CC_OP_LOGIC;
2887 8393617c Blue Swirl
                        }
2888 cf495bcf bellard
                        break;
2889 b89e94af Blue Swirl
                    case 0x6: /* orn */
2890 41d72852 Blue Swirl
                        if (IS_IMM) {
2891 41d72852 Blue Swirl
                            simm = GET_FIELDs(insn, 19, 31);
2892 41d72852 Blue Swirl
                            tcg_gen_ori_tl(cpu_dst, cpu_src1, ~simm);
2893 41d72852 Blue Swirl
                        } else {
2894 41d72852 Blue Swirl
                            tcg_gen_orc_tl(cpu_dst, cpu_src1, cpu_src2);
2895 41d72852 Blue Swirl
                        }
2896 8393617c Blue Swirl
                        if (xop & 0x10) {
2897 38482a77 Blue Swirl
                            tcg_gen_mov_tl(cpu_cc_dst, cpu_dst);
2898 38482a77 Blue Swirl
                            tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC);
2899 38482a77 Blue Swirl
                            dc->cc_op = CC_OP_LOGIC;
2900 8393617c Blue Swirl
                        }
2901 cf495bcf bellard
                        break;
2902 b89e94af Blue Swirl
                    case 0x7: /* xorn */
2903 41d72852 Blue Swirl
                        if (IS_IMM) {
2904 41d72852 Blue Swirl
                            simm = GET_FIELDs(insn, 19, 31);
2905 41d72852 Blue Swirl
                            tcg_gen_xori_tl(cpu_dst, cpu_src1, ~simm);
2906 41d72852 Blue Swirl
                        } else {
2907 41d72852 Blue Swirl
                            tcg_gen_not_tl(cpu_tmp0, cpu_src2);
2908 41d72852 Blue Swirl
                            tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_tmp0);
2909 41d72852 Blue Swirl
                        }
2910 8393617c Blue Swirl
                        if (xop & 0x10) {
2911 38482a77 Blue Swirl
                            tcg_gen_mov_tl(cpu_cc_dst, cpu_dst);
2912 38482a77 Blue Swirl
                            tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC);
2913 38482a77 Blue Swirl
                            dc->cc_op = CC_OP_LOGIC;
2914 8393617c Blue Swirl
                        }
2915 cf495bcf bellard
                        break;
2916 b89e94af Blue Swirl
                    case 0x8: /* addx, V9 addc */
2917 41d72852 Blue Swirl
                        if (IS_IMM) {
2918 41d72852 Blue Swirl
                            simm = GET_FIELDs(insn, 19, 31);
2919 8393617c Blue Swirl
                            if (xop & 0x10) {
2920 8393617c Blue Swirl
                                gen_helper_compute_psr();
2921 41d72852 Blue Swirl
                                gen_op_addxi_cc(cpu_dst, cpu_src1, simm);
2922 789c91ef Blue Swirl
                                tcg_gen_movi_i32(cpu_cc_op, CC_OP_ADDX);
2923 789c91ef Blue Swirl
                                dc->cc_op = CC_OP_ADDX;
2924 8393617c Blue Swirl
                            } else {
2925 8393617c Blue Swirl
                                gen_helper_compute_psr();
2926 41d72852 Blue Swirl
                                gen_mov_reg_C(cpu_tmp0, cpu_psr);
2927 41d72852 Blue Swirl
                                tcg_gen_addi_tl(cpu_tmp0, cpu_tmp0, simm);
2928 41d72852 Blue Swirl
                                tcg_gen_add_tl(cpu_dst, cpu_src1, cpu_tmp0);
2929 41d72852 Blue Swirl
                            }
2930 41d72852 Blue Swirl
                        } else {
2931 8393617c Blue Swirl
                            if (xop & 0x10) {
2932 8393617c Blue Swirl
                                gen_helper_compute_psr();
2933 41d72852 Blue Swirl
                                gen_op_addx_cc(cpu_dst, cpu_src1, cpu_src2);
2934 789c91ef Blue Swirl
                                tcg_gen_movi_i32(cpu_cc_op, CC_OP_ADDX);
2935 789c91ef Blue Swirl
                                dc->cc_op = CC_OP_ADDX;
2936 8393617c Blue Swirl
                            } else {
2937 8393617c Blue Swirl
                                gen_helper_compute_psr();
2938 41d72852 Blue Swirl
                                gen_mov_reg_C(cpu_tmp0, cpu_psr);
2939 41d72852 Blue Swirl
                                tcg_gen_add_tl(cpu_tmp0, cpu_src2, cpu_tmp0);
2940 41d72852 Blue Swirl
                                tcg_gen_add_tl(cpu_dst, cpu_src1, cpu_tmp0);
2941 41d72852 Blue Swirl
                            }
2942 38bc628b blueswir1
                        }
2943 cf495bcf bellard
                        break;
2944 ded3ab80 pbrook
#ifdef TARGET_SPARC64
2945 0f8a249a blueswir1
                    case 0x9: /* V9 mulx */
2946 41d72852 Blue Swirl
                        if (IS_IMM) {
2947 41d72852 Blue Swirl
                            simm = GET_FIELDs(insn, 19, 31);
2948 41d72852 Blue Swirl
                            tcg_gen_muli_i64(cpu_dst, cpu_src1, simm);
2949 41d72852 Blue Swirl
                        } else {
2950 41d72852 Blue Swirl
                            tcg_gen_mul_i64(cpu_dst, cpu_src1, cpu_src2);
2951 41d72852 Blue Swirl
                        }
2952 ded3ab80 pbrook
                        break;
2953 ded3ab80 pbrook
#endif
2954 b89e94af Blue Swirl
                    case 0xa: /* umul */
2955 64a88d5d blueswir1
                        CHECK_IU_FEATURE(dc, MUL);
2956 6ae20372 blueswir1
                        gen_op_umul(cpu_dst, cpu_src1, cpu_src2);
2957 8393617c Blue Swirl
                        if (xop & 0x10) {
2958 38482a77 Blue Swirl
                            tcg_gen_mov_tl(cpu_cc_dst, cpu_dst);
2959 38482a77 Blue Swirl
                            tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC);
2960 38482a77 Blue Swirl
                            dc->cc_op = CC_OP_LOGIC;
2961 8393617c Blue Swirl
                        }
2962 cf495bcf bellard
                        break;
2963 b89e94af Blue Swirl
                    case 0xb: /* smul */
2964 64a88d5d blueswir1
                        CHECK_IU_FEATURE(dc, MUL);
2965 6ae20372 blueswir1
                        gen_op_smul(cpu_dst, cpu_src1, cpu_src2);
2966 8393617c Blue Swirl
                        if (xop & 0x10) {
2967 38482a77 Blue Swirl
                            tcg_gen_mov_tl(cpu_cc_dst, cpu_dst);
2968 38482a77 Blue Swirl
                            tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC);
2969 38482a77 Blue Swirl
                            dc->cc_op = CC_OP_LOGIC;
2970 8393617c Blue Swirl
                        }
2971 cf495bcf bellard
                        break;
2972 b89e94af Blue Swirl
                    case 0xc: /* subx, V9 subc */
2973 41d72852 Blue Swirl
                        if (IS_IMM) {
2974 41d72852 Blue Swirl
                            simm = GET_FIELDs(insn, 19, 31);
2975 41d72852 Blue Swirl
                            if (xop & 0x10) {
2976 8393617c Blue Swirl
                                gen_helper_compute_psr();
2977 41d72852 Blue Swirl
                                gen_op_subxi_cc(cpu_dst, cpu_src1, simm);
2978 2ca1d92b Blue Swirl
                                tcg_gen_movi_i32(cpu_cc_op, CC_OP_SUBX);
2979 2ca1d92b Blue Swirl
                                dc->cc_op = CC_OP_SUBX;
2980 41d72852 Blue Swirl
                            } else {
2981 8393617c Blue Swirl
                                gen_helper_compute_psr();
2982 41d72852 Blue Swirl
                                gen_mov_reg_C(cpu_tmp0, cpu_psr);
2983 41d72852 Blue Swirl
                                tcg_gen_addi_tl(cpu_tmp0, cpu_tmp0, simm);
2984 41d72852 Blue Swirl
                                tcg_gen_sub_tl(cpu_dst, cpu_src1, cpu_tmp0);
2985 41d72852 Blue Swirl
                            }
2986 41d72852 Blue Swirl
                        } else {
2987 41d72852 Blue Swirl
                            if (xop & 0x10) {
2988 8393617c Blue Swirl
                                gen_helper_compute_psr();
2989 41d72852 Blue Swirl
                                gen_op_subx_cc(cpu_dst, cpu_src1, cpu_src2);
2990 2ca1d92b Blue Swirl
                                tcg_gen_movi_i32(cpu_cc_op, CC_OP_SUBX);
2991 2ca1d92b Blue Swirl
                                dc->cc_op = CC_OP_SUBX;
2992 41d72852 Blue Swirl
                            } else {
2993 8393617c Blue Swirl
                                gen_helper_compute_psr();
2994 41d72852 Blue Swirl
                                gen_mov_reg_C(cpu_tmp0, cpu_psr);
2995 41d72852 Blue Swirl
                                tcg_gen_add_tl(cpu_tmp0, cpu_src2, cpu_tmp0);
2996 41d72852 Blue Swirl
                                tcg_gen_sub_tl(cpu_dst, cpu_src1, cpu_tmp0);
2997 41d72852 Blue Swirl
                            }
2998 38bc628b blueswir1
                        }
2999 cf495bcf bellard
                        break;
3000 ded3ab80 pbrook
#ifdef TARGET_SPARC64
3001 0f8a249a blueswir1
                    case 0xd: /* V9 udivx */
3002 07bf2857 blueswir1
                        tcg_gen_mov_tl(cpu_cc_src, cpu_src1);
3003 07bf2857 blueswir1
                        tcg_gen_mov_tl(cpu_cc_src2, cpu_src2);
3004 07bf2857 blueswir1
                        gen_trap_ifdivzero_tl(cpu_cc_src2);
3005 07bf2857 blueswir1
                        tcg_gen_divu_i64(cpu_dst, cpu_cc_src, cpu_cc_src2);
3006 ded3ab80 pbrook
                        break;
3007 ded3ab80 pbrook
#endif
3008 b89e94af Blue Swirl
                    case 0xe: /* udiv */
3009 64a88d5d blueswir1
                        CHECK_IU_FEATURE(dc, DIV);
3010 a7812ae4 pbrook
                        gen_helper_udiv(cpu_dst, cpu_src1, cpu_src2);
3011 8393617c Blue Swirl
                        if (xop & 0x10) {
3012 6c78ea32 Blue Swirl
                            tcg_gen_mov_tl(cpu_cc_dst, cpu_dst);
3013 6c78ea32 Blue Swirl
                            tcg_gen_movi_i32(cpu_cc_op, CC_OP_DIV);
3014 6c78ea32 Blue Swirl
                            dc->cc_op = CC_OP_DIV;
3015 8393617c Blue Swirl
                        }
3016 cf495bcf bellard
                        break;
3017 b89e94af Blue Swirl
                    case 0xf: /* sdiv */
3018 64a88d5d blueswir1
                        CHECK_IU_FEATURE(dc, DIV);
3019 a7812ae4 pbrook
                        gen_helper_sdiv(cpu_dst, cpu_src1, cpu_src2);
3020 8393617c Blue Swirl
                        if (xop & 0x10) {
3021 6c78ea32 Blue Swirl
                            tcg_gen_mov_tl(cpu_cc_dst, cpu_dst);
3022 6c78ea32 Blue Swirl
                            tcg_gen_movi_i32(cpu_cc_op, CC_OP_DIV);
3023 6c78ea32 Blue Swirl
                            dc->cc_op = CC_OP_DIV;
3024 8393617c Blue Swirl
                        }
3025 cf495bcf bellard
                        break;
3026 cf495bcf bellard
                    default:
3027 cf495bcf bellard
                        goto illegal_insn;
3028 cf495bcf bellard
                    }
3029 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
3030 cf495bcf bellard
                } else {
3031 41d72852 Blue Swirl
                    cpu_src1 = get_src1(insn, cpu_src1);
3032 41d72852 Blue Swirl
                    cpu_src2 = get_src2(insn, cpu_src2);
3033 cf495bcf bellard
                    switch (xop) {
3034 0f8a249a blueswir1
                    case 0x20: /* taddcc */
3035 6ae20372 blueswir1
                        gen_op_tadd_cc(cpu_dst, cpu_src1, cpu_src2);
3036 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3037 3b2d1e92 Blue Swirl
                        tcg_gen_movi_i32(cpu_cc_op, CC_OP_TADD);
3038 3b2d1e92 Blue Swirl
                        dc->cc_op = CC_OP_TADD;
3039 0f8a249a blueswir1
                        break;
3040 0f8a249a blueswir1
                    case 0x21: /* tsubcc */
3041 6ae20372 blueswir1
                        gen_op_tsub_cc(cpu_dst, cpu_src1, cpu_src2);
3042 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3043 3b2d1e92 Blue Swirl
                        tcg_gen_movi_i32(cpu_cc_op, CC_OP_TSUB);
3044 3b2d1e92 Blue Swirl
                        dc->cc_op = CC_OP_TSUB;
3045 0f8a249a blueswir1
                        break;
3046 0f8a249a blueswir1
                    case 0x22: /* taddcctv */
3047 6ae20372 blueswir1
                        save_state(dc, cpu_cond);
3048 6ae20372 blueswir1
                        gen_op_tadd_ccTV(cpu_dst, cpu_src1, cpu_src2);
3049 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3050 3b2d1e92 Blue Swirl
                        tcg_gen_movi_i32(cpu_cc_op, CC_OP_TADDTV);
3051 3b2d1e92 Blue Swirl
                        dc->cc_op = CC_OP_TADDTV;
3052 0f8a249a blueswir1
                        break;
3053 0f8a249a blueswir1
                    case 0x23: /* tsubcctv */
3054 6ae20372 blueswir1
                        save_state(dc, cpu_cond);
3055 6ae20372 blueswir1
                        gen_op_tsub_ccTV(cpu_dst, cpu_src1, cpu_src2);
3056 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3057 3b2d1e92 Blue Swirl
                        tcg_gen_movi_i32(cpu_cc_op, CC_OP_TSUBTV);
3058 3b2d1e92 Blue Swirl
                        dc->cc_op = CC_OP_TSUBTV;
3059 0f8a249a blueswir1
                        break;
3060 cf495bcf bellard
                    case 0x24: /* mulscc */
3061 8393617c Blue Swirl
                        gen_helper_compute_psr();
3062 6ae20372 blueswir1
                        gen_op_mulscc(cpu_dst, cpu_src1, cpu_src2);
3063 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3064 d084469c Blue Swirl
                        tcg_gen_movi_i32(cpu_cc_op, CC_OP_ADD);
3065 d084469c Blue Swirl
                        dc->cc_op = CC_OP_ADD;
3066 cf495bcf bellard
                        break;
3067 83469015 bellard
#ifndef TARGET_SPARC64
3068 0f8a249a blueswir1
                    case 0x25:  /* sll */
3069 e35298cd blueswir1
                        if (IS_IMM) { /* immediate */
3070 67526b20 Blue Swirl
                            simm = GET_FIELDs(insn, 20, 31);
3071 67526b20 Blue Swirl
                            tcg_gen_shli_tl(cpu_dst, cpu_src1, simm & 0x1f);
3072 e35298cd blueswir1
                        } else { /* register */
3073 e35298cd blueswir1
                            tcg_gen_andi_tl(cpu_tmp0, cpu_src2, 0x1f);
3074 e35298cd blueswir1
                            tcg_gen_shl_tl(cpu_dst, cpu_src1, cpu_tmp0);
3075 e35298cd blueswir1
                        }
3076 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3077 cf495bcf bellard
                        break;
3078 83469015 bellard
                    case 0x26:  /* srl */
3079 e35298cd blueswir1
                        if (IS_IMM) { /* immediate */
3080 67526b20 Blue Swirl
                            simm = GET_FIELDs(insn, 20, 31);
3081 67526b20 Blue Swirl
                            tcg_gen_shri_tl(cpu_dst, cpu_src1, simm & 0x1f);
3082 e35298cd blueswir1
                        } else { /* register */
3083 e35298cd blueswir1
                            tcg_gen_andi_tl(cpu_tmp0, cpu_src2, 0x1f);
3084 e35298cd blueswir1
                            tcg_gen_shr_tl(cpu_dst, cpu_src1, cpu_tmp0);
3085 e35298cd blueswir1
                        }
3086 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3087 cf495bcf bellard
                        break;
3088 83469015 bellard
                    case 0x27:  /* sra */
3089 e35298cd blueswir1
                        if (IS_IMM) { /* immediate */
3090 67526b20 Blue Swirl
                            simm = GET_FIELDs(insn, 20, 31);
3091 67526b20 Blue Swirl
                            tcg_gen_sari_tl(cpu_dst, cpu_src1, simm & 0x1f);
3092 e35298cd blueswir1
                        } else { /* register */
3093 e35298cd blueswir1
                            tcg_gen_andi_tl(cpu_tmp0, cpu_src2, 0x1f);
3094 e35298cd blueswir1
                            tcg_gen_sar_tl(cpu_dst, cpu_src1, cpu_tmp0);
3095 e35298cd blueswir1
                        }
3096 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3097 cf495bcf bellard
                        break;
3098 83469015 bellard
#endif
3099 cf495bcf bellard
                    case 0x30:
3100 cf495bcf bellard
                        {
3101 cf495bcf bellard
                            switch(rd) {
3102 3475187d bellard
                            case 0: /* wry */
3103 5068cbd9 blueswir1
                                tcg_gen_xor_tl(cpu_tmp0, cpu_src1, cpu_src2);
3104 5068cbd9 blueswir1
                                tcg_gen_andi_tl(cpu_y, cpu_tmp0, 0xffffffff);
3105 cf495bcf bellard
                                break;
3106 65fe7b09 blueswir1
#ifndef TARGET_SPARC64
3107 65fe7b09 blueswir1
                            case 0x01 ... 0x0f: /* undefined in the
3108 65fe7b09 blueswir1
                                                   SPARCv8 manual, nop
3109 65fe7b09 blueswir1
                                                   on the microSPARC
3110 65fe7b09 blueswir1
                                                   II */
3111 65fe7b09 blueswir1
                            case 0x10 ... 0x1f: /* implementation-dependent
3112 65fe7b09 blueswir1
                                                   in the SPARCv8
3113 65fe7b09 blueswir1
                                                   manual, nop on the
3114 65fe7b09 blueswir1
                                                   microSPARC II */
3115 65fe7b09 blueswir1
                                break;
3116 65fe7b09 blueswir1
#else
3117 0f8a249a blueswir1
                            case 0x2: /* V9 wrccr */
3118 6ae20372 blueswir1
                                tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_src2);
3119 a7812ae4 pbrook
                                gen_helper_wrccr(cpu_dst);
3120 8393617c Blue Swirl
                                tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS);
3121 8393617c Blue Swirl
                                dc->cc_op = CC_OP_FLAGS;
3122 0f8a249a blueswir1
                                break;
3123 0f8a249a blueswir1
                            case 0x3: /* V9 wrasi */
3124 6ae20372 blueswir1
                                tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_src2);
3125 255e1fcb blueswir1
                                tcg_gen_trunc_tl_i32(cpu_asi, cpu_dst);
3126 0f8a249a blueswir1
                                break;
3127 0f8a249a blueswir1
                            case 0x6: /* V9 wrfprs */
3128 6ae20372 blueswir1
                                tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_src2);
3129 255e1fcb blueswir1
                                tcg_gen_trunc_tl_i32(cpu_fprs, cpu_dst);
3130 6ae20372 blueswir1
                                save_state(dc, cpu_cond);
3131 3299908c blueswir1
                                gen_op_next_insn();
3132 57fec1fe bellard
                                tcg_gen_exit_tb(0);
3133 3299908c blueswir1
                                dc->is_br = 1;
3134 0f8a249a blueswir1
                                break;
3135 0f8a249a blueswir1
                            case 0xf: /* V9 sir, nop if user */
3136 3475187d bellard
#if !defined(CONFIG_USER_ONLY)
3137 0f8a249a blueswir1
                                if (supervisor(dc))
3138 1a2fb1c0 blueswir1
                                    ; // XXX
3139 3475187d bellard
#endif
3140 0f8a249a blueswir1
                                break;
3141 0f8a249a blueswir1
                            case 0x13: /* Graphics Status */
3142 6ae20372 blueswir1
                                if (gen_trap_ifnofpu(dc, cpu_cond))
3143 725cb90b bellard
                                    goto jmp_insn;
3144 255e1fcb blueswir1
                                tcg_gen_xor_tl(cpu_gsr, cpu_src1, cpu_src2);
3145 0f8a249a blueswir1
                                break;
3146 9d926598 blueswir1
                            case 0x14: /* Softint set */
3147 9d926598 blueswir1
                                if (!supervisor(dc))
3148 9d926598 blueswir1
                                    goto illegal_insn;
3149 9d926598 blueswir1
                                tcg_gen_xor_tl(cpu_tmp64, cpu_src1, cpu_src2);
3150 a7812ae4 pbrook
                                gen_helper_set_softint(cpu_tmp64);
3151 9d926598 blueswir1
                                break;
3152 9d926598 blueswir1
                            case 0x15: /* Softint clear */
3153 9d926598 blueswir1
                                if (!supervisor(dc))
3154 9d926598 blueswir1
                                    goto illegal_insn;
3155 9d926598 blueswir1
                                tcg_gen_xor_tl(cpu_tmp64, cpu_src1, cpu_src2);
3156 a7812ae4 pbrook
                                gen_helper_clear_softint(cpu_tmp64);
3157 9d926598 blueswir1
                                break;
3158 9d926598 blueswir1
                            case 0x16: /* Softint write */
3159 9d926598 blueswir1
                                if (!supervisor(dc))
3160 9d926598 blueswir1
                                    goto illegal_insn;
3161 9d926598 blueswir1
                                tcg_gen_xor_tl(cpu_tmp64, cpu_src1, cpu_src2);
3162 a7812ae4 pbrook
                                gen_helper_write_softint(cpu_tmp64);
3163 9d926598 blueswir1
                                break;
3164 0f8a249a blueswir1
                            case 0x17: /* Tick compare */
3165 83469015 bellard
#if !defined(CONFIG_USER_ONLY)
3166 0f8a249a blueswir1
                                if (!supervisor(dc))
3167 0f8a249a blueswir1
                                    goto illegal_insn;
3168 83469015 bellard
#endif
3169 ccd4a219 blueswir1
                                {
3170 a7812ae4 pbrook
                                    TCGv_ptr r_tickptr;
3171 ccd4a219 blueswir1
3172 255e1fcb blueswir1
                                    tcg_gen_xor_tl(cpu_tick_cmpr, cpu_src1,
3173 6ae20372 blueswir1
                                                   cpu_src2);
3174 a7812ae4 pbrook
                                    r_tickptr = tcg_temp_new_ptr();
3175 ccd4a219 blueswir1
                                    tcg_gen_ld_ptr(r_tickptr, cpu_env,
3176 ccd4a219 blueswir1
                                                   offsetof(CPUState, tick));
3177 a7812ae4 pbrook
                                    gen_helper_tick_set_limit(r_tickptr,
3178 a7812ae4 pbrook
                                                              cpu_tick_cmpr);
3179 a7812ae4 pbrook
                                    tcg_temp_free_ptr(r_tickptr);
3180 ccd4a219 blueswir1
                                }
3181 0f8a249a blueswir1
                                break;
3182 0f8a249a blueswir1
                            case 0x18: /* System tick */
3183 83469015 bellard
#if !defined(CONFIG_USER_ONLY)
3184 0f8a249a blueswir1
                                if (!supervisor(dc))
3185 0f8a249a blueswir1
                                    goto illegal_insn;
3186 83469015 bellard
#endif
3187 ccd4a219 blueswir1
                                {
3188 a7812ae4 pbrook
                                    TCGv_ptr r_tickptr;
3189 ccd4a219 blueswir1
3190 6ae20372 blueswir1
                                    tcg_gen_xor_tl(cpu_dst, cpu_src1,
3191 6ae20372 blueswir1
                                                   cpu_src2);
3192 a7812ae4 pbrook
                                    r_tickptr = tcg_temp_new_ptr();
3193 ccd4a219 blueswir1
                                    tcg_gen_ld_ptr(r_tickptr, cpu_env,
3194 ccd4a219 blueswir1
                                                   offsetof(CPUState, stick));
3195 a7812ae4 pbrook
                                    gen_helper_tick_set_count(r_tickptr,
3196 a7812ae4 pbrook
                                                              cpu_dst);
3197 a7812ae4 pbrook
                                    tcg_temp_free_ptr(r_tickptr);
3198 ccd4a219 blueswir1
                                }
3199 0f8a249a blueswir1
                                break;
3200 0f8a249a blueswir1
                            case 0x19: /* System tick compare */
3201 83469015 bellard
#if !defined(CONFIG_USER_ONLY)
3202 0f8a249a blueswir1
                                if (!supervisor(dc))
3203 0f8a249a blueswir1
                                    goto illegal_insn;
3204 3475187d bellard
#endif
3205 ccd4a219 blueswir1
                                {
3206 a7812ae4 pbrook
                                    TCGv_ptr r_tickptr;
3207 ccd4a219 blueswir1
3208 255e1fcb blueswir1
                                    tcg_gen_xor_tl(cpu_stick_cmpr, cpu_src1,
3209 6ae20372 blueswir1
                                                   cpu_src2);
3210 a7812ae4 pbrook
                                    r_tickptr = tcg_temp_new_ptr();
3211 ccd4a219 blueswir1
                                    tcg_gen_ld_ptr(r_tickptr, cpu_env,
3212 ccd4a219 blueswir1
                                                   offsetof(CPUState, stick));
3213 a7812ae4 pbrook
                                    gen_helper_tick_set_limit(r_tickptr,
3214 a7812ae4 pbrook
                                                              cpu_stick_cmpr);
3215 a7812ae4 pbrook
                                    tcg_temp_free_ptr(r_tickptr);
3216 ccd4a219 blueswir1
                                }
3217 0f8a249a blueswir1
                                break;
3218 83469015 bellard
3219 0f8a249a blueswir1
                            case 0x10: /* Performance Control */
3220 77f193da blueswir1
                            case 0x11: /* Performance Instrumentation
3221 77f193da blueswir1
                                          Counter */
3222 0f8a249a blueswir1
                            case 0x12: /* Dispatch Control */
3223 83469015 bellard
#endif
3224 3475187d bellard
                            default:
3225 cf495bcf bellard
                                goto illegal_insn;
3226 cf495bcf bellard
                            }
3227 cf495bcf bellard
                        }
3228 cf495bcf bellard
                        break;
3229 e8af50a3 bellard
#if !defined(CONFIG_USER_ONLY)
3230 af7bf89b bellard
                    case 0x31: /* wrpsr, V9 saved, restored */
3231 e8af50a3 bellard
                        {
3232 0f8a249a blueswir1
                            if (!supervisor(dc))
3233 0f8a249a blueswir1
                                goto priv_insn;
3234 3475187d bellard
#ifdef TARGET_SPARC64
3235 0f8a249a blueswir1
                            switch (rd) {
3236 0f8a249a blueswir1
                            case 0:
3237 a7812ae4 pbrook
                                gen_helper_saved();
3238 0f8a249a blueswir1
                                break;
3239 0f8a249a blueswir1
                            case 1:
3240 a7812ae4 pbrook
                                gen_helper_restored();
3241 0f8a249a blueswir1
                                break;
3242 e9ebed4d blueswir1
                            case 2: /* UA2005 allclean */
3243 e9ebed4d blueswir1
                            case 3: /* UA2005 otherw */
3244 e9ebed4d blueswir1
                            case 4: /* UA2005 normalw */
3245 e9ebed4d blueswir1
                            case 5: /* UA2005 invalw */
3246 e9ebed4d blueswir1
                                // XXX
3247 0f8a249a blueswir1
                            default:
3248 3475187d bellard
                                goto illegal_insn;
3249 3475187d bellard
                            }
3250 3475187d bellard
#else
3251 6ae20372 blueswir1
                            tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_src2);
3252 a7812ae4 pbrook
                            gen_helper_wrpsr(cpu_dst);
3253 8393617c Blue Swirl
                            tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS);
3254 8393617c Blue Swirl
                            dc->cc_op = CC_OP_FLAGS;
3255 6ae20372 blueswir1
                            save_state(dc, cpu_cond);
3256 9e61bde5 bellard
                            gen_op_next_insn();
3257 57fec1fe bellard
                            tcg_gen_exit_tb(0);
3258 0f8a249a blueswir1
                            dc->is_br = 1;
3259 3475187d bellard
#endif
3260 e8af50a3 bellard
                        }
3261 e8af50a3 bellard
                        break;
3262 af7bf89b bellard
                    case 0x32: /* wrwim, V9 wrpr */
3263 e8af50a3 bellard
                        {
3264 0f8a249a blueswir1
                            if (!supervisor(dc))
3265 0f8a249a blueswir1
                                goto priv_insn;
3266 ece43b8d blueswir1
                            tcg_gen_xor_tl(cpu_tmp0, cpu_src1, cpu_src2);
3267 3475187d bellard
#ifdef TARGET_SPARC64
3268 0f8a249a blueswir1
                            switch (rd) {
3269 0f8a249a blueswir1
                            case 0: // tpc
3270 375ee38b blueswir1
                                {
3271 a7812ae4 pbrook
                                    TCGv_ptr r_tsptr;
3272 375ee38b blueswir1
3273 a7812ae4 pbrook
                                    r_tsptr = tcg_temp_new_ptr();
3274 375ee38b blueswir1
                                    tcg_gen_ld_ptr(r_tsptr, cpu_env,
3275 375ee38b blueswir1
                                                   offsetof(CPUState, tsptr));
3276 ece43b8d blueswir1
                                    tcg_gen_st_tl(cpu_tmp0, r_tsptr,
3277 375ee38b blueswir1
                                                  offsetof(trap_state, tpc));
3278 a7812ae4 pbrook
                                    tcg_temp_free_ptr(r_tsptr);
3279 375ee38b blueswir1
                                }
3280 0f8a249a blueswir1
                                break;
3281 0f8a249a blueswir1
                            case 1: // tnpc
3282 375ee38b blueswir1
                                {
3283 a7812ae4 pbrook
                                    TCGv_ptr r_tsptr;
3284 375ee38b blueswir1
3285 a7812ae4 pbrook
                                    r_tsptr = tcg_temp_new_ptr();
3286 375ee38b blueswir1
                                    tcg_gen_ld_ptr(r_tsptr, cpu_env,
3287 375ee38b blueswir1
                                                   offsetof(CPUState, tsptr));
3288 ece43b8d blueswir1
                                    tcg_gen_st_tl(cpu_tmp0, r_tsptr,
3289 375ee38b blueswir1
                                                  offsetof(trap_state, tnpc));
3290 a7812ae4 pbrook
                                    tcg_temp_free_ptr(r_tsptr);
3291 375ee38b blueswir1
                                }
3292 0f8a249a blueswir1
                                break;
3293 0f8a249a blueswir1
                            case 2: // tstate
3294 375ee38b blueswir1
                                {
3295 a7812ae4 pbrook
                                    TCGv_ptr r_tsptr;
3296 375ee38b blueswir1
3297 a7812ae4 pbrook
                                    r_tsptr = tcg_temp_new_ptr();
3298 375ee38b blueswir1
                                    tcg_gen_ld_ptr(r_tsptr, cpu_env,
3299 375ee38b blueswir1
                                                   offsetof(CPUState, tsptr));
3300 ece43b8d blueswir1
                                    tcg_gen_st_tl(cpu_tmp0, r_tsptr,
3301 77f193da blueswir1
                                                  offsetof(trap_state,
3302 77f193da blueswir1
                                                           tstate));
3303 a7812ae4 pbrook
                                    tcg_temp_free_ptr(r_tsptr);
3304 375ee38b blueswir1
                                }
3305 0f8a249a blueswir1
                                break;
3306 0f8a249a blueswir1
                            case 3: // tt
3307 375ee38b blueswir1
                                {
3308 a7812ae4 pbrook
                                    TCGv_ptr r_tsptr;
3309 375ee38b blueswir1
3310 a7812ae4 pbrook
                                    r_tsptr = tcg_temp_new_ptr();
3311 375ee38b blueswir1
                                    tcg_gen_ld_ptr(r_tsptr, cpu_env,
3312 375ee38b blueswir1
                                                   offsetof(CPUState, tsptr));
3313 527067d8 blueswir1
                                    tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3314 527067d8 blueswir1
                                    tcg_gen_st_i32(cpu_tmp32, r_tsptr,
3315 375ee38b blueswir1
                                                   offsetof(trap_state, tt));
3316 a7812ae4 pbrook
                                    tcg_temp_free_ptr(r_tsptr);
3317 375ee38b blueswir1
                                }
3318 0f8a249a blueswir1
                                break;
3319 0f8a249a blueswir1
                            case 4: // tick
3320 ccd4a219 blueswir1
                                {
3321 a7812ae4 pbrook
                                    TCGv_ptr r_tickptr;
3322 ccd4a219 blueswir1
3323 a7812ae4 pbrook
                                    r_tickptr = tcg_temp_new_ptr();
3324 ccd4a219 blueswir1
                                    tcg_gen_ld_ptr(r_tickptr, cpu_env,
3325 ccd4a219 blueswir1
                                                   offsetof(CPUState, tick));
3326 a7812ae4 pbrook
                                    gen_helper_tick_set_count(r_tickptr,
3327 a7812ae4 pbrook
                                                              cpu_tmp0);
3328 a7812ae4 pbrook
                                    tcg_temp_free_ptr(r_tickptr);
3329 ccd4a219 blueswir1
                                }
3330 0f8a249a blueswir1
                                break;
3331 0f8a249a blueswir1
                            case 5: // tba
3332 255e1fcb blueswir1
                                tcg_gen_mov_tl(cpu_tbr, cpu_tmp0);
3333 0f8a249a blueswir1
                                break;
3334 0f8a249a blueswir1
                            case 6: // pstate
3335 6ae20372 blueswir1
                                save_state(dc, cpu_cond);
3336 a7812ae4 pbrook
                                gen_helper_wrpstate(cpu_tmp0);
3337 ded3ab80 pbrook
                                gen_op_next_insn();
3338 57fec1fe bellard
                                tcg_gen_exit_tb(0);
3339 ded3ab80 pbrook
                                dc->is_br = 1;
3340 0f8a249a blueswir1
                                break;
3341 0f8a249a blueswir1
                            case 7: // tl
3342 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3343 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3344 77f193da blueswir1
                                               offsetof(CPUSPARCState, tl));
3345 0f8a249a blueswir1
                                break;
3346 0f8a249a blueswir1
                            case 8: // pil
3347 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3348 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3349 77f193da blueswir1
                                               offsetof(CPUSPARCState,
3350 77f193da blueswir1
                                                        psrpil));
3351 0f8a249a blueswir1
                                break;
3352 0f8a249a blueswir1
                            case 9: // cwp
3353 a7812ae4 pbrook
                                gen_helper_wrcwp(cpu_tmp0);
3354 0f8a249a blueswir1
                                break;
3355 0f8a249a blueswir1
                            case 10: // cansave
3356 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3357 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3358 77f193da blueswir1
                                               offsetof(CPUSPARCState,
3359 77f193da blueswir1
                                                        cansave));
3360 0f8a249a blueswir1
                                break;
3361 0f8a249a blueswir1
                            case 11: // canrestore
3362 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3363 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3364 77f193da blueswir1
                                               offsetof(CPUSPARCState,
3365 77f193da blueswir1
                                                        canrestore));
3366 0f8a249a blueswir1
                                break;
3367 0f8a249a blueswir1
                            case 12: // cleanwin
3368 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3369 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3370 77f193da blueswir1
                                               offsetof(CPUSPARCState,
3371 77f193da blueswir1
                                                        cleanwin));
3372 0f8a249a blueswir1
                                break;
3373 0f8a249a blueswir1
                            case 13: // otherwin
3374 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3375 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3376 77f193da blueswir1
                                               offsetof(CPUSPARCState,
3377 77f193da blueswir1
                                                        otherwin));
3378 0f8a249a blueswir1
                                break;
3379 0f8a249a blueswir1
                            case 14: // wstate
3380 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3381 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3382 77f193da blueswir1
                                               offsetof(CPUSPARCState,
3383 77f193da blueswir1
                                                        wstate));
3384 0f8a249a blueswir1
                                break;
3385 e9ebed4d blueswir1
                            case 16: // UA2005 gl
3386 fb79ceb9 blueswir1
                                CHECK_IU_FEATURE(dc, GL);
3387 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3388 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3389 77f193da blueswir1
                                               offsetof(CPUSPARCState, gl));
3390 e9ebed4d blueswir1
                                break;
3391 e9ebed4d blueswir1
                            case 26: // UA2005 strand status
3392 fb79ceb9 blueswir1
                                CHECK_IU_FEATURE(dc, HYPV);
3393 e9ebed4d blueswir1
                                if (!hypervisor(dc))
3394 e9ebed4d blueswir1
                                    goto priv_insn;
3395 527067d8 blueswir1
                                tcg_gen_mov_tl(cpu_ssr, cpu_tmp0);
3396 e9ebed4d blueswir1
                                break;
3397 0f8a249a blueswir1
                            default:
3398 0f8a249a blueswir1
                                goto illegal_insn;
3399 0f8a249a blueswir1
                            }
3400 3475187d bellard
#else
3401 ece43b8d blueswir1
                            tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3402 c93e7817 blueswir1
                            if (dc->def->nwindows != 32)
3403 c93e7817 blueswir1
                                tcg_gen_andi_tl(cpu_tmp32, cpu_tmp32,
3404 c93e7817 blueswir1
                                                (1 << dc->def->nwindows) - 1);
3405 255e1fcb blueswir1
                            tcg_gen_mov_i32(cpu_wim, cpu_tmp32);
3406 3475187d bellard
#endif
3407 e8af50a3 bellard
                        }
3408 e8af50a3 bellard
                        break;
3409 e9ebed4d blueswir1
                    case 0x33: /* wrtbr, UA2005 wrhpr */
3410 e8af50a3 bellard
                        {
3411 e9ebed4d blueswir1
#ifndef TARGET_SPARC64
3412 0f8a249a blueswir1
                            if (!supervisor(dc))
3413 0f8a249a blueswir1
                                goto priv_insn;
3414 255e1fcb blueswir1
                            tcg_gen_xor_tl(cpu_tbr, cpu_src1, cpu_src2);
3415 e9ebed4d blueswir1
#else
3416 fb79ceb9 blueswir1
                            CHECK_IU_FEATURE(dc, HYPV);
3417 e9ebed4d blueswir1
                            if (!hypervisor(dc))
3418 e9ebed4d blueswir1
                                goto priv_insn;
3419 ece43b8d blueswir1
                            tcg_gen_xor_tl(cpu_tmp0, cpu_src1, cpu_src2);
3420 e9ebed4d blueswir1
                            switch (rd) {
3421 e9ebed4d blueswir1
                            case 0: // hpstate
3422 e9ebed4d blueswir1
                                // XXX gen_op_wrhpstate();
3423 6ae20372 blueswir1
                                save_state(dc, cpu_cond);
3424 e9ebed4d blueswir1
                                gen_op_next_insn();
3425 57fec1fe bellard
                                tcg_gen_exit_tb(0);
3426 e9ebed4d blueswir1
                                dc->is_br = 1;
3427 e9ebed4d blueswir1
                                break;
3428 e9ebed4d blueswir1
                            case 1: // htstate
3429 e9ebed4d blueswir1
                                // XXX gen_op_wrhtstate();
3430 e9ebed4d blueswir1
                                break;
3431 e9ebed4d blueswir1
                            case 3: // hintp
3432 255e1fcb blueswir1
                                tcg_gen_mov_tl(cpu_hintp, cpu_tmp0);
3433 e9ebed4d blueswir1
                                break;
3434 e9ebed4d blueswir1
                            case 5: // htba
3435 255e1fcb blueswir1
                                tcg_gen_mov_tl(cpu_htba, cpu_tmp0);
3436 e9ebed4d blueswir1
                                break;
3437 e9ebed4d blueswir1
                            case 31: // hstick_cmpr
3438 ccd4a219 blueswir1
                                {
3439 a7812ae4 pbrook
                                    TCGv_ptr r_tickptr;
3440 ccd4a219 blueswir1
3441 255e1fcb blueswir1
                                    tcg_gen_mov_tl(cpu_hstick_cmpr, cpu_tmp0);
3442 a7812ae4 pbrook
                                    r_tickptr = tcg_temp_new_ptr();
3443 ccd4a219 blueswir1
                                    tcg_gen_ld_ptr(r_tickptr, cpu_env,
3444 ccd4a219 blueswir1
                                                   offsetof(CPUState, hstick));
3445 a7812ae4 pbrook
                                    gen_helper_tick_set_limit(r_tickptr,
3446 a7812ae4 pbrook
                                                              cpu_hstick_cmpr);
3447 a7812ae4 pbrook
                                    tcg_temp_free_ptr(r_tickptr);
3448 ccd4a219 blueswir1
                                }
3449 e9ebed4d blueswir1
                                break;
3450 e9ebed4d blueswir1
                            case 6: // hver readonly
3451 e9ebed4d blueswir1
                            default:
3452 e9ebed4d blueswir1
                                goto illegal_insn;
3453 e9ebed4d blueswir1
                            }
3454 e9ebed4d blueswir1
#endif
3455 e8af50a3 bellard
                        }
3456 e8af50a3 bellard
                        break;
3457 e8af50a3 bellard
#endif
3458 3475187d bellard
#ifdef TARGET_SPARC64
3459 0f8a249a blueswir1
                    case 0x2c: /* V9 movcc */
3460 0f8a249a blueswir1
                        {
3461 0f8a249a blueswir1
                            int cc = GET_FIELD_SP(insn, 11, 12);
3462 0f8a249a blueswir1
                            int cond = GET_FIELD_SP(insn, 14, 17);
3463 748b9d8e blueswir1
                            TCGv r_cond;
3464 00f219bf blueswir1
                            int l1;
3465 00f219bf blueswir1
3466 a7812ae4 pbrook
                            r_cond = tcg_temp_new();
3467 0f8a249a blueswir1
                            if (insn & (1 << 18)) {
3468 0f8a249a blueswir1
                                if (cc == 0)
3469 8393617c Blue Swirl
                                    gen_cond(r_cond, 0, cond, dc);
3470 0f8a249a blueswir1
                                else if (cc == 2)
3471 8393617c Blue Swirl
                                    gen_cond(r_cond, 1, cond, dc);
3472 0f8a249a blueswir1
                                else
3473 0f8a249a blueswir1
                                    goto illegal_insn;
3474 0f8a249a blueswir1
                            } else {
3475 748b9d8e blueswir1
                                gen_fcond(r_cond, cc, cond);
3476 0f8a249a blueswir1
                            }
3477 00f219bf blueswir1
3478 00f219bf blueswir1
                            l1 = gen_new_label();
3479 00f219bf blueswir1
3480 cb63669a pbrook
                            tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond, 0, l1);
3481 00f219bf blueswir1
                            if (IS_IMM) {       /* immediate */
3482 2ea815ca blueswir1
                                TCGv r_const;
3483 2ea815ca blueswir1
3484 67526b20 Blue Swirl
                                simm = GET_FIELD_SPs(insn, 0, 10);
3485 67526b20 Blue Swirl
                                r_const = tcg_const_tl(simm);
3486 2ea815ca blueswir1
                                gen_movl_TN_reg(rd, r_const);
3487 2ea815ca blueswir1
                                tcg_temp_free(r_const);
3488 00f219bf blueswir1
                            } else {
3489 00f219bf blueswir1
                                rs2 = GET_FIELD_SP(insn, 0, 4);
3490 9c6c6662 blueswir1
                                gen_movl_reg_TN(rs2, cpu_tmp0);
3491 9c6c6662 blueswir1
                                gen_movl_TN_reg(rd, cpu_tmp0);
3492 00f219bf blueswir1
                            }
3493 00f219bf blueswir1
                            gen_set_label(l1);
3494 2ea815ca blueswir1
                            tcg_temp_free(r_cond);
3495 0f8a249a blueswir1
                            break;
3496 0f8a249a blueswir1
                        }
3497 0f8a249a blueswir1
                    case 0x2d: /* V9 sdivx */
3498 6ae20372 blueswir1
                        gen_op_sdivx(cpu_dst, cpu_src1, cpu_src2);
3499 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3500 0f8a249a blueswir1
                        break;
3501 0f8a249a blueswir1
                    case 0x2e: /* V9 popc */
3502 0f8a249a blueswir1
                        {
3503 a49d9390 blueswir1
                            cpu_src2 = get_src2(insn, cpu_src2);
3504 a7812ae4 pbrook
                            gen_helper_popc(cpu_dst, cpu_src2);
3505 6ae20372 blueswir1
                            gen_movl_TN_reg(rd, cpu_dst);
3506 0f8a249a blueswir1
                        }
3507 0f8a249a blueswir1
                    case 0x2f: /* V9 movr */
3508 0f8a249a blueswir1
                        {
3509 0f8a249a blueswir1
                            int cond = GET_FIELD_SP(insn, 10, 12);
3510 00f219bf blueswir1
                            int l1;
3511 00f219bf blueswir1
3512 9322a4bf blueswir1
                            cpu_src1 = get_src1(insn, cpu_src1);
3513 00f219bf blueswir1
3514 00f219bf blueswir1
                            l1 = gen_new_label();
3515 00f219bf blueswir1
3516 cb63669a pbrook
                            tcg_gen_brcondi_tl(gen_tcg_cond_reg[cond],
3517 cb63669a pbrook
                                              cpu_src1, 0, l1);
3518 0f8a249a blueswir1
                            if (IS_IMM) {       /* immediate */
3519 2ea815ca blueswir1
                                TCGv r_const;
3520 2ea815ca blueswir1
3521 67526b20 Blue Swirl
                                simm = GET_FIELD_SPs(insn, 0, 9);
3522 67526b20 Blue Swirl
                                r_const = tcg_const_tl(simm);
3523 2ea815ca blueswir1
                                gen_movl_TN_reg(rd, r_const);
3524 2ea815ca blueswir1
                                tcg_temp_free(r_const);
3525 00f219bf blueswir1
                            } else {
3526 0f8a249a blueswir1
                                rs2 = GET_FIELD_SP(insn, 0, 4);
3527 9c6c6662 blueswir1
                                gen_movl_reg_TN(rs2, cpu_tmp0);
3528 9c6c6662 blueswir1
                                gen_movl_TN_reg(rd, cpu_tmp0);
3529 0f8a249a blueswir1
                            }
3530 00f219bf blueswir1
                            gen_set_label(l1);
3531 0f8a249a blueswir1
                            break;
3532 0f8a249a blueswir1
                        }
3533 0f8a249a blueswir1
#endif
3534 0f8a249a blueswir1
                    default:
3535 0f8a249a blueswir1
                        goto illegal_insn;
3536 0f8a249a blueswir1
                    }
3537 0f8a249a blueswir1
                }
3538 3299908c blueswir1
            } else if (xop == 0x36) { /* UltraSparc shutdown, VIS, V8 CPop1 */
3539 3299908c blueswir1
#ifdef TARGET_SPARC64
3540 3299908c blueswir1
                int opf = GET_FIELD_SP(insn, 5, 13);
3541 3299908c blueswir1
                rs1 = GET_FIELD(insn, 13, 17);
3542 3299908c blueswir1
                rs2 = GET_FIELD(insn, 27, 31);
3543 6ae20372 blueswir1
                if (gen_trap_ifnofpu(dc, cpu_cond))
3544 e9ebed4d blueswir1
                    goto jmp_insn;
3545 3299908c blueswir1
3546 3299908c blueswir1
                switch (opf) {
3547 e9ebed4d blueswir1
                case 0x000: /* VIS I edge8cc */
3548 e9ebed4d blueswir1
                case 0x001: /* VIS II edge8n */
3549 e9ebed4d blueswir1
                case 0x002: /* VIS I edge8lcc */
3550 e9ebed4d blueswir1
                case 0x003: /* VIS II edge8ln */
3551 e9ebed4d blueswir1
                case 0x004: /* VIS I edge16cc */
3552 e9ebed4d blueswir1
                case 0x005: /* VIS II edge16n */
3553 e9ebed4d blueswir1
                case 0x006: /* VIS I edge16lcc */
3554 e9ebed4d blueswir1
                case 0x007: /* VIS II edge16ln */
3555 e9ebed4d blueswir1
                case 0x008: /* VIS I edge32cc */
3556 e9ebed4d blueswir1
                case 0x009: /* VIS II edge32n */
3557 e9ebed4d blueswir1
                case 0x00a: /* VIS I edge32lcc */
3558 e9ebed4d blueswir1
                case 0x00b: /* VIS II edge32ln */
3559 e9ebed4d blueswir1
                    // XXX
3560 e9ebed4d blueswir1
                    goto illegal_insn;
3561 e9ebed4d blueswir1
                case 0x010: /* VIS I array8 */
3562 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3563 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
3564 6ae20372 blueswir1
                    gen_movl_reg_TN(rs2, cpu_src2);
3565 a7812ae4 pbrook
                    gen_helper_array8(cpu_dst, cpu_src1, cpu_src2);
3566 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
3567 e9ebed4d blueswir1
                    break;
3568 e9ebed4d blueswir1
                case 0x012: /* VIS I array16 */
3569 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3570 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
3571 6ae20372 blueswir1
                    gen_movl_reg_TN(rs2, cpu_src2);
3572 a7812ae4 pbrook
                    gen_helper_array8(cpu_dst, cpu_src1, cpu_src2);
3573 6ae20372 blueswir1
                    tcg_gen_shli_i64(cpu_dst, cpu_dst, 1);
3574 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
3575 e9ebed4d blueswir1
                    break;
3576 e9ebed4d blueswir1
                case 0x014: /* VIS I array32 */
3577 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3578 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
3579 6ae20372 blueswir1
                    gen_movl_reg_TN(rs2, cpu_src2);
3580 a7812ae4 pbrook
                    gen_helper_array8(cpu_dst, cpu_src1, cpu_src2);
3581 6ae20372 blueswir1
                    tcg_gen_shli_i64(cpu_dst, cpu_dst, 2);
3582 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
3583 e9ebed4d blueswir1
                    break;
3584 3299908c blueswir1
                case 0x018: /* VIS I alignaddr */
3585 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3586 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
3587 6ae20372 blueswir1
                    gen_movl_reg_TN(rs2, cpu_src2);
3588 a7812ae4 pbrook
                    gen_helper_alignaddr(cpu_dst, cpu_src1, cpu_src2);
3589 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
3590 3299908c blueswir1
                    break;
3591 e9ebed4d blueswir1
                case 0x019: /* VIS II bmask */
3592 3299908c blueswir1
                case 0x01a: /* VIS I alignaddrl */
3593 3299908c blueswir1
                    // XXX
3594 e9ebed4d blueswir1
                    goto illegal_insn;
3595 e9ebed4d blueswir1
                case 0x020: /* VIS I fcmple16 */
3596 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3597 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3598 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3599 a7812ae4 pbrook
                    gen_helper_fcmple16();
3600 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3601 e9ebed4d blueswir1
                    break;
3602 e9ebed4d blueswir1
                case 0x022: /* VIS I fcmpne16 */
3603 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3604 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3605 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3606 a7812ae4 pbrook
                    gen_helper_fcmpne16();
3607 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3608 3299908c blueswir1
                    break;
3609 e9ebed4d blueswir1
                case 0x024: /* VIS I fcmple32 */
3610 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3611 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3612 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3613 a7812ae4 pbrook
                    gen_helper_fcmple32();
3614 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3615 e9ebed4d blueswir1
                    break;
3616 e9ebed4d blueswir1
                case 0x026: /* VIS I fcmpne32 */
3617 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3618 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3619 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3620 a7812ae4 pbrook
                    gen_helper_fcmpne32();
3621 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3622 e9ebed4d blueswir1
                    break;
3623 e9ebed4d blueswir1
                case 0x028: /* VIS I fcmpgt16 */
3624 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3625 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3626 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3627 a7812ae4 pbrook
                    gen_helper_fcmpgt16();
3628 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3629 e9ebed4d blueswir1
                    break;
3630 e9ebed4d blueswir1
                case 0x02a: /* VIS I fcmpeq16 */
3631 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3632 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3633 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3634 a7812ae4 pbrook
                    gen_helper_fcmpeq16();
3635 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3636 e9ebed4d blueswir1
                    break;
3637 e9ebed4d blueswir1
                case 0x02c: /* VIS I fcmpgt32 */
3638 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3639 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3640 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3641 a7812ae4 pbrook
                    gen_helper_fcmpgt32();
3642 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3643 e9ebed4d blueswir1
                    break;
3644 e9ebed4d blueswir1
                case 0x02e: /* VIS I fcmpeq32 */
3645 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3646 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3647 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3648 a7812ae4 pbrook
                    gen_helper_fcmpeq32();
3649 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3650 e9ebed4d blueswir1
                    break;
3651 e9ebed4d blueswir1
                case 0x031: /* VIS I fmul8x16 */
3652 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3653 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3654 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3655 a7812ae4 pbrook
                    gen_helper_fmul8x16();
3656 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3657 e9ebed4d blueswir1
                    break;
3658 e9ebed4d blueswir1
                case 0x033: /* VIS I fmul8x16au */
3659 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3660 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3661 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3662 a7812ae4 pbrook
                    gen_helper_fmul8x16au();
3663 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3664 e9ebed4d blueswir1
                    break;
3665 e9ebed4d blueswir1
                case 0x035: /* VIS I fmul8x16al */
3666 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3667 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3668 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3669 a7812ae4 pbrook
                    gen_helper_fmul8x16al();
3670 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3671 e9ebed4d blueswir1
                    break;
3672 e9ebed4d blueswir1
                case 0x036: /* VIS I fmul8sux16 */
3673 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3674 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3675 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3676 a7812ae4 pbrook
                    gen_helper_fmul8sux16();
3677 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3678 e9ebed4d blueswir1
                    break;
3679 e9ebed4d blueswir1
                case 0x037: /* VIS I fmul8ulx16 */
3680 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3681 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3682 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3683 a7812ae4 pbrook
                    gen_helper_fmul8ulx16();
3684 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3685 e9ebed4d blueswir1
                    break;
3686 e9ebed4d blueswir1
                case 0x038: /* VIS I fmuld8sux16 */
3687 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3688 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3689 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3690 a7812ae4 pbrook
                    gen_helper_fmuld8sux16();
3691 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3692 e9ebed4d blueswir1
                    break;
3693 e9ebed4d blueswir1
                case 0x039: /* VIS I fmuld8ulx16 */
3694 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3695 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3696 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3697 a7812ae4 pbrook
                    gen_helper_fmuld8ulx16();
3698 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3699 e9ebed4d blueswir1
                    break;
3700 e9ebed4d blueswir1
                case 0x03a: /* VIS I fpack32 */
3701 e9ebed4d blueswir1
                case 0x03b: /* VIS I fpack16 */
3702 e9ebed4d blueswir1
                case 0x03d: /* VIS I fpackfix */
3703 e9ebed4d blueswir1
                case 0x03e: /* VIS I pdist */
3704 e9ebed4d blueswir1
                    // XXX
3705 e9ebed4d blueswir1
                    goto illegal_insn;
3706 3299908c blueswir1
                case 0x048: /* VIS I faligndata */
3707 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3708 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3709 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3710 a7812ae4 pbrook
                    gen_helper_faligndata();
3711 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3712 3299908c blueswir1
                    break;
3713 e9ebed4d blueswir1
                case 0x04b: /* VIS I fpmerge */
3714 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3715 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3716 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3717 a7812ae4 pbrook
                    gen_helper_fpmerge();
3718 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3719 e9ebed4d blueswir1
                    break;
3720 e9ebed4d blueswir1
                case 0x04c: /* VIS II bshuffle */
3721 e9ebed4d blueswir1
                    // XXX
3722 e9ebed4d blueswir1
                    goto illegal_insn;
3723 e9ebed4d blueswir1
                case 0x04d: /* VIS I fexpand */
3724 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3725 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3726 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3727 a7812ae4 pbrook
                    gen_helper_fexpand();
3728 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3729 e9ebed4d blueswir1
                    break;
3730 e9ebed4d blueswir1
                case 0x050: /* VIS I fpadd16 */
3731 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3732 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3733 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3734 a7812ae4 pbrook
                    gen_helper_fpadd16();
3735 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3736 e9ebed4d blueswir1
                    break;
3737 e9ebed4d blueswir1
                case 0x051: /* VIS I fpadd16s */
3738 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3739 a7812ae4 pbrook
                    gen_helper_fpadd16s(cpu_fpr[rd],
3740 a7812ae4 pbrook
                                        cpu_fpr[rs1], cpu_fpr[rs2]);
3741 e9ebed4d blueswir1
                    break;
3742 e9ebed4d blueswir1
                case 0x052: /* VIS I fpadd32 */
3743 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3744 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3745 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3746 a7812ae4 pbrook
                    gen_helper_fpadd32();
3747 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3748 e9ebed4d blueswir1
                    break;
3749 e9ebed4d blueswir1
                case 0x053: /* VIS I fpadd32s */
3750 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3751 a7812ae4 pbrook
                    gen_helper_fpadd32s(cpu_fpr[rd],
3752 a7812ae4 pbrook
                                        cpu_fpr[rs1], cpu_fpr[rs2]);
3753 e9ebed4d blueswir1
                    break;
3754 e9ebed4d blueswir1
                case 0x054: /* VIS I fpsub16 */
3755 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3756 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3757 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3758 a7812ae4 pbrook
                    gen_helper_fpsub16();
3759 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3760 e9ebed4d blueswir1
                    break;
3761 e9ebed4d blueswir1
                case 0x055: /* VIS I fpsub16s */
3762 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3763 a7812ae4 pbrook
                    gen_helper_fpsub16s(cpu_fpr[rd],
3764 a7812ae4 pbrook
                                        cpu_fpr[rs1], cpu_fpr[rs2]);
3765 e9ebed4d blueswir1
                    break;
3766 e9ebed4d blueswir1
                case 0x056: /* VIS I fpsub32 */
3767 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3768 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3769 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3770 a7812ae4 pbrook
                    gen_helper_fpsub32();
3771 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3772 e9ebed4d blueswir1
                    break;
3773 e9ebed4d blueswir1
                case 0x057: /* VIS I fpsub32s */
3774 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3775 a7812ae4 pbrook
                    gen_helper_fpsub32s(cpu_fpr[rd],
3776 a7812ae4 pbrook
                                        cpu_fpr[rs1], cpu_fpr[rs2]);
3777 e9ebed4d blueswir1
                    break;
3778 3299908c blueswir1
                case 0x060: /* VIS I fzero */
3779 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3780 1d01299d blueswir1
                    tcg_gen_movi_i32(cpu_fpr[DFPREG(rd)], 0);
3781 1d01299d blueswir1
                    tcg_gen_movi_i32(cpu_fpr[DFPREG(rd) + 1], 0);
3782 3299908c blueswir1
                    break;
3783 3299908c blueswir1
                case 0x061: /* VIS I fzeros */
3784 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3785 1d01299d blueswir1
                    tcg_gen_movi_i32(cpu_fpr[rd], 0);
3786 3299908c blueswir1
                    break;
3787 e9ebed4d blueswir1
                case 0x062: /* VIS I fnor */
3788 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3789 81b5b816 blueswir1
                    tcg_gen_nor_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1)],
3790 81b5b816 blueswir1
                                    cpu_fpr[DFPREG(rs2)]);
3791 81b5b816 blueswir1
                    tcg_gen_nor_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1) + 1],
3792 81b5b816 blueswir1
                                    cpu_fpr[DFPREG(rs2) + 1]);
3793 e9ebed4d blueswir1
                    break;
3794 e9ebed4d blueswir1
                case 0x063: /* VIS I fnors */
3795 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3796 81b5b816 blueswir1
                    tcg_gen_nor_i32(cpu_tmp32, cpu_fpr[rs1], cpu_fpr[rs2]);
3797 e9ebed4d blueswir1
                    break;
3798 e9ebed4d blueswir1
                case 0x064: /* VIS I fandnot2 */
3799 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3800 81b5b816 blueswir1
                    tcg_gen_andc_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs1)],
3801 81b5b816 blueswir1
                                     cpu_fpr[DFPREG(rs2)]);
3802 81b5b816 blueswir1
                    tcg_gen_andc_i32(cpu_fpr[DFPREG(rd) + 1],
3803 81b5b816 blueswir1
                                     cpu_fpr[DFPREG(rs1) + 1],
3804 81b5b816 blueswir1
                                     cpu_fpr[DFPREG(rs2) + 1]);
3805 e9ebed4d blueswir1
                    break;
3806 e9ebed4d blueswir1
                case 0x065: /* VIS I fandnot2s */
3807 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3808 81b5b816 blueswir1
                    tcg_gen_andc_i32(cpu_fpr[rd], cpu_fpr[rs1], cpu_fpr[rs2]);
3809 e9ebed4d blueswir1
                    break;
3810 e9ebed4d blueswir1
                case 0x066: /* VIS I fnot2 */
3811 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3812 2576d836 blueswir1
                    tcg_gen_not_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs2)]);
3813 2576d836 blueswir1
                    tcg_gen_not_i32(cpu_fpr[DFPREG(rd) + 1],
3814 2576d836 blueswir1
                                    cpu_fpr[DFPREG(rs2) + 1]);
3815 e9ebed4d blueswir1
                    break;
3816 e9ebed4d blueswir1
                case 0x067: /* VIS I fnot2s */
3817 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3818 2576d836 blueswir1
                    tcg_gen_not_i32(cpu_fpr[rd], cpu_fpr[rs2]);
3819 e9ebed4d blueswir1
                    break;
3820 e9ebed4d blueswir1
                case 0x068: /* VIS I fandnot1 */
3821 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3822 81b5b816 blueswir1
                    tcg_gen_andc_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs2)],
3823 81b5b816 blueswir1
                                     cpu_fpr[DFPREG(rs1)]);
3824 81b5b816 blueswir1
                    tcg_gen_andc_i32(cpu_fpr[DFPREG(rd) + 1],
3825 81b5b816 blueswir1
                                     cpu_fpr[DFPREG(rs2) + 1],
3826 81b5b816 blueswir1
                                     cpu_fpr[DFPREG(rs1) + 1]);
3827 e9ebed4d blueswir1
                    break;
3828 e9ebed4d blueswir1
                case 0x069: /* VIS I fandnot1s */
3829 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3830 81b5b816 blueswir1
                    tcg_gen_andc_i32(cpu_fpr[rd], cpu_fpr[rs2], cpu_fpr[rs1]);
3831 e9ebed4d blueswir1
                    break;
3832 e9ebed4d blueswir1
                case 0x06a: /* VIS I fnot1 */
3833 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3834 2576d836 blueswir1
                    tcg_gen_not_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs1)]);
3835 2576d836 blueswir1
                    tcg_gen_not_i32(cpu_fpr[DFPREG(rd) + 1],
3836 2576d836 blueswir1
                                    cpu_fpr[DFPREG(rs1) + 1]);
3837 e9ebed4d blueswir1
                    break;
3838 e9ebed4d blueswir1
                case 0x06b: /* VIS I fnot1s */
3839 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3840 2576d836 blueswir1
                    tcg_gen_not_i32(cpu_fpr[rd], cpu_fpr[rs1]);
3841 e9ebed4d blueswir1
                    break;
3842 e9ebed4d blueswir1
                case 0x06c: /* VIS I fxor */
3843 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3844 e2ea21b3 blueswir1
                    tcg_gen_xor_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs1)],
3845 e2ea21b3 blueswir1
                                    cpu_fpr[DFPREG(rs2)]);
3846 e2ea21b3 blueswir1
                    tcg_gen_xor_i32(cpu_fpr[DFPREG(rd) + 1],
3847 e2ea21b3 blueswir1
                                    cpu_fpr[DFPREG(rs1) + 1],
3848 e2ea21b3 blueswir1
                                    cpu_fpr[DFPREG(rs2) + 1]);
3849 e9ebed4d blueswir1
                    break;
3850 e9ebed4d blueswir1
                case 0x06d: /* VIS I fxors */
3851 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3852 1d01299d blueswir1
                    tcg_gen_xor_i32(cpu_fpr[rd], cpu_fpr[rs1], cpu_fpr[rs2]);
3853 e9ebed4d blueswir1
                    break;
3854 e9ebed4d blueswir1
                case 0x06e: /* VIS I fnand */
3855 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3856 81b5b816 blueswir1
                    tcg_gen_nand_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1)],
3857 81b5b816 blueswir1
                                     cpu_fpr[DFPREG(rs2)]);
3858 81b5b816 blueswir1
                    tcg_gen_nand_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1) + 1],
3859 81b5b816 blueswir1
                                     cpu_fpr[DFPREG(rs2) + 1]);
3860 e9ebed4d blueswir1
                    break;
3861 e9ebed4d blueswir1
                case 0x06f: /* VIS I fnands */
3862 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3863 81b5b816 blueswir1
                    tcg_gen_nand_i32(cpu_tmp32, cpu_fpr[rs1], cpu_fpr[rs2]);
3864 e9ebed4d blueswir1
                    break;
3865 e9ebed4d blueswir1
                case 0x070: /* VIS I fand */
3866 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3867 e2ea21b3 blueswir1
                    tcg_gen_and_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs1)],
3868 e2ea21b3 blueswir1
                                    cpu_fpr[DFPREG(rs2)]);
3869 e2ea21b3 blueswir1
                    tcg_gen_and_i32(cpu_fpr[DFPREG(rd) + 1],
3870 e2ea21b3 blueswir1
                                    cpu_fpr[DFPREG(rs1) + 1],
3871 e2ea21b3 blueswir1
                                    cpu_fpr[DFPREG(rs2) + 1]);
3872 e9ebed4d blueswir1
                    break;
3873 e9ebed4d blueswir1
                case 0x071: /* VIS I fands */
3874 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3875 1d01299d blueswir1
                    tcg_gen_and_i32(cpu_fpr[rd], cpu_fpr[rs1], cpu_fpr[rs2]);
3876 e9ebed4d blueswir1
                    break;
3877 e9ebed4d blueswir1
                case 0x072: /* VIS I fxnor */
3878 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3879 e2ea21b3 blueswir1
                    tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[DFPREG(rs2)], -1);
3880 e2ea21b3 blueswir1
                    tcg_gen_xor_i32(cpu_fpr[DFPREG(rd)], cpu_tmp32,
3881 e2ea21b3 blueswir1
                                    cpu_fpr[DFPREG(rs1)]);
3882 e2ea21b3 blueswir1
                    tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[DFPREG(rs2) + 1], -1);
3883 e2ea21b3 blueswir1
                    tcg_gen_xor_i32(cpu_fpr[DFPREG(rd) + 1], cpu_tmp32,
3884 e2ea21b3 blueswir1
                                    cpu_fpr[DFPREG(rs1) + 1]);
3885 e9ebed4d blueswir1
                    break;
3886 e9ebed4d blueswir1
                case 0x073: /* VIS I fxnors */
3887 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3888 1d01299d blueswir1
                    tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[rs2], -1);
3889 1d01299d blueswir1
                    tcg_gen_xor_i32(cpu_fpr[rd], cpu_tmp32, cpu_fpr[rs1]);
3890 e9ebed4d blueswir1
                    break;
3891 3299908c blueswir1
                case 0x074: /* VIS I fsrc1 */
3892 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3893 1d01299d blueswir1
                    tcg_gen_mov_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs1)]);
3894 1d01299d blueswir1
                    tcg_gen_mov_i32(cpu_fpr[DFPREG(rd) + 1],
3895 1d01299d blueswir1
                                    cpu_fpr[DFPREG(rs1) + 1]);
3896 3299908c blueswir1
                    break;
3897 3299908c blueswir1
                case 0x075: /* VIS I fsrc1s */
3898 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3899 1d01299d blueswir1
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_fpr[rs1]);
3900 3299908c blueswir1
                    break;
3901 e9ebed4d blueswir1
                case 0x076: /* VIS I fornot2 */
3902 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3903 81b5b816 blueswir1
                    tcg_gen_orc_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs1)],
3904 81b5b816 blueswir1
                                    cpu_fpr[DFPREG(rs2)]);
3905 81b5b816 blueswir1
                    tcg_gen_orc_i32(cpu_fpr[DFPREG(rd) + 1],
3906 81b5b816 blueswir1
                                    cpu_fpr[DFPREG(rs1) + 1],
3907 81b5b816 blueswir1
                                    cpu_fpr[DFPREG(rs2) + 1]);
3908 e9ebed4d blueswir1
                    break;
3909 e9ebed4d blueswir1
                case 0x077: /* VIS I fornot2s */
3910 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3911 81b5b816 blueswir1
                    tcg_gen_orc_i32(cpu_fpr[rd], cpu_fpr[rs1], cpu_fpr[rs2]);
3912 e9ebed4d blueswir1
                    break;
3913 3299908c blueswir1
                case 0x078: /* VIS I fsrc2 */
3914 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3915 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs2));
3916 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3917 3299908c blueswir1
                    break;
3918 3299908c blueswir1
                case 0x079: /* VIS I fsrc2s */
3919 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3920 1d01299d blueswir1
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_fpr[rs2]);
3921 3299908c blueswir1
                    break;
3922 e9ebed4d blueswir1
                case 0x07a: /* VIS I fornot1 */
3923 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3924 81b5b816 blueswir1
                    tcg_gen_orc_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs2)],
3925 81b5b816 blueswir1
                                    cpu_fpr[DFPREG(rs1)]);
3926 81b5b816 blueswir1
                    tcg_gen_orc_i32(cpu_fpr[DFPREG(rd) + 1],
3927 81b5b816 blueswir1
                                    cpu_fpr[DFPREG(rs2) + 1],
3928 81b5b816 blueswir1
                                    cpu_fpr[DFPREG(rs1) + 1]);
3929 e9ebed4d blueswir1
                    break;
3930 e9ebed4d blueswir1
                case 0x07b: /* VIS I fornot1s */
3931 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3932 81b5b816 blueswir1
                    tcg_gen_orc_i32(cpu_fpr[rd], cpu_fpr[rs2], cpu_fpr[rs1]);
3933 e9ebed4d blueswir1
                    break;
3934 e9ebed4d blueswir1
                case 0x07c: /* VIS I for */
3935 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3936 e2ea21b3 blueswir1
                    tcg_gen_or_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs1)],
3937 e2ea21b3 blueswir1
                                   cpu_fpr[DFPREG(rs2)]);
3938 e2ea21b3 blueswir1
                    tcg_gen_or_i32(cpu_fpr[DFPREG(rd) + 1],
3939 e2ea21b3 blueswir1
                                   cpu_fpr[DFPREG(rs1) + 1],
3940 e2ea21b3 blueswir1
                                   cpu_fpr[DFPREG(rs2) + 1]);
3941 e9ebed4d blueswir1
                    break;
3942 e9ebed4d blueswir1
                case 0x07d: /* VIS I fors */
3943 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3944 1d01299d blueswir1
                    tcg_gen_or_i32(cpu_fpr[rd], cpu_fpr[rs1], cpu_fpr[rs2]);
3945 e9ebed4d blueswir1
                    break;
3946 3299908c blueswir1
                case 0x07e: /* VIS I fone */
3947 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3948 1d01299d blueswir1
                    tcg_gen_movi_i32(cpu_fpr[DFPREG(rd)], -1);
3949 1d01299d blueswir1
                    tcg_gen_movi_i32(cpu_fpr[DFPREG(rd) + 1], -1);
3950 3299908c blueswir1
                    break;
3951 3299908c blueswir1
                case 0x07f: /* VIS I fones */
3952 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3953 1d01299d blueswir1
                    tcg_gen_movi_i32(cpu_fpr[rd], -1);
3954 3299908c blueswir1
                    break;
3955 e9ebed4d blueswir1
                case 0x080: /* VIS I shutdown */
3956 e9ebed4d blueswir1
                case 0x081: /* VIS II siam */
3957 e9ebed4d blueswir1
                    // XXX
3958 e9ebed4d blueswir1
                    goto illegal_insn;
3959 3299908c blueswir1
                default:
3960 3299908c blueswir1
                    goto illegal_insn;
3961 3299908c blueswir1
                }
3962 3299908c blueswir1
#else
3963 0f8a249a blueswir1
                goto ncp_insn;
3964 3299908c blueswir1
#endif
3965 3299908c blueswir1
            } else if (xop == 0x37) { /* V8 CPop2, V9 impdep2 */
3966 fcc72045 blueswir1
#ifdef TARGET_SPARC64
3967 0f8a249a blueswir1
                goto illegal_insn;
3968 fcc72045 blueswir1
#else
3969 0f8a249a blueswir1
                goto ncp_insn;
3970 fcc72045 blueswir1
#endif
3971 3475187d bellard
#ifdef TARGET_SPARC64
3972 0f8a249a blueswir1
            } else if (xop == 0x39) { /* V9 return */
3973 a7812ae4 pbrook
                TCGv_i32 r_const;
3974 2ea815ca blueswir1
3975 6ae20372 blueswir1
                save_state(dc, cpu_cond);
3976 9322a4bf blueswir1
                cpu_src1 = get_src1(insn, cpu_src1);
3977 0f8a249a blueswir1
                if (IS_IMM) {   /* immediate */
3978 67526b20 Blue Swirl
                    simm = GET_FIELDs(insn, 19, 31);
3979 67526b20 Blue Swirl
                    tcg_gen_addi_tl(cpu_dst, cpu_src1, simm);
3980 0f8a249a blueswir1
                } else {                /* register */
3981 3475187d bellard
                    rs2 = GET_FIELD(insn, 27, 31);
3982 0f8a249a blueswir1
                    if (rs2) {
3983 6ae20372 blueswir1
                        gen_movl_reg_TN(rs2, cpu_src2);
3984 6ae20372 blueswir1
                        tcg_gen_add_tl(cpu_dst, cpu_src1, cpu_src2);
3985 6f551262 blueswir1
                    } else
3986 6f551262 blueswir1
                        tcg_gen_mov_tl(cpu_dst, cpu_src1);
3987 3475187d bellard
                }
3988 a7812ae4 pbrook
                gen_helper_restore();
3989 6ae20372 blueswir1
                gen_mov_pc_npc(dc, cpu_cond);
3990 2ea815ca blueswir1
                r_const = tcg_const_i32(3);
3991 a7812ae4 pbrook
                gen_helper_check_align(cpu_dst, r_const);
3992 a7812ae4 pbrook
                tcg_temp_free_i32(r_const);
3993 6ae20372 blueswir1
                tcg_gen_mov_tl(cpu_npc, cpu_dst);
3994 0f8a249a blueswir1
                dc->npc = DYNAMIC_PC;
3995 0f8a249a blueswir1
                goto jmp_insn;
3996 3475187d bellard
#endif
3997 0f8a249a blueswir1
            } else {
3998 9322a4bf blueswir1
                cpu_src1 = get_src1(insn, cpu_src1);
3999 0f8a249a blueswir1
                if (IS_IMM) {   /* immediate */
4000 67526b20 Blue Swirl
                    simm = GET_FIELDs(insn, 19, 31);
4001 67526b20 Blue Swirl
                    tcg_gen_addi_tl(cpu_dst, cpu_src1, simm);
4002 0f8a249a blueswir1
                } else {                /* register */
4003 e80cfcfc bellard
                    rs2 = GET_FIELD(insn, 27, 31);
4004 0f8a249a blueswir1
                    if (rs2) {
4005 6ae20372 blueswir1
                        gen_movl_reg_TN(rs2, cpu_src2);
4006 6ae20372 blueswir1
                        tcg_gen_add_tl(cpu_dst, cpu_src1, cpu_src2);
4007 6f551262 blueswir1
                    } else
4008 6f551262 blueswir1
                        tcg_gen_mov_tl(cpu_dst, cpu_src1);
4009 cf495bcf bellard
                }
4010 0f8a249a blueswir1
                switch (xop) {
4011 0f8a249a blueswir1
                case 0x38:      /* jmpl */
4012 0f8a249a blueswir1
                    {
4013 a7812ae4 pbrook
                        TCGv r_pc;
4014 a7812ae4 pbrook
                        TCGv_i32 r_const;
4015 2ea815ca blueswir1
4016 a7812ae4 pbrook
                        r_pc = tcg_const_tl(dc->pc);
4017 a7812ae4 pbrook
                        gen_movl_TN_reg(rd, r_pc);
4018 a7812ae4 pbrook
                        tcg_temp_free(r_pc);
4019 6ae20372 blueswir1
                        gen_mov_pc_npc(dc, cpu_cond);
4020 2ea815ca blueswir1
                        r_const = tcg_const_i32(3);
4021 a7812ae4 pbrook
                        gen_helper_check_align(cpu_dst, r_const);
4022 a7812ae4 pbrook
                        tcg_temp_free_i32(r_const);
4023 6ae20372 blueswir1
                        tcg_gen_mov_tl(cpu_npc, cpu_dst);
4024 0f8a249a blueswir1
                        dc->npc = DYNAMIC_PC;
4025 0f8a249a blueswir1
                    }
4026 0f8a249a blueswir1
                    goto jmp_insn;
4027 3475187d bellard
#if !defined(CONFIG_USER_ONLY) && !defined(TARGET_SPARC64)
4028 0f8a249a blueswir1
                case 0x39:      /* rett, V9 return */
4029 0f8a249a blueswir1
                    {
4030 a7812ae4 pbrook
                        TCGv_i32 r_const;
4031 2ea815ca blueswir1
4032 0f8a249a blueswir1
                        if (!supervisor(dc))
4033 0f8a249a blueswir1
                            goto priv_insn;
4034 6ae20372 blueswir1
                        gen_mov_pc_npc(dc, cpu_cond);
4035 2ea815ca blueswir1
                        r_const = tcg_const_i32(3);
4036 a7812ae4 pbrook
                        gen_helper_check_align(cpu_dst, r_const);
4037 a7812ae4 pbrook
                        tcg_temp_free_i32(r_const);
4038 6ae20372 blueswir1
                        tcg_gen_mov_tl(cpu_npc, cpu_dst);
4039 0f8a249a blueswir1
                        dc->npc = DYNAMIC_PC;
4040 a7812ae4 pbrook
                        gen_helper_rett();
4041 0f8a249a blueswir1
                    }
4042 0f8a249a blueswir1
                    goto jmp_insn;
4043 0f8a249a blueswir1
#endif
4044 0f8a249a blueswir1
                case 0x3b: /* flush */
4045 5578ceab blueswir1
                    if (!((dc)->def->features & CPU_FEATURE_FLUSH))
4046 64a88d5d blueswir1
                        goto unimp_flush;
4047 a7812ae4 pbrook
                    gen_helper_flush(cpu_dst);
4048 0f8a249a blueswir1
                    break;
4049 0f8a249a blueswir1
                case 0x3c:      /* save */
4050 6ae20372 blueswir1
                    save_state(dc, cpu_cond);
4051 a7812ae4 pbrook
                    gen_helper_save();
4052 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
4053 0f8a249a blueswir1
                    break;
4054 0f8a249a blueswir1
                case 0x3d:      /* restore */
4055 6ae20372 blueswir1
                    save_state(dc, cpu_cond);
4056 a7812ae4 pbrook
                    gen_helper_restore();
4057 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
4058 0f8a249a blueswir1
                    break;
4059 3475187d bellard
#if !defined(CONFIG_USER_ONLY) && defined(TARGET_SPARC64)
4060 0f8a249a blueswir1
                case 0x3e:      /* V9 done/retry */
4061 0f8a249a blueswir1
                    {
4062 0f8a249a blueswir1
                        switch (rd) {
4063 0f8a249a blueswir1
                        case 0:
4064 0f8a249a blueswir1
                            if (!supervisor(dc))
4065 0f8a249a blueswir1
                                goto priv_insn;
4066 0f8a249a blueswir1
                            dc->npc = DYNAMIC_PC;
4067 0f8a249a blueswir1
                            dc->pc = DYNAMIC_PC;
4068 a7812ae4 pbrook
                            gen_helper_done();
4069 0f8a249a blueswir1
                            goto jmp_insn;
4070 0f8a249a blueswir1
                        case 1:
4071 0f8a249a blueswir1
                            if (!supervisor(dc))
4072 0f8a249a blueswir1
                                goto priv_insn;
4073 0f8a249a blueswir1
                            dc->npc = DYNAMIC_PC;
4074 0f8a249a blueswir1
                            dc->pc = DYNAMIC_PC;
4075 a7812ae4 pbrook
                            gen_helper_retry();
4076 0f8a249a blueswir1
                            goto jmp_insn;
4077 0f8a249a blueswir1
                        default:
4078 0f8a249a blueswir1
                            goto illegal_insn;
4079 0f8a249a blueswir1
                        }
4080 0f8a249a blueswir1
                    }
4081 0f8a249a blueswir1
                    break;
4082 0f8a249a blueswir1
#endif
4083 0f8a249a blueswir1
                default:
4084 0f8a249a blueswir1
                    goto illegal_insn;
4085 0f8a249a blueswir1
                }
4086 cf495bcf bellard
            }
4087 0f8a249a blueswir1
            break;
4088 0f8a249a blueswir1
        }
4089 0f8a249a blueswir1
        break;
4090 0f8a249a blueswir1
    case 3:                     /* load/store instructions */
4091 0f8a249a blueswir1
        {
4092 0f8a249a blueswir1
            unsigned int xop = GET_FIELD(insn, 7, 12);
4093 9322a4bf blueswir1
4094 9322a4bf blueswir1
            cpu_src1 = get_src1(insn, cpu_src1);
4095 71817e48 blueswir1
            if (xop == 0x3c || xop == 0x3e) { // V9 casa/casxa
4096 81ad8ba2 blueswir1
                rs2 = GET_FIELD(insn, 27, 31);
4097 6ae20372 blueswir1
                gen_movl_reg_TN(rs2, cpu_src2);
4098 71817e48 blueswir1
                tcg_gen_mov_tl(cpu_addr, cpu_src1);
4099 71817e48 blueswir1
            } else if (IS_IMM) {     /* immediate */
4100 67526b20 Blue Swirl
                simm = GET_FIELDs(insn, 19, 31);
4101 67526b20 Blue Swirl
                tcg_gen_addi_tl(cpu_addr, cpu_src1, simm);
4102 0f8a249a blueswir1
            } else {            /* register */
4103 0f8a249a blueswir1
                rs2 = GET_FIELD(insn, 27, 31);
4104 0f8a249a blueswir1
                if (rs2 != 0) {
4105 6ae20372 blueswir1
                    gen_movl_reg_TN(rs2, cpu_src2);
4106 6ae20372 blueswir1
                    tcg_gen_add_tl(cpu_addr, cpu_src1, cpu_src2);
4107 6f551262 blueswir1
                } else
4108 6f551262 blueswir1
                    tcg_gen_mov_tl(cpu_addr, cpu_src1);
4109 0f8a249a blueswir1
            }
4110 2f2ecb83 blueswir1
            if (xop < 4 || (xop > 7 && xop < 0x14 && xop != 0x0e) ||
4111 2f2ecb83 blueswir1
                (xop > 0x17 && xop <= 0x1d ) ||
4112 2f2ecb83 blueswir1
                (xop > 0x2c && xop <= 0x33) || xop == 0x1f || xop == 0x3d) {
4113 0f8a249a blueswir1
                switch (xop) {
4114 b89e94af Blue Swirl
                case 0x0:       /* ld, V9 lduw, load unsigned word */
4115 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4116 6ae20372 blueswir1
                    tcg_gen_qemu_ld32u(cpu_val, cpu_addr, dc->mem_idx);
4117 0f8a249a blueswir1
                    break;
4118 b89e94af Blue Swirl
                case 0x1:       /* ldub, load unsigned byte */
4119 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4120 6ae20372 blueswir1
                    tcg_gen_qemu_ld8u(cpu_val, cpu_addr, dc->mem_idx);
4121 0f8a249a blueswir1
                    break;
4122 b89e94af Blue Swirl
                case 0x2:       /* lduh, load unsigned halfword */
4123 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4124 6ae20372 blueswir1
                    tcg_gen_qemu_ld16u(cpu_val, cpu_addr, dc->mem_idx);
4125 0f8a249a blueswir1
                    break;
4126 b89e94af Blue Swirl
                case 0x3:       /* ldd, load double word */
4127 0f8a249a blueswir1
                    if (rd & 1)
4128 d4218d99 blueswir1
                        goto illegal_insn;
4129 1a2fb1c0 blueswir1
                    else {
4130 a7812ae4 pbrook
                        TCGv_i32 r_const;
4131 2ea815ca blueswir1
4132 c2bc0e38 blueswir1
                        save_state(dc, cpu_cond);
4133 2ea815ca blueswir1
                        r_const = tcg_const_i32(7);
4134 a7812ae4 pbrook
                        gen_helper_check_align(cpu_addr, r_const); // XXX remove
4135 a7812ae4 pbrook
                        tcg_temp_free_i32(r_const);
4136 2cade6a3 blueswir1
                        gen_address_mask(dc, cpu_addr);
4137 6ae20372 blueswir1
                        tcg_gen_qemu_ld64(cpu_tmp64, cpu_addr, dc->mem_idx);
4138 32b6c812 blueswir1
                        tcg_gen_trunc_i64_tl(cpu_tmp0, cpu_tmp64);
4139 32b6c812 blueswir1
                        tcg_gen_andi_tl(cpu_tmp0, cpu_tmp0, 0xffffffffULL);
4140 32b6c812 blueswir1
                        gen_movl_TN_reg(rd + 1, cpu_tmp0);
4141 8911f501 blueswir1
                        tcg_gen_shri_i64(cpu_tmp64, cpu_tmp64, 32);
4142 6ae20372 blueswir1
                        tcg_gen_trunc_i64_tl(cpu_val, cpu_tmp64);
4143 6ae20372 blueswir1
                        tcg_gen_andi_tl(cpu_val, cpu_val, 0xffffffffULL);
4144 1a2fb1c0 blueswir1
                    }
4145 0f8a249a blueswir1
                    break;
4146 b89e94af Blue Swirl
                case 0x9:       /* ldsb, load signed byte */
4147 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4148 6ae20372 blueswir1
                    tcg_gen_qemu_ld8s(cpu_val, cpu_addr, dc->mem_idx);
4149 0f8a249a blueswir1
                    break;
4150 b89e94af Blue Swirl
                case 0xa:       /* ldsh, load signed halfword */
4151 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4152 6ae20372 blueswir1
                    tcg_gen_qemu_ld16s(cpu_val, cpu_addr, dc->mem_idx);
4153 0f8a249a blueswir1
                    break;
4154 0f8a249a blueswir1
                case 0xd:       /* ldstub -- XXX: should be atomically */
4155 2ea815ca blueswir1
                    {
4156 2ea815ca blueswir1
                        TCGv r_const;
4157 2ea815ca blueswir1
4158 2cade6a3 blueswir1
                        gen_address_mask(dc, cpu_addr);
4159 2ea815ca blueswir1
                        tcg_gen_qemu_ld8s(cpu_val, cpu_addr, dc->mem_idx);
4160 2ea815ca blueswir1
                        r_const = tcg_const_tl(0xff);
4161 2ea815ca blueswir1
                        tcg_gen_qemu_st8(r_const, cpu_addr, dc->mem_idx);
4162 2ea815ca blueswir1
                        tcg_temp_free(r_const);
4163 2ea815ca blueswir1
                    }
4164 0f8a249a blueswir1
                    break;
4165 b89e94af Blue Swirl
                case 0x0f:      /* swap, swap register with memory. Also
4166 77f193da blueswir1
                                   atomically */
4167 64a88d5d blueswir1
                    CHECK_IU_FEATURE(dc, SWAP);
4168 6ae20372 blueswir1
                    gen_movl_reg_TN(rd, cpu_val);
4169 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4170 527067d8 blueswir1
                    tcg_gen_qemu_ld32u(cpu_tmp0, cpu_addr, dc->mem_idx);
4171 6ae20372 blueswir1
                    tcg_gen_qemu_st32(cpu_val, cpu_addr, dc->mem_idx);
4172 527067d8 blueswir1
                    tcg_gen_mov_tl(cpu_val, cpu_tmp0);
4173 0f8a249a blueswir1
                    break;
4174 3475187d bellard
#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64)
4175 b89e94af Blue Swirl
                case 0x10:      /* lda, V9 lduwa, load word alternate */
4176 3475187d bellard
#ifndef TARGET_SPARC64
4177 0f8a249a blueswir1
                    if (IS_IMM)
4178 0f8a249a blueswir1
                        goto illegal_insn;
4179 0f8a249a blueswir1
                    if (!supervisor(dc))
4180 0f8a249a blueswir1
                        goto priv_insn;
4181 6ea4a6c8 blueswir1
#endif
4182 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4183 6ae20372 blueswir1
                    gen_ld_asi(cpu_val, cpu_addr, insn, 4, 0);
4184 0f8a249a blueswir1
                    break;
4185 b89e94af Blue Swirl
                case 0x11:      /* lduba, load unsigned byte alternate */
4186 3475187d bellard
#ifndef TARGET_SPARC64
4187 0f8a249a blueswir1
                    if (IS_IMM)
4188 0f8a249a blueswir1
                        goto illegal_insn;
4189 0f8a249a blueswir1
                    if (!supervisor(dc))
4190 0f8a249a blueswir1
                        goto priv_insn;
4191 0f8a249a blueswir1
#endif
4192 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4193 6ae20372 blueswir1
                    gen_ld_asi(cpu_val, cpu_addr, insn, 1, 0);
4194 0f8a249a blueswir1
                    break;
4195 b89e94af Blue Swirl
                case 0x12:      /* lduha, load unsigned halfword alternate */
4196 3475187d bellard
#ifndef TARGET_SPARC64
4197 0f8a249a blueswir1
                    if (IS_IMM)
4198 0f8a249a blueswir1
                        goto illegal_insn;
4199 0f8a249a blueswir1
                    if (!supervisor(dc))
4200 0f8a249a blueswir1
                        goto priv_insn;
4201 6ea4a6c8 blueswir1
#endif
4202 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4203 6ae20372 blueswir1
                    gen_ld_asi(cpu_val, cpu_addr, insn, 2, 0);
4204 0f8a249a blueswir1
                    break;
4205 b89e94af Blue Swirl
                case 0x13:      /* ldda, load double word alternate */
4206 3475187d bellard
#ifndef TARGET_SPARC64
4207 0f8a249a blueswir1
                    if (IS_IMM)
4208 0f8a249a blueswir1
                        goto illegal_insn;
4209 0f8a249a blueswir1
                    if (!supervisor(dc))
4210 0f8a249a blueswir1
                        goto priv_insn;
4211 3475187d bellard
#endif
4212 0f8a249a blueswir1
                    if (rd & 1)
4213 d4218d99 blueswir1
                        goto illegal_insn;
4214 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4215 db166940 blueswir1
                    gen_ldda_asi(cpu_val, cpu_addr, insn, rd);
4216 db166940 blueswir1
                    goto skip_move;
4217 b89e94af Blue Swirl
                case 0x19:      /* ldsba, load signed byte alternate */
4218 3475187d bellard
#ifndef TARGET_SPARC64
4219 0f8a249a blueswir1
                    if (IS_IMM)
4220 0f8a249a blueswir1
                        goto illegal_insn;
4221 0f8a249a blueswir1
                    if (!supervisor(dc))
4222 0f8a249a blueswir1
                        goto priv_insn;
4223 0f8a249a blueswir1
#endif
4224 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4225 6ae20372 blueswir1
                    gen_ld_asi(cpu_val, cpu_addr, insn, 1, 1);
4226 0f8a249a blueswir1
                    break;
4227 b89e94af Blue Swirl
                case 0x1a:      /* ldsha, load signed halfword alternate */
4228 3475187d bellard
#ifndef TARGET_SPARC64
4229 0f8a249a blueswir1
                    if (IS_IMM)
4230 0f8a249a blueswir1
                        goto illegal_insn;
4231 0f8a249a blueswir1
                    if (!supervisor(dc))
4232 0f8a249a blueswir1
                        goto priv_insn;
4233 6ea4a6c8 blueswir1
#endif
4234 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4235 6ae20372 blueswir1
                    gen_ld_asi(cpu_val, cpu_addr, insn, 2, 1);
4236 0f8a249a blueswir1
                    break;
4237 0f8a249a blueswir1
                case 0x1d:      /* ldstuba -- XXX: should be atomically */
4238 3475187d bellard
#ifndef TARGET_SPARC64
4239 0f8a249a blueswir1
                    if (IS_IMM)
4240 0f8a249a blueswir1
                        goto illegal_insn;
4241 0f8a249a blueswir1
                    if (!supervisor(dc))
4242 0f8a249a blueswir1
                        goto priv_insn;
4243 0f8a249a blueswir1
#endif
4244 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4245 6ae20372 blueswir1
                    gen_ldstub_asi(cpu_val, cpu_addr, insn);
4246 0f8a249a blueswir1
                    break;
4247 b89e94af Blue Swirl
                case 0x1f:      /* swapa, swap reg with alt. memory. Also
4248 77f193da blueswir1
                                   atomically */
4249 64a88d5d blueswir1
                    CHECK_IU_FEATURE(dc, SWAP);
4250 3475187d bellard
#ifndef TARGET_SPARC64
4251 0f8a249a blueswir1
                    if (IS_IMM)
4252 0f8a249a blueswir1
                        goto illegal_insn;
4253 0f8a249a blueswir1
                    if (!supervisor(dc))
4254 0f8a249a blueswir1
                        goto priv_insn;
4255 6ea4a6c8 blueswir1
#endif
4256 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4257 6ae20372 blueswir1
                    gen_movl_reg_TN(rd, cpu_val);
4258 6ae20372 blueswir1
                    gen_swap_asi(cpu_val, cpu_addr, insn);
4259 0f8a249a blueswir1
                    break;
4260 3475187d bellard
4261 3475187d bellard
#ifndef TARGET_SPARC64
4262 0f8a249a blueswir1
                case 0x30: /* ldc */
4263 0f8a249a blueswir1
                case 0x31: /* ldcsr */
4264 0f8a249a blueswir1
                case 0x33: /* lddc */
4265 0f8a249a blueswir1
                    goto ncp_insn;
4266 3475187d bellard
#endif
4267 3475187d bellard
#endif
4268 3475187d bellard
#ifdef TARGET_SPARC64
4269 0f8a249a blueswir1
                case 0x08: /* V9 ldsw */
4270 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4271 6ae20372 blueswir1
                    tcg_gen_qemu_ld32s(cpu_val, cpu_addr, dc->mem_idx);
4272 0f8a249a blueswir1
                    break;
4273 0f8a249a blueswir1
                case 0x0b: /* V9 ldx */
4274 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4275 6ae20372 blueswir1
                    tcg_gen_qemu_ld64(cpu_val, cpu_addr, dc->mem_idx);
4276 0f8a249a blueswir1
                    break;
4277 0f8a249a blueswir1
                case 0x18: /* V9 ldswa */
4278 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4279 6ae20372 blueswir1
                    gen_ld_asi(cpu_val, cpu_addr, insn, 4, 1);
4280 0f8a249a blueswir1
                    break;
4281 0f8a249a blueswir1
                case 0x1b: /* V9 ldxa */
4282 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4283 6ae20372 blueswir1
                    gen_ld_asi(cpu_val, cpu_addr, insn, 8, 0);
4284 0f8a249a blueswir1
                    break;
4285 0f8a249a blueswir1
                case 0x2d: /* V9 prefetch, no effect */
4286 0f8a249a blueswir1
                    goto skip_move;
4287 0f8a249a blueswir1
                case 0x30: /* V9 ldfa */
4288 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4289 6ae20372 blueswir1
                    gen_ldf_asi(cpu_addr, insn, 4, rd);
4290 81ad8ba2 blueswir1
                    goto skip_move;
4291 0f8a249a blueswir1
                case 0x33: /* V9 lddfa */
4292 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4293 6ae20372 blueswir1
                    gen_ldf_asi(cpu_addr, insn, 8, DFPREG(rd));
4294 81ad8ba2 blueswir1
                    goto skip_move;
4295 0f8a249a blueswir1
                case 0x3d: /* V9 prefetcha, no effect */
4296 0f8a249a blueswir1
                    goto skip_move;
4297 0f8a249a blueswir1
                case 0x32: /* V9 ldqfa */
4298 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, FLOAT128);
4299 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4300 6ae20372 blueswir1
                    gen_ldf_asi(cpu_addr, insn, 16, QFPREG(rd));
4301 1f587329 blueswir1
                    goto skip_move;
4302 1f587329 blueswir1
#endif
4303 0f8a249a blueswir1
                default:
4304 0f8a249a blueswir1
                    goto illegal_insn;
4305 0f8a249a blueswir1
                }
4306 6ae20372 blueswir1
                gen_movl_TN_reg(rd, cpu_val);
4307 db166940 blueswir1
#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64)
4308 0f8a249a blueswir1
            skip_move: ;
4309 3475187d bellard
#endif
4310 0f8a249a blueswir1
            } else if (xop >= 0x20 && xop < 0x24) {
4311 6ae20372 blueswir1
                if (gen_trap_ifnofpu(dc, cpu_cond))
4312 a80dde08 bellard
                    goto jmp_insn;
4313 c2bc0e38 blueswir1
                save_state(dc, cpu_cond);
4314 0f8a249a blueswir1
                switch (xop) {
4315 b89e94af Blue Swirl
                case 0x20:      /* ldf, load fpreg */
4316 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4317 527067d8 blueswir1
                    tcg_gen_qemu_ld32u(cpu_tmp0, cpu_addr, dc->mem_idx);
4318 527067d8 blueswir1
                    tcg_gen_trunc_tl_i32(cpu_fpr[rd], cpu_tmp0);
4319 0f8a249a blueswir1
                    break;
4320 3a3b925d blueswir1
                case 0x21:      /* ldfsr, V9 ldxfsr */
4321 3a3b925d blueswir1
#ifdef TARGET_SPARC64
4322 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4323 3a3b925d blueswir1
                    if (rd == 1) {
4324 3a3b925d blueswir1
                        tcg_gen_qemu_ld64(cpu_tmp64, cpu_addr, dc->mem_idx);
4325 a7812ae4 pbrook
                        gen_helper_ldxfsr(cpu_tmp64);
4326 3a3b925d blueswir1
                    } else
4327 3a3b925d blueswir1
#else
4328 3a3b925d blueswir1
                    {
4329 3a3b925d blueswir1
                        tcg_gen_qemu_ld32u(cpu_tmp32, cpu_addr, dc->mem_idx);
4330 a7812ae4 pbrook
                        gen_helper_ldfsr(cpu_tmp32);
4331 3a3b925d blueswir1
                    }
4332 3a3b925d blueswir1
#endif
4333 0f8a249a blueswir1
                    break;
4334 b89e94af Blue Swirl
                case 0x22:      /* ldqf, load quad fpreg */
4335 2ea815ca blueswir1
                    {
4336 a7812ae4 pbrook
                        TCGv_i32 r_const;
4337 2ea815ca blueswir1
4338 2ea815ca blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
4339 2ea815ca blueswir1
                        r_const = tcg_const_i32(dc->mem_idx);
4340 a7812ae4 pbrook
                        gen_helper_ldqf(cpu_addr, r_const);
4341 a7812ae4 pbrook
                        tcg_temp_free_i32(r_const);
4342 2ea815ca blueswir1
                        gen_op_store_QT0_fpr(QFPREG(rd));
4343 2ea815ca blueswir1
                    }
4344 1f587329 blueswir1
                    break;
4345 b89e94af Blue Swirl
                case 0x23:      /* lddf, load double fpreg */
4346 2ea815ca blueswir1
                    {
4347 a7812ae4 pbrook
                        TCGv_i32 r_const;
4348 2ea815ca blueswir1
4349 2ea815ca blueswir1
                        r_const = tcg_const_i32(dc->mem_idx);
4350 a7812ae4 pbrook
                        gen_helper_lddf(cpu_addr, r_const);
4351 a7812ae4 pbrook
                        tcg_temp_free_i32(r_const);
4352 2ea815ca blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
4353 2ea815ca blueswir1
                    }
4354 0f8a249a blueswir1
                    break;
4355 0f8a249a blueswir1
                default:
4356 0f8a249a blueswir1
                    goto illegal_insn;
4357 0f8a249a blueswir1
                }
4358 dc1a6971 Blue Swirl
            } else if (xop < 8 || (xop >= 0x14 && xop < 0x18) ||
4359 0f8a249a blueswir1
                       xop == 0xe || xop == 0x1e) {
4360 6ae20372 blueswir1
                gen_movl_reg_TN(rd, cpu_val);
4361 0f8a249a blueswir1
                switch (xop) {
4362 b89e94af Blue Swirl
                case 0x4: /* st, store word */
4363 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4364 6ae20372 blueswir1
                    tcg_gen_qemu_st32(cpu_val, cpu_addr, dc->mem_idx);
4365 0f8a249a blueswir1
                    break;
4366 b89e94af Blue Swirl
                case 0x5: /* stb, store byte */
4367 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4368 6ae20372 blueswir1
                    tcg_gen_qemu_st8(cpu_val, cpu_addr, dc->mem_idx);
4369 0f8a249a blueswir1
                    break;
4370 b89e94af Blue Swirl
                case 0x6: /* sth, store halfword */
4371 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4372 6ae20372 blueswir1
                    tcg_gen_qemu_st16(cpu_val, cpu_addr, dc->mem_idx);
4373 0f8a249a blueswir1
                    break;
4374 b89e94af Blue Swirl
                case 0x7: /* std, store double word */
4375 0f8a249a blueswir1
                    if (rd & 1)
4376 d4218d99 blueswir1
                        goto illegal_insn;
4377 1a2fb1c0 blueswir1
                    else {
4378 a7812ae4 pbrook
                        TCGv_i32 r_const;
4379 1a2fb1c0 blueswir1
4380 c2bc0e38 blueswir1
                        save_state(dc, cpu_cond);
4381 2cade6a3 blueswir1
                        gen_address_mask(dc, cpu_addr);
4382 2ea815ca blueswir1
                        r_const = tcg_const_i32(7);
4383 a7812ae4 pbrook
                        gen_helper_check_align(cpu_addr, r_const); // XXX remove
4384 a7812ae4 pbrook
                        tcg_temp_free_i32(r_const);
4385 a7ec4229 blueswir1
                        gen_movl_reg_TN(rd + 1, cpu_tmp0);
4386 ab508019 blueswir1
                        tcg_gen_concat_tl_i64(cpu_tmp64, cpu_tmp0, cpu_val);
4387 6ae20372 blueswir1
                        tcg_gen_qemu_st64(cpu_tmp64, cpu_addr, dc->mem_idx);
4388 7fa76c0b blueswir1
                    }
4389 0f8a249a blueswir1
                    break;
4390 3475187d bellard
#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64)
4391 b89e94af Blue Swirl
                case 0x14: /* sta, V9 stwa, store word alternate */
4392 3475187d bellard
#ifndef TARGET_SPARC64
4393 0f8a249a blueswir1
                    if (IS_IMM)
4394 0f8a249a blueswir1
                        goto illegal_insn;
4395 0f8a249a blueswir1
                    if (!supervisor(dc))
4396 0f8a249a blueswir1
                        goto priv_insn;
4397 3475187d bellard
#endif
4398 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4399 6ae20372 blueswir1
                    gen_st_asi(cpu_val, cpu_addr, insn, 4);
4400 d39c0b99 bellard
                    break;
4401 b89e94af Blue Swirl
                case 0x15: /* stba, store byte alternate */
4402 3475187d bellard
#ifndef TARGET_SPARC64
4403 0f8a249a blueswir1
                    if (IS_IMM)
4404 0f8a249a blueswir1
                        goto illegal_insn;
4405 0f8a249a blueswir1
                    if (!supervisor(dc))
4406 0f8a249a blueswir1
                        goto priv_insn;
4407 3475187d bellard
#endif
4408 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4409 6ae20372 blueswir1
                    gen_st_asi(cpu_val, cpu_addr, insn, 1);
4410 d39c0b99 bellard
                    break;
4411 b89e94af Blue Swirl
                case 0x16: /* stha, store halfword alternate */
4412 3475187d bellard
#ifndef TARGET_SPARC64
4413 0f8a249a blueswir1
                    if (IS_IMM)
4414 0f8a249a blueswir1
                        goto illegal_insn;
4415 0f8a249a blueswir1
                    if (!supervisor(dc))
4416 0f8a249a blueswir1
                        goto priv_insn;
4417 3475187d bellard
#endif
4418 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4419 6ae20372 blueswir1
                    gen_st_asi(cpu_val, cpu_addr, insn, 2);
4420 d39c0b99 bellard
                    break;
4421 b89e94af Blue Swirl
                case 0x17: /* stda, store double word alternate */
4422 3475187d bellard
#ifndef TARGET_SPARC64
4423 0f8a249a blueswir1
                    if (IS_IMM)
4424 0f8a249a blueswir1
                        goto illegal_insn;
4425 0f8a249a blueswir1
                    if (!supervisor(dc))
4426 0f8a249a blueswir1
                        goto priv_insn;
4427 3475187d bellard
#endif
4428 0f8a249a blueswir1
                    if (rd & 1)
4429 d4218d99 blueswir1
                        goto illegal_insn;
4430 1a2fb1c0 blueswir1
                    else {
4431 c2bc0e38 blueswir1
                        save_state(dc, cpu_cond);
4432 6ae20372 blueswir1
                        gen_stda_asi(cpu_val, cpu_addr, insn, rd);
4433 1a2fb1c0 blueswir1
                    }
4434 d39c0b99 bellard
                    break;
4435 e80cfcfc bellard
#endif
4436 3475187d bellard
#ifdef TARGET_SPARC64
4437 0f8a249a blueswir1
                case 0x0e: /* V9 stx */
4438 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4439 6ae20372 blueswir1
                    tcg_gen_qemu_st64(cpu_val, cpu_addr, dc->mem_idx);
4440 0f8a249a blueswir1
                    break;
4441 0f8a249a blueswir1
                case 0x1e: /* V9 stxa */
4442 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4443 6ae20372 blueswir1
                    gen_st_asi(cpu_val, cpu_addr, insn, 8);
4444 0f8a249a blueswir1
                    break;
4445 3475187d bellard
#endif
4446 0f8a249a blueswir1
                default:
4447 0f8a249a blueswir1
                    goto illegal_insn;
4448 0f8a249a blueswir1
                }
4449 0f8a249a blueswir1
            } else if (xop > 0x23 && xop < 0x28) {
4450 6ae20372 blueswir1
                if (gen_trap_ifnofpu(dc, cpu_cond))
4451 a80dde08 bellard
                    goto jmp_insn;
4452 c2bc0e38 blueswir1
                save_state(dc, cpu_cond);
4453 0f8a249a blueswir1
                switch (xop) {
4454 b89e94af Blue Swirl
                case 0x24: /* stf, store fpreg */
4455 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4456 527067d8 blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_fpr[rd]);
4457 527067d8 blueswir1
                    tcg_gen_qemu_st32(cpu_tmp0, cpu_addr, dc->mem_idx);
4458 0f8a249a blueswir1
                    break;
4459 0f8a249a blueswir1
                case 0x25: /* stfsr, V9 stxfsr */
4460 3a3b925d blueswir1
#ifdef TARGET_SPARC64
4461 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4462 3a3b925d blueswir1
                    tcg_gen_ld_i64(cpu_tmp64, cpu_env, offsetof(CPUState, fsr));
4463 3a3b925d blueswir1
                    if (rd == 1)
4464 3a3b925d blueswir1
                        tcg_gen_qemu_st64(cpu_tmp64, cpu_addr, dc->mem_idx);
4465 527067d8 blueswir1
                    else
4466 527067d8 blueswir1
                        tcg_gen_qemu_st32(cpu_tmp64, cpu_addr, dc->mem_idx);
4467 3a3b925d blueswir1
#else
4468 3a3b925d blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUState, fsr));
4469 6ae20372 blueswir1
                    tcg_gen_qemu_st32(cpu_tmp32, cpu_addr, dc->mem_idx);
4470 3a3b925d blueswir1
#endif
4471 0f8a249a blueswir1
                    break;
4472 1f587329 blueswir1
                case 0x26:
4473 1f587329 blueswir1
#ifdef TARGET_SPARC64
4474 1f587329 blueswir1
                    /* V9 stqf, store quad fpreg */
4475 2ea815ca blueswir1
                    {
4476 a7812ae4 pbrook
                        TCGv_i32 r_const;
4477 2ea815ca blueswir1
4478 2ea815ca blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
4479 2ea815ca blueswir1
                        gen_op_load_fpr_QT0(QFPREG(rd));
4480 2ea815ca blueswir1
                        r_const = tcg_const_i32(dc->mem_idx);
4481 a7812ae4 pbrook
                        gen_helper_stqf(cpu_addr, r_const);
4482 a7812ae4 pbrook
                        tcg_temp_free_i32(r_const);
4483 2ea815ca blueswir1
                    }
4484 1f587329 blueswir1
                    break;
4485 1f587329 blueswir1
#else /* !TARGET_SPARC64 */
4486 1f587329 blueswir1
                    /* stdfq, store floating point queue */
4487 1f587329 blueswir1
#if defined(CONFIG_USER_ONLY)
4488 1f587329 blueswir1
                    goto illegal_insn;
4489 1f587329 blueswir1
#else
4490 0f8a249a blueswir1
                    if (!supervisor(dc))
4491 0f8a249a blueswir1
                        goto priv_insn;
4492 6ae20372 blueswir1
                    if (gen_trap_ifnofpu(dc, cpu_cond))
4493 0f8a249a blueswir1
                        goto jmp_insn;
4494 0f8a249a blueswir1
                    goto nfq_insn;
4495 0f8a249a blueswir1
#endif
4496 1f587329 blueswir1
#endif
4497 b89e94af Blue Swirl
                case 0x27: /* stdf, store double fpreg */
4498 2ea815ca blueswir1
                    {
4499 a7812ae4 pbrook
                        TCGv_i32 r_const;
4500 2ea815ca blueswir1
4501 2ea815ca blueswir1
                        gen_op_load_fpr_DT0(DFPREG(rd));
4502 2ea815ca blueswir1
                        r_const = tcg_const_i32(dc->mem_idx);
4503 a7812ae4 pbrook
                        gen_helper_stdf(cpu_addr, r_const);
4504 a7812ae4 pbrook
                        tcg_temp_free_i32(r_const);
4505 2ea815ca blueswir1
                    }
4506 0f8a249a blueswir1
                    break;
4507 0f8a249a blueswir1
                default:
4508 0f8a249a blueswir1
                    goto illegal_insn;
4509 0f8a249a blueswir1
                }
4510 0f8a249a blueswir1
            } else if (xop > 0x33 && xop < 0x3f) {
4511 c2bc0e38 blueswir1
                save_state(dc, cpu_cond);
4512 0f8a249a blueswir1
                switch (xop) {
4513 a4d17f19 blueswir1
#ifdef TARGET_SPARC64
4514 0f8a249a blueswir1
                case 0x34: /* V9 stfa */
4515 6ae20372 blueswir1
                    gen_stf_asi(cpu_addr, insn, 4, rd);
4516 0f8a249a blueswir1
                    break;
4517 1f587329 blueswir1
                case 0x36: /* V9 stqfa */
4518 2ea815ca blueswir1
                    {
4519 a7812ae4 pbrook
                        TCGv_i32 r_const;
4520 2ea815ca blueswir1
4521 2ea815ca blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
4522 2ea815ca blueswir1
                        r_const = tcg_const_i32(7);
4523 a7812ae4 pbrook
                        gen_helper_check_align(cpu_addr, r_const);
4524 a7812ae4 pbrook
                        tcg_temp_free_i32(r_const);
4525 2ea815ca blueswir1
                        gen_op_load_fpr_QT0(QFPREG(rd));
4526 2ea815ca blueswir1
                        gen_stf_asi(cpu_addr, insn, 16, QFPREG(rd));
4527 2ea815ca blueswir1
                    }
4528 1f587329 blueswir1
                    break;
4529 0f8a249a blueswir1
                case 0x37: /* V9 stdfa */
4530 3391c818 blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rd));
4531 6ae20372 blueswir1
                    gen_stf_asi(cpu_addr, insn, 8, DFPREG(rd));
4532 0f8a249a blueswir1
                    break;
4533 0f8a249a blueswir1
                case 0x3c: /* V9 casa */
4534 71817e48 blueswir1
                    gen_cas_asi(cpu_val, cpu_addr, cpu_src2, insn, rd);
4535 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_val);
4536 0f8a249a blueswir1
                    break;
4537 0f8a249a blueswir1
                case 0x3e: /* V9 casxa */
4538 71817e48 blueswir1
                    gen_casx_asi(cpu_val, cpu_addr, cpu_src2, insn, rd);
4539 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_val);
4540 0f8a249a blueswir1
                    break;
4541 a4d17f19 blueswir1
#else
4542 0f8a249a blueswir1
                case 0x34: /* stc */
4543 0f8a249a blueswir1
                case 0x35: /* stcsr */
4544 0f8a249a blueswir1
                case 0x36: /* stdcq */
4545 0f8a249a blueswir1
                case 0x37: /* stdc */
4546 0f8a249a blueswir1
                    goto ncp_insn;
4547 0f8a249a blueswir1
#endif
4548 0f8a249a blueswir1
                default:
4549 0f8a249a blueswir1
                    goto illegal_insn;
4550 0f8a249a blueswir1
                }
4551 dc1a6971 Blue Swirl
            } else
4552 0f8a249a blueswir1
                goto illegal_insn;
4553 0f8a249a blueswir1
        }
4554 0f8a249a blueswir1
        break;
4555 cf495bcf bellard
    }
4556 cf495bcf bellard
    /* default case for non jump instructions */
4557 72cbca10 bellard
    if (dc->npc == DYNAMIC_PC) {
4558 0f8a249a blueswir1
        dc->pc = DYNAMIC_PC;
4559 0f8a249a blueswir1
        gen_op_next_insn();
4560 72cbca10 bellard
    } else if (dc->npc == JUMP_PC) {
4561 72cbca10 bellard
        /* we can do a static jump */
4562 6ae20372 blueswir1
        gen_branch2(dc, dc->jump_pc[0], dc->jump_pc[1], cpu_cond);
4563 72cbca10 bellard
        dc->is_br = 1;
4564 72cbca10 bellard
    } else {
4565 0f8a249a blueswir1
        dc->pc = dc->npc;
4566 0f8a249a blueswir1
        dc->npc = dc->npc + 4;
4567 cf495bcf bellard
    }
4568 e80cfcfc bellard
 jmp_insn:
4569 cf495bcf bellard
    return;
4570 cf495bcf bellard
 illegal_insn:
4571 2ea815ca blueswir1
    {
4572 a7812ae4 pbrook
        TCGv_i32 r_const;
4573 2ea815ca blueswir1
4574 2ea815ca blueswir1
        save_state(dc, cpu_cond);
4575 2ea815ca blueswir1
        r_const = tcg_const_i32(TT_ILL_INSN);
4576 a7812ae4 pbrook
        gen_helper_raise_exception(r_const);
4577 a7812ae4 pbrook
        tcg_temp_free_i32(r_const);
4578 2ea815ca blueswir1
        dc->is_br = 1;
4579 2ea815ca blueswir1
    }
4580 e8af50a3 bellard
    return;
4581 64a88d5d blueswir1
 unimp_flush:
4582 2ea815ca blueswir1
    {
4583 a7812ae4 pbrook
        TCGv_i32 r_const;
4584 2ea815ca blueswir1
4585 2ea815ca blueswir1
        save_state(dc, cpu_cond);
4586 2ea815ca blueswir1
        r_const = tcg_const_i32(TT_UNIMP_FLUSH);
4587 a7812ae4 pbrook
        gen_helper_raise_exception(r_const);
4588 a7812ae4 pbrook
        tcg_temp_free_i32(r_const);
4589 2ea815ca blueswir1
        dc->is_br = 1;
4590 2ea815ca blueswir1
    }
4591 64a88d5d blueswir1
    return;
4592 e80cfcfc bellard
#if !defined(CONFIG_USER_ONLY)
4593 e8af50a3 bellard
 priv_insn:
4594 2ea815ca blueswir1
    {
4595 a7812ae4 pbrook
        TCGv_i32 r_const;
4596 2ea815ca blueswir1
4597 2ea815ca blueswir1
        save_state(dc, cpu_cond);
4598 2ea815ca blueswir1
        r_const = tcg_const_i32(TT_PRIV_INSN);
4599 a7812ae4 pbrook
        gen_helper_raise_exception(r_const);
4600 a7812ae4 pbrook
        tcg_temp_free_i32(r_const);
4601 2ea815ca blueswir1
        dc->is_br = 1;
4602 2ea815ca blueswir1
    }
4603 e80cfcfc bellard
    return;
4604 64a88d5d blueswir1
#endif
4605 e80cfcfc bellard
 nfpu_insn:
4606 6ae20372 blueswir1
    save_state(dc, cpu_cond);
4607 e80cfcfc bellard
    gen_op_fpexception_im(FSR_FTT_UNIMPFPOP);
4608 e80cfcfc bellard
    dc->is_br = 1;
4609 fcc72045 blueswir1
    return;
4610 64a88d5d blueswir1
#if !defined(CONFIG_USER_ONLY) && !defined(TARGET_SPARC64)
4611 9143e598 blueswir1
 nfq_insn:
4612 6ae20372 blueswir1
    save_state(dc, cpu_cond);
4613 9143e598 blueswir1
    gen_op_fpexception_im(FSR_FTT_SEQ_ERROR);
4614 9143e598 blueswir1
    dc->is_br = 1;
4615 9143e598 blueswir1
    return;
4616 9143e598 blueswir1
#endif
4617 fcc72045 blueswir1
#ifndef TARGET_SPARC64
4618 fcc72045 blueswir1
 ncp_insn:
4619 2ea815ca blueswir1
    {
4620 2ea815ca blueswir1
        TCGv r_const;
4621 2ea815ca blueswir1
4622 2ea815ca blueswir1
        save_state(dc, cpu_cond);
4623 2ea815ca blueswir1
        r_const = tcg_const_i32(TT_NCP_INSN);
4624 a7812ae4 pbrook
        gen_helper_raise_exception(r_const);
4625 2ea815ca blueswir1
        tcg_temp_free(r_const);
4626 2ea815ca blueswir1
        dc->is_br = 1;
4627 2ea815ca blueswir1
    }
4628 fcc72045 blueswir1
    return;
4629 fcc72045 blueswir1
#endif
4630 7a3f1944 bellard
}
4631 7a3f1944 bellard
4632 2cfc5f17 ths
static inline void gen_intermediate_code_internal(TranslationBlock * tb,
4633 2cfc5f17 ths
                                                  int spc, CPUSPARCState *env)
4634 7a3f1944 bellard
{
4635 72cbca10 bellard
    target_ulong pc_start, last_pc;
4636 cf495bcf bellard
    uint16_t *gen_opc_end;
4637 cf495bcf bellard
    DisasContext dc1, *dc = &dc1;
4638 a1d1bb31 aliguori
    CPUBreakpoint *bp;
4639 e8af50a3 bellard
    int j, lj = -1;
4640 2e70f6ef pbrook
    int num_insns;
4641 2e70f6ef pbrook
    int max_insns;
4642 cf495bcf bellard
4643 cf495bcf bellard
    memset(dc, 0, sizeof(DisasContext));
4644 cf495bcf bellard
    dc->tb = tb;
4645 72cbca10 bellard
    pc_start = tb->pc;
4646 cf495bcf bellard
    dc->pc = pc_start;
4647 e80cfcfc bellard
    last_pc = dc->pc;
4648 72cbca10 bellard
    dc->npc = (target_ulong) tb->cs_base;
4649 8393617c Blue Swirl
    dc->cc_op = CC_OP_DYNAMIC;
4650 6f27aba6 blueswir1
    dc->mem_idx = cpu_mmu_index(env);
4651 5578ceab blueswir1
    dc->def = env->def;
4652 5578ceab blueswir1
    if ((dc->def->features & CPU_FEATURE_FLOAT))
4653 64a88d5d blueswir1
        dc->fpu_enabled = cpu_fpu_enabled(env);
4654 5578ceab blueswir1
    else
4655 64a88d5d blueswir1
        dc->fpu_enabled = 0;
4656 2cade6a3 blueswir1
#ifdef TARGET_SPARC64
4657 2cade6a3 blueswir1
    dc->address_mask_32bit = env->pstate & PS_AM;
4658 2cade6a3 blueswir1
#endif
4659 cf495bcf bellard
    gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
4660 cf495bcf bellard
4661 a7812ae4 pbrook
    cpu_tmp0 = tcg_temp_new();
4662 a7812ae4 pbrook
    cpu_tmp32 = tcg_temp_new_i32();
4663 a7812ae4 pbrook
    cpu_tmp64 = tcg_temp_new_i64();
4664 d987963a blueswir1
4665 a7812ae4 pbrook
    cpu_dst = tcg_temp_local_new();
4666 d987963a blueswir1
4667 d987963a blueswir1
    // loads and stores
4668 a7812ae4 pbrook
    cpu_val = tcg_temp_local_new();
4669 a7812ae4 pbrook
    cpu_addr = tcg_temp_local_new();
4670 1a2fb1c0 blueswir1
4671 2e70f6ef pbrook
    num_insns = 0;
4672 2e70f6ef pbrook
    max_insns = tb->cflags & CF_COUNT_MASK;
4673 2e70f6ef pbrook
    if (max_insns == 0)
4674 2e70f6ef pbrook
        max_insns = CF_COUNT_MASK;
4675 2e70f6ef pbrook
    gen_icount_start();
4676 cf495bcf bellard
    do {
4677 c0ce998e aliguori
        if (unlikely(!TAILQ_EMPTY(&env->breakpoints))) {
4678 c0ce998e aliguori
            TAILQ_FOREACH(bp, &env->breakpoints, entry) {
4679 a1d1bb31 aliguori
                if (bp->pc == dc->pc) {
4680 0f8a249a blueswir1
                    if (dc->pc != pc_start)
4681 6ae20372 blueswir1
                        save_state(dc, cpu_cond);
4682 a7812ae4 pbrook
                    gen_helper_debug();
4683 57fec1fe bellard
                    tcg_gen_exit_tb(0);
4684 0f8a249a blueswir1
                    dc->is_br = 1;
4685 e80cfcfc bellard
                    goto exit_gen_loop;
4686 e8af50a3 bellard
                }
4687 e8af50a3 bellard
            }
4688 e8af50a3 bellard
        }
4689 e8af50a3 bellard
        if (spc) {
4690 93fcfe39 aliguori
            qemu_log("Search PC...\n");
4691 e8af50a3 bellard
            j = gen_opc_ptr - gen_opc_buf;
4692 e8af50a3 bellard
            if (lj < j) {
4693 e8af50a3 bellard
                lj++;
4694 e8af50a3 bellard
                while (lj < j)
4695 e8af50a3 bellard
                    gen_opc_instr_start[lj++] = 0;
4696 e8af50a3 bellard
                gen_opc_pc[lj] = dc->pc;
4697 e8af50a3 bellard
                gen_opc_npc[lj] = dc->npc;
4698 e8af50a3 bellard
                gen_opc_instr_start[lj] = 1;
4699 2e70f6ef pbrook
                gen_opc_icount[lj] = num_insns;
4700 e8af50a3 bellard
            }
4701 e8af50a3 bellard
        }
4702 2e70f6ef pbrook
        if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO))
4703 2e70f6ef pbrook
            gen_io_start();
4704 0f8a249a blueswir1
        last_pc = dc->pc;
4705 0f8a249a blueswir1
        disas_sparc_insn(dc);
4706 2e70f6ef pbrook
        num_insns++;
4707 0f8a249a blueswir1
4708 0f8a249a blueswir1
        if (dc->is_br)
4709 0f8a249a blueswir1
            break;
4710 0f8a249a blueswir1
        /* if the next PC is different, we abort now */
4711 0f8a249a blueswir1
        if (dc->pc != (last_pc + 4))
4712 0f8a249a blueswir1
            break;
4713 d39c0b99 bellard
        /* if we reach a page boundary, we stop generation so that the
4714 d39c0b99 bellard
           PC of a TT_TFAULT exception is always in the right page */
4715 d39c0b99 bellard
        if ((dc->pc & (TARGET_PAGE_SIZE - 1)) == 0)
4716 d39c0b99 bellard
            break;
4717 e80cfcfc bellard
        /* if single step mode, we generate only one instruction and
4718 e80cfcfc bellard
           generate an exception */
4719 1b530a6d aurel32
        if (env->singlestep_enabled || singlestep) {
4720 2f5680ee blueswir1
            tcg_gen_movi_tl(cpu_pc, dc->pc);
4721 57fec1fe bellard
            tcg_gen_exit_tb(0);
4722 e80cfcfc bellard
            break;
4723 e80cfcfc bellard
        }
4724 cf495bcf bellard
    } while ((gen_opc_ptr < gen_opc_end) &&
4725 2e70f6ef pbrook
             (dc->pc - pc_start) < (TARGET_PAGE_SIZE - 32) &&
4726 2e70f6ef pbrook
             num_insns < max_insns);
4727 e80cfcfc bellard
4728 e80cfcfc bellard
 exit_gen_loop:
4729 d987963a blueswir1
    tcg_temp_free(cpu_addr);
4730 3f0436fe blueswir1
    tcg_temp_free(cpu_val);
4731 d987963a blueswir1
    tcg_temp_free(cpu_dst);
4732 a7812ae4 pbrook
    tcg_temp_free_i64(cpu_tmp64);
4733 a7812ae4 pbrook
    tcg_temp_free_i32(cpu_tmp32);
4734 2ea815ca blueswir1
    tcg_temp_free(cpu_tmp0);
4735 2e70f6ef pbrook
    if (tb->cflags & CF_LAST_IO)
4736 2e70f6ef pbrook
        gen_io_end();
4737 72cbca10 bellard
    if (!dc->is_br) {
4738 5fafdf24 ths
        if (dc->pc != DYNAMIC_PC &&
4739 72cbca10 bellard
            (dc->npc != DYNAMIC_PC && dc->npc != JUMP_PC)) {
4740 72cbca10 bellard
            /* static PC and NPC: we can use direct chaining */
4741 2f5680ee blueswir1
            gen_goto_tb(dc, 0, dc->pc, dc->npc);
4742 72cbca10 bellard
        } else {
4743 72cbca10 bellard
            if (dc->pc != DYNAMIC_PC)
4744 2f5680ee blueswir1
                tcg_gen_movi_tl(cpu_pc, dc->pc);
4745 6ae20372 blueswir1
            save_npc(dc, cpu_cond);
4746 57fec1fe bellard
            tcg_gen_exit_tb(0);
4747 72cbca10 bellard
        }
4748 72cbca10 bellard
    }
4749 2e70f6ef pbrook
    gen_icount_end(tb, num_insns);
4750 cf495bcf bellard
    *gen_opc_ptr = INDEX_op_end;
4751 e8af50a3 bellard
    if (spc) {
4752 e8af50a3 bellard
        j = gen_opc_ptr - gen_opc_buf;
4753 e8af50a3 bellard
        lj++;
4754 e8af50a3 bellard
        while (lj <= j)
4755 e8af50a3 bellard
            gen_opc_instr_start[lj++] = 0;
4756 e8af50a3 bellard
#if 0
4757 93fcfe39 aliguori
        log_page_dump();
4758 e8af50a3 bellard
#endif
4759 c3278b7b bellard
        gen_opc_jump_pc[0] = dc->jump_pc[0];
4760 c3278b7b bellard
        gen_opc_jump_pc[1] = dc->jump_pc[1];
4761 e8af50a3 bellard
    } else {
4762 e80cfcfc bellard
        tb->size = last_pc + 4 - pc_start;
4763 2e70f6ef pbrook
        tb->icount = num_insns;
4764 e8af50a3 bellard
    }
4765 7a3f1944 bellard
#ifdef DEBUG_DISAS
4766 8fec2b8c aliguori
    if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
4767 93fcfe39 aliguori
        qemu_log("--------------\n");
4768 93fcfe39 aliguori
        qemu_log("IN: %s\n", lookup_symbol(pc_start));
4769 93fcfe39 aliguori
        log_target_disas(pc_start, last_pc + 4 - pc_start, 0);
4770 93fcfe39 aliguori
        qemu_log("\n");
4771 cf495bcf bellard
    }
4772 7a3f1944 bellard
#endif
4773 7a3f1944 bellard
}
4774 7a3f1944 bellard
4775 2cfc5f17 ths
void gen_intermediate_code(CPUSPARCState * env, TranslationBlock * tb)
4776 7a3f1944 bellard
{
4777 2cfc5f17 ths
    gen_intermediate_code_internal(tb, 0, env);
4778 7a3f1944 bellard
}
4779 7a3f1944 bellard
4780 2cfc5f17 ths
void gen_intermediate_code_pc(CPUSPARCState * env, TranslationBlock * tb)
4781 7a3f1944 bellard
{
4782 2cfc5f17 ths
    gen_intermediate_code_internal(tb, 1, env);
4783 7a3f1944 bellard
}
4784 7a3f1944 bellard
4785 c48fcb47 blueswir1
void gen_intermediate_code_init(CPUSPARCState *env)
4786 e80cfcfc bellard
{
4787 f5069b26 blueswir1
    unsigned int i;
4788 c48fcb47 blueswir1
    static int inited;
4789 f5069b26 blueswir1
    static const char * const gregnames[8] = {
4790 f5069b26 blueswir1
        NULL, // g0 not used
4791 f5069b26 blueswir1
        "g1",
4792 f5069b26 blueswir1
        "g2",
4793 f5069b26 blueswir1
        "g3",
4794 f5069b26 blueswir1
        "g4",
4795 f5069b26 blueswir1
        "g5",
4796 f5069b26 blueswir1
        "g6",
4797 f5069b26 blueswir1
        "g7",
4798 f5069b26 blueswir1
    };
4799 714547bb blueswir1
    static const char * const fregnames[64] = {
4800 714547bb blueswir1
        "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
4801 714547bb blueswir1
        "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
4802 714547bb blueswir1
        "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
4803 714547bb blueswir1
        "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
4804 714547bb blueswir1
        "f32", "f33", "f34", "f35", "f36", "f37", "f38", "f39",
4805 714547bb blueswir1
        "f40", "f41", "f42", "f43", "f44", "f45", "f46", "f47",
4806 714547bb blueswir1
        "f48", "f49", "f50", "f51", "f52", "f53", "f54", "f55",
4807 714547bb blueswir1
        "f56", "f57", "f58", "f59", "f60", "f61", "f62", "f63",
4808 714547bb blueswir1
    };
4809 aaed909a bellard
4810 1a2fb1c0 blueswir1
    /* init various static tables */
4811 1a2fb1c0 blueswir1
    if (!inited) {
4812 1a2fb1c0 blueswir1
        inited = 1;
4813 1a2fb1c0 blueswir1
4814 a7812ae4 pbrook
        cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env");
4815 a7812ae4 pbrook
        cpu_regwptr = tcg_global_mem_new_ptr(TCG_AREG0,
4816 a7812ae4 pbrook
                                             offsetof(CPUState, regwptr),
4817 a7812ae4 pbrook
                                             "regwptr");
4818 1a2fb1c0 blueswir1
#ifdef TARGET_SPARC64
4819 a7812ae4 pbrook
        cpu_xcc = tcg_global_mem_new_i32(TCG_AREG0, offsetof(CPUState, xcc),
4820 a7812ae4 pbrook
                                         "xcc");
4821 a7812ae4 pbrook
        cpu_asi = tcg_global_mem_new_i32(TCG_AREG0, offsetof(CPUState, asi),
4822 a7812ae4 pbrook
                                         "asi");
4823 a7812ae4 pbrook
        cpu_fprs = tcg_global_mem_new_i32(TCG_AREG0, offsetof(CPUState, fprs),
4824 a7812ae4 pbrook
                                          "fprs");
4825 a7812ae4 pbrook
        cpu_gsr = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, gsr),
4826 255e1fcb blueswir1
                                     "gsr");
4827 a7812ae4 pbrook
        cpu_tick_cmpr = tcg_global_mem_new(TCG_AREG0,
4828 255e1fcb blueswir1
                                           offsetof(CPUState, tick_cmpr),
4829 255e1fcb blueswir1
                                           "tick_cmpr");
4830 a7812ae4 pbrook
        cpu_stick_cmpr = tcg_global_mem_new(TCG_AREG0,
4831 255e1fcb blueswir1
                                            offsetof(CPUState, stick_cmpr),
4832 255e1fcb blueswir1
                                            "stick_cmpr");
4833 a7812ae4 pbrook
        cpu_hstick_cmpr = tcg_global_mem_new(TCG_AREG0,
4834 255e1fcb blueswir1
                                             offsetof(CPUState, hstick_cmpr),
4835 255e1fcb blueswir1
                                             "hstick_cmpr");
4836 a7812ae4 pbrook
        cpu_hintp = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, hintp),
4837 255e1fcb blueswir1
                                       "hintp");
4838 a7812ae4 pbrook
        cpu_htba = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, htba),
4839 a7812ae4 pbrook
                                      "htba");
4840 a7812ae4 pbrook
        cpu_hver = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, hver),
4841 a7812ae4 pbrook
                                      "hver");
4842 a7812ae4 pbrook
        cpu_ssr = tcg_global_mem_new(TCG_AREG0,
4843 255e1fcb blueswir1
                                     offsetof(CPUState, ssr), "ssr");
4844 a7812ae4 pbrook
        cpu_ver = tcg_global_mem_new(TCG_AREG0,
4845 255e1fcb blueswir1
                                     offsetof(CPUState, version), "ver");
4846 a7812ae4 pbrook
        cpu_softint = tcg_global_mem_new_i32(TCG_AREG0,
4847 a7812ae4 pbrook
                                             offsetof(CPUState, softint),
4848 a7812ae4 pbrook
                                             "softint");
4849 255e1fcb blueswir1
#else
4850 a7812ae4 pbrook
        cpu_wim = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, wim),
4851 255e1fcb blueswir1
                                     "wim");
4852 1a2fb1c0 blueswir1
#endif
4853 a7812ae4 pbrook
        cpu_cond = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, cond),
4854 77f193da blueswir1
                                      "cond");
4855 a7812ae4 pbrook
        cpu_cc_src = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, cc_src),
4856 dc99a3f2 blueswir1
                                        "cc_src");
4857 a7812ae4 pbrook
        cpu_cc_src2 = tcg_global_mem_new(TCG_AREG0,
4858 d9bdab86 blueswir1
                                         offsetof(CPUState, cc_src2),
4859 d9bdab86 blueswir1
                                         "cc_src2");
4860 a7812ae4 pbrook
        cpu_cc_dst = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, cc_dst),
4861 dc99a3f2 blueswir1
                                        "cc_dst");
4862 8393617c Blue Swirl
        cpu_cc_op = tcg_global_mem_new_i32(TCG_AREG0, offsetof(CPUState, cc_op),
4863 8393617c Blue Swirl
                                           "cc_op");
4864 a7812ae4 pbrook
        cpu_psr = tcg_global_mem_new_i32(TCG_AREG0, offsetof(CPUState, psr),
4865 a7812ae4 pbrook
                                         "psr");
4866 a7812ae4 pbrook
        cpu_fsr = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, fsr),
4867 87e92502 blueswir1
                                     "fsr");
4868 a7812ae4 pbrook
        cpu_pc = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, pc),
4869 48d5c82b blueswir1
                                    "pc");
4870 a7812ae4 pbrook
        cpu_npc = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, npc),
4871 a7812ae4 pbrook
                                     "npc");
4872 a7812ae4 pbrook
        cpu_y = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, y), "y");
4873 255e1fcb blueswir1
#ifndef CONFIG_USER_ONLY
4874 a7812ae4 pbrook
        cpu_tbr = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, tbr),
4875 255e1fcb blueswir1
                                     "tbr");
4876 255e1fcb blueswir1
#endif
4877 f5069b26 blueswir1
        for (i = 1; i < 8; i++)
4878 a7812ae4 pbrook
            cpu_gregs[i] = tcg_global_mem_new(TCG_AREG0,
4879 f5069b26 blueswir1
                                              offsetof(CPUState, gregs[i]),
4880 f5069b26 blueswir1
                                              gregnames[i]);
4881 714547bb blueswir1
        for (i = 0; i < TARGET_FPREGS; i++)
4882 a7812ae4 pbrook
            cpu_fpr[i] = tcg_global_mem_new_i32(TCG_AREG0,
4883 a7812ae4 pbrook
                                                offsetof(CPUState, fpr[i]),
4884 a7812ae4 pbrook
                                                fregnames[i]);
4885 714547bb blueswir1
4886 c9e03d8f blueswir1
        /* register helpers */
4887 c9e03d8f blueswir1
4888 a7812ae4 pbrook
#define GEN_HELPER 2
4889 c9e03d8f blueswir1
#include "helper.h"
4890 1a2fb1c0 blueswir1
    }
4891 658138bc bellard
}
4892 d2856f1a aurel32
4893 d2856f1a aurel32
void gen_pc_load(CPUState *env, TranslationBlock *tb,
4894 d2856f1a aurel32
                unsigned long searched_pc, int pc_pos, void *puc)
4895 d2856f1a aurel32
{
4896 d2856f1a aurel32
    target_ulong npc;
4897 d2856f1a aurel32
    env->pc = gen_opc_pc[pc_pos];
4898 d2856f1a aurel32
    npc = gen_opc_npc[pc_pos];
4899 d2856f1a aurel32
    if (npc == 1) {
4900 d2856f1a aurel32
        /* dynamic NPC: already stored */
4901 d2856f1a aurel32
    } else if (npc == 2) {
4902 d2856f1a aurel32
        target_ulong t2 = (target_ulong)(unsigned long)puc;
4903 d2856f1a aurel32
        /* jump PC: use T2 and the jump targets of the translation */
4904 d2856f1a aurel32
        if (t2)
4905 d2856f1a aurel32
            env->npc = gen_opc_jump_pc[0];
4906 d2856f1a aurel32
        else
4907 d2856f1a aurel32
            env->npc = gen_opc_jump_pc[1];
4908 d2856f1a aurel32
    } else {
4909 d2856f1a aurel32
        env->npc = npc;
4910 d2856f1a aurel32
    }
4911 d2856f1a aurel32
}