Statistics
| Branch: | Revision:

root / target-sparc / translate.c @ fb170183

History | View | Annotate | Download (190 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 57fec1fe bellard
        tcg_gen_exit_tb((long)tb + tb_num);
245 6e256c93 bellard
    } else {
246 6e256c93 bellard
        /* jump to another page: currently not optimized */
247 2f5680ee blueswir1
        tcg_gen_movi_tl(cpu_pc, pc);
248 2f5680ee blueswir1
        tcg_gen_movi_tl(cpu_npc, npc);
249 57fec1fe bellard
        tcg_gen_exit_tb(0);
250 6e256c93 bellard
    }
251 6e256c93 bellard
}
252 6e256c93 bellard
253 19f329ad blueswir1
// XXX suboptimal
254 a7812ae4 pbrook
static inline void gen_mov_reg_N(TCGv reg, TCGv_i32 src)
255 19f329ad blueswir1
{
256 8911f501 blueswir1
    tcg_gen_extu_i32_tl(reg, src);
257 4b8b8b76 blueswir1
    tcg_gen_shri_tl(reg, reg, PSR_NEG_SHIFT);
258 19f329ad blueswir1
    tcg_gen_andi_tl(reg, reg, 0x1);
259 19f329ad blueswir1
}
260 19f329ad blueswir1
261 a7812ae4 pbrook
static inline void gen_mov_reg_Z(TCGv reg, TCGv_i32 src)
262 19f329ad blueswir1
{
263 8911f501 blueswir1
    tcg_gen_extu_i32_tl(reg, src);
264 4b8b8b76 blueswir1
    tcg_gen_shri_tl(reg, reg, PSR_ZERO_SHIFT);
265 19f329ad blueswir1
    tcg_gen_andi_tl(reg, reg, 0x1);
266 19f329ad blueswir1
}
267 19f329ad blueswir1
268 a7812ae4 pbrook
static inline void gen_mov_reg_V(TCGv reg, TCGv_i32 src)
269 19f329ad blueswir1
{
270 8911f501 blueswir1
    tcg_gen_extu_i32_tl(reg, src);
271 4b8b8b76 blueswir1
    tcg_gen_shri_tl(reg, reg, PSR_OVF_SHIFT);
272 19f329ad blueswir1
    tcg_gen_andi_tl(reg, reg, 0x1);
273 19f329ad blueswir1
}
274 19f329ad blueswir1
275 a7812ae4 pbrook
static inline void gen_mov_reg_C(TCGv reg, TCGv_i32 src)
276 19f329ad blueswir1
{
277 8911f501 blueswir1
    tcg_gen_extu_i32_tl(reg, src);
278 4b8b8b76 blueswir1
    tcg_gen_shri_tl(reg, reg, PSR_CARRY_SHIFT);
279 19f329ad blueswir1
    tcg_gen_andi_tl(reg, reg, 0x1);
280 19f329ad blueswir1
}
281 19f329ad blueswir1
282 dc99a3f2 blueswir1
static inline void gen_add_tv(TCGv dst, TCGv src1, TCGv src2)
283 dc99a3f2 blueswir1
{
284 a7812ae4 pbrook
    TCGv r_temp;
285 a7812ae4 pbrook
    TCGv_i32 r_const;
286 dc99a3f2 blueswir1
    int l1;
287 dc99a3f2 blueswir1
288 dc99a3f2 blueswir1
    l1 = gen_new_label();
289 dc99a3f2 blueswir1
290 a7812ae4 pbrook
    r_temp = tcg_temp_new();
291 dc99a3f2 blueswir1
    tcg_gen_xor_tl(r_temp, src1, src2);
292 2576d836 blueswir1
    tcg_gen_not_tl(r_temp, r_temp);
293 0425bee5 blueswir1
    tcg_gen_xor_tl(cpu_tmp0, src1, dst);
294 0425bee5 blueswir1
    tcg_gen_and_tl(r_temp, r_temp, cpu_tmp0);
295 dd5e6304 blueswir1
    tcg_gen_andi_tl(r_temp, r_temp, (1ULL << 31));
296 cb63669a pbrook
    tcg_gen_brcondi_tl(TCG_COND_EQ, r_temp, 0, l1);
297 2ea815ca blueswir1
    r_const = tcg_const_i32(TT_TOVF);
298 a7812ae4 pbrook
    gen_helper_raise_exception(r_const);
299 a7812ae4 pbrook
    tcg_temp_free_i32(r_const);
300 dc99a3f2 blueswir1
    gen_set_label(l1);
301 2ea815ca blueswir1
    tcg_temp_free(r_temp);
302 dc99a3f2 blueswir1
}
303 dc99a3f2 blueswir1
304 dc99a3f2 blueswir1
static inline void gen_tag_tv(TCGv src1, TCGv src2)
305 dc99a3f2 blueswir1
{
306 dc99a3f2 blueswir1
    int l1;
307 a7812ae4 pbrook
    TCGv_i32 r_const;
308 dc99a3f2 blueswir1
309 dc99a3f2 blueswir1
    l1 = gen_new_label();
310 0425bee5 blueswir1
    tcg_gen_or_tl(cpu_tmp0, src1, src2);
311 0425bee5 blueswir1
    tcg_gen_andi_tl(cpu_tmp0, cpu_tmp0, 0x3);
312 cb63669a pbrook
    tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_tmp0, 0, l1);
313 2ea815ca blueswir1
    r_const = tcg_const_i32(TT_TOVF);
314 a7812ae4 pbrook
    gen_helper_raise_exception(r_const);
315 a7812ae4 pbrook
    tcg_temp_free_i32(r_const);
316 dc99a3f2 blueswir1
    gen_set_label(l1);
317 dc99a3f2 blueswir1
}
318 dc99a3f2 blueswir1
319 41d72852 Blue Swirl
static inline void gen_op_addi_cc(TCGv dst, TCGv src1, target_long src2)
320 41d72852 Blue Swirl
{
321 41d72852 Blue Swirl
    tcg_gen_mov_tl(cpu_cc_src, src1);
322 41d72852 Blue Swirl
    tcg_gen_movi_tl(cpu_cc_src2, src2);
323 41d72852 Blue Swirl
    tcg_gen_addi_tl(cpu_cc_dst, cpu_cc_src, src2);
324 bdf9f35d Blue Swirl
    tcg_gen_mov_tl(dst, cpu_cc_dst);
325 41d72852 Blue Swirl
}
326 41d72852 Blue Swirl
327 4af984a7 blueswir1
static inline void gen_op_add_cc(TCGv dst, TCGv src1, TCGv src2)
328 dc99a3f2 blueswir1
{
329 4af984a7 blueswir1
    tcg_gen_mov_tl(cpu_cc_src, src1);
330 6f551262 blueswir1
    tcg_gen_mov_tl(cpu_cc_src2, src2);
331 5c6a0628 blueswir1
    tcg_gen_add_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2);
332 bdf9f35d Blue Swirl
    tcg_gen_mov_tl(dst, cpu_cc_dst);
333 41d72852 Blue Swirl
}
334 41d72852 Blue Swirl
335 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 cf495bcf bellard
                cond = GET_FIELD(insn, 3, 6);
2001 cf495bcf bellard
                if (cond == 0x8) {
2002 6ae20372 blueswir1
                    save_state(dc, cpu_cond);
2003 b158a785 blueswir1
                    if ((dc->def->features & CPU_FEATURE_HYPV) &&
2004 b158a785 blueswir1
                        supervisor(dc))
2005 b158a785 blueswir1
                        tcg_gen_andi_tl(cpu_dst, cpu_dst, UA2005_HTRAP_MASK);
2006 b158a785 blueswir1
                    else
2007 b158a785 blueswir1
                        tcg_gen_andi_tl(cpu_dst, cpu_dst, V8_TRAP_MASK);
2008 b158a785 blueswir1
                    tcg_gen_addi_tl(cpu_dst, cpu_dst, TT_TRAP);
2009 a7812ae4 pbrook
                    tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_dst);
2010 a7812ae4 pbrook
                    gen_helper_raise_exception(cpu_tmp32);
2011 af7bf89b bellard
                } else if (cond != 0) {
2012 a7812ae4 pbrook
                    TCGv r_cond = tcg_temp_new();
2013 b158a785 blueswir1
                    int l1;
2014 3475187d bellard
#ifdef TARGET_SPARC64
2015 0f8a249a blueswir1
                    /* V9 icc/xcc */
2016 0f8a249a blueswir1
                    int cc = GET_FIELD_SP(insn, 11, 12);
2017 748b9d8e blueswir1
2018 6ae20372 blueswir1
                    save_state(dc, cpu_cond);
2019 0f8a249a blueswir1
                    if (cc == 0)
2020 8393617c Blue Swirl
                        gen_cond(r_cond, 0, cond, dc);
2021 0f8a249a blueswir1
                    else if (cc == 2)
2022 8393617c Blue Swirl
                        gen_cond(r_cond, 1, cond, dc);
2023 0f8a249a blueswir1
                    else
2024 0f8a249a blueswir1
                        goto illegal_insn;
2025 3475187d bellard
#else
2026 6ae20372 blueswir1
                    save_state(dc, cpu_cond);
2027 8393617c Blue Swirl
                    gen_cond(r_cond, 0, cond, dc);
2028 3475187d bellard
#endif
2029 b158a785 blueswir1
                    l1 = gen_new_label();
2030 b158a785 blueswir1
                    tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond, 0, l1);
2031 b158a785 blueswir1
2032 b158a785 blueswir1
                    if ((dc->def->features & CPU_FEATURE_HYPV) &&
2033 b158a785 blueswir1
                        supervisor(dc))
2034 b158a785 blueswir1
                        tcg_gen_andi_tl(cpu_dst, cpu_dst, UA2005_HTRAP_MASK);
2035 b158a785 blueswir1
                    else
2036 b158a785 blueswir1
                        tcg_gen_andi_tl(cpu_dst, cpu_dst, V8_TRAP_MASK);
2037 b158a785 blueswir1
                    tcg_gen_addi_tl(cpu_dst, cpu_dst, TT_TRAP);
2038 a7812ae4 pbrook
                    tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_dst);
2039 a7812ae4 pbrook
                    gen_helper_raise_exception(cpu_tmp32);
2040 b158a785 blueswir1
2041 b158a785 blueswir1
                    gen_set_label(l1);
2042 2ea815ca blueswir1
                    tcg_temp_free(r_cond);
2043 cf495bcf bellard
                }
2044 a80dde08 bellard
                gen_op_next_insn();
2045 57fec1fe bellard
                tcg_gen_exit_tb(0);
2046 a80dde08 bellard
                dc->is_br = 1;
2047 a80dde08 bellard
                goto jmp_insn;
2048 cf495bcf bellard
            } else if (xop == 0x28) {
2049 cf495bcf bellard
                rs1 = GET_FIELD(insn, 13, 17);
2050 cf495bcf bellard
                switch(rs1) {
2051 cf495bcf bellard
                case 0: /* rdy */
2052 65fe7b09 blueswir1
#ifndef TARGET_SPARC64
2053 65fe7b09 blueswir1
                case 0x01 ... 0x0e: /* undefined in the SPARCv8
2054 65fe7b09 blueswir1
                                       manual, rdy on the microSPARC
2055 65fe7b09 blueswir1
                                       II */
2056 65fe7b09 blueswir1
                case 0x0f:          /* stbar in the SPARCv8 manual,
2057 65fe7b09 blueswir1
                                       rdy on the microSPARC II */
2058 65fe7b09 blueswir1
                case 0x10 ... 0x1f: /* implementation-dependent in the
2059 65fe7b09 blueswir1
                                       SPARCv8 manual, rdy on the
2060 65fe7b09 blueswir1
                                       microSPARC II */
2061 65fe7b09 blueswir1
#endif
2062 255e1fcb blueswir1
                    gen_movl_TN_reg(rd, cpu_y);
2063 cf495bcf bellard
                    break;
2064 3475187d bellard
#ifdef TARGET_SPARC64
2065 0f8a249a blueswir1
                case 0x2: /* V9 rdccr */
2066 8393617c Blue Swirl
                    gen_helper_compute_psr();
2067 a7812ae4 pbrook
                    gen_helper_rdccr(cpu_dst);
2068 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
2069 3475187d bellard
                    break;
2070 0f8a249a blueswir1
                case 0x3: /* V9 rdasi */
2071 255e1fcb blueswir1
                    tcg_gen_ext_i32_tl(cpu_dst, cpu_asi);
2072 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
2073 3475187d bellard
                    break;
2074 0f8a249a blueswir1
                case 0x4: /* V9 rdtick */
2075 ccd4a219 blueswir1
                    {
2076 a7812ae4 pbrook
                        TCGv_ptr r_tickptr;
2077 ccd4a219 blueswir1
2078 a7812ae4 pbrook
                        r_tickptr = tcg_temp_new_ptr();
2079 ccd4a219 blueswir1
                        tcg_gen_ld_ptr(r_tickptr, cpu_env,
2080 ccd4a219 blueswir1
                                       offsetof(CPUState, tick));
2081 a7812ae4 pbrook
                        gen_helper_tick_get_count(cpu_dst, r_tickptr);
2082 a7812ae4 pbrook
                        tcg_temp_free_ptr(r_tickptr);
2083 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
2084 ccd4a219 blueswir1
                    }
2085 3475187d bellard
                    break;
2086 0f8a249a blueswir1
                case 0x5: /* V9 rdpc */
2087 2ea815ca blueswir1
                    {
2088 2ea815ca blueswir1
                        TCGv r_const;
2089 2ea815ca blueswir1
2090 2ea815ca blueswir1
                        r_const = tcg_const_tl(dc->pc);
2091 2ea815ca blueswir1
                        gen_movl_TN_reg(rd, r_const);
2092 2ea815ca blueswir1
                        tcg_temp_free(r_const);
2093 2ea815ca blueswir1
                    }
2094 0f8a249a blueswir1
                    break;
2095 0f8a249a blueswir1
                case 0x6: /* V9 rdfprs */
2096 255e1fcb blueswir1
                    tcg_gen_ext_i32_tl(cpu_dst, cpu_fprs);
2097 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
2098 3475187d bellard
                    break;
2099 65fe7b09 blueswir1
                case 0xf: /* V9 membar */
2100 65fe7b09 blueswir1
                    break; /* no effect */
2101 0f8a249a blueswir1
                case 0x13: /* Graphics Status */
2102 6ae20372 blueswir1
                    if (gen_trap_ifnofpu(dc, cpu_cond))
2103 725cb90b bellard
                        goto jmp_insn;
2104 255e1fcb blueswir1
                    gen_movl_TN_reg(rd, cpu_gsr);
2105 725cb90b bellard
                    break;
2106 9d926598 blueswir1
                case 0x16: /* Softint */
2107 9d926598 blueswir1
                    tcg_gen_ext_i32_tl(cpu_dst, cpu_softint);
2108 9d926598 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
2109 9d926598 blueswir1
                    break;
2110 0f8a249a blueswir1
                case 0x17: /* Tick compare */
2111 255e1fcb blueswir1
                    gen_movl_TN_reg(rd, cpu_tick_cmpr);
2112 83469015 bellard
                    break;
2113 0f8a249a blueswir1
                case 0x18: /* System tick */
2114 ccd4a219 blueswir1
                    {
2115 a7812ae4 pbrook
                        TCGv_ptr r_tickptr;
2116 ccd4a219 blueswir1
2117 a7812ae4 pbrook
                        r_tickptr = tcg_temp_new_ptr();
2118 ccd4a219 blueswir1
                        tcg_gen_ld_ptr(r_tickptr, cpu_env,
2119 ccd4a219 blueswir1
                                       offsetof(CPUState, stick));
2120 a7812ae4 pbrook
                        gen_helper_tick_get_count(cpu_dst, r_tickptr);
2121 a7812ae4 pbrook
                        tcg_temp_free_ptr(r_tickptr);
2122 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
2123 ccd4a219 blueswir1
                    }
2124 83469015 bellard
                    break;
2125 0f8a249a blueswir1
                case 0x19: /* System tick compare */
2126 255e1fcb blueswir1
                    gen_movl_TN_reg(rd, cpu_stick_cmpr);
2127 83469015 bellard
                    break;
2128 0f8a249a blueswir1
                case 0x10: /* Performance Control */
2129 0f8a249a blueswir1
                case 0x11: /* Performance Instrumentation Counter */
2130 0f8a249a blueswir1
                case 0x12: /* Dispatch Control */
2131 0f8a249a blueswir1
                case 0x14: /* Softint set, WO */
2132 0f8a249a blueswir1
                case 0x15: /* Softint clear, WO */
2133 3475187d bellard
#endif
2134 3475187d bellard
                default:
2135 cf495bcf bellard
                    goto illegal_insn;
2136 cf495bcf bellard
                }
2137 e8af50a3 bellard
#if !defined(CONFIG_USER_ONLY)
2138 e9ebed4d blueswir1
            } else if (xop == 0x29) { /* rdpsr / UA2005 rdhpr */
2139 3475187d bellard
#ifndef TARGET_SPARC64
2140 0f8a249a blueswir1
                if (!supervisor(dc))
2141 0f8a249a blueswir1
                    goto priv_insn;
2142 8393617c Blue Swirl
                gen_helper_compute_psr();
2143 8393617c Blue Swirl
                dc->cc_op = CC_OP_FLAGS;
2144 a7812ae4 pbrook
                gen_helper_rdpsr(cpu_dst);
2145 e9ebed4d blueswir1
#else
2146 fb79ceb9 blueswir1
                CHECK_IU_FEATURE(dc, HYPV);
2147 e9ebed4d blueswir1
                if (!hypervisor(dc))
2148 e9ebed4d blueswir1
                    goto priv_insn;
2149 e9ebed4d blueswir1
                rs1 = GET_FIELD(insn, 13, 17);
2150 e9ebed4d blueswir1
                switch (rs1) {
2151 e9ebed4d blueswir1
                case 0: // hpstate
2152 e9ebed4d blueswir1
                    // gen_op_rdhpstate();
2153 e9ebed4d blueswir1
                    break;
2154 e9ebed4d blueswir1
                case 1: // htstate
2155 e9ebed4d blueswir1
                    // gen_op_rdhtstate();
2156 e9ebed4d blueswir1
                    break;
2157 e9ebed4d blueswir1
                case 3: // hintp
2158 255e1fcb blueswir1
                    tcg_gen_mov_tl(cpu_dst, cpu_hintp);
2159 e9ebed4d blueswir1
                    break;
2160 e9ebed4d blueswir1
                case 5: // htba
2161 255e1fcb blueswir1
                    tcg_gen_mov_tl(cpu_dst, cpu_htba);
2162 e9ebed4d blueswir1
                    break;
2163 e9ebed4d blueswir1
                case 6: // hver
2164 255e1fcb blueswir1
                    tcg_gen_mov_tl(cpu_dst, cpu_hver);
2165 e9ebed4d blueswir1
                    break;
2166 e9ebed4d blueswir1
                case 31: // hstick_cmpr
2167 255e1fcb blueswir1
                    tcg_gen_mov_tl(cpu_dst, cpu_hstick_cmpr);
2168 e9ebed4d blueswir1
                    break;
2169 e9ebed4d blueswir1
                default:
2170 e9ebed4d blueswir1
                    goto illegal_insn;
2171 e9ebed4d blueswir1
                }
2172 e9ebed4d blueswir1
#endif
2173 6ae20372 blueswir1
                gen_movl_TN_reg(rd, cpu_dst);
2174 e8af50a3 bellard
                break;
2175 3475187d bellard
            } else if (xop == 0x2a) { /* rdwim / V9 rdpr */
2176 0f8a249a blueswir1
                if (!supervisor(dc))
2177 0f8a249a blueswir1
                    goto priv_insn;
2178 3475187d bellard
#ifdef TARGET_SPARC64
2179 3475187d bellard
                rs1 = GET_FIELD(insn, 13, 17);
2180 0f8a249a blueswir1
                switch (rs1) {
2181 0f8a249a blueswir1
                case 0: // tpc
2182 375ee38b blueswir1
                    {
2183 a7812ae4 pbrook
                        TCGv_ptr r_tsptr;
2184 375ee38b blueswir1
2185 a7812ae4 pbrook
                        r_tsptr = tcg_temp_new_ptr();
2186 8194f35a Igor Kovalenko
                        gen_load_trap_state_at_tl(r_tsptr, cpu_env);
2187 a7812ae4 pbrook
                        tcg_gen_ld_tl(cpu_tmp0, r_tsptr,
2188 375ee38b blueswir1
                                      offsetof(trap_state, tpc));
2189 a7812ae4 pbrook
                        tcg_temp_free_ptr(r_tsptr);
2190 375ee38b blueswir1
                    }
2191 0f8a249a blueswir1
                    break;
2192 0f8a249a blueswir1
                case 1: // tnpc
2193 375ee38b blueswir1
                    {
2194 a7812ae4 pbrook
                        TCGv_ptr r_tsptr;
2195 375ee38b blueswir1
2196 a7812ae4 pbrook
                        r_tsptr = tcg_temp_new_ptr();
2197 8194f35a Igor Kovalenko
                        gen_load_trap_state_at_tl(r_tsptr, cpu_env);
2198 ece43b8d blueswir1
                        tcg_gen_ld_tl(cpu_tmp0, r_tsptr,
2199 375ee38b blueswir1
                                      offsetof(trap_state, tnpc));
2200 a7812ae4 pbrook
                        tcg_temp_free_ptr(r_tsptr);
2201 375ee38b blueswir1
                    }
2202 0f8a249a blueswir1
                    break;
2203 0f8a249a blueswir1
                case 2: // tstate
2204 375ee38b blueswir1
                    {
2205 a7812ae4 pbrook
                        TCGv_ptr r_tsptr;
2206 375ee38b blueswir1
2207 a7812ae4 pbrook
                        r_tsptr = tcg_temp_new_ptr();
2208 8194f35a Igor Kovalenko
                        gen_load_trap_state_at_tl(r_tsptr, cpu_env);
2209 ece43b8d blueswir1
                        tcg_gen_ld_tl(cpu_tmp0, r_tsptr,
2210 375ee38b blueswir1
                                      offsetof(trap_state, tstate));
2211 a7812ae4 pbrook
                        tcg_temp_free_ptr(r_tsptr);
2212 375ee38b blueswir1
                    }
2213 0f8a249a blueswir1
                    break;
2214 0f8a249a blueswir1
                case 3: // tt
2215 375ee38b blueswir1
                    {
2216 a7812ae4 pbrook
                        TCGv_ptr r_tsptr;
2217 375ee38b blueswir1
2218 a7812ae4 pbrook
                        r_tsptr = tcg_temp_new_ptr();
2219 8194f35a Igor Kovalenko
                        gen_load_trap_state_at_tl(r_tsptr, cpu_env);
2220 a7812ae4 pbrook
                        tcg_gen_ld_i32(cpu_tmp32, r_tsptr,
2221 375ee38b blueswir1
                                       offsetof(trap_state, tt));
2222 a7812ae4 pbrook
                        tcg_temp_free_ptr(r_tsptr);
2223 a7812ae4 pbrook
                        tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2224 375ee38b blueswir1
                    }
2225 0f8a249a blueswir1
                    break;
2226 0f8a249a blueswir1
                case 4: // tick
2227 ccd4a219 blueswir1
                    {
2228 a7812ae4 pbrook
                        TCGv_ptr r_tickptr;
2229 ccd4a219 blueswir1
2230 a7812ae4 pbrook
                        r_tickptr = tcg_temp_new_ptr();
2231 ccd4a219 blueswir1
                        tcg_gen_ld_ptr(r_tickptr, cpu_env,
2232 ccd4a219 blueswir1
                                       offsetof(CPUState, tick));
2233 a7812ae4 pbrook
                        gen_helper_tick_get_count(cpu_tmp0, r_tickptr);
2234 ece43b8d blueswir1
                        gen_movl_TN_reg(rd, cpu_tmp0);
2235 a7812ae4 pbrook
                        tcg_temp_free_ptr(r_tickptr);
2236 ccd4a219 blueswir1
                    }
2237 0f8a249a blueswir1
                    break;
2238 0f8a249a blueswir1
                case 5: // tba
2239 255e1fcb blueswir1
                    tcg_gen_mov_tl(cpu_tmp0, cpu_tbr);
2240 0f8a249a blueswir1
                    break;
2241 0f8a249a blueswir1
                case 6: // pstate
2242 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2243 77f193da blueswir1
                                   offsetof(CPUSPARCState, pstate));
2244 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2245 0f8a249a blueswir1
                    break;
2246 0f8a249a blueswir1
                case 7: // tl
2247 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2248 77f193da blueswir1
                                   offsetof(CPUSPARCState, tl));
2249 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2250 0f8a249a blueswir1
                    break;
2251 0f8a249a blueswir1
                case 8: // pil
2252 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2253 77f193da blueswir1
                                   offsetof(CPUSPARCState, psrpil));
2254 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2255 0f8a249a blueswir1
                    break;
2256 0f8a249a blueswir1
                case 9: // cwp
2257 a7812ae4 pbrook
                    gen_helper_rdcwp(cpu_tmp0);
2258 0f8a249a blueswir1
                    break;
2259 0f8a249a blueswir1
                case 10: // cansave
2260 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2261 77f193da blueswir1
                                   offsetof(CPUSPARCState, cansave));
2262 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2263 0f8a249a blueswir1
                    break;
2264 0f8a249a blueswir1
                case 11: // canrestore
2265 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2266 77f193da blueswir1
                                   offsetof(CPUSPARCState, canrestore));
2267 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2268 0f8a249a blueswir1
                    break;
2269 0f8a249a blueswir1
                case 12: // cleanwin
2270 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2271 77f193da blueswir1
                                   offsetof(CPUSPARCState, cleanwin));
2272 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2273 0f8a249a blueswir1
                    break;
2274 0f8a249a blueswir1
                case 13: // otherwin
2275 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2276 77f193da blueswir1
                                   offsetof(CPUSPARCState, otherwin));
2277 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2278 0f8a249a blueswir1
                    break;
2279 0f8a249a blueswir1
                case 14: // wstate
2280 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2281 77f193da blueswir1
                                   offsetof(CPUSPARCState, wstate));
2282 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2283 0f8a249a blueswir1
                    break;
2284 e9ebed4d blueswir1
                case 16: // UA2005 gl
2285 fb79ceb9 blueswir1
                    CHECK_IU_FEATURE(dc, GL);
2286 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2287 77f193da blueswir1
                                   offsetof(CPUSPARCState, gl));
2288 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2289 e9ebed4d blueswir1
                    break;
2290 e9ebed4d blueswir1
                case 26: // UA2005 strand status
2291 fb79ceb9 blueswir1
                    CHECK_IU_FEATURE(dc, HYPV);
2292 e9ebed4d blueswir1
                    if (!hypervisor(dc))
2293 e9ebed4d blueswir1
                        goto priv_insn;
2294 527067d8 blueswir1
                    tcg_gen_mov_tl(cpu_tmp0, cpu_ssr);
2295 e9ebed4d blueswir1
                    break;
2296 0f8a249a blueswir1
                case 31: // ver
2297 255e1fcb blueswir1
                    tcg_gen_mov_tl(cpu_tmp0, cpu_ver);
2298 0f8a249a blueswir1
                    break;
2299 0f8a249a blueswir1
                case 15: // fq
2300 0f8a249a blueswir1
                default:
2301 0f8a249a blueswir1
                    goto illegal_insn;
2302 0f8a249a blueswir1
                }
2303 3475187d bellard
#else
2304 255e1fcb blueswir1
                tcg_gen_ext_i32_tl(cpu_tmp0, cpu_wim);
2305 3475187d bellard
#endif
2306 ece43b8d blueswir1
                gen_movl_TN_reg(rd, cpu_tmp0);
2307 e8af50a3 bellard
                break;
2308 3475187d bellard
            } else if (xop == 0x2b) { /* rdtbr / V9 flushw */
2309 3475187d bellard
#ifdef TARGET_SPARC64
2310 c5f2f668 blueswir1
                save_state(dc, cpu_cond);
2311 a7812ae4 pbrook
                gen_helper_flushw();
2312 3475187d bellard
#else
2313 0f8a249a blueswir1
                if (!supervisor(dc))
2314 0f8a249a blueswir1
                    goto priv_insn;
2315 255e1fcb blueswir1
                gen_movl_TN_reg(rd, cpu_tbr);
2316 3475187d bellard
#endif
2317 e8af50a3 bellard
                break;
2318 e8af50a3 bellard
#endif
2319 0f8a249a blueswir1
            } else if (xop == 0x34) {   /* FPU Operations */
2320 6ae20372 blueswir1
                if (gen_trap_ifnofpu(dc, cpu_cond))
2321 a80dde08 bellard
                    goto jmp_insn;
2322 0f8a249a blueswir1
                gen_op_clear_ieee_excp_and_FTT();
2323 e8af50a3 bellard
                rs1 = GET_FIELD(insn, 13, 17);
2324 0f8a249a blueswir1
                rs2 = GET_FIELD(insn, 27, 31);
2325 0f8a249a blueswir1
                xop = GET_FIELD(insn, 18, 26);
2326 cca1d527 Blue Swirl
                save_state(dc, cpu_cond);
2327 0f8a249a blueswir1
                switch (xop) {
2328 dc1a6971 Blue Swirl
                case 0x1: /* fmovs */
2329 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_fpr[rs2]);
2330 dc1a6971 Blue Swirl
                    break;
2331 dc1a6971 Blue Swirl
                case 0x5: /* fnegs */
2332 dc1a6971 Blue Swirl
                    gen_helper_fnegs(cpu_fpr[rd], cpu_fpr[rs2]);
2333 dc1a6971 Blue Swirl
                    break;
2334 dc1a6971 Blue Swirl
                case 0x9: /* fabss */
2335 dc1a6971 Blue Swirl
                    gen_helper_fabss(cpu_fpr[rd], cpu_fpr[rs2]);
2336 dc1a6971 Blue Swirl
                    break;
2337 dc1a6971 Blue Swirl
                case 0x29: /* fsqrts */
2338 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FSQRT);
2339 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2340 dc1a6971 Blue Swirl
                    gen_helper_fsqrts(cpu_tmp32, cpu_fpr[rs2]);
2341 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2342 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
2343 dc1a6971 Blue Swirl
                    break;
2344 dc1a6971 Blue Swirl
                case 0x2a: /* fsqrtd */
2345 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FSQRT);
2346 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2347 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2348 dc1a6971 Blue Swirl
                    gen_helper_fsqrtd();
2349 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2350 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2351 dc1a6971 Blue Swirl
                    break;
2352 dc1a6971 Blue Swirl
                case 0x2b: /* fsqrtq */
2353 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2354 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT1(QFPREG(rs2));
2355 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2356 dc1a6971 Blue Swirl
                    gen_helper_fsqrtq();
2357 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2358 dc1a6971 Blue Swirl
                    gen_op_store_QT0_fpr(QFPREG(rd));
2359 dc1a6971 Blue Swirl
                    break;
2360 dc1a6971 Blue Swirl
                case 0x41: /* fadds */
2361 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2362 dc1a6971 Blue Swirl
                    gen_helper_fadds(cpu_tmp32, cpu_fpr[rs1], cpu_fpr[rs2]);
2363 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2364 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
2365 dc1a6971 Blue Swirl
                    break;
2366 dc1a6971 Blue Swirl
                case 0x42: /* faddd */
2367 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT0(DFPREG(rs1));
2368 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2369 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2370 dc1a6971 Blue Swirl
                    gen_helper_faddd();
2371 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2372 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2373 dc1a6971 Blue Swirl
                    break;
2374 dc1a6971 Blue Swirl
                case 0x43: /* faddq */
2375 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2376 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT0(QFPREG(rs1));
2377 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT1(QFPREG(rs2));
2378 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2379 dc1a6971 Blue Swirl
                    gen_helper_faddq();
2380 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2381 dc1a6971 Blue Swirl
                    gen_op_store_QT0_fpr(QFPREG(rd));
2382 dc1a6971 Blue Swirl
                    break;
2383 dc1a6971 Blue Swirl
                case 0x45: /* fsubs */
2384 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2385 dc1a6971 Blue Swirl
                    gen_helper_fsubs(cpu_tmp32, cpu_fpr[rs1], cpu_fpr[rs2]);
2386 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2387 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
2388 dc1a6971 Blue Swirl
                    break;
2389 dc1a6971 Blue Swirl
                case 0x46: /* fsubd */
2390 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT0(DFPREG(rs1));
2391 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2392 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2393 dc1a6971 Blue Swirl
                    gen_helper_fsubd();
2394 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2395 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2396 dc1a6971 Blue Swirl
                    break;
2397 dc1a6971 Blue Swirl
                case 0x47: /* fsubq */
2398 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2399 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT0(QFPREG(rs1));
2400 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT1(QFPREG(rs2));
2401 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2402 dc1a6971 Blue Swirl
                    gen_helper_fsubq();
2403 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2404 dc1a6971 Blue Swirl
                    gen_op_store_QT0_fpr(QFPREG(rd));
2405 dc1a6971 Blue Swirl
                    break;
2406 dc1a6971 Blue Swirl
                case 0x49: /* fmuls */
2407 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FMUL);
2408 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2409 dc1a6971 Blue Swirl
                    gen_helper_fmuls(cpu_tmp32, cpu_fpr[rs1], cpu_fpr[rs2]);
2410 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2411 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
2412 dc1a6971 Blue Swirl
                    break;
2413 dc1a6971 Blue Swirl
                case 0x4a: /* fmuld */
2414 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FMUL);
2415 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT0(DFPREG(rs1));
2416 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2417 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2418 dc1a6971 Blue Swirl
                    gen_helper_fmuld();
2419 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2420 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2421 dc1a6971 Blue Swirl
                    break;
2422 dc1a6971 Blue Swirl
                case 0x4b: /* fmulq */
2423 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2424 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FMUL);
2425 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT0(QFPREG(rs1));
2426 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT1(QFPREG(rs2));
2427 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2428 dc1a6971 Blue Swirl
                    gen_helper_fmulq();
2429 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2430 dc1a6971 Blue Swirl
                    gen_op_store_QT0_fpr(QFPREG(rd));
2431 dc1a6971 Blue Swirl
                    break;
2432 dc1a6971 Blue Swirl
                case 0x4d: /* fdivs */
2433 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2434 dc1a6971 Blue Swirl
                    gen_helper_fdivs(cpu_tmp32, cpu_fpr[rs1], cpu_fpr[rs2]);
2435 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2436 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
2437 dc1a6971 Blue Swirl
                    break;
2438 dc1a6971 Blue Swirl
                case 0x4e: /* fdivd */
2439 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT0(DFPREG(rs1));
2440 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2441 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2442 dc1a6971 Blue Swirl
                    gen_helper_fdivd();
2443 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2444 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2445 dc1a6971 Blue Swirl
                    break;
2446 dc1a6971 Blue Swirl
                case 0x4f: /* fdivq */
2447 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2448 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT0(QFPREG(rs1));
2449 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT1(QFPREG(rs2));
2450 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2451 dc1a6971 Blue Swirl
                    gen_helper_fdivq();
2452 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2453 dc1a6971 Blue Swirl
                    gen_op_store_QT0_fpr(QFPREG(rd));
2454 dc1a6971 Blue Swirl
                    break;
2455 dc1a6971 Blue Swirl
                case 0x69: /* fsmuld */
2456 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FSMULD);
2457 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2458 dc1a6971 Blue Swirl
                    gen_helper_fsmuld(cpu_fpr[rs1], cpu_fpr[rs2]);
2459 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2460 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2461 dc1a6971 Blue Swirl
                    break;
2462 dc1a6971 Blue Swirl
                case 0x6e: /* fdmulq */
2463 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2464 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT0(DFPREG(rs1));
2465 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2466 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2467 dc1a6971 Blue Swirl
                    gen_helper_fdmulq();
2468 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2469 dc1a6971 Blue Swirl
                    gen_op_store_QT0_fpr(QFPREG(rd));
2470 dc1a6971 Blue Swirl
                    break;
2471 dc1a6971 Blue Swirl
                case 0xc4: /* fitos */
2472 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2473 dc1a6971 Blue Swirl
                    gen_helper_fitos(cpu_tmp32, cpu_fpr[rs2]);
2474 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2475 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
2476 dc1a6971 Blue Swirl
                    break;
2477 dc1a6971 Blue Swirl
                case 0xc6: /* fdtos */
2478 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2479 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2480 dc1a6971 Blue Swirl
                    gen_helper_fdtos(cpu_tmp32);
2481 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2482 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
2483 dc1a6971 Blue Swirl
                    break;
2484 dc1a6971 Blue Swirl
                case 0xc7: /* fqtos */
2485 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2486 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT1(QFPREG(rs2));
2487 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2488 dc1a6971 Blue Swirl
                    gen_helper_fqtos(cpu_tmp32);
2489 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2490 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
2491 dc1a6971 Blue Swirl
                    break;
2492 dc1a6971 Blue Swirl
                case 0xc8: /* fitod */
2493 dc1a6971 Blue Swirl
                    gen_helper_fitod(cpu_fpr[rs2]);
2494 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2495 dc1a6971 Blue Swirl
                    break;
2496 dc1a6971 Blue Swirl
                case 0xc9: /* fstod */
2497 dc1a6971 Blue Swirl
                    gen_helper_fstod(cpu_fpr[rs2]);
2498 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2499 dc1a6971 Blue Swirl
                    break;
2500 dc1a6971 Blue Swirl
                case 0xcb: /* fqtod */
2501 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2502 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT1(QFPREG(rs2));
2503 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2504 dc1a6971 Blue Swirl
                    gen_helper_fqtod();
2505 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2506 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2507 dc1a6971 Blue Swirl
                    break;
2508 dc1a6971 Blue Swirl
                case 0xcc: /* fitoq */
2509 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2510 dc1a6971 Blue Swirl
                    gen_helper_fitoq(cpu_fpr[rs2]);
2511 dc1a6971 Blue Swirl
                    gen_op_store_QT0_fpr(QFPREG(rd));
2512 dc1a6971 Blue Swirl
                    break;
2513 dc1a6971 Blue Swirl
                case 0xcd: /* fstoq */
2514 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2515 dc1a6971 Blue Swirl
                    gen_helper_fstoq(cpu_fpr[rs2]);
2516 dc1a6971 Blue Swirl
                    gen_op_store_QT0_fpr(QFPREG(rd));
2517 dc1a6971 Blue Swirl
                    break;
2518 dc1a6971 Blue Swirl
                case 0xce: /* fdtoq */
2519 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2520 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2521 dc1a6971 Blue Swirl
                    gen_helper_fdtoq();
2522 dc1a6971 Blue Swirl
                    gen_op_store_QT0_fpr(QFPREG(rd));
2523 dc1a6971 Blue Swirl
                    break;
2524 dc1a6971 Blue Swirl
                case 0xd1: /* fstoi */
2525 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2526 dc1a6971 Blue Swirl
                    gen_helper_fstoi(cpu_tmp32, cpu_fpr[rs2]);
2527 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2528 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
2529 dc1a6971 Blue Swirl
                    break;
2530 dc1a6971 Blue Swirl
                case 0xd2: /* fdtoi */
2531 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2532 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2533 dc1a6971 Blue Swirl
                    gen_helper_fdtoi(cpu_tmp32);
2534 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2535 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
2536 dc1a6971 Blue Swirl
                    break;
2537 dc1a6971 Blue Swirl
                case 0xd3: /* fqtoi */
2538 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2539 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT1(QFPREG(rs2));
2540 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2541 dc1a6971 Blue Swirl
                    gen_helper_fqtoi(cpu_tmp32);
2542 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2543 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
2544 dc1a6971 Blue Swirl
                    break;
2545 3475187d bellard
#ifdef TARGET_SPARC64
2546 dc1a6971 Blue Swirl
                case 0x2: /* V9 fmovd */
2547 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs2)]);
2548 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[DFPREG(rd) + 1],
2549 dc1a6971 Blue Swirl
                                    cpu_fpr[DFPREG(rs2) + 1]);
2550 dc1a6971 Blue Swirl
                    break;
2551 dc1a6971 Blue Swirl
                case 0x3: /* V9 fmovq */
2552 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2553 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[QFPREG(rd)], cpu_fpr[QFPREG(rs2)]);
2554 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 1],
2555 dc1a6971 Blue Swirl
                                    cpu_fpr[QFPREG(rs2) + 1]);
2556 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 2],
2557 dc1a6971 Blue Swirl
                                    cpu_fpr[QFPREG(rs2) + 2]);
2558 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 3],
2559 dc1a6971 Blue Swirl
                                    cpu_fpr[QFPREG(rs2) + 3]);
2560 dc1a6971 Blue Swirl
                    break;
2561 dc1a6971 Blue Swirl
                case 0x6: /* V9 fnegd */
2562 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2563 dc1a6971 Blue Swirl
                    gen_helper_fnegd();
2564 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2565 dc1a6971 Blue Swirl
                    break;
2566 dc1a6971 Blue Swirl
                case 0x7: /* V9 fnegq */
2567 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2568 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT1(QFPREG(rs2));
2569 dc1a6971 Blue Swirl
                    gen_helper_fnegq();
2570 dc1a6971 Blue Swirl
                    gen_op_store_QT0_fpr(QFPREG(rd));
2571 dc1a6971 Blue Swirl
                    break;
2572 dc1a6971 Blue Swirl
                case 0xa: /* V9 fabsd */
2573 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2574 dc1a6971 Blue Swirl
                    gen_helper_fabsd();
2575 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2576 dc1a6971 Blue Swirl
                    break;
2577 dc1a6971 Blue Swirl
                case 0xb: /* V9 fabsq */
2578 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2579 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT1(QFPREG(rs2));
2580 dc1a6971 Blue Swirl
                    gen_helper_fabsq();
2581 dc1a6971 Blue Swirl
                    gen_op_store_QT0_fpr(QFPREG(rd));
2582 dc1a6971 Blue Swirl
                    break;
2583 dc1a6971 Blue Swirl
                case 0x81: /* V9 fstox */
2584 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2585 dc1a6971 Blue Swirl
                    gen_helper_fstox(cpu_fpr[rs2]);
2586 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2587 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2588 dc1a6971 Blue Swirl
                    break;
2589 dc1a6971 Blue Swirl
                case 0x82: /* V9 fdtox */
2590 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2591 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2592 dc1a6971 Blue Swirl
                    gen_helper_fdtox();
2593 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2594 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2595 dc1a6971 Blue Swirl
                    break;
2596 dc1a6971 Blue Swirl
                case 0x83: /* V9 fqtox */
2597 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2598 dc1a6971 Blue Swirl
                    gen_op_load_fpr_QT1(QFPREG(rs2));
2599 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2600 dc1a6971 Blue Swirl
                    gen_helper_fqtox();
2601 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2602 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2603 dc1a6971 Blue Swirl
                    break;
2604 dc1a6971 Blue Swirl
                case 0x84: /* V9 fxtos */
2605 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2606 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2607 dc1a6971 Blue Swirl
                    gen_helper_fxtos(cpu_tmp32);
2608 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2609 dc1a6971 Blue Swirl
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_tmp32);
2610 dc1a6971 Blue Swirl
                    break;
2611 dc1a6971 Blue Swirl
                case 0x88: /* V9 fxtod */
2612 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2613 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2614 dc1a6971 Blue Swirl
                    gen_helper_fxtod();
2615 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2616 dc1a6971 Blue Swirl
                    gen_op_store_DT0_fpr(DFPREG(rd));
2617 dc1a6971 Blue Swirl
                    break;
2618 dc1a6971 Blue Swirl
                case 0x8c: /* V9 fxtoq */
2619 dc1a6971 Blue Swirl
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2620 dc1a6971 Blue Swirl
                    gen_op_load_fpr_DT1(DFPREG(rs2));
2621 dc1a6971 Blue Swirl
                    gen_clear_float_exceptions();
2622 dc1a6971 Blue Swirl
                    gen_helper_fxtoq();
2623 dc1a6971 Blue Swirl
                    gen_helper_check_ieee_exceptions();
2624 dc1a6971 Blue Swirl
                    gen_op_store_QT0_fpr(QFPREG(rd));
2625 dc1a6971 Blue Swirl
                    break;
2626 1f587329 blueswir1
#endif
2627 dc1a6971 Blue Swirl
                default:
2628 dc1a6971 Blue Swirl
                    goto illegal_insn;
2629 0f8a249a blueswir1
                }
2630 0f8a249a blueswir1
            } else if (xop == 0x35) {   /* FPU Operations */
2631 3475187d bellard
#ifdef TARGET_SPARC64
2632 0f8a249a blueswir1
                int cond;
2633 3475187d bellard
#endif
2634 6ae20372 blueswir1
                if (gen_trap_ifnofpu(dc, cpu_cond))
2635 a80dde08 bellard
                    goto jmp_insn;
2636 0f8a249a blueswir1
                gen_op_clear_ieee_excp_and_FTT();
2637 cf495bcf bellard
                rs1 = GET_FIELD(insn, 13, 17);
2638 0f8a249a blueswir1
                rs2 = GET_FIELD(insn, 27, 31);
2639 0f8a249a blueswir1
                xop = GET_FIELD(insn, 18, 26);
2640 cca1d527 Blue Swirl
                save_state(dc, cpu_cond);
2641 3475187d bellard
#ifdef TARGET_SPARC64
2642 0f8a249a blueswir1
                if ((xop & 0x11f) == 0x005) { // V9 fmovsr
2643 dcf24905 blueswir1
                    int l1;
2644 dcf24905 blueswir1
2645 dcf24905 blueswir1
                    l1 = gen_new_label();
2646 0f8a249a blueswir1
                    cond = GET_FIELD_SP(insn, 14, 17);
2647 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
2648 cb63669a pbrook
                    tcg_gen_brcondi_tl(gen_tcg_cond_reg[cond], cpu_src1,
2649 cb63669a pbrook
                                       0, l1);
2650 714547bb blueswir1
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_fpr[rs2]);
2651 dcf24905 blueswir1
                    gen_set_label(l1);
2652 0f8a249a blueswir1
                    break;
2653 0f8a249a blueswir1
                } else if ((xop & 0x11f) == 0x006) { // V9 fmovdr
2654 dcf24905 blueswir1
                    int l1;
2655 dcf24905 blueswir1
2656 dcf24905 blueswir1
                    l1 = gen_new_label();
2657 0f8a249a blueswir1
                    cond = GET_FIELD_SP(insn, 14, 17);
2658 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
2659 cb63669a pbrook
                    tcg_gen_brcondi_tl(gen_tcg_cond_reg[cond], cpu_src1,
2660 cb63669a pbrook
                                       0, l1);
2661 714547bb blueswir1
                    tcg_gen_mov_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs2)]);
2662 714547bb blueswir1
                    tcg_gen_mov_i32(cpu_fpr[DFPREG(rd) + 1], cpu_fpr[DFPREG(rs2) + 1]);
2663 dcf24905 blueswir1
                    gen_set_label(l1);
2664 0f8a249a blueswir1
                    break;
2665 0f8a249a blueswir1
                } else if ((xop & 0x11f) == 0x007) { // V9 fmovqr
2666 dcf24905 blueswir1
                    int l1;
2667 dcf24905 blueswir1
2668 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2669 dcf24905 blueswir1
                    l1 = gen_new_label();
2670 1f587329 blueswir1
                    cond = GET_FIELD_SP(insn, 14, 17);
2671 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
2672 cb63669a pbrook
                    tcg_gen_brcondi_tl(gen_tcg_cond_reg[cond], cpu_src1,
2673 cb63669a pbrook
                                       0, l1);
2674 714547bb blueswir1
                    tcg_gen_mov_i32(cpu_fpr[QFPREG(rd)], cpu_fpr[QFPREG(rs2)]);
2675 714547bb blueswir1
                    tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 1], cpu_fpr[QFPREG(rs2) + 1]);
2676 714547bb blueswir1
                    tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 2], cpu_fpr[QFPREG(rs2) + 2]);
2677 714547bb blueswir1
                    tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 3], cpu_fpr[QFPREG(rs2) + 3]);
2678 dcf24905 blueswir1
                    gen_set_label(l1);
2679 1f587329 blueswir1
                    break;
2680 0f8a249a blueswir1
                }
2681 0f8a249a blueswir1
#endif
2682 0f8a249a blueswir1
                switch (xop) {
2683 3475187d bellard
#ifdef TARGET_SPARC64
2684 714547bb blueswir1
#define FMOVSCC(fcc)                                                    \
2685 19f329ad blueswir1
                    {                                                   \
2686 0425bee5 blueswir1
                        TCGv r_cond;                                    \
2687 19f329ad blueswir1
                        int l1;                                         \
2688 19f329ad blueswir1
                                                                        \
2689 19f329ad blueswir1
                        l1 = gen_new_label();                           \
2690 dc1a6971 Blue Swirl
                        r_cond = tcg_temp_new();                        \
2691 19f329ad blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);              \
2692 19f329ad blueswir1
                        gen_fcond(r_cond, fcc, cond);                   \
2693 cb63669a pbrook
                        tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond,         \
2694 cb63669a pbrook
                                           0, l1);                      \
2695 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[rd], cpu_fpr[rs2]);     \
2696 714547bb blueswir1
                        gen_set_label(l1);                              \
2697 714547bb blueswir1
                        tcg_temp_free(r_cond);                          \
2698 714547bb blueswir1
                    }
2699 714547bb blueswir1
#define FMOVDCC(fcc)                                                    \
2700 714547bb blueswir1
                    {                                                   \
2701 714547bb blueswir1
                        TCGv r_cond;                                    \
2702 714547bb blueswir1
                        int l1;                                         \
2703 714547bb blueswir1
                                                                        \
2704 714547bb blueswir1
                        l1 = gen_new_label();                           \
2705 dc1a6971 Blue Swirl
                        r_cond = tcg_temp_new();                        \
2706 714547bb blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);              \
2707 714547bb blueswir1
                        gen_fcond(r_cond, fcc, cond);                   \
2708 714547bb blueswir1
                        tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond,         \
2709 714547bb blueswir1
                                           0, l1);                      \
2710 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[DFPREG(rd)],            \
2711 714547bb blueswir1
                                        cpu_fpr[DFPREG(rs2)]);          \
2712 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[DFPREG(rd) + 1],        \
2713 714547bb blueswir1
                                        cpu_fpr[DFPREG(rs2) + 1]);      \
2714 714547bb blueswir1
                        gen_set_label(l1);                              \
2715 714547bb blueswir1
                        tcg_temp_free(r_cond);                          \
2716 714547bb blueswir1
                    }
2717 714547bb blueswir1
#define FMOVQCC(fcc)                                                    \
2718 714547bb blueswir1
                    {                                                   \
2719 714547bb blueswir1
                        TCGv r_cond;                                    \
2720 714547bb blueswir1
                        int l1;                                         \
2721 714547bb blueswir1
                                                                        \
2722 714547bb blueswir1
                        l1 = gen_new_label();                           \
2723 dc1a6971 Blue Swirl
                        r_cond = tcg_temp_new();                        \
2724 714547bb blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);              \
2725 714547bb blueswir1
                        gen_fcond(r_cond, fcc, cond);                   \
2726 714547bb blueswir1
                        tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond,         \
2727 714547bb blueswir1
                                           0, l1);                      \
2728 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[QFPREG(rd)],            \
2729 714547bb blueswir1
                                        cpu_fpr[QFPREG(rs2)]);          \
2730 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 1],        \
2731 714547bb blueswir1
                                        cpu_fpr[QFPREG(rs2) + 1]);      \
2732 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 2],        \
2733 714547bb blueswir1
                                        cpu_fpr[QFPREG(rs2) + 2]);      \
2734 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 3],        \
2735 714547bb blueswir1
                                        cpu_fpr[QFPREG(rs2) + 3]);      \
2736 19f329ad blueswir1
                        gen_set_label(l1);                              \
2737 2ea815ca blueswir1
                        tcg_temp_free(r_cond);                          \
2738 19f329ad blueswir1
                    }
2739 0f8a249a blueswir1
                    case 0x001: /* V9 fmovscc %fcc0 */
2740 714547bb blueswir1
                        FMOVSCC(0);
2741 0f8a249a blueswir1
                        break;
2742 0f8a249a blueswir1
                    case 0x002: /* V9 fmovdcc %fcc0 */
2743 714547bb blueswir1
                        FMOVDCC(0);
2744 0f8a249a blueswir1
                        break;
2745 0f8a249a blueswir1
                    case 0x003: /* V9 fmovqcc %fcc0 */
2746 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2747 714547bb blueswir1
                        FMOVQCC(0);
2748 1f587329 blueswir1
                        break;
2749 0f8a249a blueswir1
                    case 0x041: /* V9 fmovscc %fcc1 */
2750 714547bb blueswir1
                        FMOVSCC(1);
2751 0f8a249a blueswir1
                        break;
2752 0f8a249a blueswir1
                    case 0x042: /* V9 fmovdcc %fcc1 */
2753 714547bb blueswir1
                        FMOVDCC(1);
2754 0f8a249a blueswir1
                        break;
2755 0f8a249a blueswir1
                    case 0x043: /* V9 fmovqcc %fcc1 */
2756 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2757 714547bb blueswir1
                        FMOVQCC(1);
2758 1f587329 blueswir1
                        break;
2759 0f8a249a blueswir1
                    case 0x081: /* V9 fmovscc %fcc2 */
2760 714547bb blueswir1
                        FMOVSCC(2);
2761 0f8a249a blueswir1
                        break;
2762 0f8a249a blueswir1
                    case 0x082: /* V9 fmovdcc %fcc2 */
2763 714547bb blueswir1
                        FMOVDCC(2);
2764 0f8a249a blueswir1
                        break;
2765 0f8a249a blueswir1
                    case 0x083: /* V9 fmovqcc %fcc2 */
2766 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2767 714547bb blueswir1
                        FMOVQCC(2);
2768 1f587329 blueswir1
                        break;
2769 0f8a249a blueswir1
                    case 0x0c1: /* V9 fmovscc %fcc3 */
2770 714547bb blueswir1
                        FMOVSCC(3);
2771 0f8a249a blueswir1
                        break;
2772 0f8a249a blueswir1
                    case 0x0c2: /* V9 fmovdcc %fcc3 */
2773 714547bb blueswir1
                        FMOVDCC(3);
2774 0f8a249a blueswir1
                        break;
2775 0f8a249a blueswir1
                    case 0x0c3: /* V9 fmovqcc %fcc3 */
2776 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2777 714547bb blueswir1
                        FMOVQCC(3);
2778 1f587329 blueswir1
                        break;
2779 714547bb blueswir1
#undef FMOVSCC
2780 714547bb blueswir1
#undef FMOVDCC
2781 714547bb blueswir1
#undef FMOVQCC
2782 714547bb blueswir1
#define FMOVSCC(icc)                                                    \
2783 714547bb blueswir1
                    {                                                   \
2784 714547bb blueswir1
                        TCGv r_cond;                                    \
2785 714547bb blueswir1
                        int l1;                                         \
2786 714547bb blueswir1
                                                                        \
2787 714547bb blueswir1
                        l1 = gen_new_label();                           \
2788 dc1a6971 Blue Swirl
                        r_cond = tcg_temp_new();                        \
2789 714547bb blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);              \
2790 8393617c Blue Swirl
                        gen_cond(r_cond, icc, cond, dc);                \
2791 714547bb blueswir1
                        tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond,         \
2792 714547bb blueswir1
                                           0, l1);                      \
2793 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[rd], cpu_fpr[rs2]);     \
2794 714547bb blueswir1
                        gen_set_label(l1);                              \
2795 714547bb blueswir1
                        tcg_temp_free(r_cond);                          \
2796 714547bb blueswir1
                    }
2797 714547bb blueswir1
#define FMOVDCC(icc)                                                    \
2798 714547bb blueswir1
                    {                                                   \
2799 714547bb blueswir1
                        TCGv r_cond;                                    \
2800 714547bb blueswir1
                        int l1;                                         \
2801 714547bb blueswir1
                                                                        \
2802 714547bb blueswir1
                        l1 = gen_new_label();                           \
2803 dc1a6971 Blue Swirl
                        r_cond = tcg_temp_new();                        \
2804 714547bb blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);              \
2805 8393617c Blue Swirl
                        gen_cond(r_cond, icc, cond, dc);                \
2806 714547bb blueswir1
                        tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond,         \
2807 714547bb blueswir1
                                           0, l1);                      \
2808 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[DFPREG(rd)],            \
2809 714547bb blueswir1
                                        cpu_fpr[DFPREG(rs2)]);          \
2810 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[DFPREG(rd) + 1],        \
2811 714547bb blueswir1
                                        cpu_fpr[DFPREG(rs2) + 1]);      \
2812 714547bb blueswir1
                        gen_set_label(l1);                              \
2813 714547bb blueswir1
                        tcg_temp_free(r_cond);                          \
2814 714547bb blueswir1
                    }
2815 714547bb blueswir1
#define FMOVQCC(icc)                                                    \
2816 714547bb blueswir1
                    {                                                   \
2817 714547bb blueswir1
                        TCGv r_cond;                                    \
2818 714547bb blueswir1
                        int l1;                                         \
2819 714547bb blueswir1
                                                                        \
2820 714547bb blueswir1
                        l1 = gen_new_label();                           \
2821 dc1a6971 Blue Swirl
                        r_cond = tcg_temp_new();                        \
2822 714547bb blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);              \
2823 8393617c Blue Swirl
                        gen_cond(r_cond, icc, cond, dc);                \
2824 714547bb blueswir1
                        tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond,         \
2825 714547bb blueswir1
                                           0, l1);                      \
2826 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[QFPREG(rd)],            \
2827 714547bb blueswir1
                                        cpu_fpr[QFPREG(rs2)]);          \
2828 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 1],        \
2829 714547bb blueswir1
                                        cpu_fpr[QFPREG(rs2) + 1]);      \
2830 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 2],        \
2831 714547bb blueswir1
                                        cpu_fpr[QFPREG(rs2) + 2]);      \
2832 714547bb blueswir1
                        tcg_gen_mov_i32(cpu_fpr[QFPREG(rd) + 3],        \
2833 714547bb blueswir1
                                        cpu_fpr[QFPREG(rs2) + 3]);      \
2834 714547bb blueswir1
                        gen_set_label(l1);                              \
2835 714547bb blueswir1
                        tcg_temp_free(r_cond);                          \
2836 714547bb blueswir1
                    }
2837 19f329ad blueswir1
2838 0f8a249a blueswir1
                    case 0x101: /* V9 fmovscc %icc */
2839 714547bb blueswir1
                        FMOVSCC(0);
2840 0f8a249a blueswir1
                        break;
2841 0f8a249a blueswir1
                    case 0x102: /* V9 fmovdcc %icc */
2842 714547bb blueswir1
                        FMOVDCC(0);
2843 0f8a249a blueswir1
                    case 0x103: /* V9 fmovqcc %icc */
2844 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2845 714547bb blueswir1
                        FMOVQCC(0);
2846 1f587329 blueswir1
                        break;
2847 0f8a249a blueswir1
                    case 0x181: /* V9 fmovscc %xcc */
2848 714547bb blueswir1
                        FMOVSCC(1);
2849 0f8a249a blueswir1
                        break;
2850 0f8a249a blueswir1
                    case 0x182: /* V9 fmovdcc %xcc */
2851 714547bb blueswir1
                        FMOVDCC(1);
2852 0f8a249a blueswir1
                        break;
2853 0f8a249a blueswir1
                    case 0x183: /* V9 fmovqcc %xcc */
2854 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2855 714547bb blueswir1
                        FMOVQCC(1);
2856 1f587329 blueswir1
                        break;
2857 714547bb blueswir1
#undef FMOVSCC
2858 714547bb blueswir1
#undef FMOVDCC
2859 714547bb blueswir1
#undef FMOVQCC
2860 1f587329 blueswir1
#endif
2861 1f587329 blueswir1
                    case 0x51: /* fcmps, V9 %fcc */
2862 714547bb blueswir1
                        gen_op_fcmps(rd & 3, cpu_fpr[rs1], cpu_fpr[rs2]);
2863 0f8a249a blueswir1
                        break;
2864 1f587329 blueswir1
                    case 0x52: /* fcmpd, V9 %fcc */
2865 0f8a249a blueswir1
                        gen_op_load_fpr_DT0(DFPREG(rs1));
2866 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
2867 7e8c2b6c blueswir1
                        gen_op_fcmpd(rd & 3);
2868 0f8a249a blueswir1
                        break;
2869 1f587329 blueswir1
                    case 0x53: /* fcmpq, V9 %fcc */
2870 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2871 1f587329 blueswir1
                        gen_op_load_fpr_QT0(QFPREG(rs1));
2872 1f587329 blueswir1
                        gen_op_load_fpr_QT1(QFPREG(rs2));
2873 7e8c2b6c blueswir1
                        gen_op_fcmpq(rd & 3);
2874 1f587329 blueswir1
                        break;
2875 0f8a249a blueswir1
                    case 0x55: /* fcmpes, V9 %fcc */
2876 714547bb blueswir1
                        gen_op_fcmpes(rd & 3, cpu_fpr[rs1], cpu_fpr[rs2]);
2877 0f8a249a blueswir1
                        break;
2878 0f8a249a blueswir1
                    case 0x56: /* fcmped, V9 %fcc */
2879 0f8a249a blueswir1
                        gen_op_load_fpr_DT0(DFPREG(rs1));
2880 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
2881 7e8c2b6c blueswir1
                        gen_op_fcmped(rd & 3);
2882 0f8a249a blueswir1
                        break;
2883 1f587329 blueswir1
                    case 0x57: /* fcmpeq, V9 %fcc */
2884 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2885 1f587329 blueswir1
                        gen_op_load_fpr_QT0(QFPREG(rs1));
2886 1f587329 blueswir1
                        gen_op_load_fpr_QT1(QFPREG(rs2));
2887 7e8c2b6c blueswir1
                        gen_op_fcmpeq(rd & 3);
2888 1f587329 blueswir1
                        break;
2889 0f8a249a blueswir1
                    default:
2890 0f8a249a blueswir1
                        goto illegal_insn;
2891 0f8a249a blueswir1
                }
2892 0f8a249a blueswir1
            } else if (xop == 0x2) {
2893 0f8a249a blueswir1
                // clr/mov shortcut
2894 e80cfcfc bellard
2895 e80cfcfc bellard
                rs1 = GET_FIELD(insn, 13, 17);
2896 0f8a249a blueswir1
                if (rs1 == 0) {
2897 1a2fb1c0 blueswir1
                    // or %g0, x, y -> mov T0, x; mov y, T0
2898 0f8a249a blueswir1
                    if (IS_IMM) {       /* immediate */
2899 2ea815ca blueswir1
                        TCGv r_const;
2900 2ea815ca blueswir1
2901 67526b20 Blue Swirl
                        simm = GET_FIELDs(insn, 19, 31);
2902 67526b20 Blue Swirl
                        r_const = tcg_const_tl(simm);
2903 2ea815ca blueswir1
                        gen_movl_TN_reg(rd, r_const);
2904 2ea815ca blueswir1
                        tcg_temp_free(r_const);
2905 0f8a249a blueswir1
                    } else {            /* register */
2906 0f8a249a blueswir1
                        rs2 = GET_FIELD(insn, 27, 31);
2907 6ae20372 blueswir1
                        gen_movl_reg_TN(rs2, cpu_dst);
2908 9c6c6662 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
2909 0f8a249a blueswir1
                    }
2910 0f8a249a blueswir1
                } else {
2911 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
2912 0f8a249a blueswir1
                    if (IS_IMM) {       /* immediate */
2913 67526b20 Blue Swirl
                        simm = GET_FIELDs(insn, 19, 31);
2914 67526b20 Blue Swirl
                        tcg_gen_ori_tl(cpu_dst, cpu_src1, simm);
2915 9c6c6662 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
2916 0f8a249a blueswir1
                    } else {            /* register */
2917 0f8a249a blueswir1
                        // or x, %g0, y -> mov T1, x; mov y, T1
2918 0f8a249a blueswir1
                        rs2 = GET_FIELD(insn, 27, 31);
2919 0f8a249a blueswir1
                        if (rs2 != 0) {
2920 6ae20372 blueswir1
                            gen_movl_reg_TN(rs2, cpu_src2);
2921 6ae20372 blueswir1
                            tcg_gen_or_tl(cpu_dst, cpu_src1, cpu_src2);
2922 9c6c6662 blueswir1
                            gen_movl_TN_reg(rd, cpu_dst);
2923 6f551262 blueswir1
                        } else
2924 9c6c6662 blueswir1
                            gen_movl_TN_reg(rd, cpu_src1);
2925 0f8a249a blueswir1
                    }
2926 0f8a249a blueswir1
                }
2927 83469015 bellard
#ifdef TARGET_SPARC64
2928 0f8a249a blueswir1
            } else if (xop == 0x25) { /* sll, V9 sllx */
2929 9322a4bf blueswir1
                cpu_src1 = get_src1(insn, cpu_src1);
2930 0f8a249a blueswir1
                if (IS_IMM) {   /* immediate */
2931 67526b20 Blue Swirl
                    simm = GET_FIELDs(insn, 20, 31);
2932 1a2fb1c0 blueswir1
                    if (insn & (1 << 12)) {
2933 67526b20 Blue Swirl
                        tcg_gen_shli_i64(cpu_dst, cpu_src1, simm & 0x3f);
2934 1a2fb1c0 blueswir1
                    } else {
2935 67526b20 Blue Swirl
                        tcg_gen_shli_i64(cpu_dst, cpu_src1, simm & 0x1f);
2936 1a2fb1c0 blueswir1
                    }
2937 0f8a249a blueswir1
                } else {                /* register */
2938 83469015 bellard
                    rs2 = GET_FIELD(insn, 27, 31);
2939 6ae20372 blueswir1
                    gen_movl_reg_TN(rs2, cpu_src2);
2940 1a2fb1c0 blueswir1
                    if (insn & (1 << 12)) {
2941 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_tmp0, cpu_src2, 0x3f);
2942 1a2fb1c0 blueswir1
                    } else {
2943 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_tmp0, cpu_src2, 0x1f);
2944 1a2fb1c0 blueswir1
                    }
2945 01b1fa6d blueswir1
                    tcg_gen_shl_i64(cpu_dst, cpu_src1, cpu_tmp0);
2946 83469015 bellard
                }
2947 6ae20372 blueswir1
                gen_movl_TN_reg(rd, cpu_dst);
2948 0f8a249a blueswir1
            } else if (xop == 0x26) { /* srl, V9 srlx */
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_shri_i64(cpu_dst, cpu_src1, simm & 0x3f);
2954 1a2fb1c0 blueswir1
                    } else {
2955 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_dst, cpu_src1, 0xffffffffULL);
2956 67526b20 Blue Swirl
                        tcg_gen_shri_i64(cpu_dst, cpu_dst, simm & 0x1f);
2957 1a2fb1c0 blueswir1
                    }
2958 0f8a249a blueswir1
                } else {                /* register */
2959 83469015 bellard
                    rs2 = GET_FIELD(insn, 27, 31);
2960 6ae20372 blueswir1
                    gen_movl_reg_TN(rs2, cpu_src2);
2961 1a2fb1c0 blueswir1
                    if (insn & (1 << 12)) {
2962 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_tmp0, cpu_src2, 0x3f);
2963 6ae20372 blueswir1
                        tcg_gen_shr_i64(cpu_dst, cpu_src1, cpu_tmp0);
2964 1a2fb1c0 blueswir1
                    } else {
2965 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_tmp0, cpu_src2, 0x1f);
2966 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_dst, cpu_src1, 0xffffffffULL);
2967 6ae20372 blueswir1
                        tcg_gen_shr_i64(cpu_dst, cpu_dst, cpu_tmp0);
2968 1a2fb1c0 blueswir1
                    }
2969 83469015 bellard
                }
2970 6ae20372 blueswir1
                gen_movl_TN_reg(rd, cpu_dst);
2971 0f8a249a blueswir1
            } else if (xop == 0x27) { /* sra, V9 srax */
2972 9322a4bf blueswir1
                cpu_src1 = get_src1(insn, cpu_src1);
2973 0f8a249a blueswir1
                if (IS_IMM) {   /* immediate */
2974 67526b20 Blue Swirl
                    simm = GET_FIELDs(insn, 20, 31);
2975 1a2fb1c0 blueswir1
                    if (insn & (1 << 12)) {
2976 67526b20 Blue Swirl
                        tcg_gen_sari_i64(cpu_dst, cpu_src1, simm & 0x3f);
2977 1a2fb1c0 blueswir1
                    } else {
2978 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_dst, cpu_src1, 0xffffffffULL);
2979 527067d8 blueswir1
                        tcg_gen_ext32s_i64(cpu_dst, cpu_dst);
2980 67526b20 Blue Swirl
                        tcg_gen_sari_i64(cpu_dst, cpu_dst, simm & 0x1f);
2981 1a2fb1c0 blueswir1
                    }
2982 0f8a249a blueswir1
                } else {                /* register */
2983 83469015 bellard
                    rs2 = GET_FIELD(insn, 27, 31);
2984 6ae20372 blueswir1
                    gen_movl_reg_TN(rs2, cpu_src2);
2985 1a2fb1c0 blueswir1
                    if (insn & (1 << 12)) {
2986 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_tmp0, cpu_src2, 0x3f);
2987 6ae20372 blueswir1
                        tcg_gen_sar_i64(cpu_dst, cpu_src1, cpu_tmp0);
2988 1a2fb1c0 blueswir1
                    } else {
2989 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_tmp0, cpu_src2, 0x1f);
2990 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_dst, cpu_src1, 0xffffffffULL);
2991 527067d8 blueswir1
                        tcg_gen_ext32s_i64(cpu_dst, cpu_dst);
2992 6ae20372 blueswir1
                        tcg_gen_sar_i64(cpu_dst, cpu_dst, cpu_tmp0);
2993 1a2fb1c0 blueswir1
                    }
2994 83469015 bellard
                }
2995 6ae20372 blueswir1
                gen_movl_TN_reg(rd, cpu_dst);
2996 83469015 bellard
#endif
2997 fcc72045 blueswir1
            } else if (xop < 0x36) {
2998 cf495bcf bellard
                if (xop < 0x20) {
2999 41d72852 Blue Swirl
                    cpu_src1 = get_src1(insn, cpu_src1);
3000 41d72852 Blue Swirl
                    cpu_src2 = get_src2(insn, cpu_src2);
3001 cf495bcf bellard
                    switch (xop & ~0x10) {
3002 b89e94af Blue Swirl
                    case 0x0: /* add */
3003 41d72852 Blue Swirl
                        if (IS_IMM) {
3004 41d72852 Blue Swirl
                            simm = GET_FIELDs(insn, 19, 31);
3005 41d72852 Blue Swirl
                            if (xop & 0x10) {
3006 41d72852 Blue Swirl
                                gen_op_addi_cc(cpu_dst, cpu_src1, simm);
3007 bdf9f35d Blue Swirl
                                tcg_gen_movi_i32(cpu_cc_op, CC_OP_ADD);
3008 bdf9f35d Blue Swirl
                                dc->cc_op = CC_OP_ADD;
3009 41d72852 Blue Swirl
                            } else {
3010 41d72852 Blue Swirl
                                tcg_gen_addi_tl(cpu_dst, cpu_src1, simm);
3011 41d72852 Blue Swirl
                            }
3012 41d72852 Blue Swirl
                        } else {
3013 41d72852 Blue Swirl
                            if (xop & 0x10) {
3014 41d72852 Blue Swirl
                                gen_op_add_cc(cpu_dst, cpu_src1, cpu_src2);
3015 bdf9f35d Blue Swirl
                                tcg_gen_movi_i32(cpu_cc_op, CC_OP_ADD);
3016 bdf9f35d Blue Swirl
                                dc->cc_op = CC_OP_ADD;
3017 41d72852 Blue Swirl
                            } else {
3018 41d72852 Blue Swirl
                                tcg_gen_add_tl(cpu_dst, cpu_src1, cpu_src2);
3019 41d72852 Blue Swirl
                            }
3020 41d72852 Blue Swirl
                        }
3021 cf495bcf bellard
                        break;
3022 b89e94af Blue Swirl
                    case 0x1: /* and */
3023 41d72852 Blue Swirl
                        if (IS_IMM) {
3024 41d72852 Blue Swirl
                            simm = GET_FIELDs(insn, 19, 31);
3025 41d72852 Blue Swirl
                            tcg_gen_andi_tl(cpu_dst, cpu_src1, simm);
3026 41d72852 Blue Swirl
                        } else {
3027 41d72852 Blue Swirl
                            tcg_gen_and_tl(cpu_dst, cpu_src1, cpu_src2);
3028 41d72852 Blue Swirl
                        }
3029 41d72852 Blue Swirl
                        if (xop & 0x10) {
3030 38482a77 Blue Swirl
                            tcg_gen_mov_tl(cpu_cc_dst, cpu_dst);
3031 38482a77 Blue Swirl
                            tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC);
3032 38482a77 Blue Swirl
                            dc->cc_op = CC_OP_LOGIC;
3033 41d72852 Blue Swirl
                        }
3034 cf495bcf bellard
                        break;
3035 b89e94af Blue Swirl
                    case 0x2: /* or */
3036 41d72852 Blue Swirl
                        if (IS_IMM) {
3037 41d72852 Blue Swirl
                            simm = GET_FIELDs(insn, 19, 31);
3038 41d72852 Blue Swirl
                            tcg_gen_ori_tl(cpu_dst, cpu_src1, simm);
3039 41d72852 Blue Swirl
                        } else {
3040 41d72852 Blue Swirl
                            tcg_gen_or_tl(cpu_dst, cpu_src1, cpu_src2);
3041 41d72852 Blue Swirl
                        }
3042 8393617c Blue Swirl
                        if (xop & 0x10) {
3043 38482a77 Blue Swirl
                            tcg_gen_mov_tl(cpu_cc_dst, cpu_dst);
3044 38482a77 Blue Swirl
                            tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC);
3045 38482a77 Blue Swirl
                            dc->cc_op = CC_OP_LOGIC;
3046 8393617c Blue Swirl
                        }
3047 0f8a249a blueswir1
                        break;
3048 b89e94af Blue Swirl
                    case 0x3: /* xor */
3049 41d72852 Blue Swirl
                        if (IS_IMM) {
3050 41d72852 Blue Swirl
                            simm = GET_FIELDs(insn, 19, 31);
3051 41d72852 Blue Swirl
                            tcg_gen_xori_tl(cpu_dst, cpu_src1, simm);
3052 41d72852 Blue Swirl
                        } else {
3053 41d72852 Blue Swirl
                            tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_src2);
3054 41d72852 Blue Swirl
                        }
3055 8393617c Blue Swirl
                        if (xop & 0x10) {
3056 38482a77 Blue Swirl
                            tcg_gen_mov_tl(cpu_cc_dst, cpu_dst);
3057 38482a77 Blue Swirl
                            tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC);
3058 38482a77 Blue Swirl
                            dc->cc_op = CC_OP_LOGIC;
3059 8393617c Blue Swirl
                        }
3060 cf495bcf bellard
                        break;
3061 b89e94af Blue Swirl
                    case 0x4: /* sub */
3062 41d72852 Blue Swirl
                        if (IS_IMM) {
3063 41d72852 Blue Swirl
                            simm = GET_FIELDs(insn, 19, 31);
3064 41d72852 Blue Swirl
                            if (xop & 0x10) {
3065 d4b0d468 Blue Swirl
                                gen_op_subi_cc(cpu_dst, cpu_src1, simm, dc);
3066 41d72852 Blue Swirl
                            } else {
3067 41d72852 Blue Swirl
                                tcg_gen_subi_tl(cpu_dst, cpu_src1, simm);
3068 41d72852 Blue Swirl
                            }
3069 41d72852 Blue Swirl
                        } else {
3070 41d72852 Blue Swirl
                            if (xop & 0x10) {
3071 41d72852 Blue Swirl
                                gen_op_sub_cc(cpu_dst, cpu_src1, cpu_src2);
3072 d4b0d468 Blue Swirl
                                tcg_gen_movi_i32(cpu_cc_op, CC_OP_SUB);
3073 d4b0d468 Blue Swirl
                                dc->cc_op = CC_OP_SUB;
3074 41d72852 Blue Swirl
                            } else {
3075 41d72852 Blue Swirl
                                tcg_gen_sub_tl(cpu_dst, cpu_src1, cpu_src2);
3076 41d72852 Blue Swirl
                            }
3077 41d72852 Blue Swirl
                        }
3078 cf495bcf bellard
                        break;
3079 b89e94af Blue Swirl
                    case 0x5: /* andn */
3080 41d72852 Blue Swirl
                        if (IS_IMM) {
3081 41d72852 Blue Swirl
                            simm = GET_FIELDs(insn, 19, 31);
3082 41d72852 Blue Swirl
                            tcg_gen_andi_tl(cpu_dst, cpu_src1, ~simm);
3083 41d72852 Blue Swirl
                        } else {
3084 41d72852 Blue Swirl
                            tcg_gen_andc_tl(cpu_dst, cpu_src1, cpu_src2);
3085 41d72852 Blue Swirl
                        }
3086 8393617c Blue Swirl
                        if (xop & 0x10) {
3087 38482a77 Blue Swirl
                            tcg_gen_mov_tl(cpu_cc_dst, cpu_dst);
3088 38482a77 Blue Swirl
                            tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC);
3089 38482a77 Blue Swirl
                            dc->cc_op = CC_OP_LOGIC;
3090 8393617c Blue Swirl
                        }
3091 cf495bcf bellard
                        break;
3092 b89e94af Blue Swirl
                    case 0x6: /* orn */
3093 41d72852 Blue Swirl
                        if (IS_IMM) {
3094 41d72852 Blue Swirl
                            simm = GET_FIELDs(insn, 19, 31);
3095 41d72852 Blue Swirl
                            tcg_gen_ori_tl(cpu_dst, cpu_src1, ~simm);
3096 41d72852 Blue Swirl
                        } else {
3097 41d72852 Blue Swirl
                            tcg_gen_orc_tl(cpu_dst, cpu_src1, cpu_src2);
3098 41d72852 Blue Swirl
                        }
3099 8393617c Blue Swirl
                        if (xop & 0x10) {
3100 38482a77 Blue Swirl
                            tcg_gen_mov_tl(cpu_cc_dst, cpu_dst);
3101 38482a77 Blue Swirl
                            tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC);
3102 38482a77 Blue Swirl
                            dc->cc_op = CC_OP_LOGIC;
3103 8393617c Blue Swirl
                        }
3104 cf495bcf bellard
                        break;
3105 b89e94af Blue Swirl
                    case 0x7: /* xorn */
3106 41d72852 Blue Swirl
                        if (IS_IMM) {
3107 41d72852 Blue Swirl
                            simm = GET_FIELDs(insn, 19, 31);
3108 41d72852 Blue Swirl
                            tcg_gen_xori_tl(cpu_dst, cpu_src1, ~simm);
3109 41d72852 Blue Swirl
                        } else {
3110 41d72852 Blue Swirl
                            tcg_gen_not_tl(cpu_tmp0, cpu_src2);
3111 41d72852 Blue Swirl
                            tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_tmp0);
3112 41d72852 Blue Swirl
                        }
3113 8393617c Blue Swirl
                        if (xop & 0x10) {
3114 38482a77 Blue Swirl
                            tcg_gen_mov_tl(cpu_cc_dst, cpu_dst);
3115 38482a77 Blue Swirl
                            tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC);
3116 38482a77 Blue Swirl
                            dc->cc_op = CC_OP_LOGIC;
3117 8393617c Blue Swirl
                        }
3118 cf495bcf bellard
                        break;
3119 b89e94af Blue Swirl
                    case 0x8: /* addx, V9 addc */
3120 70c48285 Richard Henderson
                        gen_op_addx_int(dc, cpu_dst, cpu_src1, cpu_src2,
3121 70c48285 Richard Henderson
                                        (xop & 0x10));
3122 cf495bcf bellard
                        break;
3123 ded3ab80 pbrook
#ifdef TARGET_SPARC64
3124 0f8a249a blueswir1
                    case 0x9: /* V9 mulx */
3125 41d72852 Blue Swirl
                        if (IS_IMM) {
3126 41d72852 Blue Swirl
                            simm = GET_FIELDs(insn, 19, 31);
3127 41d72852 Blue Swirl
                            tcg_gen_muli_i64(cpu_dst, cpu_src1, simm);
3128 41d72852 Blue Swirl
                        } else {
3129 41d72852 Blue Swirl
                            tcg_gen_mul_i64(cpu_dst, cpu_src1, cpu_src2);
3130 41d72852 Blue Swirl
                        }
3131 ded3ab80 pbrook
                        break;
3132 ded3ab80 pbrook
#endif
3133 b89e94af Blue Swirl
                    case 0xa: /* umul */
3134 64a88d5d blueswir1
                        CHECK_IU_FEATURE(dc, MUL);
3135 6ae20372 blueswir1
                        gen_op_umul(cpu_dst, cpu_src1, cpu_src2);
3136 8393617c Blue Swirl
                        if (xop & 0x10) {
3137 38482a77 Blue Swirl
                            tcg_gen_mov_tl(cpu_cc_dst, cpu_dst);
3138 38482a77 Blue Swirl
                            tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC);
3139 38482a77 Blue Swirl
                            dc->cc_op = CC_OP_LOGIC;
3140 8393617c Blue Swirl
                        }
3141 cf495bcf bellard
                        break;
3142 b89e94af Blue Swirl
                    case 0xb: /* smul */
3143 64a88d5d blueswir1
                        CHECK_IU_FEATURE(dc, MUL);
3144 6ae20372 blueswir1
                        gen_op_smul(cpu_dst, cpu_src1, cpu_src2);
3145 8393617c Blue Swirl
                        if (xop & 0x10) {
3146 38482a77 Blue Swirl
                            tcg_gen_mov_tl(cpu_cc_dst, cpu_dst);
3147 38482a77 Blue Swirl
                            tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC);
3148 38482a77 Blue Swirl
                            dc->cc_op = CC_OP_LOGIC;
3149 8393617c Blue Swirl
                        }
3150 cf495bcf bellard
                        break;
3151 b89e94af Blue Swirl
                    case 0xc: /* subx, V9 subc */
3152 70c48285 Richard Henderson
                        gen_op_subx_int(dc, cpu_dst, cpu_src1, cpu_src2,
3153 70c48285 Richard Henderson
                                        (xop & 0x10));
3154 cf495bcf bellard
                        break;
3155 ded3ab80 pbrook
#ifdef TARGET_SPARC64
3156 0f8a249a blueswir1
                    case 0xd: /* V9 udivx */
3157 07bf2857 blueswir1
                        tcg_gen_mov_tl(cpu_cc_src, cpu_src1);
3158 07bf2857 blueswir1
                        tcg_gen_mov_tl(cpu_cc_src2, cpu_src2);
3159 07bf2857 blueswir1
                        gen_trap_ifdivzero_tl(cpu_cc_src2);
3160 07bf2857 blueswir1
                        tcg_gen_divu_i64(cpu_dst, cpu_cc_src, cpu_cc_src2);
3161 ded3ab80 pbrook
                        break;
3162 ded3ab80 pbrook
#endif
3163 b89e94af Blue Swirl
                    case 0xe: /* udiv */
3164 64a88d5d blueswir1
                        CHECK_IU_FEATURE(dc, DIV);
3165 a7812ae4 pbrook
                        gen_helper_udiv(cpu_dst, cpu_src1, cpu_src2);
3166 8393617c Blue Swirl
                        if (xop & 0x10) {
3167 6c78ea32 Blue Swirl
                            tcg_gen_mov_tl(cpu_cc_dst, cpu_dst);
3168 6c78ea32 Blue Swirl
                            tcg_gen_movi_i32(cpu_cc_op, CC_OP_DIV);
3169 6c78ea32 Blue Swirl
                            dc->cc_op = CC_OP_DIV;
3170 8393617c Blue Swirl
                        }
3171 cf495bcf bellard
                        break;
3172 b89e94af Blue Swirl
                    case 0xf: /* sdiv */
3173 64a88d5d blueswir1
                        CHECK_IU_FEATURE(dc, DIV);
3174 a7812ae4 pbrook
                        gen_helper_sdiv(cpu_dst, cpu_src1, cpu_src2);
3175 8393617c Blue Swirl
                        if (xop & 0x10) {
3176 6c78ea32 Blue Swirl
                            tcg_gen_mov_tl(cpu_cc_dst, cpu_dst);
3177 6c78ea32 Blue Swirl
                            tcg_gen_movi_i32(cpu_cc_op, CC_OP_DIV);
3178 6c78ea32 Blue Swirl
                            dc->cc_op = CC_OP_DIV;
3179 8393617c Blue Swirl
                        }
3180 cf495bcf bellard
                        break;
3181 cf495bcf bellard
                    default:
3182 cf495bcf bellard
                        goto illegal_insn;
3183 cf495bcf bellard
                    }
3184 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
3185 cf495bcf bellard
                } else {
3186 41d72852 Blue Swirl
                    cpu_src1 = get_src1(insn, cpu_src1);
3187 41d72852 Blue Swirl
                    cpu_src2 = get_src2(insn, cpu_src2);
3188 cf495bcf bellard
                    switch (xop) {
3189 0f8a249a blueswir1
                    case 0x20: /* taddcc */
3190 6ae20372 blueswir1
                        gen_op_tadd_cc(cpu_dst, cpu_src1, cpu_src2);
3191 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3192 3b2d1e92 Blue Swirl
                        tcg_gen_movi_i32(cpu_cc_op, CC_OP_TADD);
3193 3b2d1e92 Blue Swirl
                        dc->cc_op = CC_OP_TADD;
3194 0f8a249a blueswir1
                        break;
3195 0f8a249a blueswir1
                    case 0x21: /* tsubcc */
3196 6ae20372 blueswir1
                        gen_op_tsub_cc(cpu_dst, cpu_src1, cpu_src2);
3197 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3198 3b2d1e92 Blue Swirl
                        tcg_gen_movi_i32(cpu_cc_op, CC_OP_TSUB);
3199 3b2d1e92 Blue Swirl
                        dc->cc_op = CC_OP_TSUB;
3200 0f8a249a blueswir1
                        break;
3201 0f8a249a blueswir1
                    case 0x22: /* taddcctv */
3202 6ae20372 blueswir1
                        save_state(dc, cpu_cond);
3203 6ae20372 blueswir1
                        gen_op_tadd_ccTV(cpu_dst, cpu_src1, cpu_src2);
3204 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3205 3b2d1e92 Blue Swirl
                        tcg_gen_movi_i32(cpu_cc_op, CC_OP_TADDTV);
3206 3b2d1e92 Blue Swirl
                        dc->cc_op = CC_OP_TADDTV;
3207 0f8a249a blueswir1
                        break;
3208 0f8a249a blueswir1
                    case 0x23: /* tsubcctv */
3209 6ae20372 blueswir1
                        save_state(dc, cpu_cond);
3210 6ae20372 blueswir1
                        gen_op_tsub_ccTV(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_TSUBTV);
3213 3b2d1e92 Blue Swirl
                        dc->cc_op = CC_OP_TSUBTV;
3214 0f8a249a blueswir1
                        break;
3215 cf495bcf bellard
                    case 0x24: /* mulscc */
3216 8393617c Blue Swirl
                        gen_helper_compute_psr();
3217 6ae20372 blueswir1
                        gen_op_mulscc(cpu_dst, cpu_src1, cpu_src2);
3218 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3219 d084469c Blue Swirl
                        tcg_gen_movi_i32(cpu_cc_op, CC_OP_ADD);
3220 d084469c Blue Swirl
                        dc->cc_op = CC_OP_ADD;
3221 cf495bcf bellard
                        break;
3222 83469015 bellard
#ifndef TARGET_SPARC64
3223 0f8a249a blueswir1
                    case 0x25:  /* sll */
3224 e35298cd blueswir1
                        if (IS_IMM) { /* immediate */
3225 67526b20 Blue Swirl
                            simm = GET_FIELDs(insn, 20, 31);
3226 67526b20 Blue Swirl
                            tcg_gen_shli_tl(cpu_dst, cpu_src1, simm & 0x1f);
3227 e35298cd blueswir1
                        } else { /* register */
3228 e35298cd blueswir1
                            tcg_gen_andi_tl(cpu_tmp0, cpu_src2, 0x1f);
3229 e35298cd blueswir1
                            tcg_gen_shl_tl(cpu_dst, cpu_src1, cpu_tmp0);
3230 e35298cd blueswir1
                        }
3231 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3232 cf495bcf bellard
                        break;
3233 83469015 bellard
                    case 0x26:  /* srl */
3234 e35298cd blueswir1
                        if (IS_IMM) { /* immediate */
3235 67526b20 Blue Swirl
                            simm = GET_FIELDs(insn, 20, 31);
3236 67526b20 Blue Swirl
                            tcg_gen_shri_tl(cpu_dst, cpu_src1, simm & 0x1f);
3237 e35298cd blueswir1
                        } else { /* register */
3238 e35298cd blueswir1
                            tcg_gen_andi_tl(cpu_tmp0, cpu_src2, 0x1f);
3239 e35298cd blueswir1
                            tcg_gen_shr_tl(cpu_dst, cpu_src1, cpu_tmp0);
3240 e35298cd blueswir1
                        }
3241 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3242 cf495bcf bellard
                        break;
3243 83469015 bellard
                    case 0x27:  /* sra */
3244 e35298cd blueswir1
                        if (IS_IMM) { /* immediate */
3245 67526b20 Blue Swirl
                            simm = GET_FIELDs(insn, 20, 31);
3246 67526b20 Blue Swirl
                            tcg_gen_sari_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_sar_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
#endif
3254 cf495bcf bellard
                    case 0x30:
3255 cf495bcf bellard
                        {
3256 cf495bcf bellard
                            switch(rd) {
3257 3475187d bellard
                            case 0: /* wry */
3258 5068cbd9 blueswir1
                                tcg_gen_xor_tl(cpu_tmp0, cpu_src1, cpu_src2);
3259 5068cbd9 blueswir1
                                tcg_gen_andi_tl(cpu_y, cpu_tmp0, 0xffffffff);
3260 cf495bcf bellard
                                break;
3261 65fe7b09 blueswir1
#ifndef TARGET_SPARC64
3262 65fe7b09 blueswir1
                            case 0x01 ... 0x0f: /* undefined in the
3263 65fe7b09 blueswir1
                                                   SPARCv8 manual, nop
3264 65fe7b09 blueswir1
                                                   on the microSPARC
3265 65fe7b09 blueswir1
                                                   II */
3266 65fe7b09 blueswir1
                            case 0x10 ... 0x1f: /* implementation-dependent
3267 65fe7b09 blueswir1
                                                   in the SPARCv8
3268 65fe7b09 blueswir1
                                                   manual, nop on the
3269 65fe7b09 blueswir1
                                                   microSPARC II */
3270 65fe7b09 blueswir1
                                break;
3271 65fe7b09 blueswir1
#else
3272 0f8a249a blueswir1
                            case 0x2: /* V9 wrccr */
3273 6ae20372 blueswir1
                                tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_src2);
3274 a7812ae4 pbrook
                                gen_helper_wrccr(cpu_dst);
3275 8393617c Blue Swirl
                                tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS);
3276 8393617c Blue Swirl
                                dc->cc_op = CC_OP_FLAGS;
3277 0f8a249a blueswir1
                                break;
3278 0f8a249a blueswir1
                            case 0x3: /* V9 wrasi */
3279 6ae20372 blueswir1
                                tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_src2);
3280 01b5d4e5 Igor V. Kovalenko
                                tcg_gen_andi_tl(cpu_dst, cpu_dst, 0xff);
3281 255e1fcb blueswir1
                                tcg_gen_trunc_tl_i32(cpu_asi, cpu_dst);
3282 0f8a249a blueswir1
                                break;
3283 0f8a249a blueswir1
                            case 0x6: /* V9 wrfprs */
3284 6ae20372 blueswir1
                                tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_src2);
3285 255e1fcb blueswir1
                                tcg_gen_trunc_tl_i32(cpu_fprs, cpu_dst);
3286 6ae20372 blueswir1
                                save_state(dc, cpu_cond);
3287 3299908c blueswir1
                                gen_op_next_insn();
3288 57fec1fe bellard
                                tcg_gen_exit_tb(0);
3289 3299908c blueswir1
                                dc->is_br = 1;
3290 0f8a249a blueswir1
                                break;
3291 0f8a249a blueswir1
                            case 0xf: /* V9 sir, nop if user */
3292 3475187d bellard
#if !defined(CONFIG_USER_ONLY)
3293 6ad6135d Blue Swirl
                                if (supervisor(dc)) {
3294 1a2fb1c0 blueswir1
                                    ; // XXX
3295 6ad6135d Blue Swirl
                                }
3296 3475187d bellard
#endif
3297 0f8a249a blueswir1
                                break;
3298 0f8a249a blueswir1
                            case 0x13: /* Graphics Status */
3299 6ae20372 blueswir1
                                if (gen_trap_ifnofpu(dc, cpu_cond))
3300 725cb90b bellard
                                    goto jmp_insn;
3301 255e1fcb blueswir1
                                tcg_gen_xor_tl(cpu_gsr, cpu_src1, cpu_src2);
3302 0f8a249a blueswir1
                                break;
3303 9d926598 blueswir1
                            case 0x14: /* Softint set */
3304 9d926598 blueswir1
                                if (!supervisor(dc))
3305 9d926598 blueswir1
                                    goto illegal_insn;
3306 9d926598 blueswir1
                                tcg_gen_xor_tl(cpu_tmp64, cpu_src1, cpu_src2);
3307 a7812ae4 pbrook
                                gen_helper_set_softint(cpu_tmp64);
3308 9d926598 blueswir1
                                break;
3309 9d926598 blueswir1
                            case 0x15: /* Softint clear */
3310 9d926598 blueswir1
                                if (!supervisor(dc))
3311 9d926598 blueswir1
                                    goto illegal_insn;
3312 9d926598 blueswir1
                                tcg_gen_xor_tl(cpu_tmp64, cpu_src1, cpu_src2);
3313 a7812ae4 pbrook
                                gen_helper_clear_softint(cpu_tmp64);
3314 9d926598 blueswir1
                                break;
3315 9d926598 blueswir1
                            case 0x16: /* Softint write */
3316 9d926598 blueswir1
                                if (!supervisor(dc))
3317 9d926598 blueswir1
                                    goto illegal_insn;
3318 9d926598 blueswir1
                                tcg_gen_xor_tl(cpu_tmp64, cpu_src1, cpu_src2);
3319 a7812ae4 pbrook
                                gen_helper_write_softint(cpu_tmp64);
3320 9d926598 blueswir1
                                break;
3321 0f8a249a blueswir1
                            case 0x17: /* Tick compare */
3322 83469015 bellard
#if !defined(CONFIG_USER_ONLY)
3323 0f8a249a blueswir1
                                if (!supervisor(dc))
3324 0f8a249a blueswir1
                                    goto illegal_insn;
3325 83469015 bellard
#endif
3326 ccd4a219 blueswir1
                                {
3327 a7812ae4 pbrook
                                    TCGv_ptr r_tickptr;
3328 ccd4a219 blueswir1
3329 255e1fcb blueswir1
                                    tcg_gen_xor_tl(cpu_tick_cmpr, cpu_src1,
3330 6ae20372 blueswir1
                                                   cpu_src2);
3331 a7812ae4 pbrook
                                    r_tickptr = tcg_temp_new_ptr();
3332 ccd4a219 blueswir1
                                    tcg_gen_ld_ptr(r_tickptr, cpu_env,
3333 ccd4a219 blueswir1
                                                   offsetof(CPUState, tick));
3334 a7812ae4 pbrook
                                    gen_helper_tick_set_limit(r_tickptr,
3335 a7812ae4 pbrook
                                                              cpu_tick_cmpr);
3336 a7812ae4 pbrook
                                    tcg_temp_free_ptr(r_tickptr);
3337 ccd4a219 blueswir1
                                }
3338 0f8a249a blueswir1
                                break;
3339 0f8a249a blueswir1
                            case 0x18: /* System tick */
3340 83469015 bellard
#if !defined(CONFIG_USER_ONLY)
3341 0f8a249a blueswir1
                                if (!supervisor(dc))
3342 0f8a249a blueswir1
                                    goto illegal_insn;
3343 83469015 bellard
#endif
3344 ccd4a219 blueswir1
                                {
3345 a7812ae4 pbrook
                                    TCGv_ptr r_tickptr;
3346 ccd4a219 blueswir1
3347 6ae20372 blueswir1
                                    tcg_gen_xor_tl(cpu_dst, cpu_src1,
3348 6ae20372 blueswir1
                                                   cpu_src2);
3349 a7812ae4 pbrook
                                    r_tickptr = tcg_temp_new_ptr();
3350 ccd4a219 blueswir1
                                    tcg_gen_ld_ptr(r_tickptr, cpu_env,
3351 ccd4a219 blueswir1
                                                   offsetof(CPUState, stick));
3352 a7812ae4 pbrook
                                    gen_helper_tick_set_count(r_tickptr,
3353 a7812ae4 pbrook
                                                              cpu_dst);
3354 a7812ae4 pbrook
                                    tcg_temp_free_ptr(r_tickptr);
3355 ccd4a219 blueswir1
                                }
3356 0f8a249a blueswir1
                                break;
3357 0f8a249a blueswir1
                            case 0x19: /* System tick compare */
3358 83469015 bellard
#if !defined(CONFIG_USER_ONLY)
3359 0f8a249a blueswir1
                                if (!supervisor(dc))
3360 0f8a249a blueswir1
                                    goto illegal_insn;
3361 3475187d bellard
#endif
3362 ccd4a219 blueswir1
                                {
3363 a7812ae4 pbrook
                                    TCGv_ptr r_tickptr;
3364 ccd4a219 blueswir1
3365 255e1fcb blueswir1
                                    tcg_gen_xor_tl(cpu_stick_cmpr, cpu_src1,
3366 6ae20372 blueswir1
                                                   cpu_src2);
3367 a7812ae4 pbrook
                                    r_tickptr = tcg_temp_new_ptr();
3368 ccd4a219 blueswir1
                                    tcg_gen_ld_ptr(r_tickptr, cpu_env,
3369 ccd4a219 blueswir1
                                                   offsetof(CPUState, stick));
3370 a7812ae4 pbrook
                                    gen_helper_tick_set_limit(r_tickptr,
3371 a7812ae4 pbrook
                                                              cpu_stick_cmpr);
3372 a7812ae4 pbrook
                                    tcg_temp_free_ptr(r_tickptr);
3373 ccd4a219 blueswir1
                                }
3374 0f8a249a blueswir1
                                break;
3375 83469015 bellard
3376 0f8a249a blueswir1
                            case 0x10: /* Performance Control */
3377 77f193da blueswir1
                            case 0x11: /* Performance Instrumentation
3378 77f193da blueswir1
                                          Counter */
3379 0f8a249a blueswir1
                            case 0x12: /* Dispatch Control */
3380 83469015 bellard
#endif
3381 3475187d bellard
                            default:
3382 cf495bcf bellard
                                goto illegal_insn;
3383 cf495bcf bellard
                            }
3384 cf495bcf bellard
                        }
3385 cf495bcf bellard
                        break;
3386 e8af50a3 bellard
#if !defined(CONFIG_USER_ONLY)
3387 af7bf89b bellard
                    case 0x31: /* wrpsr, V9 saved, restored */
3388 e8af50a3 bellard
                        {
3389 0f8a249a blueswir1
                            if (!supervisor(dc))
3390 0f8a249a blueswir1
                                goto priv_insn;
3391 3475187d bellard
#ifdef TARGET_SPARC64
3392 0f8a249a blueswir1
                            switch (rd) {
3393 0f8a249a blueswir1
                            case 0:
3394 a7812ae4 pbrook
                                gen_helper_saved();
3395 0f8a249a blueswir1
                                break;
3396 0f8a249a blueswir1
                            case 1:
3397 a7812ae4 pbrook
                                gen_helper_restored();
3398 0f8a249a blueswir1
                                break;
3399 e9ebed4d blueswir1
                            case 2: /* UA2005 allclean */
3400 e9ebed4d blueswir1
                            case 3: /* UA2005 otherw */
3401 e9ebed4d blueswir1
                            case 4: /* UA2005 normalw */
3402 e9ebed4d blueswir1
                            case 5: /* UA2005 invalw */
3403 e9ebed4d blueswir1
                                // XXX
3404 0f8a249a blueswir1
                            default:
3405 3475187d bellard
                                goto illegal_insn;
3406 3475187d bellard
                            }
3407 3475187d bellard
#else
3408 6ae20372 blueswir1
                            tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_src2);
3409 a7812ae4 pbrook
                            gen_helper_wrpsr(cpu_dst);
3410 8393617c Blue Swirl
                            tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS);
3411 8393617c Blue Swirl
                            dc->cc_op = CC_OP_FLAGS;
3412 6ae20372 blueswir1
                            save_state(dc, cpu_cond);
3413 9e61bde5 bellard
                            gen_op_next_insn();
3414 57fec1fe bellard
                            tcg_gen_exit_tb(0);
3415 0f8a249a blueswir1
                            dc->is_br = 1;
3416 3475187d bellard
#endif
3417 e8af50a3 bellard
                        }
3418 e8af50a3 bellard
                        break;
3419 af7bf89b bellard
                    case 0x32: /* wrwim, V9 wrpr */
3420 e8af50a3 bellard
                        {
3421 0f8a249a blueswir1
                            if (!supervisor(dc))
3422 0f8a249a blueswir1
                                goto priv_insn;
3423 ece43b8d blueswir1
                            tcg_gen_xor_tl(cpu_tmp0, cpu_src1, cpu_src2);
3424 3475187d bellard
#ifdef TARGET_SPARC64
3425 0f8a249a blueswir1
                            switch (rd) {
3426 0f8a249a blueswir1
                            case 0: // tpc
3427 375ee38b blueswir1
                                {
3428 a7812ae4 pbrook
                                    TCGv_ptr r_tsptr;
3429 375ee38b blueswir1
3430 a7812ae4 pbrook
                                    r_tsptr = tcg_temp_new_ptr();
3431 8194f35a Igor Kovalenko
                                    gen_load_trap_state_at_tl(r_tsptr, cpu_env);
3432 ece43b8d blueswir1
                                    tcg_gen_st_tl(cpu_tmp0, r_tsptr,
3433 375ee38b blueswir1
                                                  offsetof(trap_state, tpc));
3434 a7812ae4 pbrook
                                    tcg_temp_free_ptr(r_tsptr);
3435 375ee38b blueswir1
                                }
3436 0f8a249a blueswir1
                                break;
3437 0f8a249a blueswir1
                            case 1: // tnpc
3438 375ee38b blueswir1
                                {
3439 a7812ae4 pbrook
                                    TCGv_ptr r_tsptr;
3440 375ee38b blueswir1
3441 a7812ae4 pbrook
                                    r_tsptr = tcg_temp_new_ptr();
3442 8194f35a Igor Kovalenko
                                    gen_load_trap_state_at_tl(r_tsptr, cpu_env);
3443 ece43b8d blueswir1
                                    tcg_gen_st_tl(cpu_tmp0, r_tsptr,
3444 375ee38b blueswir1
                                                  offsetof(trap_state, tnpc));
3445 a7812ae4 pbrook
                                    tcg_temp_free_ptr(r_tsptr);
3446 375ee38b blueswir1
                                }
3447 0f8a249a blueswir1
                                break;
3448 0f8a249a blueswir1
                            case 2: // tstate
3449 375ee38b blueswir1
                                {
3450 a7812ae4 pbrook
                                    TCGv_ptr r_tsptr;
3451 375ee38b blueswir1
3452 a7812ae4 pbrook
                                    r_tsptr = tcg_temp_new_ptr();
3453 8194f35a Igor Kovalenko
                                    gen_load_trap_state_at_tl(r_tsptr, cpu_env);
3454 ece43b8d blueswir1
                                    tcg_gen_st_tl(cpu_tmp0, r_tsptr,
3455 77f193da blueswir1
                                                  offsetof(trap_state,
3456 77f193da blueswir1
                                                           tstate));
3457 a7812ae4 pbrook
                                    tcg_temp_free_ptr(r_tsptr);
3458 375ee38b blueswir1
                                }
3459 0f8a249a blueswir1
                                break;
3460 0f8a249a blueswir1
                            case 3: // tt
3461 375ee38b blueswir1
                                {
3462 a7812ae4 pbrook
                                    TCGv_ptr r_tsptr;
3463 375ee38b blueswir1
3464 a7812ae4 pbrook
                                    r_tsptr = tcg_temp_new_ptr();
3465 8194f35a Igor Kovalenko
                                    gen_load_trap_state_at_tl(r_tsptr, cpu_env);
3466 527067d8 blueswir1
                                    tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3467 527067d8 blueswir1
                                    tcg_gen_st_i32(cpu_tmp32, r_tsptr,
3468 375ee38b blueswir1
                                                   offsetof(trap_state, tt));
3469 a7812ae4 pbrook
                                    tcg_temp_free_ptr(r_tsptr);
3470 375ee38b blueswir1
                                }
3471 0f8a249a blueswir1
                                break;
3472 0f8a249a blueswir1
                            case 4: // tick
3473 ccd4a219 blueswir1
                                {
3474 a7812ae4 pbrook
                                    TCGv_ptr r_tickptr;
3475 ccd4a219 blueswir1
3476 a7812ae4 pbrook
                                    r_tickptr = tcg_temp_new_ptr();
3477 ccd4a219 blueswir1
                                    tcg_gen_ld_ptr(r_tickptr, cpu_env,
3478 ccd4a219 blueswir1
                                                   offsetof(CPUState, tick));
3479 a7812ae4 pbrook
                                    gen_helper_tick_set_count(r_tickptr,
3480 a7812ae4 pbrook
                                                              cpu_tmp0);
3481 a7812ae4 pbrook
                                    tcg_temp_free_ptr(r_tickptr);
3482 ccd4a219 blueswir1
                                }
3483 0f8a249a blueswir1
                                break;
3484 0f8a249a blueswir1
                            case 5: // tba
3485 255e1fcb blueswir1
                                tcg_gen_mov_tl(cpu_tbr, cpu_tmp0);
3486 0f8a249a blueswir1
                                break;
3487 0f8a249a blueswir1
                            case 6: // pstate
3488 6ae20372 blueswir1
                                save_state(dc, cpu_cond);
3489 a7812ae4 pbrook
                                gen_helper_wrpstate(cpu_tmp0);
3490 9fd1ae3a Igor V. Kovalenko
                                dc->npc = DYNAMIC_PC;
3491 0f8a249a blueswir1
                                break;
3492 0f8a249a blueswir1
                            case 7: // tl
3493 9fd1ae3a Igor V. Kovalenko
                                save_state(dc, cpu_cond);
3494 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3495 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3496 77f193da blueswir1
                                               offsetof(CPUSPARCState, tl));
3497 9fd1ae3a Igor V. Kovalenko
                                dc->npc = DYNAMIC_PC;
3498 0f8a249a blueswir1
                                break;
3499 0f8a249a blueswir1
                            case 8: // pil
3500 1fae7b70 Igor V. Kovalenko
                                gen_helper_wrpil(cpu_tmp0);
3501 0f8a249a blueswir1
                                break;
3502 0f8a249a blueswir1
                            case 9: // cwp
3503 a7812ae4 pbrook
                                gen_helper_wrcwp(cpu_tmp0);
3504 0f8a249a blueswir1
                                break;
3505 0f8a249a blueswir1
                            case 10: // cansave
3506 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3507 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3508 77f193da blueswir1
                                               offsetof(CPUSPARCState,
3509 77f193da blueswir1
                                                        cansave));
3510 0f8a249a blueswir1
                                break;
3511 0f8a249a blueswir1
                            case 11: // canrestore
3512 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3513 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3514 77f193da blueswir1
                                               offsetof(CPUSPARCState,
3515 77f193da blueswir1
                                                        canrestore));
3516 0f8a249a blueswir1
                                break;
3517 0f8a249a blueswir1
                            case 12: // cleanwin
3518 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3519 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3520 77f193da blueswir1
                                               offsetof(CPUSPARCState,
3521 77f193da blueswir1
                                                        cleanwin));
3522 0f8a249a blueswir1
                                break;
3523 0f8a249a blueswir1
                            case 13: // otherwin
3524 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3525 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3526 77f193da blueswir1
                                               offsetof(CPUSPARCState,
3527 77f193da blueswir1
                                                        otherwin));
3528 0f8a249a blueswir1
                                break;
3529 0f8a249a blueswir1
                            case 14: // wstate
3530 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3531 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3532 77f193da blueswir1
                                               offsetof(CPUSPARCState,
3533 77f193da blueswir1
                                                        wstate));
3534 0f8a249a blueswir1
                                break;
3535 e9ebed4d blueswir1
                            case 16: // UA2005 gl
3536 fb79ceb9 blueswir1
                                CHECK_IU_FEATURE(dc, GL);
3537 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3538 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3539 77f193da blueswir1
                                               offsetof(CPUSPARCState, gl));
3540 e9ebed4d blueswir1
                                break;
3541 e9ebed4d blueswir1
                            case 26: // UA2005 strand status
3542 fb79ceb9 blueswir1
                                CHECK_IU_FEATURE(dc, HYPV);
3543 e9ebed4d blueswir1
                                if (!hypervisor(dc))
3544 e9ebed4d blueswir1
                                    goto priv_insn;
3545 527067d8 blueswir1
                                tcg_gen_mov_tl(cpu_ssr, cpu_tmp0);
3546 e9ebed4d blueswir1
                                break;
3547 0f8a249a blueswir1
                            default:
3548 0f8a249a blueswir1
                                goto illegal_insn;
3549 0f8a249a blueswir1
                            }
3550 3475187d bellard
#else
3551 ece43b8d blueswir1
                            tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3552 c93e7817 blueswir1
                            if (dc->def->nwindows != 32)
3553 c93e7817 blueswir1
                                tcg_gen_andi_tl(cpu_tmp32, cpu_tmp32,
3554 c93e7817 blueswir1
                                                (1 << dc->def->nwindows) - 1);
3555 255e1fcb blueswir1
                            tcg_gen_mov_i32(cpu_wim, cpu_tmp32);
3556 3475187d bellard
#endif
3557 e8af50a3 bellard
                        }
3558 e8af50a3 bellard
                        break;
3559 e9ebed4d blueswir1
                    case 0x33: /* wrtbr, UA2005 wrhpr */
3560 e8af50a3 bellard
                        {
3561 e9ebed4d blueswir1
#ifndef TARGET_SPARC64
3562 0f8a249a blueswir1
                            if (!supervisor(dc))
3563 0f8a249a blueswir1
                                goto priv_insn;
3564 255e1fcb blueswir1
                            tcg_gen_xor_tl(cpu_tbr, cpu_src1, cpu_src2);
3565 e9ebed4d blueswir1
#else
3566 fb79ceb9 blueswir1
                            CHECK_IU_FEATURE(dc, HYPV);
3567 e9ebed4d blueswir1
                            if (!hypervisor(dc))
3568 e9ebed4d blueswir1
                                goto priv_insn;
3569 ece43b8d blueswir1
                            tcg_gen_xor_tl(cpu_tmp0, cpu_src1, cpu_src2);
3570 e9ebed4d blueswir1
                            switch (rd) {
3571 e9ebed4d blueswir1
                            case 0: // hpstate
3572 e9ebed4d blueswir1
                                // XXX gen_op_wrhpstate();
3573 6ae20372 blueswir1
                                save_state(dc, cpu_cond);
3574 e9ebed4d blueswir1
                                gen_op_next_insn();
3575 57fec1fe bellard
                                tcg_gen_exit_tb(0);
3576 e9ebed4d blueswir1
                                dc->is_br = 1;
3577 e9ebed4d blueswir1
                                break;
3578 e9ebed4d blueswir1
                            case 1: // htstate
3579 e9ebed4d blueswir1
                                // XXX gen_op_wrhtstate();
3580 e9ebed4d blueswir1
                                break;
3581 e9ebed4d blueswir1
                            case 3: // hintp
3582 255e1fcb blueswir1
                                tcg_gen_mov_tl(cpu_hintp, cpu_tmp0);
3583 e9ebed4d blueswir1
                                break;
3584 e9ebed4d blueswir1
                            case 5: // htba
3585 255e1fcb blueswir1
                                tcg_gen_mov_tl(cpu_htba, cpu_tmp0);
3586 e9ebed4d blueswir1
                                break;
3587 e9ebed4d blueswir1
                            case 31: // hstick_cmpr
3588 ccd4a219 blueswir1
                                {
3589 a7812ae4 pbrook
                                    TCGv_ptr r_tickptr;
3590 ccd4a219 blueswir1
3591 255e1fcb blueswir1
                                    tcg_gen_mov_tl(cpu_hstick_cmpr, cpu_tmp0);
3592 a7812ae4 pbrook
                                    r_tickptr = tcg_temp_new_ptr();
3593 ccd4a219 blueswir1
                                    tcg_gen_ld_ptr(r_tickptr, cpu_env,
3594 ccd4a219 blueswir1
                                                   offsetof(CPUState, hstick));
3595 a7812ae4 pbrook
                                    gen_helper_tick_set_limit(r_tickptr,
3596 a7812ae4 pbrook
                                                              cpu_hstick_cmpr);
3597 a7812ae4 pbrook
                                    tcg_temp_free_ptr(r_tickptr);
3598 ccd4a219 blueswir1
                                }
3599 e9ebed4d blueswir1
                                break;
3600 e9ebed4d blueswir1
                            case 6: // hver readonly
3601 e9ebed4d blueswir1
                            default:
3602 e9ebed4d blueswir1
                                goto illegal_insn;
3603 e9ebed4d blueswir1
                            }
3604 e9ebed4d blueswir1
#endif
3605 e8af50a3 bellard
                        }
3606 e8af50a3 bellard
                        break;
3607 e8af50a3 bellard
#endif
3608 3475187d bellard
#ifdef TARGET_SPARC64
3609 0f8a249a blueswir1
                    case 0x2c: /* V9 movcc */
3610 0f8a249a blueswir1
                        {
3611 0f8a249a blueswir1
                            int cc = GET_FIELD_SP(insn, 11, 12);
3612 0f8a249a blueswir1
                            int cond = GET_FIELD_SP(insn, 14, 17);
3613 748b9d8e blueswir1
                            TCGv r_cond;
3614 00f219bf blueswir1
                            int l1;
3615 00f219bf blueswir1
3616 a7812ae4 pbrook
                            r_cond = tcg_temp_new();
3617 0f8a249a blueswir1
                            if (insn & (1 << 18)) {
3618 0f8a249a blueswir1
                                if (cc == 0)
3619 8393617c Blue Swirl
                                    gen_cond(r_cond, 0, cond, dc);
3620 0f8a249a blueswir1
                                else if (cc == 2)
3621 8393617c Blue Swirl
                                    gen_cond(r_cond, 1, cond, dc);
3622 0f8a249a blueswir1
                                else
3623 0f8a249a blueswir1
                                    goto illegal_insn;
3624 0f8a249a blueswir1
                            } else {
3625 748b9d8e blueswir1
                                gen_fcond(r_cond, cc, cond);
3626 0f8a249a blueswir1
                            }
3627 00f219bf blueswir1
3628 00f219bf blueswir1
                            l1 = gen_new_label();
3629 00f219bf blueswir1
3630 cb63669a pbrook
                            tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond, 0, l1);
3631 00f219bf blueswir1
                            if (IS_IMM) {       /* immediate */
3632 2ea815ca blueswir1
                                TCGv r_const;
3633 2ea815ca blueswir1
3634 67526b20 Blue Swirl
                                simm = GET_FIELD_SPs(insn, 0, 10);
3635 67526b20 Blue Swirl
                                r_const = tcg_const_tl(simm);
3636 2ea815ca blueswir1
                                gen_movl_TN_reg(rd, r_const);
3637 2ea815ca blueswir1
                                tcg_temp_free(r_const);
3638 00f219bf blueswir1
                            } else {
3639 00f219bf blueswir1
                                rs2 = GET_FIELD_SP(insn, 0, 4);
3640 9c6c6662 blueswir1
                                gen_movl_reg_TN(rs2, cpu_tmp0);
3641 9c6c6662 blueswir1
                                gen_movl_TN_reg(rd, cpu_tmp0);
3642 00f219bf blueswir1
                            }
3643 00f219bf blueswir1
                            gen_set_label(l1);
3644 2ea815ca blueswir1
                            tcg_temp_free(r_cond);
3645 0f8a249a blueswir1
                            break;
3646 0f8a249a blueswir1
                        }
3647 0f8a249a blueswir1
                    case 0x2d: /* V9 sdivx */
3648 6ae20372 blueswir1
                        gen_op_sdivx(cpu_dst, cpu_src1, cpu_src2);
3649 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3650 0f8a249a blueswir1
                        break;
3651 0f8a249a blueswir1
                    case 0x2e: /* V9 popc */
3652 0f8a249a blueswir1
                        {
3653 a49d9390 blueswir1
                            cpu_src2 = get_src2(insn, cpu_src2);
3654 a7812ae4 pbrook
                            gen_helper_popc(cpu_dst, cpu_src2);
3655 6ae20372 blueswir1
                            gen_movl_TN_reg(rd, cpu_dst);
3656 0f8a249a blueswir1
                        }
3657 0f8a249a blueswir1
                    case 0x2f: /* V9 movr */
3658 0f8a249a blueswir1
                        {
3659 0f8a249a blueswir1
                            int cond = GET_FIELD_SP(insn, 10, 12);
3660 00f219bf blueswir1
                            int l1;
3661 00f219bf blueswir1
3662 9322a4bf blueswir1
                            cpu_src1 = get_src1(insn, cpu_src1);
3663 00f219bf blueswir1
3664 00f219bf blueswir1
                            l1 = gen_new_label();
3665 00f219bf blueswir1
3666 cb63669a pbrook
                            tcg_gen_brcondi_tl(gen_tcg_cond_reg[cond],
3667 cb63669a pbrook
                                              cpu_src1, 0, l1);
3668 0f8a249a blueswir1
                            if (IS_IMM) {       /* immediate */
3669 2ea815ca blueswir1
                                TCGv r_const;
3670 2ea815ca blueswir1
3671 67526b20 Blue Swirl
                                simm = GET_FIELD_SPs(insn, 0, 9);
3672 67526b20 Blue Swirl
                                r_const = tcg_const_tl(simm);
3673 2ea815ca blueswir1
                                gen_movl_TN_reg(rd, r_const);
3674 2ea815ca blueswir1
                                tcg_temp_free(r_const);
3675 00f219bf blueswir1
                            } else {
3676 0f8a249a blueswir1
                                rs2 = GET_FIELD_SP(insn, 0, 4);
3677 9c6c6662 blueswir1
                                gen_movl_reg_TN(rs2, cpu_tmp0);
3678 9c6c6662 blueswir1
                                gen_movl_TN_reg(rd, cpu_tmp0);
3679 0f8a249a blueswir1
                            }
3680 00f219bf blueswir1
                            gen_set_label(l1);
3681 0f8a249a blueswir1
                            break;
3682 0f8a249a blueswir1
                        }
3683 0f8a249a blueswir1
#endif
3684 0f8a249a blueswir1
                    default:
3685 0f8a249a blueswir1
                        goto illegal_insn;
3686 0f8a249a blueswir1
                    }
3687 0f8a249a blueswir1
                }
3688 3299908c blueswir1
            } else if (xop == 0x36) { /* UltraSparc shutdown, VIS, V8 CPop1 */
3689 3299908c blueswir1
#ifdef TARGET_SPARC64
3690 3299908c blueswir1
                int opf = GET_FIELD_SP(insn, 5, 13);
3691 3299908c blueswir1
                rs1 = GET_FIELD(insn, 13, 17);
3692 3299908c blueswir1
                rs2 = GET_FIELD(insn, 27, 31);
3693 6ae20372 blueswir1
                if (gen_trap_ifnofpu(dc, cpu_cond))
3694 e9ebed4d blueswir1
                    goto jmp_insn;
3695 3299908c blueswir1
3696 3299908c blueswir1
                switch (opf) {
3697 e9ebed4d blueswir1
                case 0x000: /* VIS I edge8cc */
3698 e9ebed4d blueswir1
                case 0x001: /* VIS II edge8n */
3699 e9ebed4d blueswir1
                case 0x002: /* VIS I edge8lcc */
3700 e9ebed4d blueswir1
                case 0x003: /* VIS II edge8ln */
3701 e9ebed4d blueswir1
                case 0x004: /* VIS I edge16cc */
3702 e9ebed4d blueswir1
                case 0x005: /* VIS II edge16n */
3703 e9ebed4d blueswir1
                case 0x006: /* VIS I edge16lcc */
3704 e9ebed4d blueswir1
                case 0x007: /* VIS II edge16ln */
3705 e9ebed4d blueswir1
                case 0x008: /* VIS I edge32cc */
3706 e9ebed4d blueswir1
                case 0x009: /* VIS II edge32n */
3707 e9ebed4d blueswir1
                case 0x00a: /* VIS I edge32lcc */
3708 e9ebed4d blueswir1
                case 0x00b: /* VIS II edge32ln */
3709 e9ebed4d blueswir1
                    // XXX
3710 e9ebed4d blueswir1
                    goto illegal_insn;
3711 e9ebed4d blueswir1
                case 0x010: /* VIS I array8 */
3712 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3713 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
3714 6ae20372 blueswir1
                    gen_movl_reg_TN(rs2, cpu_src2);
3715 a7812ae4 pbrook
                    gen_helper_array8(cpu_dst, cpu_src1, cpu_src2);
3716 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
3717 e9ebed4d blueswir1
                    break;
3718 e9ebed4d blueswir1
                case 0x012: /* VIS I array16 */
3719 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3720 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
3721 6ae20372 blueswir1
                    gen_movl_reg_TN(rs2, cpu_src2);
3722 a7812ae4 pbrook
                    gen_helper_array8(cpu_dst, cpu_src1, cpu_src2);
3723 6ae20372 blueswir1
                    tcg_gen_shli_i64(cpu_dst, cpu_dst, 1);
3724 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
3725 e9ebed4d blueswir1
                    break;
3726 e9ebed4d blueswir1
                case 0x014: /* VIS I array32 */
3727 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3728 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
3729 6ae20372 blueswir1
                    gen_movl_reg_TN(rs2, cpu_src2);
3730 a7812ae4 pbrook
                    gen_helper_array8(cpu_dst, cpu_src1, cpu_src2);
3731 6ae20372 blueswir1
                    tcg_gen_shli_i64(cpu_dst, cpu_dst, 2);
3732 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
3733 e9ebed4d blueswir1
                    break;
3734 3299908c blueswir1
                case 0x018: /* VIS I alignaddr */
3735 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3736 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
3737 6ae20372 blueswir1
                    gen_movl_reg_TN(rs2, cpu_src2);
3738 a7812ae4 pbrook
                    gen_helper_alignaddr(cpu_dst, cpu_src1, cpu_src2);
3739 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
3740 3299908c blueswir1
                    break;
3741 e9ebed4d blueswir1
                case 0x019: /* VIS II bmask */
3742 3299908c blueswir1
                case 0x01a: /* VIS I alignaddrl */
3743 3299908c blueswir1
                    // XXX
3744 e9ebed4d blueswir1
                    goto illegal_insn;
3745 e9ebed4d blueswir1
                case 0x020: /* VIS I fcmple16 */
3746 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3747 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3748 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3749 a7812ae4 pbrook
                    gen_helper_fcmple16();
3750 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3751 e9ebed4d blueswir1
                    break;
3752 e9ebed4d blueswir1
                case 0x022: /* VIS I fcmpne16 */
3753 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3754 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3755 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3756 a7812ae4 pbrook
                    gen_helper_fcmpne16();
3757 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3758 3299908c blueswir1
                    break;
3759 e9ebed4d blueswir1
                case 0x024: /* VIS I fcmple32 */
3760 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3761 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3762 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3763 a7812ae4 pbrook
                    gen_helper_fcmple32();
3764 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3765 e9ebed4d blueswir1
                    break;
3766 e9ebed4d blueswir1
                case 0x026: /* VIS I fcmpne32 */
3767 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3768 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3769 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3770 a7812ae4 pbrook
                    gen_helper_fcmpne32();
3771 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3772 e9ebed4d blueswir1
                    break;
3773 e9ebed4d blueswir1
                case 0x028: /* VIS I fcmpgt16 */
3774 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3775 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3776 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3777 a7812ae4 pbrook
                    gen_helper_fcmpgt16();
3778 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3779 e9ebed4d blueswir1
                    break;
3780 e9ebed4d blueswir1
                case 0x02a: /* VIS I fcmpeq16 */
3781 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3782 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3783 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3784 a7812ae4 pbrook
                    gen_helper_fcmpeq16();
3785 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3786 e9ebed4d blueswir1
                    break;
3787 e9ebed4d blueswir1
                case 0x02c: /* VIS I fcmpgt32 */
3788 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3789 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3790 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3791 a7812ae4 pbrook
                    gen_helper_fcmpgt32();
3792 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3793 e9ebed4d blueswir1
                    break;
3794 e9ebed4d blueswir1
                case 0x02e: /* VIS I fcmpeq32 */
3795 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3796 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3797 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3798 a7812ae4 pbrook
                    gen_helper_fcmpeq32();
3799 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3800 e9ebed4d blueswir1
                    break;
3801 e9ebed4d blueswir1
                case 0x031: /* VIS I fmul8x16 */
3802 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3803 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3804 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3805 a7812ae4 pbrook
                    gen_helper_fmul8x16();
3806 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3807 e9ebed4d blueswir1
                    break;
3808 e9ebed4d blueswir1
                case 0x033: /* VIS I fmul8x16au */
3809 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3810 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3811 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3812 a7812ae4 pbrook
                    gen_helper_fmul8x16au();
3813 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3814 e9ebed4d blueswir1
                    break;
3815 e9ebed4d blueswir1
                case 0x035: /* VIS I fmul8x16al */
3816 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3817 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3818 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3819 a7812ae4 pbrook
                    gen_helper_fmul8x16al();
3820 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3821 e9ebed4d blueswir1
                    break;
3822 e9ebed4d blueswir1
                case 0x036: /* VIS I fmul8sux16 */
3823 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3824 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3825 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3826 a7812ae4 pbrook
                    gen_helper_fmul8sux16();
3827 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3828 e9ebed4d blueswir1
                    break;
3829 e9ebed4d blueswir1
                case 0x037: /* VIS I fmul8ulx16 */
3830 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3831 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3832 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3833 a7812ae4 pbrook
                    gen_helper_fmul8ulx16();
3834 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3835 e9ebed4d blueswir1
                    break;
3836 e9ebed4d blueswir1
                case 0x038: /* VIS I fmuld8sux16 */
3837 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3838 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3839 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3840 a7812ae4 pbrook
                    gen_helper_fmuld8sux16();
3841 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3842 e9ebed4d blueswir1
                    break;
3843 e9ebed4d blueswir1
                case 0x039: /* VIS I fmuld8ulx16 */
3844 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3845 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3846 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3847 a7812ae4 pbrook
                    gen_helper_fmuld8ulx16();
3848 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3849 e9ebed4d blueswir1
                    break;
3850 e9ebed4d blueswir1
                case 0x03a: /* VIS I fpack32 */
3851 e9ebed4d blueswir1
                case 0x03b: /* VIS I fpack16 */
3852 e9ebed4d blueswir1
                case 0x03d: /* VIS I fpackfix */
3853 e9ebed4d blueswir1
                case 0x03e: /* VIS I pdist */
3854 e9ebed4d blueswir1
                    // XXX
3855 e9ebed4d blueswir1
                    goto illegal_insn;
3856 3299908c blueswir1
                case 0x048: /* VIS I faligndata */
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_faligndata();
3861 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3862 3299908c blueswir1
                    break;
3863 e9ebed4d blueswir1
                case 0x04b: /* VIS I fpmerge */
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_fpmerge();
3868 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3869 e9ebed4d blueswir1
                    break;
3870 e9ebed4d blueswir1
                case 0x04c: /* VIS II bshuffle */
3871 e9ebed4d blueswir1
                    // XXX
3872 e9ebed4d blueswir1
                    goto illegal_insn;
3873 e9ebed4d blueswir1
                case 0x04d: /* VIS I fexpand */
3874 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3875 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3876 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3877 a7812ae4 pbrook
                    gen_helper_fexpand();
3878 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3879 e9ebed4d blueswir1
                    break;
3880 e9ebed4d blueswir1
                case 0x050: /* VIS I fpadd16 */
3881 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3882 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3883 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3884 a7812ae4 pbrook
                    gen_helper_fpadd16();
3885 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3886 e9ebed4d blueswir1
                    break;
3887 e9ebed4d blueswir1
                case 0x051: /* VIS I fpadd16s */
3888 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3889 a7812ae4 pbrook
                    gen_helper_fpadd16s(cpu_fpr[rd],
3890 a7812ae4 pbrook
                                        cpu_fpr[rs1], cpu_fpr[rs2]);
3891 e9ebed4d blueswir1
                    break;
3892 e9ebed4d blueswir1
                case 0x052: /* VIS I fpadd32 */
3893 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3894 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3895 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3896 a7812ae4 pbrook
                    gen_helper_fpadd32();
3897 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3898 e9ebed4d blueswir1
                    break;
3899 e9ebed4d blueswir1
                case 0x053: /* VIS I fpadd32s */
3900 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3901 a7812ae4 pbrook
                    gen_helper_fpadd32s(cpu_fpr[rd],
3902 a7812ae4 pbrook
                                        cpu_fpr[rs1], cpu_fpr[rs2]);
3903 e9ebed4d blueswir1
                    break;
3904 e9ebed4d blueswir1
                case 0x054: /* VIS I fpsub16 */
3905 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3906 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3907 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3908 a7812ae4 pbrook
                    gen_helper_fpsub16();
3909 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3910 e9ebed4d blueswir1
                    break;
3911 e9ebed4d blueswir1
                case 0x055: /* VIS I fpsub16s */
3912 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3913 a7812ae4 pbrook
                    gen_helper_fpsub16s(cpu_fpr[rd],
3914 a7812ae4 pbrook
                                        cpu_fpr[rs1], cpu_fpr[rs2]);
3915 e9ebed4d blueswir1
                    break;
3916 e9ebed4d blueswir1
                case 0x056: /* VIS I fpsub32 */
3917 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3918 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3919 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3920 a7812ae4 pbrook
                    gen_helper_fpsub32();
3921 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3922 e9ebed4d blueswir1
                    break;
3923 e9ebed4d blueswir1
                case 0x057: /* VIS I fpsub32s */
3924 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3925 a7812ae4 pbrook
                    gen_helper_fpsub32s(cpu_fpr[rd],
3926 a7812ae4 pbrook
                                        cpu_fpr[rs1], cpu_fpr[rs2]);
3927 e9ebed4d blueswir1
                    break;
3928 3299908c blueswir1
                case 0x060: /* VIS I fzero */
3929 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3930 1d01299d blueswir1
                    tcg_gen_movi_i32(cpu_fpr[DFPREG(rd)], 0);
3931 1d01299d blueswir1
                    tcg_gen_movi_i32(cpu_fpr[DFPREG(rd) + 1], 0);
3932 3299908c blueswir1
                    break;
3933 3299908c blueswir1
                case 0x061: /* VIS I fzeros */
3934 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3935 1d01299d blueswir1
                    tcg_gen_movi_i32(cpu_fpr[rd], 0);
3936 3299908c blueswir1
                    break;
3937 e9ebed4d blueswir1
                case 0x062: /* VIS I fnor */
3938 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3939 81b5b816 blueswir1
                    tcg_gen_nor_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1)],
3940 81b5b816 blueswir1
                                    cpu_fpr[DFPREG(rs2)]);
3941 81b5b816 blueswir1
                    tcg_gen_nor_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1) + 1],
3942 81b5b816 blueswir1
                                    cpu_fpr[DFPREG(rs2) + 1]);
3943 e9ebed4d blueswir1
                    break;
3944 e9ebed4d blueswir1
                case 0x063: /* VIS I fnors */
3945 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3946 81b5b816 blueswir1
                    tcg_gen_nor_i32(cpu_tmp32, cpu_fpr[rs1], cpu_fpr[rs2]);
3947 e9ebed4d blueswir1
                    break;
3948 e9ebed4d blueswir1
                case 0x064: /* VIS I fandnot2 */
3949 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3950 81b5b816 blueswir1
                    tcg_gen_andc_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs1)],
3951 81b5b816 blueswir1
                                     cpu_fpr[DFPREG(rs2)]);
3952 81b5b816 blueswir1
                    tcg_gen_andc_i32(cpu_fpr[DFPREG(rd) + 1],
3953 81b5b816 blueswir1
                                     cpu_fpr[DFPREG(rs1) + 1],
3954 81b5b816 blueswir1
                                     cpu_fpr[DFPREG(rs2) + 1]);
3955 e9ebed4d blueswir1
                    break;
3956 e9ebed4d blueswir1
                case 0x065: /* VIS I fandnot2s */
3957 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3958 81b5b816 blueswir1
                    tcg_gen_andc_i32(cpu_fpr[rd], cpu_fpr[rs1], cpu_fpr[rs2]);
3959 e9ebed4d blueswir1
                    break;
3960 e9ebed4d blueswir1
                case 0x066: /* VIS I fnot2 */
3961 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3962 2576d836 blueswir1
                    tcg_gen_not_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs2)]);
3963 2576d836 blueswir1
                    tcg_gen_not_i32(cpu_fpr[DFPREG(rd) + 1],
3964 2576d836 blueswir1
                                    cpu_fpr[DFPREG(rs2) + 1]);
3965 e9ebed4d blueswir1
                    break;
3966 e9ebed4d blueswir1
                case 0x067: /* VIS I fnot2s */
3967 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3968 2576d836 blueswir1
                    tcg_gen_not_i32(cpu_fpr[rd], cpu_fpr[rs2]);
3969 e9ebed4d blueswir1
                    break;
3970 e9ebed4d blueswir1
                case 0x068: /* VIS I fandnot1 */
3971 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3972 81b5b816 blueswir1
                    tcg_gen_andc_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs2)],
3973 81b5b816 blueswir1
                                     cpu_fpr[DFPREG(rs1)]);
3974 81b5b816 blueswir1
                    tcg_gen_andc_i32(cpu_fpr[DFPREG(rd) + 1],
3975 81b5b816 blueswir1
                                     cpu_fpr[DFPREG(rs2) + 1],
3976 81b5b816 blueswir1
                                     cpu_fpr[DFPREG(rs1) + 1]);
3977 e9ebed4d blueswir1
                    break;
3978 e9ebed4d blueswir1
                case 0x069: /* VIS I fandnot1s */
3979 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3980 81b5b816 blueswir1
                    tcg_gen_andc_i32(cpu_fpr[rd], cpu_fpr[rs2], cpu_fpr[rs1]);
3981 e9ebed4d blueswir1
                    break;
3982 e9ebed4d blueswir1
                case 0x06a: /* VIS I fnot1 */
3983 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3984 2576d836 blueswir1
                    tcg_gen_not_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs1)]);
3985 2576d836 blueswir1
                    tcg_gen_not_i32(cpu_fpr[DFPREG(rd) + 1],
3986 2576d836 blueswir1
                                    cpu_fpr[DFPREG(rs1) + 1]);
3987 e9ebed4d blueswir1
                    break;
3988 e9ebed4d blueswir1
                case 0x06b: /* VIS I fnot1s */
3989 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3990 2576d836 blueswir1
                    tcg_gen_not_i32(cpu_fpr[rd], cpu_fpr[rs1]);
3991 e9ebed4d blueswir1
                    break;
3992 e9ebed4d blueswir1
                case 0x06c: /* VIS I fxor */
3993 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3994 e2ea21b3 blueswir1
                    tcg_gen_xor_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs1)],
3995 e2ea21b3 blueswir1
                                    cpu_fpr[DFPREG(rs2)]);
3996 e2ea21b3 blueswir1
                    tcg_gen_xor_i32(cpu_fpr[DFPREG(rd) + 1],
3997 e2ea21b3 blueswir1
                                    cpu_fpr[DFPREG(rs1) + 1],
3998 e2ea21b3 blueswir1
                                    cpu_fpr[DFPREG(rs2) + 1]);
3999 e9ebed4d blueswir1
                    break;
4000 e9ebed4d blueswir1
                case 0x06d: /* VIS I fxors */
4001 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4002 1d01299d blueswir1
                    tcg_gen_xor_i32(cpu_fpr[rd], cpu_fpr[rs1], cpu_fpr[rs2]);
4003 e9ebed4d blueswir1
                    break;
4004 e9ebed4d blueswir1
                case 0x06e: /* VIS I fnand */
4005 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4006 81b5b816 blueswir1
                    tcg_gen_nand_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1)],
4007 81b5b816 blueswir1
                                     cpu_fpr[DFPREG(rs2)]);
4008 81b5b816 blueswir1
                    tcg_gen_nand_i32(cpu_tmp32, cpu_fpr[DFPREG(rs1) + 1],
4009 81b5b816 blueswir1
                                     cpu_fpr[DFPREG(rs2) + 1]);
4010 e9ebed4d blueswir1
                    break;
4011 e9ebed4d blueswir1
                case 0x06f: /* VIS I fnands */
4012 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4013 81b5b816 blueswir1
                    tcg_gen_nand_i32(cpu_tmp32, cpu_fpr[rs1], cpu_fpr[rs2]);
4014 e9ebed4d blueswir1
                    break;
4015 e9ebed4d blueswir1
                case 0x070: /* VIS I fand */
4016 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4017 e2ea21b3 blueswir1
                    tcg_gen_and_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs1)],
4018 e2ea21b3 blueswir1
                                    cpu_fpr[DFPREG(rs2)]);
4019 e2ea21b3 blueswir1
                    tcg_gen_and_i32(cpu_fpr[DFPREG(rd) + 1],
4020 e2ea21b3 blueswir1
                                    cpu_fpr[DFPREG(rs1) + 1],
4021 e2ea21b3 blueswir1
                                    cpu_fpr[DFPREG(rs2) + 1]);
4022 e9ebed4d blueswir1
                    break;
4023 e9ebed4d blueswir1
                case 0x071: /* VIS I fands */
4024 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4025 1d01299d blueswir1
                    tcg_gen_and_i32(cpu_fpr[rd], cpu_fpr[rs1], cpu_fpr[rs2]);
4026 e9ebed4d blueswir1
                    break;
4027 e9ebed4d blueswir1
                case 0x072: /* VIS I fxnor */
4028 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4029 e2ea21b3 blueswir1
                    tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[DFPREG(rs2)], -1);
4030 e2ea21b3 blueswir1
                    tcg_gen_xor_i32(cpu_fpr[DFPREG(rd)], cpu_tmp32,
4031 e2ea21b3 blueswir1
                                    cpu_fpr[DFPREG(rs1)]);
4032 e2ea21b3 blueswir1
                    tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[DFPREG(rs2) + 1], -1);
4033 e2ea21b3 blueswir1
                    tcg_gen_xor_i32(cpu_fpr[DFPREG(rd) + 1], cpu_tmp32,
4034 e2ea21b3 blueswir1
                                    cpu_fpr[DFPREG(rs1) + 1]);
4035 e9ebed4d blueswir1
                    break;
4036 e9ebed4d blueswir1
                case 0x073: /* VIS I fxnors */
4037 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4038 1d01299d blueswir1
                    tcg_gen_xori_i32(cpu_tmp32, cpu_fpr[rs2], -1);
4039 1d01299d blueswir1
                    tcg_gen_xor_i32(cpu_fpr[rd], cpu_tmp32, cpu_fpr[rs1]);
4040 e9ebed4d blueswir1
                    break;
4041 3299908c blueswir1
                case 0x074: /* VIS I fsrc1 */
4042 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4043 1d01299d blueswir1
                    tcg_gen_mov_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs1)]);
4044 1d01299d blueswir1
                    tcg_gen_mov_i32(cpu_fpr[DFPREG(rd) + 1],
4045 1d01299d blueswir1
                                    cpu_fpr[DFPREG(rs1) + 1]);
4046 3299908c blueswir1
                    break;
4047 3299908c blueswir1
                case 0x075: /* VIS I fsrc1s */
4048 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4049 1d01299d blueswir1
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_fpr[rs1]);
4050 3299908c blueswir1
                    break;
4051 e9ebed4d blueswir1
                case 0x076: /* VIS I fornot2 */
4052 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4053 81b5b816 blueswir1
                    tcg_gen_orc_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs1)],
4054 81b5b816 blueswir1
                                    cpu_fpr[DFPREG(rs2)]);
4055 81b5b816 blueswir1
                    tcg_gen_orc_i32(cpu_fpr[DFPREG(rd) + 1],
4056 81b5b816 blueswir1
                                    cpu_fpr[DFPREG(rs1) + 1],
4057 81b5b816 blueswir1
                                    cpu_fpr[DFPREG(rs2) + 1]);
4058 e9ebed4d blueswir1
                    break;
4059 e9ebed4d blueswir1
                case 0x077: /* VIS I fornot2s */
4060 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4061 81b5b816 blueswir1
                    tcg_gen_orc_i32(cpu_fpr[rd], cpu_fpr[rs1], cpu_fpr[rs2]);
4062 e9ebed4d blueswir1
                    break;
4063 3299908c blueswir1
                case 0x078: /* VIS I fsrc2 */
4064 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4065 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs2));
4066 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
4067 3299908c blueswir1
                    break;
4068 3299908c blueswir1
                case 0x079: /* VIS I fsrc2s */
4069 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4070 1d01299d blueswir1
                    tcg_gen_mov_i32(cpu_fpr[rd], cpu_fpr[rs2]);
4071 3299908c blueswir1
                    break;
4072 e9ebed4d blueswir1
                case 0x07a: /* VIS I fornot1 */
4073 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4074 81b5b816 blueswir1
                    tcg_gen_orc_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs2)],
4075 81b5b816 blueswir1
                                    cpu_fpr[DFPREG(rs1)]);
4076 81b5b816 blueswir1
                    tcg_gen_orc_i32(cpu_fpr[DFPREG(rd) + 1],
4077 81b5b816 blueswir1
                                    cpu_fpr[DFPREG(rs2) + 1],
4078 81b5b816 blueswir1
                                    cpu_fpr[DFPREG(rs1) + 1]);
4079 e9ebed4d blueswir1
                    break;
4080 e9ebed4d blueswir1
                case 0x07b: /* VIS I fornot1s */
4081 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4082 81b5b816 blueswir1
                    tcg_gen_orc_i32(cpu_fpr[rd], cpu_fpr[rs2], cpu_fpr[rs1]);
4083 e9ebed4d blueswir1
                    break;
4084 e9ebed4d blueswir1
                case 0x07c: /* VIS I for */
4085 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4086 e2ea21b3 blueswir1
                    tcg_gen_or_i32(cpu_fpr[DFPREG(rd)], cpu_fpr[DFPREG(rs1)],
4087 e2ea21b3 blueswir1
                                   cpu_fpr[DFPREG(rs2)]);
4088 e2ea21b3 blueswir1
                    tcg_gen_or_i32(cpu_fpr[DFPREG(rd) + 1],
4089 e2ea21b3 blueswir1
                                   cpu_fpr[DFPREG(rs1) + 1],
4090 e2ea21b3 blueswir1
                                   cpu_fpr[DFPREG(rs2) + 1]);
4091 e9ebed4d blueswir1
                    break;
4092 e9ebed4d blueswir1
                case 0x07d: /* VIS I fors */
4093 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4094 1d01299d blueswir1
                    tcg_gen_or_i32(cpu_fpr[rd], cpu_fpr[rs1], cpu_fpr[rs2]);
4095 e9ebed4d blueswir1
                    break;
4096 3299908c blueswir1
                case 0x07e: /* VIS I fone */
4097 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4098 1d01299d blueswir1
                    tcg_gen_movi_i32(cpu_fpr[DFPREG(rd)], -1);
4099 1d01299d blueswir1
                    tcg_gen_movi_i32(cpu_fpr[DFPREG(rd) + 1], -1);
4100 3299908c blueswir1
                    break;
4101 3299908c blueswir1
                case 0x07f: /* VIS I fones */
4102 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4103 1d01299d blueswir1
                    tcg_gen_movi_i32(cpu_fpr[rd], -1);
4104 3299908c blueswir1
                    break;
4105 e9ebed4d blueswir1
                case 0x080: /* VIS I shutdown */
4106 e9ebed4d blueswir1
                case 0x081: /* VIS II siam */
4107 e9ebed4d blueswir1
                    // XXX
4108 e9ebed4d blueswir1
                    goto illegal_insn;
4109 3299908c blueswir1
                default:
4110 3299908c blueswir1
                    goto illegal_insn;
4111 3299908c blueswir1
                }
4112 3299908c blueswir1
#else
4113 0f8a249a blueswir1
                goto ncp_insn;
4114 3299908c blueswir1
#endif
4115 3299908c blueswir1
            } else if (xop == 0x37) { /* V8 CPop2, V9 impdep2 */
4116 fcc72045 blueswir1
#ifdef TARGET_SPARC64
4117 0f8a249a blueswir1
                goto illegal_insn;
4118 fcc72045 blueswir1
#else
4119 0f8a249a blueswir1
                goto ncp_insn;
4120 fcc72045 blueswir1
#endif
4121 3475187d bellard
#ifdef TARGET_SPARC64
4122 0f8a249a blueswir1
            } else if (xop == 0x39) { /* V9 return */
4123 a7812ae4 pbrook
                TCGv_i32 r_const;
4124 2ea815ca blueswir1
4125 6ae20372 blueswir1
                save_state(dc, cpu_cond);
4126 9322a4bf blueswir1
                cpu_src1 = get_src1(insn, cpu_src1);
4127 0f8a249a blueswir1
                if (IS_IMM) {   /* immediate */
4128 67526b20 Blue Swirl
                    simm = GET_FIELDs(insn, 19, 31);
4129 67526b20 Blue Swirl
                    tcg_gen_addi_tl(cpu_dst, cpu_src1, simm);
4130 0f8a249a blueswir1
                } else {                /* register */
4131 3475187d bellard
                    rs2 = GET_FIELD(insn, 27, 31);
4132 0f8a249a blueswir1
                    if (rs2) {
4133 6ae20372 blueswir1
                        gen_movl_reg_TN(rs2, cpu_src2);
4134 6ae20372 blueswir1
                        tcg_gen_add_tl(cpu_dst, cpu_src1, cpu_src2);
4135 6f551262 blueswir1
                    } else
4136 6f551262 blueswir1
                        tcg_gen_mov_tl(cpu_dst, cpu_src1);
4137 3475187d bellard
                }
4138 a7812ae4 pbrook
                gen_helper_restore();
4139 6ae20372 blueswir1
                gen_mov_pc_npc(dc, cpu_cond);
4140 2ea815ca blueswir1
                r_const = tcg_const_i32(3);
4141 a7812ae4 pbrook
                gen_helper_check_align(cpu_dst, r_const);
4142 a7812ae4 pbrook
                tcg_temp_free_i32(r_const);
4143 6ae20372 blueswir1
                tcg_gen_mov_tl(cpu_npc, cpu_dst);
4144 0f8a249a blueswir1
                dc->npc = DYNAMIC_PC;
4145 0f8a249a blueswir1
                goto jmp_insn;
4146 3475187d bellard
#endif
4147 0f8a249a blueswir1
            } else {
4148 9322a4bf blueswir1
                cpu_src1 = get_src1(insn, cpu_src1);
4149 0f8a249a blueswir1
                if (IS_IMM) {   /* immediate */
4150 67526b20 Blue Swirl
                    simm = GET_FIELDs(insn, 19, 31);
4151 67526b20 Blue Swirl
                    tcg_gen_addi_tl(cpu_dst, cpu_src1, simm);
4152 0f8a249a blueswir1
                } else {                /* register */
4153 e80cfcfc bellard
                    rs2 = GET_FIELD(insn, 27, 31);
4154 0f8a249a blueswir1
                    if (rs2) {
4155 6ae20372 blueswir1
                        gen_movl_reg_TN(rs2, cpu_src2);
4156 6ae20372 blueswir1
                        tcg_gen_add_tl(cpu_dst, cpu_src1, cpu_src2);
4157 6f551262 blueswir1
                    } else
4158 6f551262 blueswir1
                        tcg_gen_mov_tl(cpu_dst, cpu_src1);
4159 cf495bcf bellard
                }
4160 0f8a249a blueswir1
                switch (xop) {
4161 0f8a249a blueswir1
                case 0x38:      /* jmpl */
4162 0f8a249a blueswir1
                    {
4163 a7812ae4 pbrook
                        TCGv r_pc;
4164 a7812ae4 pbrook
                        TCGv_i32 r_const;
4165 2ea815ca blueswir1
4166 a7812ae4 pbrook
                        r_pc = tcg_const_tl(dc->pc);
4167 a7812ae4 pbrook
                        gen_movl_TN_reg(rd, r_pc);
4168 a7812ae4 pbrook
                        tcg_temp_free(r_pc);
4169 6ae20372 blueswir1
                        gen_mov_pc_npc(dc, cpu_cond);
4170 2ea815ca blueswir1
                        r_const = tcg_const_i32(3);
4171 a7812ae4 pbrook
                        gen_helper_check_align(cpu_dst, r_const);
4172 a7812ae4 pbrook
                        tcg_temp_free_i32(r_const);
4173 6ae20372 blueswir1
                        tcg_gen_mov_tl(cpu_npc, cpu_dst);
4174 0f8a249a blueswir1
                        dc->npc = DYNAMIC_PC;
4175 0f8a249a blueswir1
                    }
4176 0f8a249a blueswir1
                    goto jmp_insn;
4177 3475187d bellard
#if !defined(CONFIG_USER_ONLY) && !defined(TARGET_SPARC64)
4178 0f8a249a blueswir1
                case 0x39:      /* rett, V9 return */
4179 0f8a249a blueswir1
                    {
4180 a7812ae4 pbrook
                        TCGv_i32 r_const;
4181 2ea815ca blueswir1
4182 0f8a249a blueswir1
                        if (!supervisor(dc))
4183 0f8a249a blueswir1
                            goto priv_insn;
4184 6ae20372 blueswir1
                        gen_mov_pc_npc(dc, cpu_cond);
4185 2ea815ca blueswir1
                        r_const = tcg_const_i32(3);
4186 a7812ae4 pbrook
                        gen_helper_check_align(cpu_dst, r_const);
4187 a7812ae4 pbrook
                        tcg_temp_free_i32(r_const);
4188 6ae20372 blueswir1
                        tcg_gen_mov_tl(cpu_npc, cpu_dst);
4189 0f8a249a blueswir1
                        dc->npc = DYNAMIC_PC;
4190 a7812ae4 pbrook
                        gen_helper_rett();
4191 0f8a249a blueswir1
                    }
4192 0f8a249a blueswir1
                    goto jmp_insn;
4193 0f8a249a blueswir1
#endif
4194 0f8a249a blueswir1
                case 0x3b: /* flush */
4195 5578ceab blueswir1
                    if (!((dc)->def->features & CPU_FEATURE_FLUSH))
4196 64a88d5d blueswir1
                        goto unimp_flush;
4197 a7812ae4 pbrook
                    gen_helper_flush(cpu_dst);
4198 0f8a249a blueswir1
                    break;
4199 0f8a249a blueswir1
                case 0x3c:      /* save */
4200 6ae20372 blueswir1
                    save_state(dc, cpu_cond);
4201 a7812ae4 pbrook
                    gen_helper_save();
4202 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
4203 0f8a249a blueswir1
                    break;
4204 0f8a249a blueswir1
                case 0x3d:      /* restore */
4205 6ae20372 blueswir1
                    save_state(dc, cpu_cond);
4206 a7812ae4 pbrook
                    gen_helper_restore();
4207 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
4208 0f8a249a blueswir1
                    break;
4209 3475187d bellard
#if !defined(CONFIG_USER_ONLY) && defined(TARGET_SPARC64)
4210 0f8a249a blueswir1
                case 0x3e:      /* V9 done/retry */
4211 0f8a249a blueswir1
                    {
4212 0f8a249a blueswir1
                        switch (rd) {
4213 0f8a249a blueswir1
                        case 0:
4214 0f8a249a blueswir1
                            if (!supervisor(dc))
4215 0f8a249a blueswir1
                                goto priv_insn;
4216 0f8a249a blueswir1
                            dc->npc = DYNAMIC_PC;
4217 0f8a249a blueswir1
                            dc->pc = DYNAMIC_PC;
4218 a7812ae4 pbrook
                            gen_helper_done();
4219 0f8a249a blueswir1
                            goto jmp_insn;
4220 0f8a249a blueswir1
                        case 1:
4221 0f8a249a blueswir1
                            if (!supervisor(dc))
4222 0f8a249a blueswir1
                                goto priv_insn;
4223 0f8a249a blueswir1
                            dc->npc = DYNAMIC_PC;
4224 0f8a249a blueswir1
                            dc->pc = DYNAMIC_PC;
4225 a7812ae4 pbrook
                            gen_helper_retry();
4226 0f8a249a blueswir1
                            goto jmp_insn;
4227 0f8a249a blueswir1
                        default:
4228 0f8a249a blueswir1
                            goto illegal_insn;
4229 0f8a249a blueswir1
                        }
4230 0f8a249a blueswir1
                    }
4231 0f8a249a blueswir1
                    break;
4232 0f8a249a blueswir1
#endif
4233 0f8a249a blueswir1
                default:
4234 0f8a249a blueswir1
                    goto illegal_insn;
4235 0f8a249a blueswir1
                }
4236 cf495bcf bellard
            }
4237 0f8a249a blueswir1
            break;
4238 0f8a249a blueswir1
        }
4239 0f8a249a blueswir1
        break;
4240 0f8a249a blueswir1
    case 3:                     /* load/store instructions */
4241 0f8a249a blueswir1
        {
4242 0f8a249a blueswir1
            unsigned int xop = GET_FIELD(insn, 7, 12);
4243 9322a4bf blueswir1
4244 cfa90513 Blue Swirl
            /* flush pending conditional evaluations before exposing
4245 cfa90513 Blue Swirl
               cpu state */
4246 cfa90513 Blue Swirl
            if (dc->cc_op != CC_OP_FLAGS) {
4247 cfa90513 Blue Swirl
                dc->cc_op = CC_OP_FLAGS;
4248 cfa90513 Blue Swirl
                gen_helper_compute_psr();
4249 cfa90513 Blue Swirl
            }
4250 9322a4bf blueswir1
            cpu_src1 = get_src1(insn, cpu_src1);
4251 71817e48 blueswir1
            if (xop == 0x3c || xop == 0x3e) { // V9 casa/casxa
4252 81ad8ba2 blueswir1
                rs2 = GET_FIELD(insn, 27, 31);
4253 6ae20372 blueswir1
                gen_movl_reg_TN(rs2, cpu_src2);
4254 71817e48 blueswir1
                tcg_gen_mov_tl(cpu_addr, cpu_src1);
4255 71817e48 blueswir1
            } else if (IS_IMM) {     /* immediate */
4256 67526b20 Blue Swirl
                simm = GET_FIELDs(insn, 19, 31);
4257 67526b20 Blue Swirl
                tcg_gen_addi_tl(cpu_addr, cpu_src1, simm);
4258 0f8a249a blueswir1
            } else {            /* register */
4259 0f8a249a blueswir1
                rs2 = GET_FIELD(insn, 27, 31);
4260 0f8a249a blueswir1
                if (rs2 != 0) {
4261 6ae20372 blueswir1
                    gen_movl_reg_TN(rs2, cpu_src2);
4262 6ae20372 blueswir1
                    tcg_gen_add_tl(cpu_addr, cpu_src1, cpu_src2);
4263 6f551262 blueswir1
                } else
4264 6f551262 blueswir1
                    tcg_gen_mov_tl(cpu_addr, cpu_src1);
4265 0f8a249a blueswir1
            }
4266 2f2ecb83 blueswir1
            if (xop < 4 || (xop > 7 && xop < 0x14 && xop != 0x0e) ||
4267 2f2ecb83 blueswir1
                (xop > 0x17 && xop <= 0x1d ) ||
4268 2f2ecb83 blueswir1
                (xop > 0x2c && xop <= 0x33) || xop == 0x1f || xop == 0x3d) {
4269 0f8a249a blueswir1
                switch (xop) {
4270 b89e94af Blue Swirl
                case 0x0:       /* ld, V9 lduw, load unsigned word */
4271 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4272 6ae20372 blueswir1
                    tcg_gen_qemu_ld32u(cpu_val, cpu_addr, dc->mem_idx);
4273 0f8a249a blueswir1
                    break;
4274 b89e94af Blue Swirl
                case 0x1:       /* ldub, load unsigned byte */
4275 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4276 6ae20372 blueswir1
                    tcg_gen_qemu_ld8u(cpu_val, cpu_addr, dc->mem_idx);
4277 0f8a249a blueswir1
                    break;
4278 b89e94af Blue Swirl
                case 0x2:       /* lduh, load unsigned halfword */
4279 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4280 6ae20372 blueswir1
                    tcg_gen_qemu_ld16u(cpu_val, cpu_addr, dc->mem_idx);
4281 0f8a249a blueswir1
                    break;
4282 b89e94af Blue Swirl
                case 0x3:       /* ldd, load double word */
4283 0f8a249a blueswir1
                    if (rd & 1)
4284 d4218d99 blueswir1
                        goto illegal_insn;
4285 1a2fb1c0 blueswir1
                    else {
4286 a7812ae4 pbrook
                        TCGv_i32 r_const;
4287 2ea815ca blueswir1
4288 c2bc0e38 blueswir1
                        save_state(dc, cpu_cond);
4289 2ea815ca blueswir1
                        r_const = tcg_const_i32(7);
4290 a7812ae4 pbrook
                        gen_helper_check_align(cpu_addr, r_const); // XXX remove
4291 a7812ae4 pbrook
                        tcg_temp_free_i32(r_const);
4292 2cade6a3 blueswir1
                        gen_address_mask(dc, cpu_addr);
4293 6ae20372 blueswir1
                        tcg_gen_qemu_ld64(cpu_tmp64, cpu_addr, dc->mem_idx);
4294 32b6c812 blueswir1
                        tcg_gen_trunc_i64_tl(cpu_tmp0, cpu_tmp64);
4295 32b6c812 blueswir1
                        tcg_gen_andi_tl(cpu_tmp0, cpu_tmp0, 0xffffffffULL);
4296 32b6c812 blueswir1
                        gen_movl_TN_reg(rd + 1, cpu_tmp0);
4297 8911f501 blueswir1
                        tcg_gen_shri_i64(cpu_tmp64, cpu_tmp64, 32);
4298 6ae20372 blueswir1
                        tcg_gen_trunc_i64_tl(cpu_val, cpu_tmp64);
4299 6ae20372 blueswir1
                        tcg_gen_andi_tl(cpu_val, cpu_val, 0xffffffffULL);
4300 1a2fb1c0 blueswir1
                    }
4301 0f8a249a blueswir1
                    break;
4302 b89e94af Blue Swirl
                case 0x9:       /* ldsb, load signed byte */
4303 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4304 6ae20372 blueswir1
                    tcg_gen_qemu_ld8s(cpu_val, cpu_addr, dc->mem_idx);
4305 0f8a249a blueswir1
                    break;
4306 b89e94af Blue Swirl
                case 0xa:       /* ldsh, load signed halfword */
4307 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4308 6ae20372 blueswir1
                    tcg_gen_qemu_ld16s(cpu_val, cpu_addr, dc->mem_idx);
4309 0f8a249a blueswir1
                    break;
4310 0f8a249a blueswir1
                case 0xd:       /* ldstub -- XXX: should be atomically */
4311 2ea815ca blueswir1
                    {
4312 2ea815ca blueswir1
                        TCGv r_const;
4313 2ea815ca blueswir1
4314 2cade6a3 blueswir1
                        gen_address_mask(dc, cpu_addr);
4315 2ea815ca blueswir1
                        tcg_gen_qemu_ld8s(cpu_val, cpu_addr, dc->mem_idx);
4316 2ea815ca blueswir1
                        r_const = tcg_const_tl(0xff);
4317 2ea815ca blueswir1
                        tcg_gen_qemu_st8(r_const, cpu_addr, dc->mem_idx);
4318 2ea815ca blueswir1
                        tcg_temp_free(r_const);
4319 2ea815ca blueswir1
                    }
4320 0f8a249a blueswir1
                    break;
4321 b89e94af Blue Swirl
                case 0x0f:      /* swap, swap register with memory. Also
4322 77f193da blueswir1
                                   atomically */
4323 64a88d5d blueswir1
                    CHECK_IU_FEATURE(dc, SWAP);
4324 6ae20372 blueswir1
                    gen_movl_reg_TN(rd, cpu_val);
4325 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4326 527067d8 blueswir1
                    tcg_gen_qemu_ld32u(cpu_tmp0, cpu_addr, dc->mem_idx);
4327 6ae20372 blueswir1
                    tcg_gen_qemu_st32(cpu_val, cpu_addr, dc->mem_idx);
4328 527067d8 blueswir1
                    tcg_gen_mov_tl(cpu_val, cpu_tmp0);
4329 0f8a249a blueswir1
                    break;
4330 3475187d bellard
#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64)
4331 b89e94af Blue Swirl
                case 0x10:      /* lda, V9 lduwa, load word alternate */
4332 3475187d bellard
#ifndef TARGET_SPARC64
4333 0f8a249a blueswir1
                    if (IS_IMM)
4334 0f8a249a blueswir1
                        goto illegal_insn;
4335 0f8a249a blueswir1
                    if (!supervisor(dc))
4336 0f8a249a blueswir1
                        goto priv_insn;
4337 6ea4a6c8 blueswir1
#endif
4338 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4339 6ae20372 blueswir1
                    gen_ld_asi(cpu_val, cpu_addr, insn, 4, 0);
4340 0f8a249a blueswir1
                    break;
4341 b89e94af Blue Swirl
                case 0x11:      /* lduba, load unsigned byte alternate */
4342 3475187d bellard
#ifndef TARGET_SPARC64
4343 0f8a249a blueswir1
                    if (IS_IMM)
4344 0f8a249a blueswir1
                        goto illegal_insn;
4345 0f8a249a blueswir1
                    if (!supervisor(dc))
4346 0f8a249a blueswir1
                        goto priv_insn;
4347 0f8a249a blueswir1
#endif
4348 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4349 6ae20372 blueswir1
                    gen_ld_asi(cpu_val, cpu_addr, insn, 1, 0);
4350 0f8a249a blueswir1
                    break;
4351 b89e94af Blue Swirl
                case 0x12:      /* lduha, load unsigned halfword 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, 2, 0);
4360 0f8a249a blueswir1
                    break;
4361 b89e94af Blue Swirl
                case 0x13:      /* ldda, load double word 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 3475187d bellard
#endif
4368 0f8a249a blueswir1
                    if (rd & 1)
4369 d4218d99 blueswir1
                        goto illegal_insn;
4370 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4371 db166940 blueswir1
                    gen_ldda_asi(cpu_val, cpu_addr, insn, rd);
4372 db166940 blueswir1
                    goto skip_move;
4373 b89e94af Blue Swirl
                case 0x19:      /* ldsba, load signed byte alternate */
4374 3475187d bellard
#ifndef TARGET_SPARC64
4375 0f8a249a blueswir1
                    if (IS_IMM)
4376 0f8a249a blueswir1
                        goto illegal_insn;
4377 0f8a249a blueswir1
                    if (!supervisor(dc))
4378 0f8a249a blueswir1
                        goto priv_insn;
4379 0f8a249a blueswir1
#endif
4380 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4381 6ae20372 blueswir1
                    gen_ld_asi(cpu_val, cpu_addr, insn, 1, 1);
4382 0f8a249a blueswir1
                    break;
4383 b89e94af Blue Swirl
                case 0x1a:      /* ldsha, load signed halfword alternate */
4384 3475187d bellard
#ifndef TARGET_SPARC64
4385 0f8a249a blueswir1
                    if (IS_IMM)
4386 0f8a249a blueswir1
                        goto illegal_insn;
4387 0f8a249a blueswir1
                    if (!supervisor(dc))
4388 0f8a249a blueswir1
                        goto priv_insn;
4389 6ea4a6c8 blueswir1
#endif
4390 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4391 6ae20372 blueswir1
                    gen_ld_asi(cpu_val, cpu_addr, insn, 2, 1);
4392 0f8a249a blueswir1
                    break;
4393 0f8a249a blueswir1
                case 0x1d:      /* ldstuba -- XXX: should be atomically */
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_ldstub_asi(cpu_val, cpu_addr, insn);
4402 0f8a249a blueswir1
                    break;
4403 b89e94af Blue Swirl
                case 0x1f:      /* swapa, swap reg with alt. memory. Also
4404 77f193da blueswir1
                                   atomically */
4405 64a88d5d blueswir1
                    CHECK_IU_FEATURE(dc, SWAP);
4406 3475187d bellard
#ifndef TARGET_SPARC64
4407 0f8a249a blueswir1
                    if (IS_IMM)
4408 0f8a249a blueswir1
                        goto illegal_insn;
4409 0f8a249a blueswir1
                    if (!supervisor(dc))
4410 0f8a249a blueswir1
                        goto priv_insn;
4411 6ea4a6c8 blueswir1
#endif
4412 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4413 6ae20372 blueswir1
                    gen_movl_reg_TN(rd, cpu_val);
4414 6ae20372 blueswir1
                    gen_swap_asi(cpu_val, cpu_addr, insn);
4415 0f8a249a blueswir1
                    break;
4416 3475187d bellard
4417 3475187d bellard
#ifndef TARGET_SPARC64
4418 0f8a249a blueswir1
                case 0x30: /* ldc */
4419 0f8a249a blueswir1
                case 0x31: /* ldcsr */
4420 0f8a249a blueswir1
                case 0x33: /* lddc */
4421 0f8a249a blueswir1
                    goto ncp_insn;
4422 3475187d bellard
#endif
4423 3475187d bellard
#endif
4424 3475187d bellard
#ifdef TARGET_SPARC64
4425 0f8a249a blueswir1
                case 0x08: /* V9 ldsw */
4426 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4427 6ae20372 blueswir1
                    tcg_gen_qemu_ld32s(cpu_val, cpu_addr, dc->mem_idx);
4428 0f8a249a blueswir1
                    break;
4429 0f8a249a blueswir1
                case 0x0b: /* V9 ldx */
4430 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4431 6ae20372 blueswir1
                    tcg_gen_qemu_ld64(cpu_val, cpu_addr, dc->mem_idx);
4432 0f8a249a blueswir1
                    break;
4433 0f8a249a blueswir1
                case 0x18: /* V9 ldswa */
4434 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4435 6ae20372 blueswir1
                    gen_ld_asi(cpu_val, cpu_addr, insn, 4, 1);
4436 0f8a249a blueswir1
                    break;
4437 0f8a249a blueswir1
                case 0x1b: /* V9 ldxa */
4438 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4439 6ae20372 blueswir1
                    gen_ld_asi(cpu_val, cpu_addr, insn, 8, 0);
4440 0f8a249a blueswir1
                    break;
4441 0f8a249a blueswir1
                case 0x2d: /* V9 prefetch, no effect */
4442 0f8a249a blueswir1
                    goto skip_move;
4443 0f8a249a blueswir1
                case 0x30: /* V9 ldfa */
4444 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4445 6ae20372 blueswir1
                    gen_ldf_asi(cpu_addr, insn, 4, rd);
4446 81ad8ba2 blueswir1
                    goto skip_move;
4447 0f8a249a blueswir1
                case 0x33: /* V9 lddfa */
4448 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4449 6ae20372 blueswir1
                    gen_ldf_asi(cpu_addr, insn, 8, DFPREG(rd));
4450 81ad8ba2 blueswir1
                    goto skip_move;
4451 0f8a249a blueswir1
                case 0x3d: /* V9 prefetcha, no effect */
4452 0f8a249a blueswir1
                    goto skip_move;
4453 0f8a249a blueswir1
                case 0x32: /* V9 ldqfa */
4454 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, FLOAT128);
4455 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4456 6ae20372 blueswir1
                    gen_ldf_asi(cpu_addr, insn, 16, QFPREG(rd));
4457 1f587329 blueswir1
                    goto skip_move;
4458 1f587329 blueswir1
#endif
4459 0f8a249a blueswir1
                default:
4460 0f8a249a blueswir1
                    goto illegal_insn;
4461 0f8a249a blueswir1
                }
4462 6ae20372 blueswir1
                gen_movl_TN_reg(rd, cpu_val);
4463 db166940 blueswir1
#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64)
4464 0f8a249a blueswir1
            skip_move: ;
4465 3475187d bellard
#endif
4466 0f8a249a blueswir1
            } else if (xop >= 0x20 && xop < 0x24) {
4467 6ae20372 blueswir1
                if (gen_trap_ifnofpu(dc, cpu_cond))
4468 a80dde08 bellard
                    goto jmp_insn;
4469 c2bc0e38 blueswir1
                save_state(dc, cpu_cond);
4470 0f8a249a blueswir1
                switch (xop) {
4471 b89e94af Blue Swirl
                case 0x20:      /* ldf, load fpreg */
4472 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4473 527067d8 blueswir1
                    tcg_gen_qemu_ld32u(cpu_tmp0, cpu_addr, dc->mem_idx);
4474 527067d8 blueswir1
                    tcg_gen_trunc_tl_i32(cpu_fpr[rd], cpu_tmp0);
4475 0f8a249a blueswir1
                    break;
4476 3a3b925d blueswir1
                case 0x21:      /* ldfsr, V9 ldxfsr */
4477 3a3b925d blueswir1
#ifdef TARGET_SPARC64
4478 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4479 3a3b925d blueswir1
                    if (rd == 1) {
4480 3a3b925d blueswir1
                        tcg_gen_qemu_ld64(cpu_tmp64, cpu_addr, dc->mem_idx);
4481 a7812ae4 pbrook
                        gen_helper_ldxfsr(cpu_tmp64);
4482 fe987e23 Igor V. Kovalenko
                    } else {
4483 fe987e23 Igor V. Kovalenko
                        tcg_gen_qemu_ld32u(cpu_tmp0, cpu_addr, dc->mem_idx);
4484 fe987e23 Igor V. Kovalenko
                        tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
4485 fe987e23 Igor V. Kovalenko
                        gen_helper_ldfsr(cpu_tmp32);
4486 fe987e23 Igor V. Kovalenko
                    }
4487 3a3b925d blueswir1
#else
4488 3a3b925d blueswir1
                    {
4489 3a3b925d blueswir1
                        tcg_gen_qemu_ld32u(cpu_tmp32, cpu_addr, dc->mem_idx);
4490 a7812ae4 pbrook
                        gen_helper_ldfsr(cpu_tmp32);
4491 3a3b925d blueswir1
                    }
4492 3a3b925d blueswir1
#endif
4493 0f8a249a blueswir1
                    break;
4494 b89e94af Blue Swirl
                case 0x22:      /* ldqf, load quad fpreg */
4495 2ea815ca blueswir1
                    {
4496 a7812ae4 pbrook
                        TCGv_i32 r_const;
4497 2ea815ca blueswir1
4498 2ea815ca blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
4499 2ea815ca blueswir1
                        r_const = tcg_const_i32(dc->mem_idx);
4500 1295001c Igor V. Kovalenko
                        gen_address_mask(dc, cpu_addr);
4501 a7812ae4 pbrook
                        gen_helper_ldqf(cpu_addr, r_const);
4502 a7812ae4 pbrook
                        tcg_temp_free_i32(r_const);
4503 2ea815ca blueswir1
                        gen_op_store_QT0_fpr(QFPREG(rd));
4504 2ea815ca blueswir1
                    }
4505 1f587329 blueswir1
                    break;
4506 b89e94af Blue Swirl
                case 0x23:      /* lddf, load double fpreg */
4507 2ea815ca blueswir1
                    {
4508 a7812ae4 pbrook
                        TCGv_i32 r_const;
4509 2ea815ca blueswir1
4510 2ea815ca blueswir1
                        r_const = tcg_const_i32(dc->mem_idx);
4511 1295001c Igor V. Kovalenko
                        gen_address_mask(dc, cpu_addr);
4512 a7812ae4 pbrook
                        gen_helper_lddf(cpu_addr, r_const);
4513 a7812ae4 pbrook
                        tcg_temp_free_i32(r_const);
4514 2ea815ca blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
4515 2ea815ca blueswir1
                    }
4516 0f8a249a blueswir1
                    break;
4517 0f8a249a blueswir1
                default:
4518 0f8a249a blueswir1
                    goto illegal_insn;
4519 0f8a249a blueswir1
                }
4520 dc1a6971 Blue Swirl
            } else if (xop < 8 || (xop >= 0x14 && xop < 0x18) ||
4521 0f8a249a blueswir1
                       xop == 0xe || xop == 0x1e) {
4522 6ae20372 blueswir1
                gen_movl_reg_TN(rd, cpu_val);
4523 0f8a249a blueswir1
                switch (xop) {
4524 b89e94af Blue Swirl
                case 0x4: /* st, store word */
4525 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4526 6ae20372 blueswir1
                    tcg_gen_qemu_st32(cpu_val, cpu_addr, dc->mem_idx);
4527 0f8a249a blueswir1
                    break;
4528 b89e94af Blue Swirl
                case 0x5: /* stb, store byte */
4529 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4530 6ae20372 blueswir1
                    tcg_gen_qemu_st8(cpu_val, cpu_addr, dc->mem_idx);
4531 0f8a249a blueswir1
                    break;
4532 b89e94af Blue Swirl
                case 0x6: /* sth, store halfword */
4533 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4534 6ae20372 blueswir1
                    tcg_gen_qemu_st16(cpu_val, cpu_addr, dc->mem_idx);
4535 0f8a249a blueswir1
                    break;
4536 b89e94af Blue Swirl
                case 0x7: /* std, store double word */
4537 0f8a249a blueswir1
                    if (rd & 1)
4538 d4218d99 blueswir1
                        goto illegal_insn;
4539 1a2fb1c0 blueswir1
                    else {
4540 a7812ae4 pbrook
                        TCGv_i32 r_const;
4541 1a2fb1c0 blueswir1
4542 c2bc0e38 blueswir1
                        save_state(dc, cpu_cond);
4543 2cade6a3 blueswir1
                        gen_address_mask(dc, cpu_addr);
4544 2ea815ca blueswir1
                        r_const = tcg_const_i32(7);
4545 a7812ae4 pbrook
                        gen_helper_check_align(cpu_addr, r_const); // XXX remove
4546 a7812ae4 pbrook
                        tcg_temp_free_i32(r_const);
4547 a7ec4229 blueswir1
                        gen_movl_reg_TN(rd + 1, cpu_tmp0);
4548 ab508019 blueswir1
                        tcg_gen_concat_tl_i64(cpu_tmp64, cpu_tmp0, cpu_val);
4549 6ae20372 blueswir1
                        tcg_gen_qemu_st64(cpu_tmp64, cpu_addr, dc->mem_idx);
4550 7fa76c0b blueswir1
                    }
4551 0f8a249a blueswir1
                    break;
4552 3475187d bellard
#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64)
4553 b89e94af Blue Swirl
                case 0x14: /* sta, V9 stwa, store word alternate */
4554 3475187d bellard
#ifndef TARGET_SPARC64
4555 0f8a249a blueswir1
                    if (IS_IMM)
4556 0f8a249a blueswir1
                        goto illegal_insn;
4557 0f8a249a blueswir1
                    if (!supervisor(dc))
4558 0f8a249a blueswir1
                        goto priv_insn;
4559 3475187d bellard
#endif
4560 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4561 6ae20372 blueswir1
                    gen_st_asi(cpu_val, cpu_addr, insn, 4);
4562 9fd1ae3a Igor V. Kovalenko
                    dc->npc = DYNAMIC_PC;
4563 d39c0b99 bellard
                    break;
4564 b89e94af Blue Swirl
                case 0x15: /* stba, store byte alternate */
4565 3475187d bellard
#ifndef TARGET_SPARC64
4566 0f8a249a blueswir1
                    if (IS_IMM)
4567 0f8a249a blueswir1
                        goto illegal_insn;
4568 0f8a249a blueswir1
                    if (!supervisor(dc))
4569 0f8a249a blueswir1
                        goto priv_insn;
4570 3475187d bellard
#endif
4571 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4572 6ae20372 blueswir1
                    gen_st_asi(cpu_val, cpu_addr, insn, 1);
4573 9fd1ae3a Igor V. Kovalenko
                    dc->npc = DYNAMIC_PC;
4574 d39c0b99 bellard
                    break;
4575 b89e94af Blue Swirl
                case 0x16: /* stha, store halfword alternate */
4576 3475187d bellard
#ifndef TARGET_SPARC64
4577 0f8a249a blueswir1
                    if (IS_IMM)
4578 0f8a249a blueswir1
                        goto illegal_insn;
4579 0f8a249a blueswir1
                    if (!supervisor(dc))
4580 0f8a249a blueswir1
                        goto priv_insn;
4581 3475187d bellard
#endif
4582 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4583 6ae20372 blueswir1
                    gen_st_asi(cpu_val, cpu_addr, insn, 2);
4584 9fd1ae3a Igor V. Kovalenko
                    dc->npc = DYNAMIC_PC;
4585 d39c0b99 bellard
                    break;
4586 b89e94af Blue Swirl
                case 0x17: /* stda, store double word alternate */
4587 3475187d bellard
#ifndef TARGET_SPARC64
4588 0f8a249a blueswir1
                    if (IS_IMM)
4589 0f8a249a blueswir1
                        goto illegal_insn;
4590 0f8a249a blueswir1
                    if (!supervisor(dc))
4591 0f8a249a blueswir1
                        goto priv_insn;
4592 3475187d bellard
#endif
4593 0f8a249a blueswir1
                    if (rd & 1)
4594 d4218d99 blueswir1
                        goto illegal_insn;
4595 1a2fb1c0 blueswir1
                    else {
4596 c2bc0e38 blueswir1
                        save_state(dc, cpu_cond);
4597 6ae20372 blueswir1
                        gen_stda_asi(cpu_val, cpu_addr, insn, rd);
4598 1a2fb1c0 blueswir1
                    }
4599 d39c0b99 bellard
                    break;
4600 e80cfcfc bellard
#endif
4601 3475187d bellard
#ifdef TARGET_SPARC64
4602 0f8a249a blueswir1
                case 0x0e: /* V9 stx */
4603 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4604 6ae20372 blueswir1
                    tcg_gen_qemu_st64(cpu_val, cpu_addr, dc->mem_idx);
4605 0f8a249a blueswir1
                    break;
4606 0f8a249a blueswir1
                case 0x1e: /* V9 stxa */
4607 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4608 6ae20372 blueswir1
                    gen_st_asi(cpu_val, cpu_addr, insn, 8);
4609 9fd1ae3a Igor V. Kovalenko
                    dc->npc = DYNAMIC_PC;
4610 0f8a249a blueswir1
                    break;
4611 3475187d bellard
#endif
4612 0f8a249a blueswir1
                default:
4613 0f8a249a blueswir1
                    goto illegal_insn;
4614 0f8a249a blueswir1
                }
4615 0f8a249a blueswir1
            } else if (xop > 0x23 && xop < 0x28) {
4616 6ae20372 blueswir1
                if (gen_trap_ifnofpu(dc, cpu_cond))
4617 a80dde08 bellard
                    goto jmp_insn;
4618 c2bc0e38 blueswir1
                save_state(dc, cpu_cond);
4619 0f8a249a blueswir1
                switch (xop) {
4620 b89e94af Blue Swirl
                case 0x24: /* stf, store fpreg */
4621 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4622 527067d8 blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_fpr[rd]);
4623 527067d8 blueswir1
                    tcg_gen_qemu_st32(cpu_tmp0, cpu_addr, dc->mem_idx);
4624 0f8a249a blueswir1
                    break;
4625 0f8a249a blueswir1
                case 0x25: /* stfsr, V9 stxfsr */
4626 3a3b925d blueswir1
#ifdef TARGET_SPARC64
4627 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4628 3a3b925d blueswir1
                    tcg_gen_ld_i64(cpu_tmp64, cpu_env, offsetof(CPUState, fsr));
4629 3a3b925d blueswir1
                    if (rd == 1)
4630 3a3b925d blueswir1
                        tcg_gen_qemu_st64(cpu_tmp64, cpu_addr, dc->mem_idx);
4631 527067d8 blueswir1
                    else
4632 527067d8 blueswir1
                        tcg_gen_qemu_st32(cpu_tmp64, cpu_addr, dc->mem_idx);
4633 3a3b925d blueswir1
#else
4634 3a3b925d blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env, offsetof(CPUState, fsr));
4635 6ae20372 blueswir1
                    tcg_gen_qemu_st32(cpu_tmp32, cpu_addr, dc->mem_idx);
4636 3a3b925d blueswir1
#endif
4637 0f8a249a blueswir1
                    break;
4638 1f587329 blueswir1
                case 0x26:
4639 1f587329 blueswir1
#ifdef TARGET_SPARC64
4640 1f587329 blueswir1
                    /* V9 stqf, store quad fpreg */
4641 2ea815ca blueswir1
                    {
4642 a7812ae4 pbrook
                        TCGv_i32 r_const;
4643 2ea815ca blueswir1
4644 2ea815ca blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
4645 2ea815ca blueswir1
                        gen_op_load_fpr_QT0(QFPREG(rd));
4646 2ea815ca blueswir1
                        r_const = tcg_const_i32(dc->mem_idx);
4647 1295001c Igor V. Kovalenko
                        gen_address_mask(dc, cpu_addr);
4648 a7812ae4 pbrook
                        gen_helper_stqf(cpu_addr, r_const);
4649 a7812ae4 pbrook
                        tcg_temp_free_i32(r_const);
4650 2ea815ca blueswir1
                    }
4651 1f587329 blueswir1
                    break;
4652 1f587329 blueswir1
#else /* !TARGET_SPARC64 */
4653 1f587329 blueswir1
                    /* stdfq, store floating point queue */
4654 1f587329 blueswir1
#if defined(CONFIG_USER_ONLY)
4655 1f587329 blueswir1
                    goto illegal_insn;
4656 1f587329 blueswir1
#else
4657 0f8a249a blueswir1
                    if (!supervisor(dc))
4658 0f8a249a blueswir1
                        goto priv_insn;
4659 6ae20372 blueswir1
                    if (gen_trap_ifnofpu(dc, cpu_cond))
4660 0f8a249a blueswir1
                        goto jmp_insn;
4661 0f8a249a blueswir1
                    goto nfq_insn;
4662 0f8a249a blueswir1
#endif
4663 1f587329 blueswir1
#endif
4664 b89e94af Blue Swirl
                case 0x27: /* stdf, store double fpreg */
4665 2ea815ca blueswir1
                    {
4666 a7812ae4 pbrook
                        TCGv_i32 r_const;
4667 2ea815ca blueswir1
4668 2ea815ca blueswir1
                        gen_op_load_fpr_DT0(DFPREG(rd));
4669 2ea815ca blueswir1
                        r_const = tcg_const_i32(dc->mem_idx);
4670 1295001c Igor V. Kovalenko
                        gen_address_mask(dc, cpu_addr);
4671 a7812ae4 pbrook
                        gen_helper_stdf(cpu_addr, r_const);
4672 a7812ae4 pbrook
                        tcg_temp_free_i32(r_const);
4673 2ea815ca blueswir1
                    }
4674 0f8a249a blueswir1
                    break;
4675 0f8a249a blueswir1
                default:
4676 0f8a249a blueswir1
                    goto illegal_insn;
4677 0f8a249a blueswir1
                }
4678 0f8a249a blueswir1
            } else if (xop > 0x33 && xop < 0x3f) {
4679 c2bc0e38 blueswir1
                save_state(dc, cpu_cond);
4680 0f8a249a blueswir1
                switch (xop) {
4681 a4d17f19 blueswir1
#ifdef TARGET_SPARC64
4682 0f8a249a blueswir1
                case 0x34: /* V9 stfa */
4683 6ae20372 blueswir1
                    gen_stf_asi(cpu_addr, insn, 4, rd);
4684 0f8a249a blueswir1
                    break;
4685 1f587329 blueswir1
                case 0x36: /* V9 stqfa */
4686 2ea815ca blueswir1
                    {
4687 a7812ae4 pbrook
                        TCGv_i32 r_const;
4688 2ea815ca blueswir1
4689 2ea815ca blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
4690 2ea815ca blueswir1
                        r_const = tcg_const_i32(7);
4691 a7812ae4 pbrook
                        gen_helper_check_align(cpu_addr, r_const);
4692 a7812ae4 pbrook
                        tcg_temp_free_i32(r_const);
4693 2ea815ca blueswir1
                        gen_op_load_fpr_QT0(QFPREG(rd));
4694 2ea815ca blueswir1
                        gen_stf_asi(cpu_addr, insn, 16, QFPREG(rd));
4695 2ea815ca blueswir1
                    }
4696 1f587329 blueswir1
                    break;
4697 0f8a249a blueswir1
                case 0x37: /* V9 stdfa */
4698 3391c818 blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rd));
4699 6ae20372 blueswir1
                    gen_stf_asi(cpu_addr, insn, 8, DFPREG(rd));
4700 0f8a249a blueswir1
                    break;
4701 0f8a249a blueswir1
                case 0x3c: /* V9 casa */
4702 71817e48 blueswir1
                    gen_cas_asi(cpu_val, cpu_addr, cpu_src2, insn, rd);
4703 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_val);
4704 0f8a249a blueswir1
                    break;
4705 0f8a249a blueswir1
                case 0x3e: /* V9 casxa */
4706 71817e48 blueswir1
                    gen_casx_asi(cpu_val, cpu_addr, cpu_src2, insn, rd);
4707 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_val);
4708 0f8a249a blueswir1
                    break;
4709 a4d17f19 blueswir1
#else
4710 0f8a249a blueswir1
                case 0x34: /* stc */
4711 0f8a249a blueswir1
                case 0x35: /* stcsr */
4712 0f8a249a blueswir1
                case 0x36: /* stdcq */
4713 0f8a249a blueswir1
                case 0x37: /* stdc */
4714 0f8a249a blueswir1
                    goto ncp_insn;
4715 0f8a249a blueswir1
#endif
4716 0f8a249a blueswir1
                default:
4717 0f8a249a blueswir1
                    goto illegal_insn;
4718 0f8a249a blueswir1
                }
4719 dc1a6971 Blue Swirl
            } else
4720 0f8a249a blueswir1
                goto illegal_insn;
4721 0f8a249a blueswir1
        }
4722 0f8a249a blueswir1
        break;
4723 cf495bcf bellard
    }
4724 cf495bcf bellard
    /* default case for non jump instructions */
4725 72cbca10 bellard
    if (dc->npc == DYNAMIC_PC) {
4726 0f8a249a blueswir1
        dc->pc = DYNAMIC_PC;
4727 0f8a249a blueswir1
        gen_op_next_insn();
4728 72cbca10 bellard
    } else if (dc->npc == JUMP_PC) {
4729 72cbca10 bellard
        /* we can do a static jump */
4730 6ae20372 blueswir1
        gen_branch2(dc, dc->jump_pc[0], dc->jump_pc[1], cpu_cond);
4731 72cbca10 bellard
        dc->is_br = 1;
4732 72cbca10 bellard
    } else {
4733 0f8a249a blueswir1
        dc->pc = dc->npc;
4734 0f8a249a blueswir1
        dc->npc = dc->npc + 4;
4735 cf495bcf bellard
    }
4736 e80cfcfc bellard
 jmp_insn:
4737 42a8aa83 Richard Henderson
    goto egress;
4738 cf495bcf bellard
 illegal_insn:
4739 2ea815ca blueswir1
    {
4740 a7812ae4 pbrook
        TCGv_i32 r_const;
4741 2ea815ca blueswir1
4742 2ea815ca blueswir1
        save_state(dc, cpu_cond);
4743 2ea815ca blueswir1
        r_const = tcg_const_i32(TT_ILL_INSN);
4744 a7812ae4 pbrook
        gen_helper_raise_exception(r_const);
4745 a7812ae4 pbrook
        tcg_temp_free_i32(r_const);
4746 2ea815ca blueswir1
        dc->is_br = 1;
4747 2ea815ca blueswir1
    }
4748 42a8aa83 Richard Henderson
    goto egress;
4749 64a88d5d blueswir1
 unimp_flush:
4750 2ea815ca blueswir1
    {
4751 a7812ae4 pbrook
        TCGv_i32 r_const;
4752 2ea815ca blueswir1
4753 2ea815ca blueswir1
        save_state(dc, cpu_cond);
4754 2ea815ca blueswir1
        r_const = tcg_const_i32(TT_UNIMP_FLUSH);
4755 a7812ae4 pbrook
        gen_helper_raise_exception(r_const);
4756 a7812ae4 pbrook
        tcg_temp_free_i32(r_const);
4757 2ea815ca blueswir1
        dc->is_br = 1;
4758 2ea815ca blueswir1
    }
4759 42a8aa83 Richard Henderson
    goto egress;
4760 e80cfcfc bellard
#if !defined(CONFIG_USER_ONLY)
4761 e8af50a3 bellard
 priv_insn:
4762 2ea815ca blueswir1
    {
4763 a7812ae4 pbrook
        TCGv_i32 r_const;
4764 2ea815ca blueswir1
4765 2ea815ca blueswir1
        save_state(dc, cpu_cond);
4766 2ea815ca blueswir1
        r_const = tcg_const_i32(TT_PRIV_INSN);
4767 a7812ae4 pbrook
        gen_helper_raise_exception(r_const);
4768 a7812ae4 pbrook
        tcg_temp_free_i32(r_const);
4769 2ea815ca blueswir1
        dc->is_br = 1;
4770 2ea815ca blueswir1
    }
4771 42a8aa83 Richard Henderson
    goto egress;
4772 64a88d5d blueswir1
#endif
4773 e80cfcfc bellard
 nfpu_insn:
4774 6ae20372 blueswir1
    save_state(dc, cpu_cond);
4775 e80cfcfc bellard
    gen_op_fpexception_im(FSR_FTT_UNIMPFPOP);
4776 e80cfcfc bellard
    dc->is_br = 1;
4777 42a8aa83 Richard Henderson
    goto egress;
4778 64a88d5d blueswir1
#if !defined(CONFIG_USER_ONLY) && !defined(TARGET_SPARC64)
4779 9143e598 blueswir1
 nfq_insn:
4780 6ae20372 blueswir1
    save_state(dc, cpu_cond);
4781 9143e598 blueswir1
    gen_op_fpexception_im(FSR_FTT_SEQ_ERROR);
4782 9143e598 blueswir1
    dc->is_br = 1;
4783 42a8aa83 Richard Henderson
    goto egress;
4784 9143e598 blueswir1
#endif
4785 fcc72045 blueswir1
#ifndef TARGET_SPARC64
4786 fcc72045 blueswir1
 ncp_insn:
4787 2ea815ca blueswir1
    {
4788 2ea815ca blueswir1
        TCGv r_const;
4789 2ea815ca blueswir1
4790 2ea815ca blueswir1
        save_state(dc, cpu_cond);
4791 2ea815ca blueswir1
        r_const = tcg_const_i32(TT_NCP_INSN);
4792 a7812ae4 pbrook
        gen_helper_raise_exception(r_const);
4793 2ea815ca blueswir1
        tcg_temp_free(r_const);
4794 2ea815ca blueswir1
        dc->is_br = 1;
4795 2ea815ca blueswir1
    }
4796 42a8aa83 Richard Henderson
    goto egress;
4797 fcc72045 blueswir1
#endif
4798 42a8aa83 Richard Henderson
 egress:
4799 42a8aa83 Richard Henderson
    tcg_temp_free(cpu_tmp1);
4800 42a8aa83 Richard Henderson
    tcg_temp_free(cpu_tmp2);
4801 7a3f1944 bellard
}
4802 7a3f1944 bellard
4803 2cfc5f17 ths
static inline void gen_intermediate_code_internal(TranslationBlock * tb,
4804 2cfc5f17 ths
                                                  int spc, CPUSPARCState *env)
4805 7a3f1944 bellard
{
4806 72cbca10 bellard
    target_ulong pc_start, last_pc;
4807 cf495bcf bellard
    uint16_t *gen_opc_end;
4808 cf495bcf bellard
    DisasContext dc1, *dc = &dc1;
4809 a1d1bb31 aliguori
    CPUBreakpoint *bp;
4810 e8af50a3 bellard
    int j, lj = -1;
4811 2e70f6ef pbrook
    int num_insns;
4812 2e70f6ef pbrook
    int max_insns;
4813 cf495bcf bellard
4814 cf495bcf bellard
    memset(dc, 0, sizeof(DisasContext));
4815 cf495bcf bellard
    dc->tb = tb;
4816 72cbca10 bellard
    pc_start = tb->pc;
4817 cf495bcf bellard
    dc->pc = pc_start;
4818 e80cfcfc bellard
    last_pc = dc->pc;
4819 72cbca10 bellard
    dc->npc = (target_ulong) tb->cs_base;
4820 8393617c Blue Swirl
    dc->cc_op = CC_OP_DYNAMIC;
4821 6f27aba6 blueswir1
    dc->mem_idx = cpu_mmu_index(env);
4822 5578ceab blueswir1
    dc->def = env->def;
4823 5578ceab blueswir1
    if ((dc->def->features & CPU_FEATURE_FLOAT))
4824 64a88d5d blueswir1
        dc->fpu_enabled = cpu_fpu_enabled(env);
4825 5578ceab blueswir1
    else
4826 64a88d5d blueswir1
        dc->fpu_enabled = 0;
4827 2cade6a3 blueswir1
#ifdef TARGET_SPARC64
4828 2cade6a3 blueswir1
    dc->address_mask_32bit = env->pstate & PS_AM;
4829 2cade6a3 blueswir1
#endif
4830 060718c1 Richard Henderson
    dc->singlestep = (env->singlestep_enabled || singlestep);
4831 cf495bcf bellard
    gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
4832 cf495bcf bellard
4833 a7812ae4 pbrook
    cpu_tmp0 = tcg_temp_new();
4834 a7812ae4 pbrook
    cpu_tmp32 = tcg_temp_new_i32();
4835 a7812ae4 pbrook
    cpu_tmp64 = tcg_temp_new_i64();
4836 d987963a blueswir1
4837 a7812ae4 pbrook
    cpu_dst = tcg_temp_local_new();
4838 d987963a blueswir1
4839 d987963a blueswir1
    // loads and stores
4840 a7812ae4 pbrook
    cpu_val = tcg_temp_local_new();
4841 a7812ae4 pbrook
    cpu_addr = tcg_temp_local_new();
4842 1a2fb1c0 blueswir1
4843 2e70f6ef pbrook
    num_insns = 0;
4844 2e70f6ef pbrook
    max_insns = tb->cflags & CF_COUNT_MASK;
4845 2e70f6ef pbrook
    if (max_insns == 0)
4846 2e70f6ef pbrook
        max_insns = CF_COUNT_MASK;
4847 2e70f6ef pbrook
    gen_icount_start();
4848 cf495bcf bellard
    do {
4849 72cf2d4f Blue Swirl
        if (unlikely(!QTAILQ_EMPTY(&env->breakpoints))) {
4850 72cf2d4f Blue Swirl
            QTAILQ_FOREACH(bp, &env->breakpoints, entry) {
4851 a1d1bb31 aliguori
                if (bp->pc == dc->pc) {
4852 0f8a249a blueswir1
                    if (dc->pc != pc_start)
4853 6ae20372 blueswir1
                        save_state(dc, cpu_cond);
4854 a7812ae4 pbrook
                    gen_helper_debug();
4855 57fec1fe bellard
                    tcg_gen_exit_tb(0);
4856 0f8a249a blueswir1
                    dc->is_br = 1;
4857 e80cfcfc bellard
                    goto exit_gen_loop;
4858 e8af50a3 bellard
                }
4859 e8af50a3 bellard
            }
4860 e8af50a3 bellard
        }
4861 e8af50a3 bellard
        if (spc) {
4862 93fcfe39 aliguori
            qemu_log("Search PC...\n");
4863 e8af50a3 bellard
            j = gen_opc_ptr - gen_opc_buf;
4864 e8af50a3 bellard
            if (lj < j) {
4865 e8af50a3 bellard
                lj++;
4866 e8af50a3 bellard
                while (lj < j)
4867 e8af50a3 bellard
                    gen_opc_instr_start[lj++] = 0;
4868 e8af50a3 bellard
                gen_opc_pc[lj] = dc->pc;
4869 e8af50a3 bellard
                gen_opc_npc[lj] = dc->npc;
4870 e8af50a3 bellard
                gen_opc_instr_start[lj] = 1;
4871 2e70f6ef pbrook
                gen_opc_icount[lj] = num_insns;
4872 e8af50a3 bellard
            }
4873 e8af50a3 bellard
        }
4874 2e70f6ef pbrook
        if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO))
4875 2e70f6ef pbrook
            gen_io_start();
4876 0f8a249a blueswir1
        last_pc = dc->pc;
4877 0f8a249a blueswir1
        disas_sparc_insn(dc);
4878 2e70f6ef pbrook
        num_insns++;
4879 0f8a249a blueswir1
4880 0f8a249a blueswir1
        if (dc->is_br)
4881 0f8a249a blueswir1
            break;
4882 0f8a249a blueswir1
        /* if the next PC is different, we abort now */
4883 0f8a249a blueswir1
        if (dc->pc != (last_pc + 4))
4884 0f8a249a blueswir1
            break;
4885 d39c0b99 bellard
        /* if we reach a page boundary, we stop generation so that the
4886 d39c0b99 bellard
           PC of a TT_TFAULT exception is always in the right page */
4887 d39c0b99 bellard
        if ((dc->pc & (TARGET_PAGE_SIZE - 1)) == 0)
4888 d39c0b99 bellard
            break;
4889 e80cfcfc bellard
        /* if single step mode, we generate only one instruction and
4890 e80cfcfc bellard
           generate an exception */
4891 060718c1 Richard Henderson
        if (dc->singlestep) {
4892 e80cfcfc bellard
            break;
4893 e80cfcfc bellard
        }
4894 cf495bcf bellard
    } while ((gen_opc_ptr < gen_opc_end) &&
4895 2e70f6ef pbrook
             (dc->pc - pc_start) < (TARGET_PAGE_SIZE - 32) &&
4896 2e70f6ef pbrook
             num_insns < max_insns);
4897 e80cfcfc bellard
4898 e80cfcfc bellard
 exit_gen_loop:
4899 d987963a blueswir1
    tcg_temp_free(cpu_addr);
4900 3f0436fe blueswir1
    tcg_temp_free(cpu_val);
4901 d987963a blueswir1
    tcg_temp_free(cpu_dst);
4902 a7812ae4 pbrook
    tcg_temp_free_i64(cpu_tmp64);
4903 a7812ae4 pbrook
    tcg_temp_free_i32(cpu_tmp32);
4904 2ea815ca blueswir1
    tcg_temp_free(cpu_tmp0);
4905 2e70f6ef pbrook
    if (tb->cflags & CF_LAST_IO)
4906 2e70f6ef pbrook
        gen_io_end();
4907 72cbca10 bellard
    if (!dc->is_br) {
4908 5fafdf24 ths
        if (dc->pc != DYNAMIC_PC &&
4909 72cbca10 bellard
            (dc->npc != DYNAMIC_PC && dc->npc != JUMP_PC)) {
4910 72cbca10 bellard
            /* static PC and NPC: we can use direct chaining */
4911 2f5680ee blueswir1
            gen_goto_tb(dc, 0, dc->pc, dc->npc);
4912 72cbca10 bellard
        } else {
4913 72cbca10 bellard
            if (dc->pc != DYNAMIC_PC)
4914 2f5680ee blueswir1
                tcg_gen_movi_tl(cpu_pc, dc->pc);
4915 6ae20372 blueswir1
            save_npc(dc, cpu_cond);
4916 57fec1fe bellard
            tcg_gen_exit_tb(0);
4917 72cbca10 bellard
        }
4918 72cbca10 bellard
    }
4919 2e70f6ef pbrook
    gen_icount_end(tb, num_insns);
4920 cf495bcf bellard
    *gen_opc_ptr = INDEX_op_end;
4921 e8af50a3 bellard
    if (spc) {
4922 e8af50a3 bellard
        j = gen_opc_ptr - gen_opc_buf;
4923 e8af50a3 bellard
        lj++;
4924 e8af50a3 bellard
        while (lj <= j)
4925 e8af50a3 bellard
            gen_opc_instr_start[lj++] = 0;
4926 e8af50a3 bellard
#if 0
4927 93fcfe39 aliguori
        log_page_dump();
4928 e8af50a3 bellard
#endif
4929 c3278b7b bellard
        gen_opc_jump_pc[0] = dc->jump_pc[0];
4930 c3278b7b bellard
        gen_opc_jump_pc[1] = dc->jump_pc[1];
4931 e8af50a3 bellard
    } else {
4932 e80cfcfc bellard
        tb->size = last_pc + 4 - pc_start;
4933 2e70f6ef pbrook
        tb->icount = num_insns;
4934 e8af50a3 bellard
    }
4935 7a3f1944 bellard
#ifdef DEBUG_DISAS
4936 8fec2b8c aliguori
    if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
4937 93fcfe39 aliguori
        qemu_log("--------------\n");
4938 93fcfe39 aliguori
        qemu_log("IN: %s\n", lookup_symbol(pc_start));
4939 93fcfe39 aliguori
        log_target_disas(pc_start, last_pc + 4 - pc_start, 0);
4940 93fcfe39 aliguori
        qemu_log("\n");
4941 cf495bcf bellard
    }
4942 7a3f1944 bellard
#endif
4943 7a3f1944 bellard
}
4944 7a3f1944 bellard
4945 2cfc5f17 ths
void gen_intermediate_code(CPUSPARCState * env, TranslationBlock * tb)
4946 7a3f1944 bellard
{
4947 2cfc5f17 ths
    gen_intermediate_code_internal(tb, 0, env);
4948 7a3f1944 bellard
}
4949 7a3f1944 bellard
4950 2cfc5f17 ths
void gen_intermediate_code_pc(CPUSPARCState * env, TranslationBlock * tb)
4951 7a3f1944 bellard
{
4952 2cfc5f17 ths
    gen_intermediate_code_internal(tb, 1, env);
4953 7a3f1944 bellard
}
4954 7a3f1944 bellard
4955 c48fcb47 blueswir1
void gen_intermediate_code_init(CPUSPARCState *env)
4956 e80cfcfc bellard
{
4957 f5069b26 blueswir1
    unsigned int i;
4958 c48fcb47 blueswir1
    static int inited;
4959 f5069b26 blueswir1
    static const char * const gregnames[8] = {
4960 f5069b26 blueswir1
        NULL, // g0 not used
4961 f5069b26 blueswir1
        "g1",
4962 f5069b26 blueswir1
        "g2",
4963 f5069b26 blueswir1
        "g3",
4964 f5069b26 blueswir1
        "g4",
4965 f5069b26 blueswir1
        "g5",
4966 f5069b26 blueswir1
        "g6",
4967 f5069b26 blueswir1
        "g7",
4968 f5069b26 blueswir1
    };
4969 714547bb blueswir1
    static const char * const fregnames[64] = {
4970 714547bb blueswir1
        "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
4971 714547bb blueswir1
        "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
4972 714547bb blueswir1
        "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
4973 714547bb blueswir1
        "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
4974 714547bb blueswir1
        "f32", "f33", "f34", "f35", "f36", "f37", "f38", "f39",
4975 714547bb blueswir1
        "f40", "f41", "f42", "f43", "f44", "f45", "f46", "f47",
4976 714547bb blueswir1
        "f48", "f49", "f50", "f51", "f52", "f53", "f54", "f55",
4977 714547bb blueswir1
        "f56", "f57", "f58", "f59", "f60", "f61", "f62", "f63",
4978 714547bb blueswir1
    };
4979 aaed909a bellard
4980 1a2fb1c0 blueswir1
    /* init various static tables */
4981 1a2fb1c0 blueswir1
    if (!inited) {
4982 1a2fb1c0 blueswir1
        inited = 1;
4983 1a2fb1c0 blueswir1
4984 a7812ae4 pbrook
        cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env");
4985 a7812ae4 pbrook
        cpu_regwptr = tcg_global_mem_new_ptr(TCG_AREG0,
4986 a7812ae4 pbrook
                                             offsetof(CPUState, regwptr),
4987 a7812ae4 pbrook
                                             "regwptr");
4988 1a2fb1c0 blueswir1
#ifdef TARGET_SPARC64
4989 a7812ae4 pbrook
        cpu_xcc = tcg_global_mem_new_i32(TCG_AREG0, offsetof(CPUState, xcc),
4990 a7812ae4 pbrook
                                         "xcc");
4991 a7812ae4 pbrook
        cpu_asi = tcg_global_mem_new_i32(TCG_AREG0, offsetof(CPUState, asi),
4992 a7812ae4 pbrook
                                         "asi");
4993 a7812ae4 pbrook
        cpu_fprs = tcg_global_mem_new_i32(TCG_AREG0, offsetof(CPUState, fprs),
4994 a7812ae4 pbrook
                                          "fprs");
4995 a7812ae4 pbrook
        cpu_gsr = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, gsr),
4996 255e1fcb blueswir1
                                     "gsr");
4997 a7812ae4 pbrook
        cpu_tick_cmpr = tcg_global_mem_new(TCG_AREG0,
4998 255e1fcb blueswir1
                                           offsetof(CPUState, tick_cmpr),
4999 255e1fcb blueswir1
                                           "tick_cmpr");
5000 a7812ae4 pbrook
        cpu_stick_cmpr = tcg_global_mem_new(TCG_AREG0,
5001 255e1fcb blueswir1
                                            offsetof(CPUState, stick_cmpr),
5002 255e1fcb blueswir1
                                            "stick_cmpr");
5003 a7812ae4 pbrook
        cpu_hstick_cmpr = tcg_global_mem_new(TCG_AREG0,
5004 255e1fcb blueswir1
                                             offsetof(CPUState, hstick_cmpr),
5005 255e1fcb blueswir1
                                             "hstick_cmpr");
5006 a7812ae4 pbrook
        cpu_hintp = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, hintp),
5007 255e1fcb blueswir1
                                       "hintp");
5008 a7812ae4 pbrook
        cpu_htba = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, htba),
5009 a7812ae4 pbrook
                                      "htba");
5010 a7812ae4 pbrook
        cpu_hver = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, hver),
5011 a7812ae4 pbrook
                                      "hver");
5012 a7812ae4 pbrook
        cpu_ssr = tcg_global_mem_new(TCG_AREG0,
5013 255e1fcb blueswir1
                                     offsetof(CPUState, ssr), "ssr");
5014 a7812ae4 pbrook
        cpu_ver = tcg_global_mem_new(TCG_AREG0,
5015 255e1fcb blueswir1
                                     offsetof(CPUState, version), "ver");
5016 a7812ae4 pbrook
        cpu_softint = tcg_global_mem_new_i32(TCG_AREG0,
5017 a7812ae4 pbrook
                                             offsetof(CPUState, softint),
5018 a7812ae4 pbrook
                                             "softint");
5019 255e1fcb blueswir1
#else
5020 a7812ae4 pbrook
        cpu_wim = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, wim),
5021 255e1fcb blueswir1
                                     "wim");
5022 1a2fb1c0 blueswir1
#endif
5023 a7812ae4 pbrook
        cpu_cond = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, cond),
5024 77f193da blueswir1
                                      "cond");
5025 a7812ae4 pbrook
        cpu_cc_src = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, cc_src),
5026 dc99a3f2 blueswir1
                                        "cc_src");
5027 a7812ae4 pbrook
        cpu_cc_src2 = tcg_global_mem_new(TCG_AREG0,
5028 d9bdab86 blueswir1
                                         offsetof(CPUState, cc_src2),
5029 d9bdab86 blueswir1
                                         "cc_src2");
5030 a7812ae4 pbrook
        cpu_cc_dst = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, cc_dst),
5031 dc99a3f2 blueswir1
                                        "cc_dst");
5032 8393617c Blue Swirl
        cpu_cc_op = tcg_global_mem_new_i32(TCG_AREG0, offsetof(CPUState, cc_op),
5033 8393617c Blue Swirl
                                           "cc_op");
5034 a7812ae4 pbrook
        cpu_psr = tcg_global_mem_new_i32(TCG_AREG0, offsetof(CPUState, psr),
5035 a7812ae4 pbrook
                                         "psr");
5036 a7812ae4 pbrook
        cpu_fsr = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, fsr),
5037 87e92502 blueswir1
                                     "fsr");
5038 a7812ae4 pbrook
        cpu_pc = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, pc),
5039 48d5c82b blueswir1
                                    "pc");
5040 a7812ae4 pbrook
        cpu_npc = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, npc),
5041 a7812ae4 pbrook
                                     "npc");
5042 a7812ae4 pbrook
        cpu_y = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, y), "y");
5043 255e1fcb blueswir1
#ifndef CONFIG_USER_ONLY
5044 a7812ae4 pbrook
        cpu_tbr = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, tbr),
5045 255e1fcb blueswir1
                                     "tbr");
5046 255e1fcb blueswir1
#endif
5047 f5069b26 blueswir1
        for (i = 1; i < 8; i++)
5048 a7812ae4 pbrook
            cpu_gregs[i] = tcg_global_mem_new(TCG_AREG0,
5049 f5069b26 blueswir1
                                              offsetof(CPUState, gregs[i]),
5050 f5069b26 blueswir1
                                              gregnames[i]);
5051 714547bb blueswir1
        for (i = 0; i < TARGET_FPREGS; i++)
5052 a7812ae4 pbrook
            cpu_fpr[i] = tcg_global_mem_new_i32(TCG_AREG0,
5053 a7812ae4 pbrook
                                                offsetof(CPUState, fpr[i]),
5054 a7812ae4 pbrook
                                                fregnames[i]);
5055 714547bb blueswir1
5056 c9e03d8f blueswir1
        /* register helpers */
5057 c9e03d8f blueswir1
5058 a7812ae4 pbrook
#define GEN_HELPER 2
5059 c9e03d8f blueswir1
#include "helper.h"
5060 1a2fb1c0 blueswir1
    }
5061 658138bc bellard
}
5062 d2856f1a aurel32
5063 d2856f1a aurel32
void gen_pc_load(CPUState *env, TranslationBlock *tb,
5064 d2856f1a aurel32
                unsigned long searched_pc, int pc_pos, void *puc)
5065 d2856f1a aurel32
{
5066 d2856f1a aurel32
    target_ulong npc;
5067 d2856f1a aurel32
    env->pc = gen_opc_pc[pc_pos];
5068 d2856f1a aurel32
    npc = gen_opc_npc[pc_pos];
5069 d2856f1a aurel32
    if (npc == 1) {
5070 d2856f1a aurel32
        /* dynamic NPC: already stored */
5071 d2856f1a aurel32
    } else if (npc == 2) {
5072 d7da2a10 Blue Swirl
        /* jump PC: use 'cond' and the jump targets of the translation */
5073 d7da2a10 Blue Swirl
        if (env->cond) {
5074 d2856f1a aurel32
            env->npc = gen_opc_jump_pc[0];
5075 d7da2a10 Blue Swirl
        } else {
5076 d2856f1a aurel32
            env->npc = gen_opc_jump_pc[1];
5077 d7da2a10 Blue Swirl
        }
5078 d2856f1a aurel32
    } else {
5079 d2856f1a aurel32
        env->npc = npc;
5080 d2856f1a aurel32
    }
5081 14ed7adc Igor Kovalenko
5082 14ed7adc Igor Kovalenko
    /* flush pending conditional evaluations before exposing cpu state */
5083 14ed7adc Igor Kovalenko
    if (CC_OP != CC_OP_FLAGS) {
5084 14ed7adc Igor Kovalenko
        helper_compute_psr();
5085 14ed7adc Igor Kovalenko
    }
5086 d2856f1a aurel32
}