Statistics
| Branch: | Revision:

root / target-sparc / translate.c @ 060718c1

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