Statistics
| Branch: | Revision:

root / target-sparc / translate.c @ 32902772

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