Statistics
| Branch: | Revision:

root / target-sparc / translate.c @ 8eba209e

History | View | Annotate | Download (184.8 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 fb79ceb9 blueswir1
                CHECK_IU_FEATURE(dc, HYPV);
2179 e9ebed4d blueswir1
                if (!hypervisor(dc))
2180 e9ebed4d blueswir1
                    goto priv_insn;
2181 e9ebed4d blueswir1
                rs1 = GET_FIELD(insn, 13, 17);
2182 e9ebed4d blueswir1
                switch (rs1) {
2183 e9ebed4d blueswir1
                case 0: // hpstate
2184 e9ebed4d blueswir1
                    // gen_op_rdhpstate();
2185 e9ebed4d blueswir1
                    break;
2186 e9ebed4d blueswir1
                case 1: // htstate
2187 e9ebed4d blueswir1
                    // gen_op_rdhtstate();
2188 e9ebed4d blueswir1
                    break;
2189 e9ebed4d blueswir1
                case 3: // hintp
2190 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2191 77f193da blueswir1
                                   offsetof(CPUSPARCState, hintp));
2192 6ae20372 blueswir1
                    tcg_gen_ext_i32_tl(cpu_dst, cpu_tmp32);
2193 e9ebed4d blueswir1
                    break;
2194 e9ebed4d blueswir1
                case 5: // htba
2195 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2196 77f193da blueswir1
                                   offsetof(CPUSPARCState, htba));
2197 6ae20372 blueswir1
                    tcg_gen_ext_i32_tl(cpu_dst, cpu_tmp32);
2198 e9ebed4d blueswir1
                    break;
2199 e9ebed4d blueswir1
                case 6: // hver
2200 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2201 77f193da blueswir1
                                   offsetof(CPUSPARCState, hver));
2202 6ae20372 blueswir1
                    tcg_gen_ext_i32_tl(cpu_dst, cpu_tmp32);
2203 e9ebed4d blueswir1
                    break;
2204 e9ebed4d blueswir1
                case 31: // hstick_cmpr
2205 8d7d8c4b blueswir1
                    tcg_gen_ld_tl(cpu_dst, cpu_env,
2206 8d7d8c4b blueswir1
                                  offsetof(CPUSPARCState, hstick_cmpr));
2207 e9ebed4d blueswir1
                    break;
2208 e9ebed4d blueswir1
                default:
2209 e9ebed4d blueswir1
                    goto illegal_insn;
2210 e9ebed4d blueswir1
                }
2211 e9ebed4d blueswir1
#endif
2212 6ae20372 blueswir1
                gen_movl_TN_reg(rd, cpu_dst);
2213 e8af50a3 bellard
                break;
2214 3475187d bellard
            } else if (xop == 0x2a) { /* rdwim / V9 rdpr */
2215 0f8a249a blueswir1
                if (!supervisor(dc))
2216 0f8a249a blueswir1
                    goto priv_insn;
2217 3475187d bellard
#ifdef TARGET_SPARC64
2218 3475187d bellard
                rs1 = GET_FIELD(insn, 13, 17);
2219 0f8a249a blueswir1
                switch (rs1) {
2220 0f8a249a blueswir1
                case 0: // tpc
2221 375ee38b blueswir1
                    {
2222 375ee38b blueswir1
                        TCGv r_tsptr;
2223 375ee38b blueswir1
2224 375ee38b blueswir1
                        r_tsptr = tcg_temp_new(TCG_TYPE_PTR);
2225 375ee38b blueswir1
                        tcg_gen_ld_ptr(r_tsptr, cpu_env,
2226 375ee38b blueswir1
                                       offsetof(CPUState, tsptr));
2227 ece43b8d blueswir1
                        tcg_gen_ld_tl(cpu_tmp0, r_tsptr,
2228 375ee38b blueswir1
                                      offsetof(trap_state, tpc));
2229 2ea815ca blueswir1
                        tcg_temp_free(r_tsptr);
2230 375ee38b blueswir1
                    }
2231 0f8a249a blueswir1
                    break;
2232 0f8a249a blueswir1
                case 1: // tnpc
2233 375ee38b blueswir1
                    {
2234 375ee38b blueswir1
                        TCGv r_tsptr;
2235 375ee38b blueswir1
2236 375ee38b blueswir1
                        r_tsptr = tcg_temp_new(TCG_TYPE_PTR);
2237 375ee38b blueswir1
                        tcg_gen_ld_ptr(r_tsptr, cpu_env,
2238 375ee38b blueswir1
                                       offsetof(CPUState, tsptr));
2239 ece43b8d blueswir1
                        tcg_gen_ld_tl(cpu_tmp0, r_tsptr,
2240 375ee38b blueswir1
                                      offsetof(trap_state, tnpc));
2241 2ea815ca blueswir1
                        tcg_temp_free(r_tsptr);
2242 375ee38b blueswir1
                    }
2243 0f8a249a blueswir1
                    break;
2244 0f8a249a blueswir1
                case 2: // tstate
2245 375ee38b blueswir1
                    {
2246 375ee38b blueswir1
                        TCGv r_tsptr;
2247 375ee38b blueswir1
2248 375ee38b blueswir1
                        r_tsptr = tcg_temp_new(TCG_TYPE_PTR);
2249 375ee38b blueswir1
                        tcg_gen_ld_ptr(r_tsptr, cpu_env,
2250 375ee38b blueswir1
                                       offsetof(CPUState, tsptr));
2251 ece43b8d blueswir1
                        tcg_gen_ld_tl(cpu_tmp0, r_tsptr,
2252 375ee38b blueswir1
                                      offsetof(trap_state, tstate));
2253 2ea815ca blueswir1
                        tcg_temp_free(r_tsptr);
2254 375ee38b blueswir1
                    }
2255 0f8a249a blueswir1
                    break;
2256 0f8a249a blueswir1
                case 3: // tt
2257 375ee38b blueswir1
                    {
2258 375ee38b blueswir1
                        TCGv r_tsptr;
2259 375ee38b blueswir1
2260 375ee38b blueswir1
                        r_tsptr = tcg_temp_new(TCG_TYPE_PTR);
2261 375ee38b blueswir1
                        tcg_gen_ld_ptr(r_tsptr, cpu_env,
2262 375ee38b blueswir1
                                       offsetof(CPUState, tsptr));
2263 ece43b8d blueswir1
                        tcg_gen_ld_i32(cpu_tmp0, r_tsptr,
2264 375ee38b blueswir1
                                       offsetof(trap_state, tt));
2265 2ea815ca blueswir1
                        tcg_temp_free(r_tsptr);
2266 375ee38b blueswir1
                    }
2267 0f8a249a blueswir1
                    break;
2268 0f8a249a blueswir1
                case 4: // tick
2269 ccd4a219 blueswir1
                    {
2270 ccd4a219 blueswir1
                        TCGv r_tickptr;
2271 ccd4a219 blueswir1
2272 ccd4a219 blueswir1
                        r_tickptr = tcg_temp_new(TCG_TYPE_PTR);
2273 ccd4a219 blueswir1
                        tcg_gen_ld_ptr(r_tickptr, cpu_env,
2274 ccd4a219 blueswir1
                                       offsetof(CPUState, tick));
2275 ece43b8d blueswir1
                        tcg_gen_helper_1_1(helper_tick_get_count, cpu_tmp0,
2276 ccd4a219 blueswir1
                                           r_tickptr);
2277 ece43b8d blueswir1
                        gen_movl_TN_reg(rd, cpu_tmp0);
2278 2ea815ca blueswir1
                        tcg_temp_free(r_tickptr);
2279 ccd4a219 blueswir1
                    }
2280 0f8a249a blueswir1
                    break;
2281 0f8a249a blueswir1
                case 5: // tba
2282 ece43b8d blueswir1
                    tcg_gen_ld_tl(cpu_tmp0, cpu_env,
2283 77f193da blueswir1
                                  offsetof(CPUSPARCState, tbr));
2284 0f8a249a blueswir1
                    break;
2285 0f8a249a blueswir1
                case 6: // pstate
2286 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2287 77f193da blueswir1
                                   offsetof(CPUSPARCState, pstate));
2288 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2289 0f8a249a blueswir1
                    break;
2290 0f8a249a blueswir1
                case 7: // tl
2291 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2292 77f193da blueswir1
                                   offsetof(CPUSPARCState, tl));
2293 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2294 0f8a249a blueswir1
                    break;
2295 0f8a249a blueswir1
                case 8: // pil
2296 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2297 77f193da blueswir1
                                   offsetof(CPUSPARCState, psrpil));
2298 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2299 0f8a249a blueswir1
                    break;
2300 0f8a249a blueswir1
                case 9: // cwp
2301 ece43b8d blueswir1
                    tcg_gen_helper_1_0(helper_rdcwp, cpu_tmp0);
2302 0f8a249a blueswir1
                    break;
2303 0f8a249a blueswir1
                case 10: // cansave
2304 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2305 77f193da blueswir1
                                   offsetof(CPUSPARCState, cansave));
2306 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2307 0f8a249a blueswir1
                    break;
2308 0f8a249a blueswir1
                case 11: // canrestore
2309 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2310 77f193da blueswir1
                                   offsetof(CPUSPARCState, canrestore));
2311 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2312 0f8a249a blueswir1
                    break;
2313 0f8a249a blueswir1
                case 12: // cleanwin
2314 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2315 77f193da blueswir1
                                   offsetof(CPUSPARCState, cleanwin));
2316 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2317 0f8a249a blueswir1
                    break;
2318 0f8a249a blueswir1
                case 13: // otherwin
2319 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2320 77f193da blueswir1
                                   offsetof(CPUSPARCState, otherwin));
2321 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2322 0f8a249a blueswir1
                    break;
2323 0f8a249a blueswir1
                case 14: // wstate
2324 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2325 77f193da blueswir1
                                   offsetof(CPUSPARCState, wstate));
2326 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2327 0f8a249a blueswir1
                    break;
2328 e9ebed4d blueswir1
                case 16: // UA2005 gl
2329 fb79ceb9 blueswir1
                    CHECK_IU_FEATURE(dc, GL);
2330 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2331 77f193da blueswir1
                                   offsetof(CPUSPARCState, gl));
2332 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2333 e9ebed4d blueswir1
                    break;
2334 e9ebed4d blueswir1
                case 26: // UA2005 strand status
2335 fb79ceb9 blueswir1
                    CHECK_IU_FEATURE(dc, HYPV);
2336 e9ebed4d blueswir1
                    if (!hypervisor(dc))
2337 e9ebed4d blueswir1
                        goto priv_insn;
2338 77f193da blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2339 77f193da blueswir1
                                   offsetof(CPUSPARCState, ssr));
2340 ece43b8d blueswir1
                    tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2341 e9ebed4d blueswir1
                    break;
2342 0f8a249a blueswir1
                case 31: // ver
2343 ece43b8d blueswir1
                    tcg_gen_ld_tl(cpu_tmp0, cpu_env,
2344 77f193da blueswir1
                                  offsetof(CPUSPARCState, version));
2345 0f8a249a blueswir1
                    break;
2346 0f8a249a blueswir1
                case 15: // fq
2347 0f8a249a blueswir1
                default:
2348 0f8a249a blueswir1
                    goto illegal_insn;
2349 0f8a249a blueswir1
                }
2350 3475187d bellard
#else
2351 77f193da blueswir1
                tcg_gen_ld_i32(cpu_tmp32, cpu_env,
2352 77f193da blueswir1
                               offsetof(CPUSPARCState, wim));
2353 ece43b8d blueswir1
                tcg_gen_ext_i32_tl(cpu_tmp0, cpu_tmp32);
2354 3475187d bellard
#endif
2355 ece43b8d blueswir1
                gen_movl_TN_reg(rd, cpu_tmp0);
2356 e8af50a3 bellard
                break;
2357 3475187d bellard
            } else if (xop == 0x2b) { /* rdtbr / V9 flushw */
2358 3475187d bellard
#ifdef TARGET_SPARC64
2359 c5f2f668 blueswir1
                save_state(dc, cpu_cond);
2360 72a9747b blueswir1
                tcg_gen_helper_0_0(helper_flushw);
2361 3475187d bellard
#else
2362 0f8a249a blueswir1
                if (!supervisor(dc))
2363 0f8a249a blueswir1
                    goto priv_insn;
2364 ece43b8d blueswir1
                tcg_gen_ld_tl(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, tbr));
2365 ece43b8d blueswir1
                gen_movl_TN_reg(rd, cpu_tmp0);
2366 3475187d bellard
#endif
2367 e8af50a3 bellard
                break;
2368 e8af50a3 bellard
#endif
2369 0f8a249a blueswir1
            } else if (xop == 0x34) {   /* FPU Operations */
2370 6ae20372 blueswir1
                if (gen_trap_ifnofpu(dc, cpu_cond))
2371 a80dde08 bellard
                    goto jmp_insn;
2372 0f8a249a blueswir1
                gen_op_clear_ieee_excp_and_FTT();
2373 e8af50a3 bellard
                rs1 = GET_FIELD(insn, 13, 17);
2374 0f8a249a blueswir1
                rs2 = GET_FIELD(insn, 27, 31);
2375 0f8a249a blueswir1
                xop = GET_FIELD(insn, 18, 26);
2376 0f8a249a blueswir1
                switch (xop) {
2377 0f8a249a blueswir1
                    case 0x1: /* fmovs */
2378 0f8a249a blueswir1
                        gen_op_load_fpr_FT0(rs2);
2379 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
2380 0f8a249a blueswir1
                        break;
2381 0f8a249a blueswir1
                    case 0x5: /* fnegs */
2382 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
2383 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fnegs);
2384 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
2385 0f8a249a blueswir1
                        break;
2386 0f8a249a blueswir1
                    case 0x9: /* fabss */
2387 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
2388 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_fabss);
2389 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
2390 0f8a249a blueswir1
                        break;
2391 0f8a249a blueswir1
                    case 0x29: /* fsqrts */
2392 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FSQRT);
2393 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
2394 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2395 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_fsqrts);
2396 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2397 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
2398 0f8a249a blueswir1
                        break;
2399 0f8a249a blueswir1
                    case 0x2a: /* fsqrtd */
2400 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FSQRT);
2401 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
2402 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2403 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_fsqrtd);
2404 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2405 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
2406 0f8a249a blueswir1
                        break;
2407 0f8a249a blueswir1
                    case 0x2b: /* fsqrtq */
2408 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2409 1f587329 blueswir1
                        gen_op_load_fpr_QT1(QFPREG(rs2));
2410 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2411 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_fsqrtq);
2412 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2413 1f587329 blueswir1
                        gen_op_store_QT0_fpr(QFPREG(rd));
2414 1f587329 blueswir1
                        break;
2415 0f8a249a blueswir1
                    case 0x41:
2416 0f8a249a blueswir1
                        gen_op_load_fpr_FT0(rs1);
2417 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
2418 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2419 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fadds);
2420 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2421 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
2422 0f8a249a blueswir1
                        break;
2423 0f8a249a blueswir1
                    case 0x42:
2424 0f8a249a blueswir1
                        gen_op_load_fpr_DT0(DFPREG(rs1));
2425 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
2426 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2427 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_faddd);
2428 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2429 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
2430 0f8a249a blueswir1
                        break;
2431 0f8a249a blueswir1
                    case 0x43: /* faddq */
2432 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2433 1f587329 blueswir1
                        gen_op_load_fpr_QT0(QFPREG(rs1));
2434 1f587329 blueswir1
                        gen_op_load_fpr_QT1(QFPREG(rs2));
2435 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2436 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_faddq);
2437 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2438 1f587329 blueswir1
                        gen_op_store_QT0_fpr(QFPREG(rd));
2439 1f587329 blueswir1
                        break;
2440 0f8a249a blueswir1
                    case 0x45:
2441 0f8a249a blueswir1
                        gen_op_load_fpr_FT0(rs1);
2442 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
2443 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2444 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fsubs);
2445 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2446 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
2447 0f8a249a blueswir1
                        break;
2448 0f8a249a blueswir1
                    case 0x46:
2449 0f8a249a blueswir1
                        gen_op_load_fpr_DT0(DFPREG(rs1));
2450 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
2451 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2452 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fsubd);
2453 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2454 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
2455 0f8a249a blueswir1
                        break;
2456 0f8a249a blueswir1
                    case 0x47: /* fsubq */
2457 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2458 1f587329 blueswir1
                        gen_op_load_fpr_QT0(QFPREG(rs1));
2459 1f587329 blueswir1
                        gen_op_load_fpr_QT1(QFPREG(rs2));
2460 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2461 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fsubq);
2462 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2463 1f587329 blueswir1
                        gen_op_store_QT0_fpr(QFPREG(rd));
2464 1f587329 blueswir1
                        break;
2465 64a88d5d blueswir1
                    case 0x49: /* fmuls */
2466 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FMUL);
2467 0f8a249a blueswir1
                        gen_op_load_fpr_FT0(rs1);
2468 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
2469 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2470 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fmuls);
2471 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2472 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
2473 0f8a249a blueswir1
                        break;
2474 64a88d5d blueswir1
                    case 0x4a: /* fmuld */
2475 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FMUL);
2476 0f8a249a blueswir1
                        gen_op_load_fpr_DT0(DFPREG(rs1));
2477 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
2478 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2479 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fmuld);
2480 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2481 2382dc6b blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
2482 0f8a249a blueswir1
                        break;
2483 0f8a249a blueswir1
                    case 0x4b: /* fmulq */
2484 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2485 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FMUL);
2486 1f587329 blueswir1
                        gen_op_load_fpr_QT0(QFPREG(rs1));
2487 1f587329 blueswir1
                        gen_op_load_fpr_QT1(QFPREG(rs2));
2488 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2489 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fmulq);
2490 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2491 1f587329 blueswir1
                        gen_op_store_QT0_fpr(QFPREG(rd));
2492 1f587329 blueswir1
                        break;
2493 0f8a249a blueswir1
                    case 0x4d:
2494 0f8a249a blueswir1
                        gen_op_load_fpr_FT0(rs1);
2495 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
2496 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2497 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fdivs);
2498 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2499 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
2500 0f8a249a blueswir1
                        break;
2501 0f8a249a blueswir1
                    case 0x4e:
2502 0f8a249a blueswir1
                        gen_op_load_fpr_DT0(DFPREG(rs1));
2503 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
2504 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2505 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fdivd);
2506 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2507 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
2508 0f8a249a blueswir1
                        break;
2509 0f8a249a blueswir1
                    case 0x4f: /* fdivq */
2510 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2511 1f587329 blueswir1
                        gen_op_load_fpr_QT0(QFPREG(rs1));
2512 1f587329 blueswir1
                        gen_op_load_fpr_QT1(QFPREG(rs2));
2513 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2514 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fdivq);
2515 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2516 1f587329 blueswir1
                        gen_op_store_QT0_fpr(QFPREG(rd));
2517 1f587329 blueswir1
                        break;
2518 0f8a249a blueswir1
                    case 0x69:
2519 e30b4678 blueswir1
                        CHECK_FPU_FEATURE(dc, FSMULD);
2520 0f8a249a blueswir1
                        gen_op_load_fpr_FT0(rs1);
2521 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
2522 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2523 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fsmuld);
2524 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2525 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
2526 0f8a249a blueswir1
                        break;
2527 0f8a249a blueswir1
                    case 0x6e: /* fdmulq */
2528 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2529 1f587329 blueswir1
                        gen_op_load_fpr_DT0(DFPREG(rs1));
2530 1f587329 blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
2531 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2532 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fdmulq);
2533 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2534 1f587329 blueswir1
                        gen_op_store_QT0_fpr(QFPREG(rd));
2535 1f587329 blueswir1
                        break;
2536 0f8a249a blueswir1
                    case 0xc4:
2537 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
2538 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2539 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fitos);
2540 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2541 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
2542 0f8a249a blueswir1
                        break;
2543 0f8a249a blueswir1
                    case 0xc6:
2544 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
2545 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2546 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fdtos);
2547 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2548 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
2549 0f8a249a blueswir1
                        break;
2550 0f8a249a blueswir1
                    case 0xc7: /* fqtos */
2551 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2552 1f587329 blueswir1
                        gen_op_load_fpr_QT1(QFPREG(rs2));
2553 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2554 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fqtos);
2555 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2556 1f587329 blueswir1
                        gen_op_store_FT0_fpr(rd);
2557 1f587329 blueswir1
                        break;
2558 0f8a249a blueswir1
                    case 0xc8:
2559 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
2560 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fitod);
2561 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
2562 0f8a249a blueswir1
                        break;
2563 0f8a249a blueswir1
                    case 0xc9:
2564 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
2565 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fstod);
2566 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
2567 0f8a249a blueswir1
                        break;
2568 0f8a249a blueswir1
                    case 0xcb: /* fqtod */
2569 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2570 1f587329 blueswir1
                        gen_op_load_fpr_QT1(QFPREG(rs2));
2571 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2572 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fqtod);
2573 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2574 1f587329 blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
2575 1f587329 blueswir1
                        break;
2576 0f8a249a blueswir1
                    case 0xcc: /* fitoq */
2577 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2578 1f587329 blueswir1
                        gen_op_load_fpr_FT1(rs2);
2579 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fitoq);
2580 1f587329 blueswir1
                        gen_op_store_QT0_fpr(QFPREG(rd));
2581 1f587329 blueswir1
                        break;
2582 0f8a249a blueswir1
                    case 0xcd: /* fstoq */
2583 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2584 1f587329 blueswir1
                        gen_op_load_fpr_FT1(rs2);
2585 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fstoq);
2586 1f587329 blueswir1
                        gen_op_store_QT0_fpr(QFPREG(rd));
2587 1f587329 blueswir1
                        break;
2588 0f8a249a blueswir1
                    case 0xce: /* fdtoq */
2589 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2590 1f587329 blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
2591 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fdtoq);
2592 1f587329 blueswir1
                        gen_op_store_QT0_fpr(QFPREG(rd));
2593 1f587329 blueswir1
                        break;
2594 0f8a249a blueswir1
                    case 0xd1:
2595 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
2596 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2597 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fstoi);
2598 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2599 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
2600 0f8a249a blueswir1
                        break;
2601 0f8a249a blueswir1
                    case 0xd2:
2602 2382dc6b blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
2603 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2604 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fdtoi);
2605 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2606 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
2607 0f8a249a blueswir1
                        break;
2608 0f8a249a blueswir1
                    case 0xd3: /* fqtoi */
2609 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2610 1f587329 blueswir1
                        gen_op_load_fpr_QT1(QFPREG(rs2));
2611 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2612 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fqtoi);
2613 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2614 1f587329 blueswir1
                        gen_op_store_FT0_fpr(rd);
2615 1f587329 blueswir1
                        break;
2616 3475187d bellard
#ifdef TARGET_SPARC64
2617 0f8a249a blueswir1
                    case 0x2: /* V9 fmovd */
2618 0f8a249a blueswir1
                        gen_op_load_fpr_DT0(DFPREG(rs2));
2619 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
2620 0f8a249a blueswir1
                        break;
2621 1f587329 blueswir1
                    case 0x3: /* V9 fmovq */
2622 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2623 1f587329 blueswir1
                        gen_op_load_fpr_QT0(QFPREG(rs2));
2624 1f587329 blueswir1
                        gen_op_store_QT0_fpr(QFPREG(rd));
2625 1f587329 blueswir1
                        break;
2626 0f8a249a blueswir1
                    case 0x6: /* V9 fnegd */
2627 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
2628 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fnegd);
2629 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
2630 0f8a249a blueswir1
                        break;
2631 1f587329 blueswir1
                    case 0x7: /* V9 fnegq */
2632 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2633 1f587329 blueswir1
                        gen_op_load_fpr_QT1(QFPREG(rs2));
2634 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fnegq);
2635 1f587329 blueswir1
                        gen_op_store_QT0_fpr(QFPREG(rd));
2636 1f587329 blueswir1
                        break;
2637 0f8a249a blueswir1
                    case 0xa: /* V9 fabsd */
2638 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
2639 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_fabsd);
2640 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
2641 0f8a249a blueswir1
                        break;
2642 1f587329 blueswir1
                    case 0xb: /* V9 fabsq */
2643 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2644 1f587329 blueswir1
                        gen_op_load_fpr_QT1(QFPREG(rs2));
2645 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_fabsq);
2646 1f587329 blueswir1
                        gen_op_store_QT0_fpr(QFPREG(rd));
2647 1f587329 blueswir1
                        break;
2648 0f8a249a blueswir1
                    case 0x81: /* V9 fstox */
2649 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
2650 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2651 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fstox);
2652 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2653 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
2654 0f8a249a blueswir1
                        break;
2655 0f8a249a blueswir1
                    case 0x82: /* V9 fdtox */
2656 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
2657 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2658 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fdtox);
2659 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2660 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
2661 0f8a249a blueswir1
                        break;
2662 1f587329 blueswir1
                    case 0x83: /* V9 fqtox */
2663 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2664 1f587329 blueswir1
                        gen_op_load_fpr_QT1(QFPREG(rs2));
2665 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2666 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fqtox);
2667 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2668 1f587329 blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
2669 1f587329 blueswir1
                        break;
2670 0f8a249a blueswir1
                    case 0x84: /* V9 fxtos */
2671 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
2672 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2673 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fxtos);
2674 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2675 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
2676 0f8a249a blueswir1
                        break;
2677 0f8a249a blueswir1
                    case 0x88: /* V9 fxtod */
2678 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
2679 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2680 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fxtod);
2681 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2682 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
2683 0f8a249a blueswir1
                        break;
2684 0f8a249a blueswir1
                    case 0x8c: /* V9 fxtoq */
2685 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2686 1f587329 blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
2687 7e8c2b6c blueswir1
                        gen_clear_float_exceptions();
2688 44e7757c blueswir1
                        tcg_gen_helper_0_0(helper_fxtoq);
2689 7e8c2b6c blueswir1
                        tcg_gen_helper_0_0(helper_check_ieee_exceptions);
2690 1f587329 blueswir1
                        gen_op_store_QT0_fpr(QFPREG(rd));
2691 1f587329 blueswir1
                        break;
2692 1f587329 blueswir1
#endif
2693 0f8a249a blueswir1
                    default:
2694 0f8a249a blueswir1
                        goto illegal_insn;
2695 0f8a249a blueswir1
                }
2696 0f8a249a blueswir1
            } else if (xop == 0x35) {   /* FPU Operations */
2697 3475187d bellard
#ifdef TARGET_SPARC64
2698 0f8a249a blueswir1
                int cond;
2699 3475187d bellard
#endif
2700 6ae20372 blueswir1
                if (gen_trap_ifnofpu(dc, cpu_cond))
2701 a80dde08 bellard
                    goto jmp_insn;
2702 0f8a249a blueswir1
                gen_op_clear_ieee_excp_and_FTT();
2703 cf495bcf bellard
                rs1 = GET_FIELD(insn, 13, 17);
2704 0f8a249a blueswir1
                rs2 = GET_FIELD(insn, 27, 31);
2705 0f8a249a blueswir1
                xop = GET_FIELD(insn, 18, 26);
2706 3475187d bellard
#ifdef TARGET_SPARC64
2707 0f8a249a blueswir1
                if ((xop & 0x11f) == 0x005) { // V9 fmovsr
2708 dcf24905 blueswir1
                    int l1;
2709 dcf24905 blueswir1
2710 dcf24905 blueswir1
                    l1 = gen_new_label();
2711 0f8a249a blueswir1
                    cond = GET_FIELD_SP(insn, 14, 17);
2712 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
2713 cb63669a pbrook
                    tcg_gen_brcondi_tl(gen_tcg_cond_reg[cond], cpu_src1,
2714 cb63669a pbrook
                                       0, l1);
2715 19f329ad blueswir1
                    gen_op_load_fpr_FT0(rs2);
2716 0f8a249a blueswir1
                    gen_op_store_FT0_fpr(rd);
2717 dcf24905 blueswir1
                    gen_set_label(l1);
2718 0f8a249a blueswir1
                    break;
2719 0f8a249a blueswir1
                } else if ((xop & 0x11f) == 0x006) { // V9 fmovdr
2720 dcf24905 blueswir1
                    int l1;
2721 dcf24905 blueswir1
2722 dcf24905 blueswir1
                    l1 = gen_new_label();
2723 0f8a249a blueswir1
                    cond = GET_FIELD_SP(insn, 14, 17);
2724 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
2725 cb63669a pbrook
                    tcg_gen_brcondi_tl(gen_tcg_cond_reg[cond], cpu_src1,
2726 cb63669a pbrook
                                       0, l1);
2727 19f329ad blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs2));
2728 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
2729 dcf24905 blueswir1
                    gen_set_label(l1);
2730 0f8a249a blueswir1
                    break;
2731 0f8a249a blueswir1
                } else if ((xop & 0x11f) == 0x007) { // V9 fmovqr
2732 dcf24905 blueswir1
                    int l1;
2733 dcf24905 blueswir1
2734 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, FLOAT128);
2735 dcf24905 blueswir1
                    l1 = gen_new_label();
2736 1f587329 blueswir1
                    cond = GET_FIELD_SP(insn, 14, 17);
2737 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
2738 cb63669a pbrook
                    tcg_gen_brcondi_tl(gen_tcg_cond_reg[cond], cpu_src1,
2739 cb63669a pbrook
                                       0, l1);
2740 19f329ad blueswir1
                    gen_op_load_fpr_QT0(QFPREG(rs2));
2741 1f587329 blueswir1
                    gen_op_store_QT0_fpr(QFPREG(rd));
2742 dcf24905 blueswir1
                    gen_set_label(l1);
2743 1f587329 blueswir1
                    break;
2744 0f8a249a blueswir1
                }
2745 0f8a249a blueswir1
#endif
2746 0f8a249a blueswir1
                switch (xop) {
2747 3475187d bellard
#ifdef TARGET_SPARC64
2748 19f329ad blueswir1
#define FMOVCC(size_FDQ, fcc)                                           \
2749 19f329ad blueswir1
                    {                                                   \
2750 0425bee5 blueswir1
                        TCGv r_cond;                                    \
2751 19f329ad blueswir1
                        int l1;                                         \
2752 19f329ad blueswir1
                                                                        \
2753 19f329ad blueswir1
                        l1 = gen_new_label();                           \
2754 19f329ad blueswir1
                        r_cond = tcg_temp_new(TCG_TYPE_TL);             \
2755 19f329ad blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);              \
2756 19f329ad blueswir1
                        gen_fcond(r_cond, fcc, cond);                   \
2757 cb63669a pbrook
                        tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond,         \
2758 cb63669a pbrook
                                           0, l1);                      \
2759 77f193da blueswir1
                        glue(glue(gen_op_load_fpr_, size_FDQ), T0)      \
2760 77f193da blueswir1
                            (glue(size_FDQ, FPREG(rs2)));               \
2761 77f193da blueswir1
                        glue(glue(gen_op_store_, size_FDQ), T0_fpr)     \
2762 77f193da blueswir1
                            (glue(size_FDQ, FPREG(rd)));                \
2763 19f329ad blueswir1
                        gen_set_label(l1);                              \
2764 2ea815ca blueswir1
                        tcg_temp_free(r_cond);                          \
2765 19f329ad blueswir1
                    }
2766 0f8a249a blueswir1
                    case 0x001: /* V9 fmovscc %fcc0 */
2767 19f329ad blueswir1
                        FMOVCC(F, 0);
2768 0f8a249a blueswir1
                        break;
2769 0f8a249a blueswir1
                    case 0x002: /* V9 fmovdcc %fcc0 */
2770 19f329ad blueswir1
                        FMOVCC(D, 0);
2771 0f8a249a blueswir1
                        break;
2772 0f8a249a blueswir1
                    case 0x003: /* V9 fmovqcc %fcc0 */
2773 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2774 19f329ad blueswir1
                        FMOVCC(Q, 0);
2775 1f587329 blueswir1
                        break;
2776 0f8a249a blueswir1
                    case 0x041: /* V9 fmovscc %fcc1 */
2777 19f329ad blueswir1
                        FMOVCC(F, 1);
2778 0f8a249a blueswir1
                        break;
2779 0f8a249a blueswir1
                    case 0x042: /* V9 fmovdcc %fcc1 */
2780 19f329ad blueswir1
                        FMOVCC(D, 1);
2781 0f8a249a blueswir1
                        break;
2782 0f8a249a blueswir1
                    case 0x043: /* V9 fmovqcc %fcc1 */
2783 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2784 19f329ad blueswir1
                        FMOVCC(Q, 1);
2785 1f587329 blueswir1
                        break;
2786 0f8a249a blueswir1
                    case 0x081: /* V9 fmovscc %fcc2 */
2787 19f329ad blueswir1
                        FMOVCC(F, 2);
2788 0f8a249a blueswir1
                        break;
2789 0f8a249a blueswir1
                    case 0x082: /* V9 fmovdcc %fcc2 */
2790 19f329ad blueswir1
                        FMOVCC(D, 2);
2791 0f8a249a blueswir1
                        break;
2792 0f8a249a blueswir1
                    case 0x083: /* V9 fmovqcc %fcc2 */
2793 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2794 19f329ad blueswir1
                        FMOVCC(Q, 2);
2795 1f587329 blueswir1
                        break;
2796 0f8a249a blueswir1
                    case 0x0c1: /* V9 fmovscc %fcc3 */
2797 19f329ad blueswir1
                        FMOVCC(F, 3);
2798 0f8a249a blueswir1
                        break;
2799 0f8a249a blueswir1
                    case 0x0c2: /* V9 fmovdcc %fcc3 */
2800 19f329ad blueswir1
                        FMOVCC(D, 3);
2801 0f8a249a blueswir1
                        break;
2802 0f8a249a blueswir1
                    case 0x0c3: /* V9 fmovqcc %fcc3 */
2803 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2804 19f329ad blueswir1
                        FMOVCC(Q, 3);
2805 1f587329 blueswir1
                        break;
2806 19f329ad blueswir1
#undef FMOVCC
2807 19f329ad blueswir1
#define FMOVCC(size_FDQ, icc)                                           \
2808 19f329ad blueswir1
                    {                                                   \
2809 0425bee5 blueswir1
                        TCGv r_cond;                                    \
2810 19f329ad blueswir1
                        int l1;                                         \
2811 19f329ad blueswir1
                                                                        \
2812 19f329ad blueswir1
                        l1 = gen_new_label();                           \
2813 19f329ad blueswir1
                        r_cond = tcg_temp_new(TCG_TYPE_TL);             \
2814 19f329ad blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);              \
2815 19f329ad blueswir1
                        gen_cond(r_cond, icc, cond);                    \
2816 cb63669a pbrook
                        tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond,         \
2817 cb63669a pbrook
                                           0, l1);                      \
2818 77f193da blueswir1
                        glue(glue(gen_op_load_fpr_, size_FDQ), T0)      \
2819 77f193da blueswir1
                            (glue(size_FDQ, FPREG(rs2)));               \
2820 77f193da blueswir1
                        glue(glue(gen_op_store_, size_FDQ), T0_fpr)     \
2821 77f193da blueswir1
                            (glue(size_FDQ, FPREG(rd)));                \
2822 19f329ad blueswir1
                        gen_set_label(l1);                              \
2823 2ea815ca blueswir1
                        tcg_temp_free(r_cond);                          \
2824 19f329ad blueswir1
                    }
2825 19f329ad blueswir1
2826 0f8a249a blueswir1
                    case 0x101: /* V9 fmovscc %icc */
2827 19f329ad blueswir1
                        FMOVCC(F, 0);
2828 0f8a249a blueswir1
                        break;
2829 0f8a249a blueswir1
                    case 0x102: /* V9 fmovdcc %icc */
2830 19f329ad blueswir1
                        FMOVCC(D, 0);
2831 0f8a249a blueswir1
                    case 0x103: /* V9 fmovqcc %icc */
2832 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2833 64a88d5d blueswir1
                        FMOVCC(Q, 0);
2834 1f587329 blueswir1
                        break;
2835 0f8a249a blueswir1
                    case 0x181: /* V9 fmovscc %xcc */
2836 19f329ad blueswir1
                        FMOVCC(F, 1);
2837 0f8a249a blueswir1
                        break;
2838 0f8a249a blueswir1
                    case 0x182: /* V9 fmovdcc %xcc */
2839 19f329ad blueswir1
                        FMOVCC(D, 1);
2840 0f8a249a blueswir1
                        break;
2841 0f8a249a blueswir1
                    case 0x183: /* V9 fmovqcc %xcc */
2842 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2843 19f329ad blueswir1
                        FMOVCC(Q, 1);
2844 1f587329 blueswir1
                        break;
2845 19f329ad blueswir1
#undef FMOVCC
2846 1f587329 blueswir1
#endif
2847 1f587329 blueswir1
                    case 0x51: /* fcmps, V9 %fcc */
2848 0f8a249a blueswir1
                        gen_op_load_fpr_FT0(rs1);
2849 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
2850 7e8c2b6c blueswir1
                        gen_op_fcmps(rd & 3);
2851 0f8a249a blueswir1
                        break;
2852 1f587329 blueswir1
                    case 0x52: /* fcmpd, V9 %fcc */
2853 0f8a249a blueswir1
                        gen_op_load_fpr_DT0(DFPREG(rs1));
2854 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
2855 7e8c2b6c blueswir1
                        gen_op_fcmpd(rd & 3);
2856 0f8a249a blueswir1
                        break;
2857 1f587329 blueswir1
                    case 0x53: /* fcmpq, V9 %fcc */
2858 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2859 1f587329 blueswir1
                        gen_op_load_fpr_QT0(QFPREG(rs1));
2860 1f587329 blueswir1
                        gen_op_load_fpr_QT1(QFPREG(rs2));
2861 7e8c2b6c blueswir1
                        gen_op_fcmpq(rd & 3);
2862 1f587329 blueswir1
                        break;
2863 0f8a249a blueswir1
                    case 0x55: /* fcmpes, V9 %fcc */
2864 0f8a249a blueswir1
                        gen_op_load_fpr_FT0(rs1);
2865 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
2866 7e8c2b6c blueswir1
                        gen_op_fcmpes(rd & 3);
2867 0f8a249a blueswir1
                        break;
2868 0f8a249a blueswir1
                    case 0x56: /* fcmped, V9 %fcc */
2869 0f8a249a blueswir1
                        gen_op_load_fpr_DT0(DFPREG(rs1));
2870 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
2871 7e8c2b6c blueswir1
                        gen_op_fcmped(rd & 3);
2872 0f8a249a blueswir1
                        break;
2873 1f587329 blueswir1
                    case 0x57: /* fcmpeq, V9 %fcc */
2874 64a88d5d blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
2875 1f587329 blueswir1
                        gen_op_load_fpr_QT0(QFPREG(rs1));
2876 1f587329 blueswir1
                        gen_op_load_fpr_QT1(QFPREG(rs2));
2877 7e8c2b6c blueswir1
                        gen_op_fcmpeq(rd & 3);
2878 1f587329 blueswir1
                        break;
2879 0f8a249a blueswir1
                    default:
2880 0f8a249a blueswir1
                        goto illegal_insn;
2881 0f8a249a blueswir1
                }
2882 0f8a249a blueswir1
            } else if (xop == 0x2) {
2883 0f8a249a blueswir1
                // clr/mov shortcut
2884 e80cfcfc bellard
2885 e80cfcfc bellard
                rs1 = GET_FIELD(insn, 13, 17);
2886 0f8a249a blueswir1
                if (rs1 == 0) {
2887 1a2fb1c0 blueswir1
                    // or %g0, x, y -> mov T0, x; mov y, T0
2888 0f8a249a blueswir1
                    if (IS_IMM) {       /* immediate */
2889 2ea815ca blueswir1
                        TCGv r_const;
2890 2ea815ca blueswir1
2891 0f8a249a blueswir1
                        rs2 = GET_FIELDs(insn, 19, 31);
2892 2ea815ca blueswir1
                        r_const = tcg_const_tl((int)rs2);
2893 2ea815ca blueswir1
                        gen_movl_TN_reg(rd, r_const);
2894 2ea815ca blueswir1
                        tcg_temp_free(r_const);
2895 0f8a249a blueswir1
                    } else {            /* register */
2896 0f8a249a blueswir1
                        rs2 = GET_FIELD(insn, 27, 31);
2897 6ae20372 blueswir1
                        gen_movl_reg_TN(rs2, cpu_dst);
2898 9c6c6662 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
2899 0f8a249a blueswir1
                    }
2900 0f8a249a blueswir1
                } else {
2901 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
2902 0f8a249a blueswir1
                    if (IS_IMM) {       /* immediate */
2903 0f8a249a blueswir1
                        rs2 = GET_FIELDs(insn, 19, 31);
2904 6ae20372 blueswir1
                        tcg_gen_ori_tl(cpu_dst, cpu_src1, (int)rs2);
2905 9c6c6662 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
2906 0f8a249a blueswir1
                    } else {            /* register */
2907 0f8a249a blueswir1
                        // or x, %g0, y -> mov T1, x; mov y, T1
2908 0f8a249a blueswir1
                        rs2 = GET_FIELD(insn, 27, 31);
2909 0f8a249a blueswir1
                        if (rs2 != 0) {
2910 6ae20372 blueswir1
                            gen_movl_reg_TN(rs2, cpu_src2);
2911 6ae20372 blueswir1
                            tcg_gen_or_tl(cpu_dst, cpu_src1, cpu_src2);
2912 9c6c6662 blueswir1
                            gen_movl_TN_reg(rd, cpu_dst);
2913 6f551262 blueswir1
                        } else
2914 9c6c6662 blueswir1
                            gen_movl_TN_reg(rd, cpu_src1);
2915 0f8a249a blueswir1
                    }
2916 0f8a249a blueswir1
                }
2917 83469015 bellard
#ifdef TARGET_SPARC64
2918 0f8a249a blueswir1
            } else if (xop == 0x25) { /* sll, V9 sllx */
2919 9322a4bf blueswir1
                cpu_src1 = get_src1(insn, cpu_src1);
2920 0f8a249a blueswir1
                if (IS_IMM) {   /* immediate */
2921 83469015 bellard
                    rs2 = GET_FIELDs(insn, 20, 31);
2922 1a2fb1c0 blueswir1
                    if (insn & (1 << 12)) {
2923 6ae20372 blueswir1
                        tcg_gen_shli_i64(cpu_dst, cpu_src1, rs2 & 0x3f);
2924 1a2fb1c0 blueswir1
                    } else {
2925 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_dst, cpu_src1, 0xffffffffULL);
2926 6ae20372 blueswir1
                        tcg_gen_shli_i64(cpu_dst, cpu_dst, rs2 & 0x1f);
2927 1a2fb1c0 blueswir1
                    }
2928 0f8a249a blueswir1
                } else {                /* register */
2929 83469015 bellard
                    rs2 = GET_FIELD(insn, 27, 31);
2930 6ae20372 blueswir1
                    gen_movl_reg_TN(rs2, cpu_src2);
2931 1a2fb1c0 blueswir1
                    if (insn & (1 << 12)) {
2932 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_tmp0, cpu_src2, 0x3f);
2933 6ae20372 blueswir1
                        tcg_gen_shl_i64(cpu_dst, cpu_src1, cpu_tmp0);
2934 1a2fb1c0 blueswir1
                    } else {
2935 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_tmp0, cpu_src2, 0x1f);
2936 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_dst, cpu_src1, 0xffffffffULL);
2937 6ae20372 blueswir1
                        tcg_gen_shl_i64(cpu_dst, cpu_dst, cpu_tmp0);
2938 1a2fb1c0 blueswir1
                    }
2939 83469015 bellard
                }
2940 6ae20372 blueswir1
                gen_movl_TN_reg(rd, cpu_dst);
2941 0f8a249a blueswir1
            } else if (xop == 0x26) { /* srl, V9 srlx */
2942 9322a4bf blueswir1
                cpu_src1 = get_src1(insn, cpu_src1);
2943 0f8a249a blueswir1
                if (IS_IMM) {   /* immediate */
2944 83469015 bellard
                    rs2 = GET_FIELDs(insn, 20, 31);
2945 1a2fb1c0 blueswir1
                    if (insn & (1 << 12)) {
2946 6ae20372 blueswir1
                        tcg_gen_shri_i64(cpu_dst, cpu_src1, rs2 & 0x3f);
2947 1a2fb1c0 blueswir1
                    } else {
2948 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_dst, cpu_src1, 0xffffffffULL);
2949 6ae20372 blueswir1
                        tcg_gen_shri_i64(cpu_dst, cpu_dst, rs2 & 0x1f);
2950 1a2fb1c0 blueswir1
                    }
2951 0f8a249a blueswir1
                } else {                /* register */
2952 83469015 bellard
                    rs2 = GET_FIELD(insn, 27, 31);
2953 6ae20372 blueswir1
                    gen_movl_reg_TN(rs2, cpu_src2);
2954 1a2fb1c0 blueswir1
                    if (insn & (1 << 12)) {
2955 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_tmp0, cpu_src2, 0x3f);
2956 6ae20372 blueswir1
                        tcg_gen_shr_i64(cpu_dst, cpu_src1, cpu_tmp0);
2957 1a2fb1c0 blueswir1
                    } else {
2958 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_tmp0, cpu_src2, 0x1f);
2959 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_dst, cpu_src1, 0xffffffffULL);
2960 6ae20372 blueswir1
                        tcg_gen_shr_i64(cpu_dst, cpu_dst, cpu_tmp0);
2961 1a2fb1c0 blueswir1
                    }
2962 83469015 bellard
                }
2963 6ae20372 blueswir1
                gen_movl_TN_reg(rd, cpu_dst);
2964 0f8a249a blueswir1
            } else if (xop == 0x27) { /* sra, V9 srax */
2965 9322a4bf blueswir1
                cpu_src1 = get_src1(insn, cpu_src1);
2966 0f8a249a blueswir1
                if (IS_IMM) {   /* immediate */
2967 83469015 bellard
                    rs2 = GET_FIELDs(insn, 20, 31);
2968 1a2fb1c0 blueswir1
                    if (insn & (1 << 12)) {
2969 6ae20372 blueswir1
                        tcg_gen_sari_i64(cpu_dst, cpu_src1, rs2 & 0x3f);
2970 1a2fb1c0 blueswir1
                    } else {
2971 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_dst, cpu_src1, 0xffffffffULL);
2972 6ae20372 blueswir1
                        tcg_gen_ext_i32_i64(cpu_dst, cpu_dst);
2973 6ae20372 blueswir1
                        tcg_gen_sari_i64(cpu_dst, cpu_dst, rs2 & 0x1f);
2974 1a2fb1c0 blueswir1
                    }
2975 0f8a249a blueswir1
                } else {                /* register */
2976 83469015 bellard
                    rs2 = GET_FIELD(insn, 27, 31);
2977 6ae20372 blueswir1
                    gen_movl_reg_TN(rs2, cpu_src2);
2978 1a2fb1c0 blueswir1
                    if (insn & (1 << 12)) {
2979 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_tmp0, cpu_src2, 0x3f);
2980 6ae20372 blueswir1
                        tcg_gen_sar_i64(cpu_dst, cpu_src1, cpu_tmp0);
2981 1a2fb1c0 blueswir1
                    } else {
2982 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_tmp0, cpu_src2, 0x1f);
2983 6ae20372 blueswir1
                        tcg_gen_andi_i64(cpu_dst, cpu_src1, 0xffffffffULL);
2984 6ae20372 blueswir1
                        tcg_gen_sar_i64(cpu_dst, cpu_dst, cpu_tmp0);
2985 1a2fb1c0 blueswir1
                    }
2986 83469015 bellard
                }
2987 6ae20372 blueswir1
                gen_movl_TN_reg(rd, cpu_dst);
2988 83469015 bellard
#endif
2989 fcc72045 blueswir1
            } else if (xop < 0x36) {
2990 9322a4bf blueswir1
                cpu_src1 = get_src1(insn, cpu_src1);
2991 a49d9390 blueswir1
                cpu_src2 = get_src2(insn, cpu_src2);
2992 cf495bcf bellard
                if (xop < 0x20) {
2993 cf495bcf bellard
                    switch (xop & ~0x10) {
2994 cf495bcf bellard
                    case 0x0:
2995 cf495bcf bellard
                        if (xop & 0x10)
2996 6ae20372 blueswir1
                            gen_op_add_cc(cpu_dst, cpu_src1, cpu_src2);
2997 cf495bcf bellard
                        else
2998 6ae20372 blueswir1
                            tcg_gen_add_tl(cpu_dst, cpu_src1, cpu_src2);
2999 cf495bcf bellard
                        break;
3000 cf495bcf bellard
                    case 0x1:
3001 6ae20372 blueswir1
                        tcg_gen_and_tl(cpu_dst, cpu_src1, cpu_src2);
3002 cf495bcf bellard
                        if (xop & 0x10)
3003 6ae20372 blueswir1
                            gen_op_logic_cc(cpu_dst);
3004 cf495bcf bellard
                        break;
3005 cf495bcf bellard
                    case 0x2:
3006 6ae20372 blueswir1
                        tcg_gen_or_tl(cpu_dst, cpu_src1, cpu_src2);
3007 0f8a249a blueswir1
                        if (xop & 0x10)
3008 6ae20372 blueswir1
                            gen_op_logic_cc(cpu_dst);
3009 0f8a249a blueswir1
                        break;
3010 cf495bcf bellard
                    case 0x3:
3011 6ae20372 blueswir1
                        tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_src2);
3012 cf495bcf bellard
                        if (xop & 0x10)
3013 6ae20372 blueswir1
                            gen_op_logic_cc(cpu_dst);
3014 cf495bcf bellard
                        break;
3015 cf495bcf bellard
                    case 0x4:
3016 cf495bcf bellard
                        if (xop & 0x10)
3017 6ae20372 blueswir1
                            gen_op_sub_cc(cpu_dst, cpu_src1, cpu_src2);
3018 cf495bcf bellard
                        else
3019 6ae20372 blueswir1
                            tcg_gen_sub_tl(cpu_dst, cpu_src1, cpu_src2);
3020 cf495bcf bellard
                        break;
3021 cf495bcf bellard
                    case 0x5:
3022 6ae20372 blueswir1
                        tcg_gen_xori_tl(cpu_tmp0, cpu_src2, -1);
3023 6ae20372 blueswir1
                        tcg_gen_and_tl(cpu_dst, cpu_src1, cpu_tmp0);
3024 cf495bcf bellard
                        if (xop & 0x10)
3025 6ae20372 blueswir1
                            gen_op_logic_cc(cpu_dst);
3026 cf495bcf bellard
                        break;
3027 cf495bcf bellard
                    case 0x6:
3028 6ae20372 blueswir1
                        tcg_gen_xori_tl(cpu_tmp0, cpu_src2, -1);
3029 6ae20372 blueswir1
                        tcg_gen_or_tl(cpu_dst, cpu_src1, cpu_tmp0);
3030 cf495bcf bellard
                        if (xop & 0x10)
3031 6ae20372 blueswir1
                            gen_op_logic_cc(cpu_dst);
3032 cf495bcf bellard
                        break;
3033 cf495bcf bellard
                    case 0x7:
3034 6ae20372 blueswir1
                        tcg_gen_xori_tl(cpu_tmp0, cpu_src2, -1);
3035 6ae20372 blueswir1
                        tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_tmp0);
3036 cf495bcf bellard
                        if (xop & 0x10)
3037 6ae20372 blueswir1
                            gen_op_logic_cc(cpu_dst);
3038 cf495bcf bellard
                        break;
3039 cf495bcf bellard
                    case 0x8:
3040 cf495bcf bellard
                        if (xop & 0x10)
3041 6ae20372 blueswir1
                            gen_op_addx_cc(cpu_dst, cpu_src1, cpu_src2);
3042 38bc628b blueswir1
                        else {
3043 dc99a3f2 blueswir1
                            gen_mov_reg_C(cpu_tmp0, cpu_psr);
3044 6ae20372 blueswir1
                            tcg_gen_add_tl(cpu_tmp0, cpu_src2, cpu_tmp0);
3045 6ae20372 blueswir1
                            tcg_gen_add_tl(cpu_dst, cpu_src1, cpu_tmp0);
3046 38bc628b blueswir1
                        }
3047 cf495bcf bellard
                        break;
3048 ded3ab80 pbrook
#ifdef TARGET_SPARC64
3049 0f8a249a blueswir1
                    case 0x9: /* V9 mulx */
3050 6ae20372 blueswir1
                        tcg_gen_mul_i64(cpu_dst, cpu_src1, cpu_src2);
3051 ded3ab80 pbrook
                        break;
3052 ded3ab80 pbrook
#endif
3053 cf495bcf bellard
                    case 0xa:
3054 64a88d5d blueswir1
                        CHECK_IU_FEATURE(dc, MUL);
3055 6ae20372 blueswir1
                        gen_op_umul(cpu_dst, cpu_src1, cpu_src2);
3056 cf495bcf bellard
                        if (xop & 0x10)
3057 6ae20372 blueswir1
                            gen_op_logic_cc(cpu_dst);
3058 cf495bcf bellard
                        break;
3059 cf495bcf bellard
                    case 0xb:
3060 64a88d5d blueswir1
                        CHECK_IU_FEATURE(dc, MUL);
3061 6ae20372 blueswir1
                        gen_op_smul(cpu_dst, cpu_src1, cpu_src2);
3062 cf495bcf bellard
                        if (xop & 0x10)
3063 6ae20372 blueswir1
                            gen_op_logic_cc(cpu_dst);
3064 cf495bcf bellard
                        break;
3065 cf495bcf bellard
                    case 0xc:
3066 cf495bcf bellard
                        if (xop & 0x10)
3067 6ae20372 blueswir1
                            gen_op_subx_cc(cpu_dst, cpu_src1, cpu_src2);
3068 38bc628b blueswir1
                        else {
3069 dc99a3f2 blueswir1
                            gen_mov_reg_C(cpu_tmp0, cpu_psr);
3070 6ae20372 blueswir1
                            tcg_gen_add_tl(cpu_tmp0, cpu_src2, cpu_tmp0);
3071 6ae20372 blueswir1
                            tcg_gen_sub_tl(cpu_dst, cpu_src1, cpu_tmp0);
3072 38bc628b blueswir1
                        }
3073 cf495bcf bellard
                        break;
3074 ded3ab80 pbrook
#ifdef TARGET_SPARC64
3075 0f8a249a blueswir1
                    case 0xd: /* V9 udivx */
3076 07bf2857 blueswir1
                        tcg_gen_mov_tl(cpu_cc_src, cpu_src1);
3077 07bf2857 blueswir1
                        tcg_gen_mov_tl(cpu_cc_src2, cpu_src2);
3078 07bf2857 blueswir1
                        gen_trap_ifdivzero_tl(cpu_cc_src2);
3079 07bf2857 blueswir1
                        tcg_gen_divu_i64(cpu_dst, cpu_cc_src, cpu_cc_src2);
3080 ded3ab80 pbrook
                        break;
3081 ded3ab80 pbrook
#endif
3082 cf495bcf bellard
                    case 0xe:
3083 64a88d5d blueswir1
                        CHECK_IU_FEATURE(dc, DIV);
3084 77f193da blueswir1
                        tcg_gen_helper_1_2(helper_udiv, cpu_dst, cpu_src1,
3085 77f193da blueswir1
                                           cpu_src2);
3086 cf495bcf bellard
                        if (xop & 0x10)
3087 6ae20372 blueswir1
                            gen_op_div_cc(cpu_dst);
3088 cf495bcf bellard
                        break;
3089 cf495bcf bellard
                    case 0xf:
3090 64a88d5d blueswir1
                        CHECK_IU_FEATURE(dc, DIV);
3091 77f193da blueswir1
                        tcg_gen_helper_1_2(helper_sdiv, cpu_dst, cpu_src1,
3092 77f193da blueswir1
                                           cpu_src2);
3093 cf495bcf bellard
                        if (xop & 0x10)
3094 6ae20372 blueswir1
                            gen_op_div_cc(cpu_dst);
3095 cf495bcf bellard
                        break;
3096 cf495bcf bellard
                    default:
3097 cf495bcf bellard
                        goto illegal_insn;
3098 cf495bcf bellard
                    }
3099 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
3100 cf495bcf bellard
                } else {
3101 cf495bcf bellard
                    switch (xop) {
3102 0f8a249a blueswir1
                    case 0x20: /* taddcc */
3103 6ae20372 blueswir1
                        gen_op_tadd_cc(cpu_dst, cpu_src1, cpu_src2);
3104 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3105 0f8a249a blueswir1
                        break;
3106 0f8a249a blueswir1
                    case 0x21: /* tsubcc */
3107 6ae20372 blueswir1
                        gen_op_tsub_cc(cpu_dst, cpu_src1, cpu_src2);
3108 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3109 0f8a249a blueswir1
                        break;
3110 0f8a249a blueswir1
                    case 0x22: /* taddcctv */
3111 6ae20372 blueswir1
                        save_state(dc, cpu_cond);
3112 6ae20372 blueswir1
                        gen_op_tadd_ccTV(cpu_dst, cpu_src1, cpu_src2);
3113 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3114 0f8a249a blueswir1
                        break;
3115 0f8a249a blueswir1
                    case 0x23: /* tsubcctv */
3116 6ae20372 blueswir1
                        save_state(dc, cpu_cond);
3117 6ae20372 blueswir1
                        gen_op_tsub_ccTV(cpu_dst, cpu_src1, cpu_src2);
3118 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3119 0f8a249a blueswir1
                        break;
3120 cf495bcf bellard
                    case 0x24: /* mulscc */
3121 6ae20372 blueswir1
                        gen_op_mulscc(cpu_dst, cpu_src1, cpu_src2);
3122 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3123 cf495bcf bellard
                        break;
3124 83469015 bellard
#ifndef TARGET_SPARC64
3125 0f8a249a blueswir1
                    case 0x25:  /* sll */
3126 e35298cd blueswir1
                        if (IS_IMM) { /* immediate */
3127 e35298cd blueswir1
                            rs2 = GET_FIELDs(insn, 20, 31);
3128 e35298cd blueswir1
                            tcg_gen_shli_tl(cpu_dst, cpu_src1, rs2 & 0x1f);
3129 e35298cd blueswir1
                        } else { /* register */
3130 e35298cd blueswir1
                            tcg_gen_andi_tl(cpu_tmp0, cpu_src2, 0x1f);
3131 e35298cd blueswir1
                            tcg_gen_shl_tl(cpu_dst, cpu_src1, cpu_tmp0);
3132 e35298cd blueswir1
                        }
3133 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3134 cf495bcf bellard
                        break;
3135 83469015 bellard
                    case 0x26:  /* srl */
3136 e35298cd blueswir1
                        if (IS_IMM) { /* immediate */
3137 e35298cd blueswir1
                            rs2 = GET_FIELDs(insn, 20, 31);
3138 e35298cd blueswir1
                            tcg_gen_shri_tl(cpu_dst, cpu_src1, rs2 & 0x1f);
3139 e35298cd blueswir1
                        } else { /* register */
3140 e35298cd blueswir1
                            tcg_gen_andi_tl(cpu_tmp0, cpu_src2, 0x1f);
3141 e35298cd blueswir1
                            tcg_gen_shr_tl(cpu_dst, cpu_src1, cpu_tmp0);
3142 e35298cd blueswir1
                        }
3143 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3144 cf495bcf bellard
                        break;
3145 83469015 bellard
                    case 0x27:  /* sra */
3146 e35298cd blueswir1
                        if (IS_IMM) { /* immediate */
3147 e35298cd blueswir1
                            rs2 = GET_FIELDs(insn, 20, 31);
3148 e35298cd blueswir1
                            tcg_gen_sari_tl(cpu_dst, cpu_src1, rs2 & 0x1f);
3149 e35298cd blueswir1
                        } else { /* register */
3150 e35298cd blueswir1
                            tcg_gen_andi_tl(cpu_tmp0, cpu_src2, 0x1f);
3151 e35298cd blueswir1
                            tcg_gen_sar_tl(cpu_dst, cpu_src1, cpu_tmp0);
3152 e35298cd blueswir1
                        }
3153 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3154 cf495bcf bellard
                        break;
3155 83469015 bellard
#endif
3156 cf495bcf bellard
                    case 0x30:
3157 cf495bcf bellard
                        {
3158 cf495bcf bellard
                            switch(rd) {
3159 3475187d bellard
                            case 0: /* wry */
3160 ece43b8d blueswir1
                                tcg_gen_xor_tl(cpu_tmp0, cpu_src1, cpu_src2);
3161 ece43b8d blueswir1
                                tcg_gen_st_tl(cpu_tmp0, cpu_env,
3162 77f193da blueswir1
                                              offsetof(CPUSPARCState, y));
3163 cf495bcf bellard
                                break;
3164 65fe7b09 blueswir1
#ifndef TARGET_SPARC64
3165 65fe7b09 blueswir1
                            case 0x01 ... 0x0f: /* undefined in the
3166 65fe7b09 blueswir1
                                                   SPARCv8 manual, nop
3167 65fe7b09 blueswir1
                                                   on the microSPARC
3168 65fe7b09 blueswir1
                                                   II */
3169 65fe7b09 blueswir1
                            case 0x10 ... 0x1f: /* implementation-dependent
3170 65fe7b09 blueswir1
                                                   in the SPARCv8
3171 65fe7b09 blueswir1
                                                   manual, nop on the
3172 65fe7b09 blueswir1
                                                   microSPARC II */
3173 65fe7b09 blueswir1
                                break;
3174 65fe7b09 blueswir1
#else
3175 0f8a249a blueswir1
                            case 0x2: /* V9 wrccr */
3176 6ae20372 blueswir1
                                tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_src2);
3177 6ae20372 blueswir1
                                tcg_gen_helper_0_1(helper_wrccr, cpu_dst);
3178 0f8a249a blueswir1
                                break;
3179 0f8a249a blueswir1
                            case 0x3: /* V9 wrasi */
3180 6ae20372 blueswir1
                                tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_src2);
3181 6ae20372 blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_dst);
3182 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3183 77f193da blueswir1
                                               offsetof(CPUSPARCState, asi));
3184 0f8a249a blueswir1
                                break;
3185 0f8a249a blueswir1
                            case 0x6: /* V9 wrfprs */
3186 6ae20372 blueswir1
                                tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_src2);
3187 6ae20372 blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_dst);
3188 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3189 77f193da blueswir1
                                               offsetof(CPUSPARCState, fprs));
3190 6ae20372 blueswir1
                                save_state(dc, cpu_cond);
3191 3299908c blueswir1
                                gen_op_next_insn();
3192 57fec1fe bellard
                                tcg_gen_exit_tb(0);
3193 3299908c blueswir1
                                dc->is_br = 1;
3194 0f8a249a blueswir1
                                break;
3195 0f8a249a blueswir1
                            case 0xf: /* V9 sir, nop if user */
3196 3475187d bellard
#if !defined(CONFIG_USER_ONLY)
3197 0f8a249a blueswir1
                                if (supervisor(dc))
3198 1a2fb1c0 blueswir1
                                    ; // XXX
3199 3475187d bellard
#endif
3200 0f8a249a blueswir1
                                break;
3201 0f8a249a blueswir1
                            case 0x13: /* Graphics Status */
3202 6ae20372 blueswir1
                                if (gen_trap_ifnofpu(dc, cpu_cond))
3203 725cb90b bellard
                                    goto jmp_insn;
3204 ece43b8d blueswir1
                                tcg_gen_xor_tl(cpu_tmp0, cpu_src1, cpu_src2);
3205 ece43b8d blueswir1
                                tcg_gen_st_tl(cpu_tmp0, cpu_env,
3206 77f193da blueswir1
                                              offsetof(CPUSPARCState, gsr));
3207 0f8a249a blueswir1
                                break;
3208 0f8a249a blueswir1
                            case 0x17: /* Tick compare */
3209 83469015 bellard
#if !defined(CONFIG_USER_ONLY)
3210 0f8a249a blueswir1
                                if (!supervisor(dc))
3211 0f8a249a blueswir1
                                    goto illegal_insn;
3212 83469015 bellard
#endif
3213 ccd4a219 blueswir1
                                {
3214 ccd4a219 blueswir1
                                    TCGv r_tickptr;
3215 ccd4a219 blueswir1
3216 ece43b8d blueswir1
                                    tcg_gen_xor_tl(cpu_tmp0, cpu_src1,
3217 6ae20372 blueswir1
                                                   cpu_src2);
3218 ece43b8d blueswir1
                                    tcg_gen_st_tl(cpu_tmp0, cpu_env,
3219 77f193da blueswir1
                                                  offsetof(CPUSPARCState,
3220 77f193da blueswir1
                                                           tick_cmpr));
3221 ccd4a219 blueswir1
                                    r_tickptr = tcg_temp_new(TCG_TYPE_PTR);
3222 ccd4a219 blueswir1
                                    tcg_gen_ld_ptr(r_tickptr, cpu_env,
3223 ccd4a219 blueswir1
                                                   offsetof(CPUState, tick));
3224 ccd4a219 blueswir1
                                    tcg_gen_helper_0_2(helper_tick_set_limit,
3225 ece43b8d blueswir1
                                                       r_tickptr, cpu_tmp0);
3226 2ea815ca blueswir1
                                    tcg_temp_free(r_tickptr);
3227 ccd4a219 blueswir1
                                }
3228 0f8a249a blueswir1
                                break;
3229 0f8a249a blueswir1
                            case 0x18: /* System tick */
3230 83469015 bellard
#if !defined(CONFIG_USER_ONLY)
3231 0f8a249a blueswir1
                                if (!supervisor(dc))
3232 0f8a249a blueswir1
                                    goto illegal_insn;
3233 83469015 bellard
#endif
3234 ccd4a219 blueswir1
                                {
3235 ccd4a219 blueswir1
                                    TCGv r_tickptr;
3236 ccd4a219 blueswir1
3237 6ae20372 blueswir1
                                    tcg_gen_xor_tl(cpu_dst, cpu_src1,
3238 6ae20372 blueswir1
                                                   cpu_src2);
3239 ccd4a219 blueswir1
                                    r_tickptr = tcg_temp_new(TCG_TYPE_PTR);
3240 ccd4a219 blueswir1
                                    tcg_gen_ld_ptr(r_tickptr, cpu_env,
3241 ccd4a219 blueswir1
                                                   offsetof(CPUState, stick));
3242 ccd4a219 blueswir1
                                    tcg_gen_helper_0_2(helper_tick_set_count,
3243 6ae20372 blueswir1
                                                       r_tickptr, cpu_dst);
3244 2ea815ca blueswir1
                                    tcg_temp_free(r_tickptr);
3245 ccd4a219 blueswir1
                                }
3246 0f8a249a blueswir1
                                break;
3247 0f8a249a blueswir1
                            case 0x19: /* System tick compare */
3248 83469015 bellard
#if !defined(CONFIG_USER_ONLY)
3249 0f8a249a blueswir1
                                if (!supervisor(dc))
3250 0f8a249a blueswir1
                                    goto illegal_insn;
3251 3475187d bellard
#endif
3252 ccd4a219 blueswir1
                                {
3253 ccd4a219 blueswir1
                                    TCGv r_tickptr;
3254 ccd4a219 blueswir1
3255 ece43b8d blueswir1
                                    tcg_gen_xor_tl(cpu_tmp0, cpu_src1,
3256 6ae20372 blueswir1
                                                   cpu_src2);
3257 ece43b8d blueswir1
                                    tcg_gen_st_tl(cpu_tmp0, cpu_env,
3258 77f193da blueswir1
                                                  offsetof(CPUSPARCState,
3259 77f193da blueswir1
                                                           stick_cmpr));
3260 ccd4a219 blueswir1
                                    r_tickptr = tcg_temp_new(TCG_TYPE_PTR);
3261 ccd4a219 blueswir1
                                    tcg_gen_ld_ptr(r_tickptr, cpu_env,
3262 ccd4a219 blueswir1
                                                   offsetof(CPUState, stick));
3263 ccd4a219 blueswir1
                                    tcg_gen_helper_0_2(helper_tick_set_limit,
3264 ece43b8d blueswir1
                                                       r_tickptr, cpu_tmp0);
3265 2ea815ca blueswir1
                                    tcg_temp_free(r_tickptr);
3266 ccd4a219 blueswir1
                                }
3267 0f8a249a blueswir1
                                break;
3268 83469015 bellard
3269 0f8a249a blueswir1
                            case 0x10: /* Performance Control */
3270 77f193da blueswir1
                            case 0x11: /* Performance Instrumentation
3271 77f193da blueswir1
                                          Counter */
3272 0f8a249a blueswir1
                            case 0x12: /* Dispatch Control */
3273 0f8a249a blueswir1
                            case 0x14: /* Softint set */
3274 0f8a249a blueswir1
                            case 0x15: /* Softint clear */
3275 0f8a249a blueswir1
                            case 0x16: /* Softint write */
3276 83469015 bellard
#endif
3277 3475187d bellard
                            default:
3278 cf495bcf bellard
                                goto illegal_insn;
3279 cf495bcf bellard
                            }
3280 cf495bcf bellard
                        }
3281 cf495bcf bellard
                        break;
3282 e8af50a3 bellard
#if !defined(CONFIG_USER_ONLY)
3283 af7bf89b bellard
                    case 0x31: /* wrpsr, V9 saved, restored */
3284 e8af50a3 bellard
                        {
3285 0f8a249a blueswir1
                            if (!supervisor(dc))
3286 0f8a249a blueswir1
                                goto priv_insn;
3287 3475187d bellard
#ifdef TARGET_SPARC64
3288 0f8a249a blueswir1
                            switch (rd) {
3289 0f8a249a blueswir1
                            case 0:
3290 72a9747b blueswir1
                                tcg_gen_helper_0_0(helper_saved);
3291 0f8a249a blueswir1
                                break;
3292 0f8a249a blueswir1
                            case 1:
3293 72a9747b blueswir1
                                tcg_gen_helper_0_0(helper_restored);
3294 0f8a249a blueswir1
                                break;
3295 e9ebed4d blueswir1
                            case 2: /* UA2005 allclean */
3296 e9ebed4d blueswir1
                            case 3: /* UA2005 otherw */
3297 e9ebed4d blueswir1
                            case 4: /* UA2005 normalw */
3298 e9ebed4d blueswir1
                            case 5: /* UA2005 invalw */
3299 e9ebed4d blueswir1
                                // XXX
3300 0f8a249a blueswir1
                            default:
3301 3475187d bellard
                                goto illegal_insn;
3302 3475187d bellard
                            }
3303 3475187d bellard
#else
3304 6ae20372 blueswir1
                            tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_src2);
3305 6ae20372 blueswir1
                            tcg_gen_helper_0_1(helper_wrpsr, cpu_dst);
3306 6ae20372 blueswir1
                            save_state(dc, cpu_cond);
3307 9e61bde5 bellard
                            gen_op_next_insn();
3308 57fec1fe bellard
                            tcg_gen_exit_tb(0);
3309 0f8a249a blueswir1
                            dc->is_br = 1;
3310 3475187d bellard
#endif
3311 e8af50a3 bellard
                        }
3312 e8af50a3 bellard
                        break;
3313 af7bf89b bellard
                    case 0x32: /* wrwim, V9 wrpr */
3314 e8af50a3 bellard
                        {
3315 0f8a249a blueswir1
                            if (!supervisor(dc))
3316 0f8a249a blueswir1
                                goto priv_insn;
3317 ece43b8d blueswir1
                            tcg_gen_xor_tl(cpu_tmp0, cpu_src1, cpu_src2);
3318 3475187d bellard
#ifdef TARGET_SPARC64
3319 0f8a249a blueswir1
                            switch (rd) {
3320 0f8a249a blueswir1
                            case 0: // tpc
3321 375ee38b blueswir1
                                {
3322 375ee38b blueswir1
                                    TCGv r_tsptr;
3323 375ee38b blueswir1
3324 375ee38b blueswir1
                                    r_tsptr = tcg_temp_new(TCG_TYPE_PTR);
3325 375ee38b blueswir1
                                    tcg_gen_ld_ptr(r_tsptr, cpu_env,
3326 375ee38b blueswir1
                                                   offsetof(CPUState, tsptr));
3327 ece43b8d blueswir1
                                    tcg_gen_st_tl(cpu_tmp0, r_tsptr,
3328 375ee38b blueswir1
                                                  offsetof(trap_state, tpc));
3329 2ea815ca blueswir1
                                    tcg_temp_free(r_tsptr);
3330 375ee38b blueswir1
                                }
3331 0f8a249a blueswir1
                                break;
3332 0f8a249a blueswir1
                            case 1: // tnpc
3333 375ee38b blueswir1
                                {
3334 375ee38b blueswir1
                                    TCGv r_tsptr;
3335 375ee38b blueswir1
3336 375ee38b blueswir1
                                    r_tsptr = tcg_temp_new(TCG_TYPE_PTR);
3337 375ee38b blueswir1
                                    tcg_gen_ld_ptr(r_tsptr, cpu_env,
3338 375ee38b blueswir1
                                                   offsetof(CPUState, tsptr));
3339 ece43b8d blueswir1
                                    tcg_gen_st_tl(cpu_tmp0, r_tsptr,
3340 375ee38b blueswir1
                                                  offsetof(trap_state, tnpc));
3341 2ea815ca blueswir1
                                    tcg_temp_free(r_tsptr);
3342 375ee38b blueswir1
                                }
3343 0f8a249a blueswir1
                                break;
3344 0f8a249a blueswir1
                            case 2: // tstate
3345 375ee38b blueswir1
                                {
3346 375ee38b blueswir1
                                    TCGv r_tsptr;
3347 375ee38b blueswir1
3348 375ee38b blueswir1
                                    r_tsptr = tcg_temp_new(TCG_TYPE_PTR);
3349 375ee38b blueswir1
                                    tcg_gen_ld_ptr(r_tsptr, cpu_env,
3350 375ee38b blueswir1
                                                   offsetof(CPUState, tsptr));
3351 ece43b8d blueswir1
                                    tcg_gen_st_tl(cpu_tmp0, r_tsptr,
3352 77f193da blueswir1
                                                  offsetof(trap_state,
3353 77f193da blueswir1
                                                           tstate));
3354 2ea815ca blueswir1
                                    tcg_temp_free(r_tsptr);
3355 375ee38b blueswir1
                                }
3356 0f8a249a blueswir1
                                break;
3357 0f8a249a blueswir1
                            case 3: // tt
3358 375ee38b blueswir1
                                {
3359 375ee38b blueswir1
                                    TCGv r_tsptr;
3360 375ee38b blueswir1
3361 375ee38b blueswir1
                                    r_tsptr = tcg_temp_new(TCG_TYPE_PTR);
3362 375ee38b blueswir1
                                    tcg_gen_ld_ptr(r_tsptr, cpu_env,
3363 375ee38b blueswir1
                                                   offsetof(CPUState, tsptr));
3364 ece43b8d blueswir1
                                    tcg_gen_st_i32(cpu_tmp0, r_tsptr,
3365 375ee38b blueswir1
                                                   offsetof(trap_state, tt));
3366 2ea815ca blueswir1
                                    tcg_temp_free(r_tsptr);
3367 375ee38b blueswir1
                                }
3368 0f8a249a blueswir1
                                break;
3369 0f8a249a blueswir1
                            case 4: // tick
3370 ccd4a219 blueswir1
                                {
3371 ccd4a219 blueswir1
                                    TCGv r_tickptr;
3372 ccd4a219 blueswir1
3373 ccd4a219 blueswir1
                                    r_tickptr = tcg_temp_new(TCG_TYPE_PTR);
3374 ccd4a219 blueswir1
                                    tcg_gen_ld_ptr(r_tickptr, cpu_env,
3375 ccd4a219 blueswir1
                                                   offsetof(CPUState, tick));
3376 ccd4a219 blueswir1
                                    tcg_gen_helper_0_2(helper_tick_set_count,
3377 ece43b8d blueswir1
                                                       r_tickptr, cpu_tmp0);
3378 2ea815ca blueswir1
                                    tcg_temp_free(r_tickptr);
3379 ccd4a219 blueswir1
                                }
3380 0f8a249a blueswir1
                                break;
3381 0f8a249a blueswir1
                            case 5: // tba
3382 ece43b8d blueswir1
                                tcg_gen_st_tl(cpu_tmp0, cpu_env,
3383 77f193da blueswir1
                                              offsetof(CPUSPARCState, tbr));
3384 0f8a249a blueswir1
                                break;
3385 0f8a249a blueswir1
                            case 6: // pstate
3386 6ae20372 blueswir1
                                save_state(dc, cpu_cond);
3387 ece43b8d blueswir1
                                tcg_gen_helper_0_1(helper_wrpstate, cpu_tmp0);
3388 ded3ab80 pbrook
                                gen_op_next_insn();
3389 57fec1fe bellard
                                tcg_gen_exit_tb(0);
3390 ded3ab80 pbrook
                                dc->is_br = 1;
3391 0f8a249a blueswir1
                                break;
3392 0f8a249a blueswir1
                            case 7: // tl
3393 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3394 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3395 77f193da blueswir1
                                               offsetof(CPUSPARCState, tl));
3396 0f8a249a blueswir1
                                break;
3397 0f8a249a blueswir1
                            case 8: // pil
3398 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3399 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3400 77f193da blueswir1
                                               offsetof(CPUSPARCState,
3401 77f193da blueswir1
                                                        psrpil));
3402 0f8a249a blueswir1
                                break;
3403 0f8a249a blueswir1
                            case 9: // cwp
3404 ece43b8d blueswir1
                                tcg_gen_helper_0_1(helper_wrcwp, cpu_tmp0);
3405 0f8a249a blueswir1
                                break;
3406 0f8a249a blueswir1
                            case 10: // cansave
3407 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3408 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3409 77f193da blueswir1
                                               offsetof(CPUSPARCState,
3410 77f193da blueswir1
                                                        cansave));
3411 0f8a249a blueswir1
                                break;
3412 0f8a249a blueswir1
                            case 11: // canrestore
3413 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3414 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3415 77f193da blueswir1
                                               offsetof(CPUSPARCState,
3416 77f193da blueswir1
                                                        canrestore));
3417 0f8a249a blueswir1
                                break;
3418 0f8a249a blueswir1
                            case 12: // cleanwin
3419 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3420 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3421 77f193da blueswir1
                                               offsetof(CPUSPARCState,
3422 77f193da blueswir1
                                                        cleanwin));
3423 0f8a249a blueswir1
                                break;
3424 0f8a249a blueswir1
                            case 13: // otherwin
3425 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3426 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3427 77f193da blueswir1
                                               offsetof(CPUSPARCState,
3428 77f193da blueswir1
                                                        otherwin));
3429 0f8a249a blueswir1
                                break;
3430 0f8a249a blueswir1
                            case 14: // wstate
3431 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3432 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3433 77f193da blueswir1
                                               offsetof(CPUSPARCState,
3434 77f193da blueswir1
                                                        wstate));
3435 0f8a249a blueswir1
                                break;
3436 e9ebed4d blueswir1
                            case 16: // UA2005 gl
3437 fb79ceb9 blueswir1
                                CHECK_IU_FEATURE(dc, GL);
3438 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3439 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3440 77f193da blueswir1
                                               offsetof(CPUSPARCState, gl));
3441 e9ebed4d blueswir1
                                break;
3442 e9ebed4d blueswir1
                            case 26: // UA2005 strand status
3443 fb79ceb9 blueswir1
                                CHECK_IU_FEATURE(dc, HYPV);
3444 e9ebed4d blueswir1
                                if (!hypervisor(dc))
3445 e9ebed4d blueswir1
                                    goto priv_insn;
3446 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3447 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3448 77f193da blueswir1
                                               offsetof(CPUSPARCState, ssr));
3449 e9ebed4d blueswir1
                                break;
3450 0f8a249a blueswir1
                            default:
3451 0f8a249a blueswir1
                                goto illegal_insn;
3452 0f8a249a blueswir1
                            }
3453 3475187d bellard
#else
3454 ece43b8d blueswir1
                            tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3455 77f193da blueswir1
                            tcg_gen_st_i32(cpu_tmp32, cpu_env,
3456 77f193da blueswir1
                                           offsetof(CPUSPARCState, wim));
3457 3475187d bellard
#endif
3458 e8af50a3 bellard
                        }
3459 e8af50a3 bellard
                        break;
3460 e9ebed4d blueswir1
                    case 0x33: /* wrtbr, UA2005 wrhpr */
3461 e8af50a3 bellard
                        {
3462 e9ebed4d blueswir1
#ifndef TARGET_SPARC64
3463 0f8a249a blueswir1
                            if (!supervisor(dc))
3464 0f8a249a blueswir1
                                goto priv_insn;
3465 ece43b8d blueswir1
                            tcg_gen_xor_tl(cpu_tmp0, cpu_src1, cpu_src2);
3466 ece43b8d blueswir1
                            tcg_gen_st_tl(cpu_tmp0, cpu_env,
3467 77f193da blueswir1
                                          offsetof(CPUSPARCState, tbr));
3468 e9ebed4d blueswir1
#else
3469 fb79ceb9 blueswir1
                            CHECK_IU_FEATURE(dc, HYPV);
3470 e9ebed4d blueswir1
                            if (!hypervisor(dc))
3471 e9ebed4d blueswir1
                                goto priv_insn;
3472 ece43b8d blueswir1
                            tcg_gen_xor_tl(cpu_tmp0, cpu_src1, cpu_src2);
3473 e9ebed4d blueswir1
                            switch (rd) {
3474 e9ebed4d blueswir1
                            case 0: // hpstate
3475 e9ebed4d blueswir1
                                // XXX gen_op_wrhpstate();
3476 6ae20372 blueswir1
                                save_state(dc, cpu_cond);
3477 e9ebed4d blueswir1
                                gen_op_next_insn();
3478 57fec1fe bellard
                                tcg_gen_exit_tb(0);
3479 e9ebed4d blueswir1
                                dc->is_br = 1;
3480 e9ebed4d blueswir1
                                break;
3481 e9ebed4d blueswir1
                            case 1: // htstate
3482 e9ebed4d blueswir1
                                // XXX gen_op_wrhtstate();
3483 e9ebed4d blueswir1
                                break;
3484 e9ebed4d blueswir1
                            case 3: // hintp
3485 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3486 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3487 77f193da blueswir1
                                               offsetof(CPUSPARCState, hintp));
3488 e9ebed4d blueswir1
                                break;
3489 e9ebed4d blueswir1
                            case 5: // htba
3490 ece43b8d blueswir1
                                tcg_gen_trunc_tl_i32(cpu_tmp32, cpu_tmp0);
3491 77f193da blueswir1
                                tcg_gen_st_i32(cpu_tmp32, cpu_env,
3492 77f193da blueswir1
                                               offsetof(CPUSPARCState, htba));
3493 e9ebed4d blueswir1
                                break;
3494 e9ebed4d blueswir1
                            case 31: // hstick_cmpr
3495 ccd4a219 blueswir1
                                {
3496 ccd4a219 blueswir1
                                    TCGv r_tickptr;
3497 ccd4a219 blueswir1
3498 ece43b8d blueswir1
                                    tcg_gen_st_tl(cpu_tmp0, cpu_env,
3499 77f193da blueswir1
                                                  offsetof(CPUSPARCState,
3500 77f193da blueswir1
                                                           hstick_cmpr));
3501 ccd4a219 blueswir1
                                    r_tickptr = tcg_temp_new(TCG_TYPE_PTR);
3502 ccd4a219 blueswir1
                                    tcg_gen_ld_ptr(r_tickptr, cpu_env,
3503 ccd4a219 blueswir1
                                                   offsetof(CPUState, hstick));
3504 ccd4a219 blueswir1
                                    tcg_gen_helper_0_2(helper_tick_set_limit,
3505 ece43b8d blueswir1
                                                       r_tickptr, cpu_tmp0);
3506 2ea815ca blueswir1
                                    tcg_temp_free(r_tickptr);
3507 ccd4a219 blueswir1
                                }
3508 e9ebed4d blueswir1
                                break;
3509 e9ebed4d blueswir1
                            case 6: // hver readonly
3510 e9ebed4d blueswir1
                            default:
3511 e9ebed4d blueswir1
                                goto illegal_insn;
3512 e9ebed4d blueswir1
                            }
3513 e9ebed4d blueswir1
#endif
3514 e8af50a3 bellard
                        }
3515 e8af50a3 bellard
                        break;
3516 e8af50a3 bellard
#endif
3517 3475187d bellard
#ifdef TARGET_SPARC64
3518 0f8a249a blueswir1
                    case 0x2c: /* V9 movcc */
3519 0f8a249a blueswir1
                        {
3520 0f8a249a blueswir1
                            int cc = GET_FIELD_SP(insn, 11, 12);
3521 0f8a249a blueswir1
                            int cond = GET_FIELD_SP(insn, 14, 17);
3522 748b9d8e blueswir1
                            TCGv r_cond;
3523 00f219bf blueswir1
                            int l1;
3524 00f219bf blueswir1
3525 748b9d8e blueswir1
                            r_cond = tcg_temp_new(TCG_TYPE_TL);
3526 0f8a249a blueswir1
                            if (insn & (1 << 18)) {
3527 0f8a249a blueswir1
                                if (cc == 0)
3528 748b9d8e blueswir1
                                    gen_cond(r_cond, 0, cond);
3529 0f8a249a blueswir1
                                else if (cc == 2)
3530 748b9d8e blueswir1
                                    gen_cond(r_cond, 1, cond);
3531 0f8a249a blueswir1
                                else
3532 0f8a249a blueswir1
                                    goto illegal_insn;
3533 0f8a249a blueswir1
                            } else {
3534 748b9d8e blueswir1
                                gen_fcond(r_cond, cc, cond);
3535 0f8a249a blueswir1
                            }
3536 00f219bf blueswir1
3537 00f219bf blueswir1
                            l1 = gen_new_label();
3538 00f219bf blueswir1
3539 cb63669a pbrook
                            tcg_gen_brcondi_tl(TCG_COND_EQ, r_cond, 0, l1);
3540 00f219bf blueswir1
                            if (IS_IMM) {       /* immediate */
3541 2ea815ca blueswir1
                                TCGv r_const;
3542 2ea815ca blueswir1
3543 00f219bf blueswir1
                                rs2 = GET_FIELD_SPs(insn, 0, 10);
3544 2ea815ca blueswir1
                                r_const = tcg_const_tl((int)rs2);
3545 2ea815ca blueswir1
                                gen_movl_TN_reg(rd, r_const);
3546 2ea815ca blueswir1
                                tcg_temp_free(r_const);
3547 00f219bf blueswir1
                            } else {
3548 00f219bf blueswir1
                                rs2 = GET_FIELD_SP(insn, 0, 4);
3549 9c6c6662 blueswir1
                                gen_movl_reg_TN(rs2, cpu_tmp0);
3550 9c6c6662 blueswir1
                                gen_movl_TN_reg(rd, cpu_tmp0);
3551 00f219bf blueswir1
                            }
3552 00f219bf blueswir1
                            gen_set_label(l1);
3553 2ea815ca blueswir1
                            tcg_temp_free(r_cond);
3554 0f8a249a blueswir1
                            break;
3555 0f8a249a blueswir1
                        }
3556 0f8a249a blueswir1
                    case 0x2d: /* V9 sdivx */
3557 6ae20372 blueswir1
                        gen_op_sdivx(cpu_dst, cpu_src1, cpu_src2);
3558 6ae20372 blueswir1
                        gen_movl_TN_reg(rd, cpu_dst);
3559 0f8a249a blueswir1
                        break;
3560 0f8a249a blueswir1
                    case 0x2e: /* V9 popc */
3561 0f8a249a blueswir1
                        {
3562 a49d9390 blueswir1
                            cpu_src2 = get_src2(insn, cpu_src2);
3563 6ae20372 blueswir1
                            tcg_gen_helper_1_1(helper_popc, cpu_dst,
3564 6ae20372 blueswir1
                                               cpu_src2);
3565 6ae20372 blueswir1
                            gen_movl_TN_reg(rd, cpu_dst);
3566 0f8a249a blueswir1
                        }
3567 0f8a249a blueswir1
                    case 0x2f: /* V9 movr */
3568 0f8a249a blueswir1
                        {
3569 0f8a249a blueswir1
                            int cond = GET_FIELD_SP(insn, 10, 12);
3570 00f219bf blueswir1
                            int l1;
3571 00f219bf blueswir1
3572 9322a4bf blueswir1
                            cpu_src1 = get_src1(insn, cpu_src1);
3573 00f219bf blueswir1
3574 00f219bf blueswir1
                            l1 = gen_new_label();
3575 00f219bf blueswir1
3576 cb63669a pbrook
                            tcg_gen_brcondi_tl(gen_tcg_cond_reg[cond],
3577 cb63669a pbrook
                                              cpu_src1, 0, l1);
3578 0f8a249a blueswir1
                            if (IS_IMM) {       /* immediate */
3579 2ea815ca blueswir1
                                TCGv r_const;
3580 2ea815ca blueswir1
3581 0f8a249a blueswir1
                                rs2 = GET_FIELD_SPs(insn, 0, 9);
3582 2ea815ca blueswir1
                                r_const = tcg_const_tl((int)rs2);
3583 2ea815ca blueswir1
                                gen_movl_TN_reg(rd, r_const);
3584 2ea815ca blueswir1
                                tcg_temp_free(r_const);
3585 00f219bf blueswir1
                            } else {
3586 0f8a249a blueswir1
                                rs2 = GET_FIELD_SP(insn, 0, 4);
3587 9c6c6662 blueswir1
                                gen_movl_reg_TN(rs2, cpu_tmp0);
3588 9c6c6662 blueswir1
                                gen_movl_TN_reg(rd, cpu_tmp0);
3589 0f8a249a blueswir1
                            }
3590 00f219bf blueswir1
                            gen_set_label(l1);
3591 0f8a249a blueswir1
                            break;
3592 0f8a249a blueswir1
                        }
3593 0f8a249a blueswir1
#endif
3594 0f8a249a blueswir1
                    default:
3595 0f8a249a blueswir1
                        goto illegal_insn;
3596 0f8a249a blueswir1
                    }
3597 0f8a249a blueswir1
                }
3598 3299908c blueswir1
            } else if (xop == 0x36) { /* UltraSparc shutdown, VIS, V8 CPop1 */
3599 3299908c blueswir1
#ifdef TARGET_SPARC64
3600 3299908c blueswir1
                int opf = GET_FIELD_SP(insn, 5, 13);
3601 3299908c blueswir1
                rs1 = GET_FIELD(insn, 13, 17);
3602 3299908c blueswir1
                rs2 = GET_FIELD(insn, 27, 31);
3603 6ae20372 blueswir1
                if (gen_trap_ifnofpu(dc, cpu_cond))
3604 e9ebed4d blueswir1
                    goto jmp_insn;
3605 3299908c blueswir1
3606 3299908c blueswir1
                switch (opf) {
3607 e9ebed4d blueswir1
                case 0x000: /* VIS I edge8cc */
3608 e9ebed4d blueswir1
                case 0x001: /* VIS II edge8n */
3609 e9ebed4d blueswir1
                case 0x002: /* VIS I edge8lcc */
3610 e9ebed4d blueswir1
                case 0x003: /* VIS II edge8ln */
3611 e9ebed4d blueswir1
                case 0x004: /* VIS I edge16cc */
3612 e9ebed4d blueswir1
                case 0x005: /* VIS II edge16n */
3613 e9ebed4d blueswir1
                case 0x006: /* VIS I edge16lcc */
3614 e9ebed4d blueswir1
                case 0x007: /* VIS II edge16ln */
3615 e9ebed4d blueswir1
                case 0x008: /* VIS I edge32cc */
3616 e9ebed4d blueswir1
                case 0x009: /* VIS II edge32n */
3617 e9ebed4d blueswir1
                case 0x00a: /* VIS I edge32lcc */
3618 e9ebed4d blueswir1
                case 0x00b: /* VIS II edge32ln */
3619 e9ebed4d blueswir1
                    // XXX
3620 e9ebed4d blueswir1
                    goto illegal_insn;
3621 e9ebed4d blueswir1
                case 0x010: /* VIS I array8 */
3622 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3623 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
3624 6ae20372 blueswir1
                    gen_movl_reg_TN(rs2, cpu_src2);
3625 6ae20372 blueswir1
                    tcg_gen_helper_1_2(helper_array8, cpu_dst, cpu_src1,
3626 6ae20372 blueswir1
                                       cpu_src2);
3627 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
3628 e9ebed4d blueswir1
                    break;
3629 e9ebed4d blueswir1
                case 0x012: /* VIS I array16 */
3630 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3631 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
3632 6ae20372 blueswir1
                    gen_movl_reg_TN(rs2, cpu_src2);
3633 6ae20372 blueswir1
                    tcg_gen_helper_1_2(helper_array8, cpu_dst, cpu_src1,
3634 6ae20372 blueswir1
                                       cpu_src2);
3635 6ae20372 blueswir1
                    tcg_gen_shli_i64(cpu_dst, cpu_dst, 1);
3636 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
3637 e9ebed4d blueswir1
                    break;
3638 e9ebed4d blueswir1
                case 0x014: /* VIS I array32 */
3639 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3640 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
3641 6ae20372 blueswir1
                    gen_movl_reg_TN(rs2, cpu_src2);
3642 6ae20372 blueswir1
                    tcg_gen_helper_1_2(helper_array8, cpu_dst, cpu_src1,
3643 6ae20372 blueswir1
                                       cpu_src2);
3644 6ae20372 blueswir1
                    tcg_gen_shli_i64(cpu_dst, cpu_dst, 2);
3645 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
3646 e9ebed4d blueswir1
                    break;
3647 3299908c blueswir1
                case 0x018: /* VIS I alignaddr */
3648 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3649 9322a4bf blueswir1
                    cpu_src1 = get_src1(insn, cpu_src1);
3650 6ae20372 blueswir1
                    gen_movl_reg_TN(rs2, cpu_src2);
3651 6ae20372 blueswir1
                    tcg_gen_helper_1_2(helper_alignaddr, cpu_dst, cpu_src1,
3652 6ae20372 blueswir1
                                       cpu_src2);
3653 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
3654 3299908c blueswir1
                    break;
3655 e9ebed4d blueswir1
                case 0x019: /* VIS II bmask */
3656 3299908c blueswir1
                case 0x01a: /* VIS I alignaddrl */
3657 3299908c blueswir1
                    // XXX
3658 e9ebed4d blueswir1
                    goto illegal_insn;
3659 e9ebed4d blueswir1
                case 0x020: /* VIS I fcmple16 */
3660 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3661 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3662 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3663 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fcmple16);
3664 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3665 e9ebed4d blueswir1
                    break;
3666 e9ebed4d blueswir1
                case 0x022: /* VIS I fcmpne16 */
3667 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3668 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3669 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3670 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fcmpne16);
3671 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3672 3299908c blueswir1
                    break;
3673 e9ebed4d blueswir1
                case 0x024: /* VIS I fcmple32 */
3674 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3675 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3676 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3677 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fcmple32);
3678 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3679 e9ebed4d blueswir1
                    break;
3680 e9ebed4d blueswir1
                case 0x026: /* VIS I fcmpne32 */
3681 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3682 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3683 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3684 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fcmpne32);
3685 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3686 e9ebed4d blueswir1
                    break;
3687 e9ebed4d blueswir1
                case 0x028: /* VIS I fcmpgt16 */
3688 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3689 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3690 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3691 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fcmpgt16);
3692 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3693 e9ebed4d blueswir1
                    break;
3694 e9ebed4d blueswir1
                case 0x02a: /* VIS I fcmpeq16 */
3695 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3696 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3697 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3698 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fcmpeq16);
3699 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3700 e9ebed4d blueswir1
                    break;
3701 e9ebed4d blueswir1
                case 0x02c: /* VIS I fcmpgt32 */
3702 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3703 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3704 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3705 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fcmpgt32);
3706 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3707 e9ebed4d blueswir1
                    break;
3708 e9ebed4d blueswir1
                case 0x02e: /* VIS I fcmpeq32 */
3709 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3710 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3711 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3712 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fcmpeq32);
3713 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3714 e9ebed4d blueswir1
                    break;
3715 e9ebed4d blueswir1
                case 0x031: /* VIS I fmul8x16 */
3716 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3717 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3718 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3719 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fmul8x16);
3720 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3721 e9ebed4d blueswir1
                    break;
3722 e9ebed4d blueswir1
                case 0x033: /* VIS I fmul8x16au */
3723 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3724 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3725 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3726 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fmul8x16au);
3727 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3728 e9ebed4d blueswir1
                    break;
3729 e9ebed4d blueswir1
                case 0x035: /* VIS I fmul8x16al */
3730 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3731 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3732 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3733 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fmul8x16al);
3734 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3735 e9ebed4d blueswir1
                    break;
3736 e9ebed4d blueswir1
                case 0x036: /* VIS I fmul8sux16 */
3737 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3738 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3739 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3740 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fmul8sux16);
3741 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3742 e9ebed4d blueswir1
                    break;
3743 e9ebed4d blueswir1
                case 0x037: /* VIS I fmul8ulx16 */
3744 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3745 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3746 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3747 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fmul8ulx16);
3748 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3749 e9ebed4d blueswir1
                    break;
3750 e9ebed4d blueswir1
                case 0x038: /* VIS I fmuld8sux16 */
3751 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3752 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3753 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3754 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fmuld8sux16);
3755 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3756 e9ebed4d blueswir1
                    break;
3757 e9ebed4d blueswir1
                case 0x039: /* VIS I fmuld8ulx16 */
3758 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3759 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3760 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3761 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fmuld8ulx16);
3762 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3763 e9ebed4d blueswir1
                    break;
3764 e9ebed4d blueswir1
                case 0x03a: /* VIS I fpack32 */
3765 e9ebed4d blueswir1
                case 0x03b: /* VIS I fpack16 */
3766 e9ebed4d blueswir1
                case 0x03d: /* VIS I fpackfix */
3767 e9ebed4d blueswir1
                case 0x03e: /* VIS I pdist */
3768 e9ebed4d blueswir1
                    // XXX
3769 e9ebed4d blueswir1
                    goto illegal_insn;
3770 3299908c blueswir1
                case 0x048: /* VIS I faligndata */
3771 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3772 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3773 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3774 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_faligndata);
3775 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3776 3299908c blueswir1
                    break;
3777 e9ebed4d blueswir1
                case 0x04b: /* VIS I fpmerge */
3778 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3779 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3780 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3781 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fpmerge);
3782 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3783 e9ebed4d blueswir1
                    break;
3784 e9ebed4d blueswir1
                case 0x04c: /* VIS II bshuffle */
3785 e9ebed4d blueswir1
                    // XXX
3786 e9ebed4d blueswir1
                    goto illegal_insn;
3787 e9ebed4d blueswir1
                case 0x04d: /* VIS I fexpand */
3788 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3789 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3790 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3791 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fexpand);
3792 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3793 e9ebed4d blueswir1
                    break;
3794 e9ebed4d blueswir1
                case 0x050: /* VIS I fpadd16 */
3795 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3796 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3797 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3798 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fpadd16);
3799 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3800 e9ebed4d blueswir1
                    break;
3801 e9ebed4d blueswir1
                case 0x051: /* VIS I fpadd16s */
3802 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3803 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs1);
3804 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
3805 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fpadd16s);
3806 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
3807 e9ebed4d blueswir1
                    break;
3808 e9ebed4d blueswir1
                case 0x052: /* VIS I fpadd32 */
3809 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3810 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3811 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3812 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fpadd32);
3813 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3814 e9ebed4d blueswir1
                    break;
3815 e9ebed4d blueswir1
                case 0x053: /* VIS I fpadd32s */
3816 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3817 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs1);
3818 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
3819 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fpadd32s);
3820 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
3821 e9ebed4d blueswir1
                    break;
3822 e9ebed4d blueswir1
                case 0x054: /* VIS I fpsub16 */
3823 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3824 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3825 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3826 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fpsub16);
3827 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3828 e9ebed4d blueswir1
                    break;
3829 e9ebed4d blueswir1
                case 0x055: /* VIS I fpsub16s */
3830 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3831 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs1);
3832 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
3833 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fpsub16s);
3834 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
3835 e9ebed4d blueswir1
                    break;
3836 e9ebed4d blueswir1
                case 0x056: /* VIS I fpsub32 */
3837 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3838 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3839 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3840 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fpadd32);
3841 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3842 e9ebed4d blueswir1
                    break;
3843 e9ebed4d blueswir1
                case 0x057: /* VIS I fpsub32s */
3844 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3845 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs1);
3846 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
3847 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fpsub32s);
3848 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
3849 e9ebed4d blueswir1
                    break;
3850 3299908c blueswir1
                case 0x060: /* VIS I fzero */
3851 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3852 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_movl_DT0_0);
3853 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3854 3299908c blueswir1
                    break;
3855 3299908c blueswir1
                case 0x061: /* VIS I fzeros */
3856 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3857 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_movl_FT0_0);
3858 3299908c blueswir1
                    gen_op_store_FT0_fpr(rd);
3859 3299908c blueswir1
                    break;
3860 e9ebed4d blueswir1
                case 0x062: /* VIS I fnor */
3861 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3862 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3863 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3864 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fnor);
3865 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3866 e9ebed4d blueswir1
                    break;
3867 e9ebed4d blueswir1
                case 0x063: /* VIS I fnors */
3868 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3869 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs1);
3870 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
3871 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fnors);
3872 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
3873 e9ebed4d blueswir1
                    break;
3874 e9ebed4d blueswir1
                case 0x064: /* VIS I fandnot2 */
3875 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3876 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs1));
3877 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs2));
3878 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fandnot);
3879 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3880 e9ebed4d blueswir1
                    break;
3881 e9ebed4d blueswir1
                case 0x065: /* VIS I fandnot2s */
3882 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3883 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs1);
3884 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs2);
3885 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fandnots);
3886 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
3887 e9ebed4d blueswir1
                    break;
3888 e9ebed4d blueswir1
                case 0x066: /* VIS I fnot2 */
3889 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3890 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3891 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fnot);
3892 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3893 e9ebed4d blueswir1
                    break;
3894 e9ebed4d blueswir1
                case 0x067: /* VIS I fnot2s */
3895 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3896 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
3897 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fnot);
3898 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
3899 e9ebed4d blueswir1
                    break;
3900 e9ebed4d blueswir1
                case 0x068: /* VIS I fandnot1 */
3901 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3902 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3903 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3904 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fandnot);
3905 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3906 e9ebed4d blueswir1
                    break;
3907 e9ebed4d blueswir1
                case 0x069: /* VIS I fandnot1s */
3908 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3909 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs1);
3910 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
3911 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fandnots);
3912 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
3913 e9ebed4d blueswir1
                    break;
3914 e9ebed4d blueswir1
                case 0x06a: /* VIS I fnot1 */
3915 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3916 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs1));
3917 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fnot);
3918 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3919 e9ebed4d blueswir1
                    break;
3920 e9ebed4d blueswir1
                case 0x06b: /* VIS I fnot1s */
3921 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3922 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs1);
3923 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fnot);
3924 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
3925 e9ebed4d blueswir1
                    break;
3926 e9ebed4d blueswir1
                case 0x06c: /* VIS I fxor */
3927 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3928 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3929 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3930 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fxor);
3931 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3932 e9ebed4d blueswir1
                    break;
3933 e9ebed4d blueswir1
                case 0x06d: /* VIS I fxors */
3934 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3935 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs1);
3936 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
3937 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fxors);
3938 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
3939 e9ebed4d blueswir1
                    break;
3940 e9ebed4d blueswir1
                case 0x06e: /* VIS I fnand */
3941 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3942 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3943 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3944 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fnand);
3945 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3946 e9ebed4d blueswir1
                    break;
3947 e9ebed4d blueswir1
                case 0x06f: /* VIS I fnands */
3948 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3949 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs1);
3950 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
3951 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fnands);
3952 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
3953 e9ebed4d blueswir1
                    break;
3954 e9ebed4d blueswir1
                case 0x070: /* VIS I fand */
3955 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3956 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3957 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3958 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fand);
3959 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3960 e9ebed4d blueswir1
                    break;
3961 e9ebed4d blueswir1
                case 0x071: /* VIS I fands */
3962 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3963 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs1);
3964 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
3965 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fands);
3966 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
3967 e9ebed4d blueswir1
                    break;
3968 e9ebed4d blueswir1
                case 0x072: /* VIS I fxnor */
3969 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3970 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3971 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
3972 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fxnor);
3973 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3974 e9ebed4d blueswir1
                    break;
3975 e9ebed4d blueswir1
                case 0x073: /* VIS I fxnors */
3976 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3977 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs1);
3978 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
3979 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fxnors);
3980 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
3981 e9ebed4d blueswir1
                    break;
3982 3299908c blueswir1
                case 0x074: /* VIS I fsrc1 */
3983 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3984 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
3985 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3986 3299908c blueswir1
                    break;
3987 3299908c blueswir1
                case 0x075: /* VIS I fsrc1s */
3988 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3989 3299908c blueswir1
                    gen_op_load_fpr_FT0(rs1);
3990 3299908c blueswir1
                    gen_op_store_FT0_fpr(rd);
3991 3299908c blueswir1
                    break;
3992 e9ebed4d blueswir1
                case 0x076: /* VIS I fornot2 */
3993 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
3994 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs1));
3995 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs2));
3996 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fornot);
3997 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3998 e9ebed4d blueswir1
                    break;
3999 e9ebed4d blueswir1
                case 0x077: /* VIS I fornot2s */
4000 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4001 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs1);
4002 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs2);
4003 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fornots);
4004 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
4005 e9ebed4d blueswir1
                    break;
4006 3299908c blueswir1
                case 0x078: /* VIS I fsrc2 */
4007 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4008 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs2));
4009 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
4010 3299908c blueswir1
                    break;
4011 3299908c blueswir1
                case 0x079: /* VIS I fsrc2s */
4012 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4013 3299908c blueswir1
                    gen_op_load_fpr_FT0(rs2);
4014 3299908c blueswir1
                    gen_op_store_FT0_fpr(rd);
4015 3299908c blueswir1
                    break;
4016 e9ebed4d blueswir1
                case 0x07a: /* VIS I fornot1 */
4017 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4018 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
4019 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
4020 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fornot);
4021 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
4022 e9ebed4d blueswir1
                    break;
4023 e9ebed4d blueswir1
                case 0x07b: /* VIS I fornot1s */
4024 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4025 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs1);
4026 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
4027 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fornots);
4028 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
4029 e9ebed4d blueswir1
                    break;
4030 e9ebed4d blueswir1
                case 0x07c: /* VIS I for */
4031 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4032 2382dc6b blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rs1));
4033 2382dc6b blueswir1
                    gen_op_load_fpr_DT1(DFPREG(rs2));
4034 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_for);
4035 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
4036 e9ebed4d blueswir1
                    break;
4037 e9ebed4d blueswir1
                case 0x07d: /* VIS I fors */
4038 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4039 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs1);
4040 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
4041 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_fors);
4042 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
4043 e9ebed4d blueswir1
                    break;
4044 3299908c blueswir1
                case 0x07e: /* VIS I fone */
4045 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4046 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_movl_DT0_1);
4047 2382dc6b blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
4048 3299908c blueswir1
                    break;
4049 3299908c blueswir1
                case 0x07f: /* VIS I fones */
4050 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, VIS1);
4051 44e7757c blueswir1
                    tcg_gen_helper_0_0(helper_movl_FT0_1);
4052 3299908c blueswir1
                    gen_op_store_FT0_fpr(rd);
4053 3299908c blueswir1
                    break;
4054 e9ebed4d blueswir1
                case 0x080: /* VIS I shutdown */
4055 e9ebed4d blueswir1
                case 0x081: /* VIS II siam */
4056 e9ebed4d blueswir1
                    // XXX
4057 e9ebed4d blueswir1
                    goto illegal_insn;
4058 3299908c blueswir1
                default:
4059 3299908c blueswir1
                    goto illegal_insn;
4060 3299908c blueswir1
                }
4061 3299908c blueswir1
#else
4062 0f8a249a blueswir1
                goto ncp_insn;
4063 3299908c blueswir1
#endif
4064 3299908c blueswir1
            } else if (xop == 0x37) { /* V8 CPop2, V9 impdep2 */
4065 fcc72045 blueswir1
#ifdef TARGET_SPARC64
4066 0f8a249a blueswir1
                goto illegal_insn;
4067 fcc72045 blueswir1
#else
4068 0f8a249a blueswir1
                goto ncp_insn;
4069 fcc72045 blueswir1
#endif
4070 3475187d bellard
#ifdef TARGET_SPARC64
4071 0f8a249a blueswir1
            } else if (xop == 0x39) { /* V9 return */
4072 2ea815ca blueswir1
                TCGv r_const;
4073 2ea815ca blueswir1
4074 6ae20372 blueswir1
                save_state(dc, cpu_cond);
4075 9322a4bf blueswir1
                cpu_src1 = get_src1(insn, cpu_src1);
4076 0f8a249a blueswir1
                if (IS_IMM) {   /* immediate */
4077 0f8a249a blueswir1
                    rs2 = GET_FIELDs(insn, 19, 31);
4078 6ae20372 blueswir1
                    tcg_gen_addi_tl(cpu_dst, cpu_src1, (int)rs2);
4079 0f8a249a blueswir1
                } else {                /* register */
4080 3475187d bellard
                    rs2 = GET_FIELD(insn, 27, 31);
4081 0f8a249a blueswir1
                    if (rs2) {
4082 6ae20372 blueswir1
                        gen_movl_reg_TN(rs2, cpu_src2);
4083 6ae20372 blueswir1
                        tcg_gen_add_tl(cpu_dst, cpu_src1, cpu_src2);
4084 6f551262 blueswir1
                    } else
4085 6f551262 blueswir1
                        tcg_gen_mov_tl(cpu_dst, cpu_src1);
4086 3475187d bellard
                }
4087 72a9747b blueswir1
                tcg_gen_helper_0_0(helper_restore);
4088 6ae20372 blueswir1
                gen_mov_pc_npc(dc, cpu_cond);
4089 2ea815ca blueswir1
                r_const = tcg_const_i32(3);
4090 2ea815ca blueswir1
                tcg_gen_helper_0_2(helper_check_align, cpu_dst, r_const);
4091 2ea815ca blueswir1
                tcg_temp_free(r_const);
4092 6ae20372 blueswir1
                tcg_gen_mov_tl(cpu_npc, cpu_dst);
4093 0f8a249a blueswir1
                dc->npc = DYNAMIC_PC;
4094 0f8a249a blueswir1
                goto jmp_insn;
4095 3475187d bellard
#endif
4096 0f8a249a blueswir1
            } else {
4097 9322a4bf blueswir1
                cpu_src1 = get_src1(insn, cpu_src1);
4098 0f8a249a blueswir1
                if (IS_IMM) {   /* immediate */
4099 0f8a249a blueswir1
                    rs2 = GET_FIELDs(insn, 19, 31);
4100 6ae20372 blueswir1
                    tcg_gen_addi_tl(cpu_dst, cpu_src1, (int)rs2);
4101 0f8a249a blueswir1
                } else {                /* register */
4102 e80cfcfc bellard
                    rs2 = GET_FIELD(insn, 27, 31);
4103 0f8a249a blueswir1
                    if (rs2) {
4104 6ae20372 blueswir1
                        gen_movl_reg_TN(rs2, cpu_src2);
4105 6ae20372 blueswir1
                        tcg_gen_add_tl(cpu_dst, cpu_src1, cpu_src2);
4106 6f551262 blueswir1
                    } else
4107 6f551262 blueswir1
                        tcg_gen_mov_tl(cpu_dst, cpu_src1);
4108 cf495bcf bellard
                }
4109 0f8a249a blueswir1
                switch (xop) {
4110 0f8a249a blueswir1
                case 0x38:      /* jmpl */
4111 0f8a249a blueswir1
                    {
4112 2ea815ca blueswir1
                        TCGv r_const;
4113 2ea815ca blueswir1
4114 2ea815ca blueswir1
                        r_const = tcg_const_tl(dc->pc);
4115 2ea815ca blueswir1
                        gen_movl_TN_reg(rd, r_const);
4116 2ea815ca blueswir1
                        tcg_temp_free(r_const);
4117 6ae20372 blueswir1
                        gen_mov_pc_npc(dc, cpu_cond);
4118 2ea815ca blueswir1
                        r_const = tcg_const_i32(3);
4119 77f193da blueswir1
                        tcg_gen_helper_0_2(helper_check_align, cpu_dst,
4120 2ea815ca blueswir1
                                           r_const);
4121 2ea815ca blueswir1
                        tcg_temp_free(r_const);
4122 6ae20372 blueswir1
                        tcg_gen_mov_tl(cpu_npc, cpu_dst);
4123 0f8a249a blueswir1
                        dc->npc = DYNAMIC_PC;
4124 0f8a249a blueswir1
                    }
4125 0f8a249a blueswir1
                    goto jmp_insn;
4126 3475187d bellard
#if !defined(CONFIG_USER_ONLY) && !defined(TARGET_SPARC64)
4127 0f8a249a blueswir1
                case 0x39:      /* rett, V9 return */
4128 0f8a249a blueswir1
                    {
4129 2ea815ca blueswir1
                        TCGv r_const;
4130 2ea815ca blueswir1
4131 0f8a249a blueswir1
                        if (!supervisor(dc))
4132 0f8a249a blueswir1
                            goto priv_insn;
4133 6ae20372 blueswir1
                        gen_mov_pc_npc(dc, cpu_cond);
4134 2ea815ca blueswir1
                        r_const = tcg_const_i32(3);
4135 77f193da blueswir1
                        tcg_gen_helper_0_2(helper_check_align, cpu_dst,
4136 2ea815ca blueswir1
                                           r_const);
4137 2ea815ca blueswir1
                        tcg_temp_free(r_const);
4138 6ae20372 blueswir1
                        tcg_gen_mov_tl(cpu_npc, cpu_dst);
4139 0f8a249a blueswir1
                        dc->npc = DYNAMIC_PC;
4140 1a2fb1c0 blueswir1
                        tcg_gen_helper_0_0(helper_rett);
4141 0f8a249a blueswir1
                    }
4142 0f8a249a blueswir1
                    goto jmp_insn;
4143 0f8a249a blueswir1
#endif
4144 0f8a249a blueswir1
                case 0x3b: /* flush */
4145 64a88d5d blueswir1
                    if (!((dc)->features & CPU_FEATURE_FLUSH))
4146 64a88d5d blueswir1
                        goto unimp_flush;
4147 6ae20372 blueswir1
                    tcg_gen_helper_0_1(helper_flush, cpu_dst);
4148 0f8a249a blueswir1
                    break;
4149 0f8a249a blueswir1
                case 0x3c:      /* save */
4150 6ae20372 blueswir1
                    save_state(dc, cpu_cond);
4151 72a9747b blueswir1
                    tcg_gen_helper_0_0(helper_save);
4152 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
4153 0f8a249a blueswir1
                    break;
4154 0f8a249a blueswir1
                case 0x3d:      /* restore */
4155 6ae20372 blueswir1
                    save_state(dc, cpu_cond);
4156 72a9747b blueswir1
                    tcg_gen_helper_0_0(helper_restore);
4157 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_dst);
4158 0f8a249a blueswir1
                    break;
4159 3475187d bellard
#if !defined(CONFIG_USER_ONLY) && defined(TARGET_SPARC64)
4160 0f8a249a blueswir1
                case 0x3e:      /* V9 done/retry */
4161 0f8a249a blueswir1
                    {
4162 0f8a249a blueswir1
                        switch (rd) {
4163 0f8a249a blueswir1
                        case 0:
4164 0f8a249a blueswir1
                            if (!supervisor(dc))
4165 0f8a249a blueswir1
                                goto priv_insn;
4166 0f8a249a blueswir1
                            dc->npc = DYNAMIC_PC;
4167 0f8a249a blueswir1
                            dc->pc = DYNAMIC_PC;
4168 1a2fb1c0 blueswir1
                            tcg_gen_helper_0_0(helper_done);
4169 0f8a249a blueswir1
                            goto jmp_insn;
4170 0f8a249a blueswir1
                        case 1:
4171 0f8a249a blueswir1
                            if (!supervisor(dc))
4172 0f8a249a blueswir1
                                goto priv_insn;
4173 0f8a249a blueswir1
                            dc->npc = DYNAMIC_PC;
4174 0f8a249a blueswir1
                            dc->pc = DYNAMIC_PC;
4175 1a2fb1c0 blueswir1
                            tcg_gen_helper_0_0(helper_retry);
4176 0f8a249a blueswir1
                            goto jmp_insn;
4177 0f8a249a blueswir1
                        default:
4178 0f8a249a blueswir1
                            goto illegal_insn;
4179 0f8a249a blueswir1
                        }
4180 0f8a249a blueswir1
                    }
4181 0f8a249a blueswir1
                    break;
4182 0f8a249a blueswir1
#endif
4183 0f8a249a blueswir1
                default:
4184 0f8a249a blueswir1
                    goto illegal_insn;
4185 0f8a249a blueswir1
                }
4186 cf495bcf bellard
            }
4187 0f8a249a blueswir1
            break;
4188 0f8a249a blueswir1
        }
4189 0f8a249a blueswir1
        break;
4190 0f8a249a blueswir1
    case 3:                     /* load/store instructions */
4191 0f8a249a blueswir1
        {
4192 0f8a249a blueswir1
            unsigned int xop = GET_FIELD(insn, 7, 12);
4193 9322a4bf blueswir1
4194 9322a4bf blueswir1
            cpu_src1 = get_src1(insn, cpu_src1);
4195 71817e48 blueswir1
            if (xop == 0x3c || xop == 0x3e) { // V9 casa/casxa
4196 81ad8ba2 blueswir1
                rs2 = GET_FIELD(insn, 27, 31);
4197 6ae20372 blueswir1
                gen_movl_reg_TN(rs2, cpu_src2);
4198 71817e48 blueswir1
                tcg_gen_mov_tl(cpu_addr, cpu_src1);
4199 71817e48 blueswir1
            } else if (IS_IMM) {     /* immediate */
4200 0f8a249a blueswir1
                rs2 = GET_FIELDs(insn, 19, 31);
4201 6ae20372 blueswir1
                tcg_gen_addi_tl(cpu_addr, cpu_src1, (int)rs2);
4202 0f8a249a blueswir1
            } else {            /* register */
4203 0f8a249a blueswir1
                rs2 = GET_FIELD(insn, 27, 31);
4204 0f8a249a blueswir1
                if (rs2 != 0) {
4205 6ae20372 blueswir1
                    gen_movl_reg_TN(rs2, cpu_src2);
4206 6ae20372 blueswir1
                    tcg_gen_add_tl(cpu_addr, cpu_src1, cpu_src2);
4207 6f551262 blueswir1
                } else
4208 6f551262 blueswir1
                    tcg_gen_mov_tl(cpu_addr, cpu_src1);
4209 0f8a249a blueswir1
            }
4210 2f2ecb83 blueswir1
            if (xop < 4 || (xop > 7 && xop < 0x14 && xop != 0x0e) ||
4211 2f2ecb83 blueswir1
                (xop > 0x17 && xop <= 0x1d ) ||
4212 2f2ecb83 blueswir1
                (xop > 0x2c && xop <= 0x33) || xop == 0x1f || xop == 0x3d) {
4213 0f8a249a blueswir1
                switch (xop) {
4214 1a2fb1c0 blueswir1
                case 0x0:       /* load unsigned word */
4215 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4216 6ae20372 blueswir1
                    tcg_gen_qemu_ld32u(cpu_val, cpu_addr, dc->mem_idx);
4217 0f8a249a blueswir1
                    break;
4218 0f8a249a blueswir1
                case 0x1:       /* load unsigned byte */
4219 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4220 6ae20372 blueswir1
                    tcg_gen_qemu_ld8u(cpu_val, cpu_addr, dc->mem_idx);
4221 0f8a249a blueswir1
                    break;
4222 0f8a249a blueswir1
                case 0x2:       /* load unsigned halfword */
4223 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4224 6ae20372 blueswir1
                    tcg_gen_qemu_ld16u(cpu_val, cpu_addr, dc->mem_idx);
4225 0f8a249a blueswir1
                    break;
4226 0f8a249a blueswir1
                case 0x3:       /* load double word */
4227 0f8a249a blueswir1
                    if (rd & 1)
4228 d4218d99 blueswir1
                        goto illegal_insn;
4229 1a2fb1c0 blueswir1
                    else {
4230 2ea815ca blueswir1
                        TCGv r_const;
4231 2ea815ca blueswir1
4232 c2bc0e38 blueswir1
                        save_state(dc, cpu_cond);
4233 2ea815ca blueswir1
                        r_const = tcg_const_i32(7);
4234 d987963a blueswir1
                        tcg_gen_helper_0_2(helper_check_align, cpu_addr,
4235 2ea815ca blueswir1
                                           r_const); // XXX remove
4236 2ea815ca blueswir1
                        tcg_temp_free(r_const);
4237 2cade6a3 blueswir1
                        gen_address_mask(dc, cpu_addr);
4238 6ae20372 blueswir1
                        tcg_gen_qemu_ld64(cpu_tmp64, cpu_addr, dc->mem_idx);
4239 32b6c812 blueswir1
                        tcg_gen_trunc_i64_tl(cpu_tmp0, cpu_tmp64);
4240 32b6c812 blueswir1
                        tcg_gen_andi_tl(cpu_tmp0, cpu_tmp0, 0xffffffffULL);
4241 32b6c812 blueswir1
                        gen_movl_TN_reg(rd + 1, cpu_tmp0);
4242 8911f501 blueswir1
                        tcg_gen_shri_i64(cpu_tmp64, cpu_tmp64, 32);
4243 6ae20372 blueswir1
                        tcg_gen_trunc_i64_tl(cpu_val, cpu_tmp64);
4244 6ae20372 blueswir1
                        tcg_gen_andi_tl(cpu_val, cpu_val, 0xffffffffULL);
4245 1a2fb1c0 blueswir1
                    }
4246 0f8a249a blueswir1
                    break;
4247 0f8a249a blueswir1
                case 0x9:       /* load signed byte */
4248 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4249 6ae20372 blueswir1
                    tcg_gen_qemu_ld8s(cpu_val, cpu_addr, dc->mem_idx);
4250 0f8a249a blueswir1
                    break;
4251 0f8a249a blueswir1
                case 0xa:       /* load signed halfword */
4252 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4253 6ae20372 blueswir1
                    tcg_gen_qemu_ld16s(cpu_val, cpu_addr, dc->mem_idx);
4254 0f8a249a blueswir1
                    break;
4255 0f8a249a blueswir1
                case 0xd:       /* ldstub -- XXX: should be atomically */
4256 2ea815ca blueswir1
                    {
4257 2ea815ca blueswir1
                        TCGv r_const;
4258 2ea815ca blueswir1
4259 2cade6a3 blueswir1
                        gen_address_mask(dc, cpu_addr);
4260 2ea815ca blueswir1
                        tcg_gen_qemu_ld8s(cpu_val, cpu_addr, dc->mem_idx);
4261 2ea815ca blueswir1
                        r_const = tcg_const_tl(0xff);
4262 2ea815ca blueswir1
                        tcg_gen_qemu_st8(r_const, cpu_addr, dc->mem_idx);
4263 2ea815ca blueswir1
                        tcg_temp_free(r_const);
4264 2ea815ca blueswir1
                    }
4265 0f8a249a blueswir1
                    break;
4266 77f193da blueswir1
                case 0x0f:      /* swap register with memory. Also
4267 77f193da blueswir1
                                   atomically */
4268 64a88d5d blueswir1
                    CHECK_IU_FEATURE(dc, SWAP);
4269 6ae20372 blueswir1
                    gen_movl_reg_TN(rd, cpu_val);
4270 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4271 6ae20372 blueswir1
                    tcg_gen_qemu_ld32u(cpu_tmp32, cpu_addr, dc->mem_idx);
4272 6ae20372 blueswir1
                    tcg_gen_qemu_st32(cpu_val, cpu_addr, dc->mem_idx);
4273 6ae20372 blueswir1
                    tcg_gen_extu_i32_tl(cpu_val, cpu_tmp32);
4274 0f8a249a blueswir1
                    break;
4275 3475187d bellard
#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64)
4276 0f8a249a blueswir1
                case 0x10:      /* load word alternate */
4277 3475187d bellard
#ifndef TARGET_SPARC64
4278 0f8a249a blueswir1
                    if (IS_IMM)
4279 0f8a249a blueswir1
                        goto illegal_insn;
4280 0f8a249a blueswir1
                    if (!supervisor(dc))
4281 0f8a249a blueswir1
                        goto priv_insn;
4282 6ea4a6c8 blueswir1
#endif
4283 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4284 6ae20372 blueswir1
                    gen_ld_asi(cpu_val, cpu_addr, insn, 4, 0);
4285 0f8a249a blueswir1
                    break;
4286 0f8a249a blueswir1
                case 0x11:      /* load unsigned byte alternate */
4287 3475187d bellard
#ifndef TARGET_SPARC64
4288 0f8a249a blueswir1
                    if (IS_IMM)
4289 0f8a249a blueswir1
                        goto illegal_insn;
4290 0f8a249a blueswir1
                    if (!supervisor(dc))
4291 0f8a249a blueswir1
                        goto priv_insn;
4292 0f8a249a blueswir1
#endif
4293 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4294 6ae20372 blueswir1
                    gen_ld_asi(cpu_val, cpu_addr, insn, 1, 0);
4295 0f8a249a blueswir1
                    break;
4296 0f8a249a blueswir1
                case 0x12:      /* load unsigned halfword alternate */
4297 3475187d bellard
#ifndef TARGET_SPARC64
4298 0f8a249a blueswir1
                    if (IS_IMM)
4299 0f8a249a blueswir1
                        goto illegal_insn;
4300 0f8a249a blueswir1
                    if (!supervisor(dc))
4301 0f8a249a blueswir1
                        goto priv_insn;
4302 6ea4a6c8 blueswir1
#endif
4303 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4304 6ae20372 blueswir1
                    gen_ld_asi(cpu_val, cpu_addr, insn, 2, 0);
4305 0f8a249a blueswir1
                    break;
4306 0f8a249a blueswir1
                case 0x13:      /* load double word alternate */
4307 3475187d bellard
#ifndef TARGET_SPARC64
4308 0f8a249a blueswir1
                    if (IS_IMM)
4309 0f8a249a blueswir1
                        goto illegal_insn;
4310 0f8a249a blueswir1
                    if (!supervisor(dc))
4311 0f8a249a blueswir1
                        goto priv_insn;
4312 3475187d bellard
#endif
4313 0f8a249a blueswir1
                    if (rd & 1)
4314 d4218d99 blueswir1
                        goto illegal_insn;
4315 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4316 db166940 blueswir1
                    gen_ldda_asi(cpu_val, cpu_addr, insn, rd);
4317 db166940 blueswir1
                    goto skip_move;
4318 0f8a249a blueswir1
                case 0x19:      /* load signed byte alternate */
4319 3475187d bellard
#ifndef TARGET_SPARC64
4320 0f8a249a blueswir1
                    if (IS_IMM)
4321 0f8a249a blueswir1
                        goto illegal_insn;
4322 0f8a249a blueswir1
                    if (!supervisor(dc))
4323 0f8a249a blueswir1
                        goto priv_insn;
4324 0f8a249a blueswir1
#endif
4325 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4326 6ae20372 blueswir1
                    gen_ld_asi(cpu_val, cpu_addr, insn, 1, 1);
4327 0f8a249a blueswir1
                    break;
4328 0f8a249a blueswir1
                case 0x1a:      /* load signed halfword alternate */
4329 3475187d bellard
#ifndef TARGET_SPARC64
4330 0f8a249a blueswir1
                    if (IS_IMM)
4331 0f8a249a blueswir1
                        goto illegal_insn;
4332 0f8a249a blueswir1
                    if (!supervisor(dc))
4333 0f8a249a blueswir1
                        goto priv_insn;
4334 6ea4a6c8 blueswir1
#endif
4335 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4336 6ae20372 blueswir1
                    gen_ld_asi(cpu_val, cpu_addr, insn, 2, 1);
4337 0f8a249a blueswir1
                    break;
4338 0f8a249a blueswir1
                case 0x1d:      /* ldstuba -- XXX: should be atomically */
4339 3475187d bellard
#ifndef TARGET_SPARC64
4340 0f8a249a blueswir1
                    if (IS_IMM)
4341 0f8a249a blueswir1
                        goto illegal_insn;
4342 0f8a249a blueswir1
                    if (!supervisor(dc))
4343 0f8a249a blueswir1
                        goto priv_insn;
4344 0f8a249a blueswir1
#endif
4345 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4346 6ae20372 blueswir1
                    gen_ldstub_asi(cpu_val, cpu_addr, insn);
4347 0f8a249a blueswir1
                    break;
4348 77f193da blueswir1
                case 0x1f:      /* swap reg with alt. memory. Also
4349 77f193da blueswir1
                                   atomically */
4350 64a88d5d blueswir1
                    CHECK_IU_FEATURE(dc, SWAP);
4351 3475187d bellard
#ifndef TARGET_SPARC64
4352 0f8a249a blueswir1
                    if (IS_IMM)
4353 0f8a249a blueswir1
                        goto illegal_insn;
4354 0f8a249a blueswir1
                    if (!supervisor(dc))
4355 0f8a249a blueswir1
                        goto priv_insn;
4356 6ea4a6c8 blueswir1
#endif
4357 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4358 6ae20372 blueswir1
                    gen_movl_reg_TN(rd, cpu_val);
4359 6ae20372 blueswir1
                    gen_swap_asi(cpu_val, cpu_addr, insn);
4360 0f8a249a blueswir1
                    break;
4361 3475187d bellard
4362 3475187d bellard
#ifndef TARGET_SPARC64
4363 0f8a249a blueswir1
                case 0x30: /* ldc */
4364 0f8a249a blueswir1
                case 0x31: /* ldcsr */
4365 0f8a249a blueswir1
                case 0x33: /* lddc */
4366 0f8a249a blueswir1
                    goto ncp_insn;
4367 3475187d bellard
#endif
4368 3475187d bellard
#endif
4369 3475187d bellard
#ifdef TARGET_SPARC64
4370 0f8a249a blueswir1
                case 0x08: /* V9 ldsw */
4371 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4372 6ae20372 blueswir1
                    tcg_gen_qemu_ld32s(cpu_val, cpu_addr, dc->mem_idx);
4373 0f8a249a blueswir1
                    break;
4374 0f8a249a blueswir1
                case 0x0b: /* V9 ldx */
4375 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4376 6ae20372 blueswir1
                    tcg_gen_qemu_ld64(cpu_val, cpu_addr, dc->mem_idx);
4377 0f8a249a blueswir1
                    break;
4378 0f8a249a blueswir1
                case 0x18: /* V9 ldswa */
4379 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4380 6ae20372 blueswir1
                    gen_ld_asi(cpu_val, cpu_addr, insn, 4, 1);
4381 0f8a249a blueswir1
                    break;
4382 0f8a249a blueswir1
                case 0x1b: /* V9 ldxa */
4383 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4384 6ae20372 blueswir1
                    gen_ld_asi(cpu_val, cpu_addr, insn, 8, 0);
4385 0f8a249a blueswir1
                    break;
4386 0f8a249a blueswir1
                case 0x2d: /* V9 prefetch, no effect */
4387 0f8a249a blueswir1
                    goto skip_move;
4388 0f8a249a blueswir1
                case 0x30: /* V9 ldfa */
4389 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4390 6ae20372 blueswir1
                    gen_ldf_asi(cpu_addr, insn, 4, rd);
4391 81ad8ba2 blueswir1
                    goto skip_move;
4392 0f8a249a blueswir1
                case 0x33: /* V9 lddfa */
4393 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4394 6ae20372 blueswir1
                    gen_ldf_asi(cpu_addr, insn, 8, DFPREG(rd));
4395 81ad8ba2 blueswir1
                    goto skip_move;
4396 0f8a249a blueswir1
                case 0x3d: /* V9 prefetcha, no effect */
4397 0f8a249a blueswir1
                    goto skip_move;
4398 0f8a249a blueswir1
                case 0x32: /* V9 ldqfa */
4399 64a88d5d blueswir1
                    CHECK_FPU_FEATURE(dc, FLOAT128);
4400 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4401 6ae20372 blueswir1
                    gen_ldf_asi(cpu_addr, insn, 16, QFPREG(rd));
4402 1f587329 blueswir1
                    goto skip_move;
4403 1f587329 blueswir1
#endif
4404 0f8a249a blueswir1
                default:
4405 0f8a249a blueswir1
                    goto illegal_insn;
4406 0f8a249a blueswir1
                }
4407 6ae20372 blueswir1
                gen_movl_TN_reg(rd, cpu_val);
4408 db166940 blueswir1
#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64)
4409 0f8a249a blueswir1
            skip_move: ;
4410 3475187d bellard
#endif
4411 0f8a249a blueswir1
            } else if (xop >= 0x20 && xop < 0x24) {
4412 6ae20372 blueswir1
                if (gen_trap_ifnofpu(dc, cpu_cond))
4413 a80dde08 bellard
                    goto jmp_insn;
4414 c2bc0e38 blueswir1
                save_state(dc, cpu_cond);
4415 0f8a249a blueswir1
                switch (xop) {
4416 0f8a249a blueswir1
                case 0x20:      /* load fpreg */
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, fpr[rd]));
4421 0f8a249a blueswir1
                    break;
4422 0f8a249a blueswir1
                case 0x21:      /* load fsr */
4423 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4424 6ae20372 blueswir1
                    tcg_gen_qemu_ld32u(cpu_tmp32, cpu_addr, dc->mem_idx);
4425 ce8536e2 blueswir1
                    tcg_gen_st_i32(cpu_tmp32, cpu_env,
4426 ce8536e2 blueswir1
                                   offsetof(CPUState, ft0));
4427 7e8c2b6c blueswir1
                    tcg_gen_helper_0_0(helper_ldfsr);
4428 0f8a249a blueswir1
                    break;
4429 0f8a249a blueswir1
                case 0x22:      /* load quad fpreg */
4430 2ea815ca blueswir1
                    {
4431 2ea815ca blueswir1
                        TCGv r_const;
4432 2ea815ca blueswir1
4433 2ea815ca blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
4434 2ea815ca blueswir1
                        r_const = tcg_const_i32(dc->mem_idx);
4435 2ea815ca blueswir1
                        tcg_gen_helper_0_2(helper_ldqf, cpu_addr, r_const);
4436 2ea815ca blueswir1
                        tcg_temp_free(r_const);
4437 2ea815ca blueswir1
                        gen_op_store_QT0_fpr(QFPREG(rd));
4438 2ea815ca blueswir1
                    }
4439 1f587329 blueswir1
                    break;
4440 0f8a249a blueswir1
                case 0x23:      /* load double fpreg */
4441 2ea815ca blueswir1
                    {
4442 2ea815ca blueswir1
                        TCGv r_const;
4443 2ea815ca blueswir1
4444 2ea815ca blueswir1
                        r_const = tcg_const_i32(dc->mem_idx);
4445 2ea815ca blueswir1
                        tcg_gen_helper_0_2(helper_lddf, cpu_addr, r_const);
4446 2ea815ca blueswir1
                        tcg_temp_free(r_const);
4447 2ea815ca blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
4448 2ea815ca blueswir1
                    }
4449 0f8a249a blueswir1
                    break;
4450 0f8a249a blueswir1
                default:
4451 0f8a249a blueswir1
                    goto illegal_insn;
4452 0f8a249a blueswir1
                }
4453 0f8a249a blueswir1
            } else if (xop < 8 || (xop >= 0x14 && xop < 0x18) || \
4454 0f8a249a blueswir1
                       xop == 0xe || xop == 0x1e) {
4455 6ae20372 blueswir1
                gen_movl_reg_TN(rd, cpu_val);
4456 0f8a249a blueswir1
                switch (xop) {
4457 1a2fb1c0 blueswir1
                case 0x4: /* store word */
4458 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4459 6ae20372 blueswir1
                    tcg_gen_qemu_st32(cpu_val, cpu_addr, dc->mem_idx);
4460 0f8a249a blueswir1
                    break;
4461 1a2fb1c0 blueswir1
                case 0x5: /* store byte */
4462 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4463 6ae20372 blueswir1
                    tcg_gen_qemu_st8(cpu_val, cpu_addr, dc->mem_idx);
4464 0f8a249a blueswir1
                    break;
4465 1a2fb1c0 blueswir1
                case 0x6: /* store halfword */
4466 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4467 6ae20372 blueswir1
                    tcg_gen_qemu_st16(cpu_val, cpu_addr, dc->mem_idx);
4468 0f8a249a blueswir1
                    break;
4469 1a2fb1c0 blueswir1
                case 0x7: /* store double word */
4470 0f8a249a blueswir1
                    if (rd & 1)
4471 d4218d99 blueswir1
                        goto illegal_insn;
4472 1a2fb1c0 blueswir1
                    else {
4473 2ea815ca blueswir1
                        TCGv r_low, r_const;
4474 1a2fb1c0 blueswir1
4475 c2bc0e38 blueswir1
                        save_state(dc, cpu_cond);
4476 2cade6a3 blueswir1
                        gen_address_mask(dc, cpu_addr);
4477 2ea815ca blueswir1
                        r_const = tcg_const_i32(7);
4478 c2bc0e38 blueswir1
                        tcg_gen_helper_0_2(helper_check_align, cpu_addr,
4479 2ea815ca blueswir1
                                           r_const); // XXX remove
4480 2ea815ca blueswir1
                        tcg_temp_free(r_const);
4481 8d96d209 blueswir1
                        r_low = tcg_temp_new(TCG_TYPE_TL);
4482 1a2fb1c0 blueswir1
                        gen_movl_reg_TN(rd + 1, r_low);
4483 6ae20372 blueswir1
                        tcg_gen_helper_1_2(helper_pack64, cpu_tmp64, cpu_val,
4484 1a2fb1c0 blueswir1
                                           r_low);
4485 2ea815ca blueswir1
                        tcg_temp_free(r_low);
4486 6ae20372 blueswir1
                        tcg_gen_qemu_st64(cpu_tmp64, cpu_addr, dc->mem_idx);
4487 7fa76c0b blueswir1
                    }
4488 0f8a249a blueswir1
                    break;
4489 3475187d bellard
#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64)
4490 1a2fb1c0 blueswir1
                case 0x14: /* store word alternate */
4491 3475187d bellard
#ifndef TARGET_SPARC64
4492 0f8a249a blueswir1
                    if (IS_IMM)
4493 0f8a249a blueswir1
                        goto illegal_insn;
4494 0f8a249a blueswir1
                    if (!supervisor(dc))
4495 0f8a249a blueswir1
                        goto priv_insn;
4496 3475187d bellard
#endif
4497 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4498 6ae20372 blueswir1
                    gen_st_asi(cpu_val, cpu_addr, insn, 4);
4499 d39c0b99 bellard
                    break;
4500 1a2fb1c0 blueswir1
                case 0x15: /* store byte alternate */
4501 3475187d bellard
#ifndef TARGET_SPARC64
4502 0f8a249a blueswir1
                    if (IS_IMM)
4503 0f8a249a blueswir1
                        goto illegal_insn;
4504 0f8a249a blueswir1
                    if (!supervisor(dc))
4505 0f8a249a blueswir1
                        goto priv_insn;
4506 3475187d bellard
#endif
4507 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4508 6ae20372 blueswir1
                    gen_st_asi(cpu_val, cpu_addr, insn, 1);
4509 d39c0b99 bellard
                    break;
4510 1a2fb1c0 blueswir1
                case 0x16: /* store halfword alternate */
4511 3475187d bellard
#ifndef TARGET_SPARC64
4512 0f8a249a blueswir1
                    if (IS_IMM)
4513 0f8a249a blueswir1
                        goto illegal_insn;
4514 0f8a249a blueswir1
                    if (!supervisor(dc))
4515 0f8a249a blueswir1
                        goto priv_insn;
4516 3475187d bellard
#endif
4517 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4518 6ae20372 blueswir1
                    gen_st_asi(cpu_val, cpu_addr, insn, 2);
4519 d39c0b99 bellard
                    break;
4520 1a2fb1c0 blueswir1
                case 0x17: /* store double word alternate */
4521 3475187d bellard
#ifndef TARGET_SPARC64
4522 0f8a249a blueswir1
                    if (IS_IMM)
4523 0f8a249a blueswir1
                        goto illegal_insn;
4524 0f8a249a blueswir1
                    if (!supervisor(dc))
4525 0f8a249a blueswir1
                        goto priv_insn;
4526 3475187d bellard
#endif
4527 0f8a249a blueswir1
                    if (rd & 1)
4528 d4218d99 blueswir1
                        goto illegal_insn;
4529 1a2fb1c0 blueswir1
                    else {
4530 c2bc0e38 blueswir1
                        save_state(dc, cpu_cond);
4531 6ae20372 blueswir1
                        gen_stda_asi(cpu_val, cpu_addr, insn, rd);
4532 1a2fb1c0 blueswir1
                    }
4533 d39c0b99 bellard
                    break;
4534 e80cfcfc bellard
#endif
4535 3475187d bellard
#ifdef TARGET_SPARC64
4536 0f8a249a blueswir1
                case 0x0e: /* V9 stx */
4537 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4538 6ae20372 blueswir1
                    tcg_gen_qemu_st64(cpu_val, cpu_addr, dc->mem_idx);
4539 0f8a249a blueswir1
                    break;
4540 0f8a249a blueswir1
                case 0x1e: /* V9 stxa */
4541 c2bc0e38 blueswir1
                    save_state(dc, cpu_cond);
4542 6ae20372 blueswir1
                    gen_st_asi(cpu_val, cpu_addr, insn, 8);
4543 0f8a249a blueswir1
                    break;
4544 3475187d bellard
#endif
4545 0f8a249a blueswir1
                default:
4546 0f8a249a blueswir1
                    goto illegal_insn;
4547 0f8a249a blueswir1
                }
4548 0f8a249a blueswir1
            } else if (xop > 0x23 && xop < 0x28) {
4549 6ae20372 blueswir1
                if (gen_trap_ifnofpu(dc, cpu_cond))
4550 a80dde08 bellard
                    goto jmp_insn;
4551 c2bc0e38 blueswir1
                save_state(dc, cpu_cond);
4552 0f8a249a blueswir1
                switch (xop) {
4553 ce8536e2 blueswir1
                case 0x24: /* store fpreg */
4554 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4555 ce8536e2 blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
4556 ce8536e2 blueswir1
                                   offsetof(CPUState, fpr[rd]));
4557 6ae20372 blueswir1
                    tcg_gen_qemu_st32(cpu_tmp32, cpu_addr, dc->mem_idx);
4558 0f8a249a blueswir1
                    break;
4559 0f8a249a blueswir1
                case 0x25: /* stfsr, V9 stxfsr */
4560 2cade6a3 blueswir1
                    gen_address_mask(dc, cpu_addr);
4561 bb5529bb blueswir1
                    tcg_gen_helper_0_0(helper_stfsr);
4562 ce8536e2 blueswir1
                    tcg_gen_ld_i32(cpu_tmp32, cpu_env,
4563 ce8536e2 blueswir1
                                   offsetof(CPUState, ft0));
4564 6ae20372 blueswir1
                    tcg_gen_qemu_st32(cpu_tmp32, cpu_addr, dc->mem_idx);
4565 0f8a249a blueswir1
                    break;
4566 1f587329 blueswir1
                case 0x26:
4567 1f587329 blueswir1
#ifdef TARGET_SPARC64
4568 1f587329 blueswir1
                    /* V9 stqf, store quad fpreg */
4569 2ea815ca blueswir1
                    {
4570 2ea815ca blueswir1
                        TCGv r_const;
4571 2ea815ca blueswir1
4572 2ea815ca blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
4573 2ea815ca blueswir1
                        gen_op_load_fpr_QT0(QFPREG(rd));
4574 2ea815ca blueswir1
                        r_const = tcg_const_i32(dc->mem_idx);
4575 2ea815ca blueswir1
                        tcg_gen_helper_0_2(helper_stqf, cpu_addr, r_const);
4576 2ea815ca blueswir1
                        tcg_temp_free(r_const);
4577 2ea815ca blueswir1
                    }
4578 1f587329 blueswir1
                    break;
4579 1f587329 blueswir1
#else /* !TARGET_SPARC64 */
4580 1f587329 blueswir1
                    /* stdfq, store floating point queue */
4581 1f587329 blueswir1
#if defined(CONFIG_USER_ONLY)
4582 1f587329 blueswir1
                    goto illegal_insn;
4583 1f587329 blueswir1
#else
4584 0f8a249a blueswir1
                    if (!supervisor(dc))
4585 0f8a249a blueswir1
                        goto priv_insn;
4586 6ae20372 blueswir1
                    if (gen_trap_ifnofpu(dc, cpu_cond))
4587 0f8a249a blueswir1
                        goto jmp_insn;
4588 0f8a249a blueswir1
                    goto nfq_insn;
4589 0f8a249a blueswir1
#endif
4590 1f587329 blueswir1
#endif
4591 7fa76c0b blueswir1
                case 0x27: /* store double fpreg */
4592 2ea815ca blueswir1
                    {
4593 2ea815ca blueswir1
                        TCGv r_const;
4594 2ea815ca blueswir1
4595 2ea815ca blueswir1
                        gen_op_load_fpr_DT0(DFPREG(rd));
4596 2ea815ca blueswir1
                        r_const = tcg_const_i32(dc->mem_idx);
4597 2ea815ca blueswir1
                        tcg_gen_helper_0_2(helper_stdf, cpu_addr, r_const);
4598 2ea815ca blueswir1
                        tcg_temp_free(r_const);
4599 2ea815ca blueswir1
                    }
4600 0f8a249a blueswir1
                    break;
4601 0f8a249a blueswir1
                default:
4602 0f8a249a blueswir1
                    goto illegal_insn;
4603 0f8a249a blueswir1
                }
4604 0f8a249a blueswir1
            } else if (xop > 0x33 && xop < 0x3f) {
4605 c2bc0e38 blueswir1
                save_state(dc, cpu_cond);
4606 0f8a249a blueswir1
                switch (xop) {
4607 a4d17f19 blueswir1
#ifdef TARGET_SPARC64
4608 0f8a249a blueswir1
                case 0x34: /* V9 stfa */
4609 3391c818 blueswir1
                    gen_op_load_fpr_FT0(rd);
4610 6ae20372 blueswir1
                    gen_stf_asi(cpu_addr, insn, 4, rd);
4611 0f8a249a blueswir1
                    break;
4612 1f587329 blueswir1
                case 0x36: /* V9 stqfa */
4613 2ea815ca blueswir1
                    {
4614 2ea815ca blueswir1
                        TCGv r_const;
4615 2ea815ca blueswir1
4616 2ea815ca blueswir1
                        CHECK_FPU_FEATURE(dc, FLOAT128);
4617 2ea815ca blueswir1
                        r_const = tcg_const_i32(7);
4618 2ea815ca blueswir1
                        tcg_gen_helper_0_2(helper_check_align, cpu_addr,
4619 2ea815ca blueswir1
                                           r_const);
4620 2ea815ca blueswir1
                        tcg_temp_free(r_const);
4621 2ea815ca blueswir1
                        gen_op_load_fpr_QT0(QFPREG(rd));
4622 2ea815ca blueswir1
                        gen_stf_asi(cpu_addr, insn, 16, QFPREG(rd));
4623 2ea815ca blueswir1
                    }
4624 1f587329 blueswir1
                    break;
4625 0f8a249a blueswir1
                case 0x37: /* V9 stdfa */
4626 3391c818 blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rd));
4627 6ae20372 blueswir1
                    gen_stf_asi(cpu_addr, insn, 8, DFPREG(rd));
4628 0f8a249a blueswir1
                    break;
4629 0f8a249a blueswir1
                case 0x3c: /* V9 casa */
4630 71817e48 blueswir1
                    gen_cas_asi(cpu_val, cpu_addr, cpu_src2, insn, rd);
4631 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_val);
4632 0f8a249a blueswir1
                    break;
4633 0f8a249a blueswir1
                case 0x3e: /* V9 casxa */
4634 71817e48 blueswir1
                    gen_casx_asi(cpu_val, cpu_addr, cpu_src2, insn, rd);
4635 6ae20372 blueswir1
                    gen_movl_TN_reg(rd, cpu_val);
4636 0f8a249a blueswir1
                    break;
4637 a4d17f19 blueswir1
#else
4638 0f8a249a blueswir1
                case 0x34: /* stc */
4639 0f8a249a blueswir1
                case 0x35: /* stcsr */
4640 0f8a249a blueswir1
                case 0x36: /* stdcq */
4641 0f8a249a blueswir1
                case 0x37: /* stdc */
4642 0f8a249a blueswir1
                    goto ncp_insn;
4643 0f8a249a blueswir1
#endif
4644 0f8a249a blueswir1
                default:
4645 0f8a249a blueswir1
                    goto illegal_insn;
4646 0f8a249a blueswir1
                }
4647 e8af50a3 bellard
            }
4648 0f8a249a blueswir1
            else
4649 0f8a249a blueswir1
                goto illegal_insn;
4650 0f8a249a blueswir1
        }
4651 0f8a249a blueswir1
        break;
4652 cf495bcf bellard
    }
4653 cf495bcf bellard
    /* default case for non jump instructions */
4654 72cbca10 bellard
    if (dc->npc == DYNAMIC_PC) {
4655 0f8a249a blueswir1
        dc->pc = DYNAMIC_PC;
4656 0f8a249a blueswir1
        gen_op_next_insn();
4657 72cbca10 bellard
    } else if (dc->npc == JUMP_PC) {
4658 72cbca10 bellard
        /* we can do a static jump */
4659 6ae20372 blueswir1
        gen_branch2(dc, dc->jump_pc[0], dc->jump_pc[1], cpu_cond);
4660 72cbca10 bellard
        dc->is_br = 1;
4661 72cbca10 bellard
    } else {
4662 0f8a249a blueswir1
        dc->pc = dc->npc;
4663 0f8a249a blueswir1
        dc->npc = dc->npc + 4;
4664 cf495bcf bellard
    }
4665 e80cfcfc bellard
 jmp_insn:
4666 cf495bcf bellard
    return;
4667 cf495bcf bellard
 illegal_insn:
4668 2ea815ca blueswir1
    {
4669 2ea815ca blueswir1
        TCGv r_const;
4670 2ea815ca blueswir1
4671 2ea815ca blueswir1
        save_state(dc, cpu_cond);
4672 2ea815ca blueswir1
        r_const = tcg_const_i32(TT_ILL_INSN);
4673 2ea815ca blueswir1
        tcg_gen_helper_0_1(raise_exception, r_const);
4674 2ea815ca blueswir1
        tcg_temp_free(r_const);
4675 2ea815ca blueswir1
        dc->is_br = 1;
4676 2ea815ca blueswir1
    }
4677 e8af50a3 bellard
    return;
4678 64a88d5d blueswir1
 unimp_flush:
4679 2ea815ca blueswir1
    {
4680 2ea815ca blueswir1
        TCGv r_const;
4681 2ea815ca blueswir1
4682 2ea815ca blueswir1
        save_state(dc, cpu_cond);
4683 2ea815ca blueswir1
        r_const = tcg_const_i32(TT_UNIMP_FLUSH);
4684 2ea815ca blueswir1
        tcg_gen_helper_0_1(raise_exception, r_const);
4685 2ea815ca blueswir1
        tcg_temp_free(r_const);
4686 2ea815ca blueswir1
        dc->is_br = 1;
4687 2ea815ca blueswir1
    }
4688 64a88d5d blueswir1
    return;
4689 e80cfcfc bellard
#if !defined(CONFIG_USER_ONLY)
4690 e8af50a3 bellard
 priv_insn:
4691 2ea815ca blueswir1
    {
4692 2ea815ca blueswir1
        TCGv r_const;
4693 2ea815ca blueswir1
4694 2ea815ca blueswir1
        save_state(dc, cpu_cond);
4695 2ea815ca blueswir1
        r_const = tcg_const_i32(TT_PRIV_INSN);
4696 2ea815ca blueswir1
        tcg_gen_helper_0_1(raise_exception, r_const);
4697 2ea815ca blueswir1
        tcg_temp_free(r_const);
4698 2ea815ca blueswir1
        dc->is_br = 1;
4699 2ea815ca blueswir1
    }
4700 e80cfcfc bellard
    return;
4701 64a88d5d blueswir1
#endif
4702 e80cfcfc bellard
 nfpu_insn:
4703 6ae20372 blueswir1
    save_state(dc, cpu_cond);
4704 e80cfcfc bellard
    gen_op_fpexception_im(FSR_FTT_UNIMPFPOP);
4705 e80cfcfc bellard
    dc->is_br = 1;
4706 fcc72045 blueswir1
    return;
4707 64a88d5d blueswir1
#if !defined(CONFIG_USER_ONLY) && !defined(TARGET_SPARC64)
4708 9143e598 blueswir1
 nfq_insn:
4709 6ae20372 blueswir1
    save_state(dc, cpu_cond);
4710 9143e598 blueswir1
    gen_op_fpexception_im(FSR_FTT_SEQ_ERROR);
4711 9143e598 blueswir1
    dc->is_br = 1;
4712 9143e598 blueswir1
    return;
4713 9143e598 blueswir1
#endif
4714 fcc72045 blueswir1
#ifndef TARGET_SPARC64
4715 fcc72045 blueswir1
 ncp_insn:
4716 2ea815ca blueswir1
    {
4717 2ea815ca blueswir1
        TCGv r_const;
4718 2ea815ca blueswir1
4719 2ea815ca blueswir1
        save_state(dc, cpu_cond);
4720 2ea815ca blueswir1
        r_const = tcg_const_i32(TT_NCP_INSN);
4721 2ea815ca blueswir1
        tcg_gen_helper_0_1(raise_exception, r_const);
4722 2ea815ca blueswir1
        tcg_temp_free(r_const);
4723 2ea815ca blueswir1
        dc->is_br = 1;
4724 2ea815ca blueswir1
    }
4725 fcc72045 blueswir1
    return;
4726 fcc72045 blueswir1
#endif
4727 7a3f1944 bellard
}
4728 7a3f1944 bellard
4729 2cfc5f17 ths
static inline void gen_intermediate_code_internal(TranslationBlock * tb,
4730 2cfc5f17 ths
                                                  int spc, CPUSPARCState *env)
4731 7a3f1944 bellard
{
4732 72cbca10 bellard
    target_ulong pc_start, last_pc;
4733 cf495bcf bellard
    uint16_t *gen_opc_end;
4734 cf495bcf bellard
    DisasContext dc1, *dc = &dc1;
4735 e8af50a3 bellard
    int j, lj = -1;
4736 2e70f6ef pbrook
    int num_insns;
4737 2e70f6ef pbrook
    int max_insns;
4738 cf495bcf bellard
4739 cf495bcf bellard
    memset(dc, 0, sizeof(DisasContext));
4740 cf495bcf bellard
    dc->tb = tb;
4741 72cbca10 bellard
    pc_start = tb->pc;
4742 cf495bcf bellard
    dc->pc = pc_start;
4743 e80cfcfc bellard
    last_pc = dc->pc;
4744 72cbca10 bellard
    dc->npc = (target_ulong) tb->cs_base;
4745 6f27aba6 blueswir1
    dc->mem_idx = cpu_mmu_index(env);
4746 64a88d5d blueswir1
    dc->features = env->features;
4747 64a88d5d blueswir1
    if ((dc->features & CPU_FEATURE_FLOAT)) {
4748 64a88d5d blueswir1
        dc->fpu_enabled = cpu_fpu_enabled(env);
4749 64a88d5d blueswir1
#if defined(CONFIG_USER_ONLY)
4750 64a88d5d blueswir1
        dc->features |= CPU_FEATURE_FLOAT128;
4751 64a88d5d blueswir1
#endif
4752 64a88d5d blueswir1
    } else
4753 64a88d5d blueswir1
        dc->fpu_enabled = 0;
4754 2cade6a3 blueswir1
#ifdef TARGET_SPARC64
4755 2cade6a3 blueswir1
    dc->address_mask_32bit = env->pstate & PS_AM;
4756 2cade6a3 blueswir1
#endif
4757 cf495bcf bellard
    gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
4758 cf495bcf bellard
4759 1a2fb1c0 blueswir1
    cpu_tmp0 = tcg_temp_new(TCG_TYPE_TL);
4760 8911f501 blueswir1
    cpu_tmp32 = tcg_temp_new(TCG_TYPE_I32);
4761 8911f501 blueswir1
    cpu_tmp64 = tcg_temp_new(TCG_TYPE_I64);
4762 d987963a blueswir1
4763 d987963a blueswir1
    cpu_dst = tcg_temp_local_new(TCG_TYPE_TL);
4764 d987963a blueswir1
4765 d987963a blueswir1
    // loads and stores
4766 3f0436fe blueswir1
    cpu_val = tcg_temp_local_new(TCG_TYPE_TL);
4767 d987963a blueswir1
    cpu_addr = tcg_temp_local_new(TCG_TYPE_TL);
4768 1a2fb1c0 blueswir1
4769 2e70f6ef pbrook
    num_insns = 0;
4770 2e70f6ef pbrook
    max_insns = tb->cflags & CF_COUNT_MASK;
4771 2e70f6ef pbrook
    if (max_insns == 0)
4772 2e70f6ef pbrook
        max_insns = CF_COUNT_MASK;
4773 2e70f6ef pbrook
    gen_icount_start();
4774 cf495bcf bellard
    do {
4775 e8af50a3 bellard
        if (env->nb_breakpoints > 0) {
4776 e8af50a3 bellard
            for(j = 0; j < env->nb_breakpoints; j++) {
4777 e8af50a3 bellard
                if (env->breakpoints[j] == dc->pc) {
4778 0f8a249a blueswir1
                    if (dc->pc != pc_start)
4779 6ae20372 blueswir1
                        save_state(dc, cpu_cond);
4780 1a2fb1c0 blueswir1
                    tcg_gen_helper_0_0(helper_debug);
4781 57fec1fe bellard
                    tcg_gen_exit_tb(0);
4782 0f8a249a blueswir1
                    dc->is_br = 1;
4783 e80cfcfc bellard
                    goto exit_gen_loop;
4784 e8af50a3 bellard
                }
4785 e8af50a3 bellard
            }
4786 e8af50a3 bellard
        }
4787 e8af50a3 bellard
        if (spc) {
4788 e8af50a3 bellard
            if (loglevel > 0)
4789 e8af50a3 bellard
                fprintf(logfile, "Search PC...\n");
4790 e8af50a3 bellard
            j = gen_opc_ptr - gen_opc_buf;
4791 e8af50a3 bellard
            if (lj < j) {
4792 e8af50a3 bellard
                lj++;
4793 e8af50a3 bellard
                while (lj < j)
4794 e8af50a3 bellard
                    gen_opc_instr_start[lj++] = 0;
4795 e8af50a3 bellard
                gen_opc_pc[lj] = dc->pc;
4796 e8af50a3 bellard
                gen_opc_npc[lj] = dc->npc;
4797 e8af50a3 bellard
                gen_opc_instr_start[lj] = 1;
4798 2e70f6ef pbrook
                gen_opc_icount[lj] = num_insns;
4799 e8af50a3 bellard
            }
4800 e8af50a3 bellard
        }
4801 2e70f6ef pbrook
        if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO))
4802 2e70f6ef pbrook
            gen_io_start();
4803 0f8a249a blueswir1
        last_pc = dc->pc;
4804 0f8a249a blueswir1
        disas_sparc_insn(dc);
4805 2e70f6ef pbrook
        num_insns++;
4806 0f8a249a blueswir1
4807 0f8a249a blueswir1
        if (dc->is_br)
4808 0f8a249a blueswir1
            break;
4809 0f8a249a blueswir1
        /* if the next PC is different, we abort now */
4810 0f8a249a blueswir1
        if (dc->pc != (last_pc + 4))
4811 0f8a249a blueswir1
            break;
4812 d39c0b99 bellard
        /* if we reach a page boundary, we stop generation so that the
4813 d39c0b99 bellard
           PC of a TT_TFAULT exception is always in the right page */
4814 d39c0b99 bellard
        if ((dc->pc & (TARGET_PAGE_SIZE - 1)) == 0)
4815 d39c0b99 bellard
            break;
4816 e80cfcfc bellard
        /* if single step mode, we generate only one instruction and
4817 e80cfcfc bellard
           generate an exception */
4818 e80cfcfc bellard
        if (env->singlestep_enabled) {
4819 2f5680ee blueswir1
            tcg_gen_movi_tl(cpu_pc, dc->pc);
4820 57fec1fe bellard
            tcg_gen_exit_tb(0);
4821 e80cfcfc bellard
            break;
4822 e80cfcfc bellard
        }
4823 cf495bcf bellard
    } while ((gen_opc_ptr < gen_opc_end) &&
4824 2e70f6ef pbrook
             (dc->pc - pc_start) < (TARGET_PAGE_SIZE - 32) &&
4825 2e70f6ef pbrook
             num_insns < max_insns);
4826 e80cfcfc bellard
4827 e80cfcfc bellard
 exit_gen_loop:
4828 d987963a blueswir1
    tcg_temp_free(cpu_addr);
4829 3f0436fe blueswir1
    tcg_temp_free(cpu_val);
4830 d987963a blueswir1
    tcg_temp_free(cpu_dst);
4831 2ea815ca blueswir1
    tcg_temp_free(cpu_tmp64);
4832 2ea815ca blueswir1
    tcg_temp_free(cpu_tmp32);
4833 2ea815ca blueswir1
    tcg_temp_free(cpu_tmp0);
4834 2e70f6ef pbrook
    if (tb->cflags & CF_LAST_IO)
4835 2e70f6ef pbrook
        gen_io_end();
4836 72cbca10 bellard
    if (!dc->is_br) {
4837 5fafdf24 ths
        if (dc->pc != DYNAMIC_PC &&
4838 72cbca10 bellard
            (dc->npc != DYNAMIC_PC && dc->npc != JUMP_PC)) {
4839 72cbca10 bellard
            /* static PC and NPC: we can use direct chaining */
4840 2f5680ee blueswir1
            gen_goto_tb(dc, 0, dc->pc, dc->npc);
4841 72cbca10 bellard
        } else {
4842 72cbca10 bellard
            if (dc->pc != DYNAMIC_PC)
4843 2f5680ee blueswir1
                tcg_gen_movi_tl(cpu_pc, dc->pc);
4844 6ae20372 blueswir1
            save_npc(dc, cpu_cond);
4845 57fec1fe bellard
            tcg_gen_exit_tb(0);
4846 72cbca10 bellard
        }
4847 72cbca10 bellard
    }
4848 2e70f6ef pbrook
    gen_icount_end(tb, num_insns);
4849 cf495bcf bellard
    *gen_opc_ptr = INDEX_op_end;
4850 e8af50a3 bellard
    if (spc) {
4851 e8af50a3 bellard
        j = gen_opc_ptr - gen_opc_buf;
4852 e8af50a3 bellard
        lj++;
4853 e8af50a3 bellard
        while (lj <= j)
4854 e8af50a3 bellard
            gen_opc_instr_start[lj++] = 0;
4855 e8af50a3 bellard
#if 0
4856 e8af50a3 bellard
        if (loglevel > 0) {
4857 e8af50a3 bellard
            page_dump(logfile);
4858 e8af50a3 bellard
        }
4859 e8af50a3 bellard
#endif
4860 c3278b7b bellard
        gen_opc_jump_pc[0] = dc->jump_pc[0];
4861 c3278b7b bellard
        gen_opc_jump_pc[1] = dc->jump_pc[1];
4862 e8af50a3 bellard
    } else {
4863 e80cfcfc bellard
        tb->size = last_pc + 4 - pc_start;
4864 2e70f6ef pbrook
        tb->icount = num_insns;
4865 e8af50a3 bellard
    }
4866 7a3f1944 bellard
#ifdef DEBUG_DISAS
4867 e19e89a5 bellard
    if (loglevel & CPU_LOG_TB_IN_ASM) {
4868 0f8a249a blueswir1
        fprintf(logfile, "--------------\n");
4869 0f8a249a blueswir1
        fprintf(logfile, "IN: %s\n", lookup_symbol(pc_start));
4870 0f8a249a blueswir1
        target_disas(logfile, pc_start, last_pc + 4 - pc_start, 0);
4871 0f8a249a blueswir1
        fprintf(logfile, "\n");
4872 cf495bcf bellard
    }
4873 7a3f1944 bellard
#endif
4874 7a3f1944 bellard
}
4875 7a3f1944 bellard
4876 2cfc5f17 ths
void gen_intermediate_code(CPUSPARCState * env, TranslationBlock * tb)
4877 7a3f1944 bellard
{
4878 2cfc5f17 ths
    gen_intermediate_code_internal(tb, 0, env);
4879 7a3f1944 bellard
}
4880 7a3f1944 bellard
4881 2cfc5f17 ths
void gen_intermediate_code_pc(CPUSPARCState * env, TranslationBlock * tb)
4882 7a3f1944 bellard
{
4883 2cfc5f17 ths
    gen_intermediate_code_internal(tb, 1, env);
4884 7a3f1944 bellard
}
4885 7a3f1944 bellard
4886 c48fcb47 blueswir1
void gen_intermediate_code_init(CPUSPARCState *env)
4887 e80cfcfc bellard
{
4888 f5069b26 blueswir1
    unsigned int i;
4889 c48fcb47 blueswir1
    static int inited;
4890 f5069b26 blueswir1
    static const char * const gregnames[8] = {
4891 f5069b26 blueswir1
        NULL, // g0 not used
4892 f5069b26 blueswir1
        "g1",
4893 f5069b26 blueswir1
        "g2",
4894 f5069b26 blueswir1
        "g3",
4895 f5069b26 blueswir1
        "g4",
4896 f5069b26 blueswir1
        "g5",
4897 f5069b26 blueswir1
        "g6",
4898 f5069b26 blueswir1
        "g7",
4899 f5069b26 blueswir1
    };
4900 aaed909a bellard
4901 1a2fb1c0 blueswir1
    /* init various static tables */
4902 1a2fb1c0 blueswir1
    if (!inited) {
4903 1a2fb1c0 blueswir1
        inited = 1;
4904 1a2fb1c0 blueswir1
4905 1a2fb1c0 blueswir1
        cpu_env = tcg_global_reg_new(TCG_TYPE_PTR, TCG_AREG0, "env");
4906 db4a4ea4 blueswir1
        cpu_regwptr = tcg_global_mem_new(TCG_TYPE_PTR, TCG_AREG0,
4907 db4a4ea4 blueswir1
                                         offsetof(CPUState, regwptr),
4908 db4a4ea4 blueswir1
                                         "regwptr");
4909 1a2fb1c0 blueswir1
#ifdef TARGET_SPARC64
4910 dc99a3f2 blueswir1
        cpu_xcc = tcg_global_mem_new(TCG_TYPE_I32,
4911 dc99a3f2 blueswir1
                                     TCG_AREG0, offsetof(CPUState, xcc),
4912 dc99a3f2 blueswir1
                                     "xcc");
4913 1a2fb1c0 blueswir1
#endif
4914 7c60cc4b bellard
        cpu_cond = tcg_global_mem_new(TCG_TYPE_TL,
4915 77f193da blueswir1
                                      TCG_AREG0, offsetof(CPUState, cond),
4916 77f193da blueswir1
                                      "cond");
4917 dc99a3f2 blueswir1
        cpu_cc_src = tcg_global_mem_new(TCG_TYPE_TL,
4918 dc99a3f2 blueswir1
                                        TCG_AREG0, offsetof(CPUState, cc_src),
4919 dc99a3f2 blueswir1
                                        "cc_src");
4920 d9bdab86 blueswir1
        cpu_cc_src2 = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0,
4921 d9bdab86 blueswir1
                                         offsetof(CPUState, cc_src2),
4922 d9bdab86 blueswir1
                                         "cc_src2");
4923 dc99a3f2 blueswir1
        cpu_cc_dst = tcg_global_mem_new(TCG_TYPE_TL,
4924 dc99a3f2 blueswir1
                                        TCG_AREG0, offsetof(CPUState, cc_dst),
4925 dc99a3f2 blueswir1
                                        "cc_dst");
4926 dc99a3f2 blueswir1
        cpu_psr = tcg_global_mem_new(TCG_TYPE_I32,
4927 dc99a3f2 blueswir1
                                     TCG_AREG0, offsetof(CPUState, psr),
4928 dc99a3f2 blueswir1
                                     "psr");
4929 87e92502 blueswir1
        cpu_fsr = tcg_global_mem_new(TCG_TYPE_TL,
4930 87e92502 blueswir1
                                     TCG_AREG0, offsetof(CPUState, fsr),
4931 87e92502 blueswir1
                                     "fsr");
4932 48d5c82b blueswir1
        cpu_pc = tcg_global_mem_new(TCG_TYPE_TL,
4933 48d5c82b blueswir1
                                    TCG_AREG0, offsetof(CPUState, pc),
4934 48d5c82b blueswir1
                                    "pc");
4935 48d5c82b blueswir1
        cpu_npc = tcg_global_mem_new(TCG_TYPE_TL,
4936 48d5c82b blueswir1
                                    TCG_AREG0, offsetof(CPUState, npc),
4937 48d5c82b blueswir1
                                    "npc");
4938 f5069b26 blueswir1
        for (i = 1; i < 8; i++)
4939 f5069b26 blueswir1
            cpu_gregs[i] = tcg_global_mem_new(TCG_TYPE_TL, TCG_AREG0,
4940 f5069b26 blueswir1
                                              offsetof(CPUState, gregs[i]),
4941 f5069b26 blueswir1
                                              gregnames[i]);
4942 c9e03d8f blueswir1
        /* register helpers */
4943 c9e03d8f blueswir1
4944 c9e03d8f blueswir1
#undef DEF_HELPER
4945 c9e03d8f blueswir1
#define DEF_HELPER(ret, name, params) tcg_register_helper(name, #name);
4946 c9e03d8f blueswir1
#include "helper.h"
4947 1a2fb1c0 blueswir1
    }
4948 658138bc bellard
}
4949 d2856f1a aurel32
4950 d2856f1a aurel32
void gen_pc_load(CPUState *env, TranslationBlock *tb,
4951 d2856f1a aurel32
                unsigned long searched_pc, int pc_pos, void *puc)
4952 d2856f1a aurel32
{
4953 d2856f1a aurel32
    target_ulong npc;
4954 d2856f1a aurel32
    env->pc = gen_opc_pc[pc_pos];
4955 d2856f1a aurel32
    npc = gen_opc_npc[pc_pos];
4956 d2856f1a aurel32
    if (npc == 1) {
4957 d2856f1a aurel32
        /* dynamic NPC: already stored */
4958 d2856f1a aurel32
    } else if (npc == 2) {
4959 d2856f1a aurel32
        target_ulong t2 = (target_ulong)(unsigned long)puc;
4960 d2856f1a aurel32
        /* jump PC: use T2 and the jump targets of the translation */
4961 d2856f1a aurel32
        if (t2)
4962 d2856f1a aurel32
            env->npc = gen_opc_jump_pc[0];
4963 d2856f1a aurel32
        else
4964 d2856f1a aurel32
            env->npc = gen_opc_jump_pc[1];
4965 d2856f1a aurel32
    } else {
4966 d2856f1a aurel32
        env->npc = npc;
4967 d2856f1a aurel32
    }
4968 d2856f1a aurel32
}