Statistics
| Branch: | Revision:

root / target-sparc / translate.c @ 5068cbd9

History | View | Annotate | Download (191.4 kB)

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

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

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

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

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