Statistics
| Branch: | Revision:

root / target-sparc / translate.c @ 0dcda9be

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