Statistics
| Branch: | Revision:

root / target-sparc / translate.c @ 375ee38b

History | View | Annotate | Download (162.1 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
/*
23 7a3f1944 bellard
   TODO-list:
24 7a3f1944 bellard

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