Statistics
| Branch: | Revision:

root / target-sparc / translate.c @ 255e1fcb

History | View | Annotate | Download (183.7 kB)

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

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

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

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

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