Statistics
| Branch: | Revision:

root / target-sparc / translate.c @ db166940

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