Statistics
| Branch: | Revision:

root / target-sparc / translate.c @ f838e2c5

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