Statistics
| Branch: | Revision:

root / target-sparc / translate.c @ 6f27aba6

History | View | Annotate | Download (123 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 3475187d bellard
   128-bit float
29 bd497938 bellard
*/
30 7a3f1944 bellard
31 7a3f1944 bellard
#include <stdarg.h>
32 7a3f1944 bellard
#include <stdlib.h>
33 7a3f1944 bellard
#include <stdio.h>
34 7a3f1944 bellard
#include <string.h>
35 7a3f1944 bellard
#include <inttypes.h>
36 7a3f1944 bellard
37 7a3f1944 bellard
#include "cpu.h"
38 7a3f1944 bellard
#include "exec-all.h"
39 7a3f1944 bellard
#include "disas.h"
40 7a3f1944 bellard
41 7a3f1944 bellard
#define DEBUG_DISAS
42 7a3f1944 bellard
43 72cbca10 bellard
#define DYNAMIC_PC  1 /* dynamic pc value */
44 72cbca10 bellard
#define JUMP_PC     2 /* dynamic pc value which takes only two values
45 72cbca10 bellard
                         according to jump_pc[T2] */
46 72cbca10 bellard
47 7a3f1944 bellard
typedef struct DisasContext {
48 0f8a249a blueswir1
    target_ulong pc;    /* current Program Counter: integer or DYNAMIC_PC */
49 0f8a249a blueswir1
    target_ulong npc;   /* next PC: integer or DYNAMIC_PC or JUMP_PC */
50 72cbca10 bellard
    target_ulong jump_pc[2]; /* used when JUMP_PC pc value is used */
51 cf495bcf bellard
    int is_br;
52 e8af50a3 bellard
    int mem_idx;
53 a80dde08 bellard
    int fpu_enabled;
54 cf495bcf bellard
    struct TranslationBlock *tb;
55 7a3f1944 bellard
} DisasContext;
56 7a3f1944 bellard
57 62724a37 blueswir1
struct sparc_def_t {
58 62724a37 blueswir1
    const unsigned char *name;
59 62724a37 blueswir1
    target_ulong iu_version;
60 62724a37 blueswir1
    uint32_t fpu_version;
61 62724a37 blueswir1
    uint32_t mmu_version;
62 62724a37 blueswir1
};
63 62724a37 blueswir1
64 7a3f1944 bellard
static uint16_t *gen_opc_ptr;
65 7a3f1944 bellard
static uint32_t *gen_opparam_ptr;
66 7a3f1944 bellard
extern FILE *logfile;
67 7a3f1944 bellard
extern int loglevel;
68 7a3f1944 bellard
69 7a3f1944 bellard
enum {
70 7a3f1944 bellard
#define DEF(s,n,copy_size) INDEX_op_ ## s,
71 7a3f1944 bellard
#include "opc.h"
72 7a3f1944 bellard
#undef DEF
73 cf495bcf bellard
    NB_OPS
74 7a3f1944 bellard
};
75 7a3f1944 bellard
76 7a3f1944 bellard
#include "gen-op.h"
77 7a3f1944 bellard
78 3475187d bellard
// This function uses non-native bit order
79 7a3f1944 bellard
#define GET_FIELD(X, FROM, TO) \
80 7a3f1944 bellard
  ((X) >> (31 - (TO)) & ((1 << ((TO) - (FROM) + 1)) - 1))
81 7a3f1944 bellard
82 3475187d bellard
// This function uses the order in the manuals, i.e. bit 0 is 2^0
83 3475187d bellard
#define GET_FIELD_SP(X, FROM, TO) \
84 3475187d bellard
    GET_FIELD(X, 31 - (TO), 31 - (FROM))
85 3475187d bellard
86 3475187d bellard
#define GET_FIELDs(x,a,b) sign_extend (GET_FIELD(x,a,b), (b) - (a) + 1)
87 46d38ba8 blueswir1
#define GET_FIELD_SPs(x,a,b) sign_extend (GET_FIELD_SP(x,a,b), ((b) - (a) + 1))
88 3475187d bellard
89 3475187d bellard
#ifdef TARGET_SPARC64
90 0387d928 blueswir1
#define DFPREG(r) (((r & 1) << 5) | (r & 0x1e))
91 3475187d bellard
#else
92 c185970a blueswir1
#define DFPREG(r) (r & 0x1e)
93 3475187d bellard
#endif
94 3475187d bellard
95 83469015 bellard
#ifdef USE_DIRECT_JUMP
96 83469015 bellard
#define TBPARAM(x)
97 83469015 bellard
#else
98 83469015 bellard
#define TBPARAM(x) (long)(x)
99 83469015 bellard
#endif
100 83469015 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 a68156d0 blueswir1
static GenOpFunc * const gen_op_movl_TN_reg[2][32] = {
112 cf495bcf bellard
    {
113 cf495bcf bellard
     gen_op_movl_g0_T0,
114 cf495bcf bellard
     gen_op_movl_g1_T0,
115 cf495bcf bellard
     gen_op_movl_g2_T0,
116 cf495bcf bellard
     gen_op_movl_g3_T0,
117 cf495bcf bellard
     gen_op_movl_g4_T0,
118 cf495bcf bellard
     gen_op_movl_g5_T0,
119 cf495bcf bellard
     gen_op_movl_g6_T0,
120 cf495bcf bellard
     gen_op_movl_g7_T0,
121 cf495bcf bellard
     gen_op_movl_o0_T0,
122 cf495bcf bellard
     gen_op_movl_o1_T0,
123 cf495bcf bellard
     gen_op_movl_o2_T0,
124 cf495bcf bellard
     gen_op_movl_o3_T0,
125 cf495bcf bellard
     gen_op_movl_o4_T0,
126 cf495bcf bellard
     gen_op_movl_o5_T0,
127 cf495bcf bellard
     gen_op_movl_o6_T0,
128 cf495bcf bellard
     gen_op_movl_o7_T0,
129 cf495bcf bellard
     gen_op_movl_l0_T0,
130 cf495bcf bellard
     gen_op_movl_l1_T0,
131 cf495bcf bellard
     gen_op_movl_l2_T0,
132 cf495bcf bellard
     gen_op_movl_l3_T0,
133 cf495bcf bellard
     gen_op_movl_l4_T0,
134 cf495bcf bellard
     gen_op_movl_l5_T0,
135 cf495bcf bellard
     gen_op_movl_l6_T0,
136 cf495bcf bellard
     gen_op_movl_l7_T0,
137 cf495bcf bellard
     gen_op_movl_i0_T0,
138 cf495bcf bellard
     gen_op_movl_i1_T0,
139 cf495bcf bellard
     gen_op_movl_i2_T0,
140 cf495bcf bellard
     gen_op_movl_i3_T0,
141 cf495bcf bellard
     gen_op_movl_i4_T0,
142 cf495bcf bellard
     gen_op_movl_i5_T0,
143 cf495bcf bellard
     gen_op_movl_i6_T0,
144 cf495bcf bellard
     gen_op_movl_i7_T0,
145 cf495bcf bellard
     },
146 cf495bcf bellard
    {
147 cf495bcf bellard
     gen_op_movl_g0_T1,
148 cf495bcf bellard
     gen_op_movl_g1_T1,
149 cf495bcf bellard
     gen_op_movl_g2_T1,
150 cf495bcf bellard
     gen_op_movl_g3_T1,
151 cf495bcf bellard
     gen_op_movl_g4_T1,
152 cf495bcf bellard
     gen_op_movl_g5_T1,
153 cf495bcf bellard
     gen_op_movl_g6_T1,
154 cf495bcf bellard
     gen_op_movl_g7_T1,
155 cf495bcf bellard
     gen_op_movl_o0_T1,
156 cf495bcf bellard
     gen_op_movl_o1_T1,
157 cf495bcf bellard
     gen_op_movl_o2_T1,
158 cf495bcf bellard
     gen_op_movl_o3_T1,
159 cf495bcf bellard
     gen_op_movl_o4_T1,
160 cf495bcf bellard
     gen_op_movl_o5_T1,
161 cf495bcf bellard
     gen_op_movl_o6_T1,
162 cf495bcf bellard
     gen_op_movl_o7_T1,
163 cf495bcf bellard
     gen_op_movl_l0_T1,
164 cf495bcf bellard
     gen_op_movl_l1_T1,
165 cf495bcf bellard
     gen_op_movl_l2_T1,
166 cf495bcf bellard
     gen_op_movl_l3_T1,
167 cf495bcf bellard
     gen_op_movl_l4_T1,
168 cf495bcf bellard
     gen_op_movl_l5_T1,
169 cf495bcf bellard
     gen_op_movl_l6_T1,
170 cf495bcf bellard
     gen_op_movl_l7_T1,
171 cf495bcf bellard
     gen_op_movl_i0_T1,
172 cf495bcf bellard
     gen_op_movl_i1_T1,
173 cf495bcf bellard
     gen_op_movl_i2_T1,
174 cf495bcf bellard
     gen_op_movl_i3_T1,
175 cf495bcf bellard
     gen_op_movl_i4_T1,
176 cf495bcf bellard
     gen_op_movl_i5_T1,
177 cf495bcf bellard
     gen_op_movl_i6_T1,
178 cf495bcf bellard
     gen_op_movl_i7_T1,
179 cf495bcf bellard
     }
180 7a3f1944 bellard
};
181 7a3f1944 bellard
182 a68156d0 blueswir1
static GenOpFunc * const gen_op_movl_reg_TN[3][32] = {
183 cf495bcf bellard
    {
184 cf495bcf bellard
     gen_op_movl_T0_g0,
185 cf495bcf bellard
     gen_op_movl_T0_g1,
186 cf495bcf bellard
     gen_op_movl_T0_g2,
187 cf495bcf bellard
     gen_op_movl_T0_g3,
188 cf495bcf bellard
     gen_op_movl_T0_g4,
189 cf495bcf bellard
     gen_op_movl_T0_g5,
190 cf495bcf bellard
     gen_op_movl_T0_g6,
191 cf495bcf bellard
     gen_op_movl_T0_g7,
192 cf495bcf bellard
     gen_op_movl_T0_o0,
193 cf495bcf bellard
     gen_op_movl_T0_o1,
194 cf495bcf bellard
     gen_op_movl_T0_o2,
195 cf495bcf bellard
     gen_op_movl_T0_o3,
196 cf495bcf bellard
     gen_op_movl_T0_o4,
197 cf495bcf bellard
     gen_op_movl_T0_o5,
198 cf495bcf bellard
     gen_op_movl_T0_o6,
199 cf495bcf bellard
     gen_op_movl_T0_o7,
200 cf495bcf bellard
     gen_op_movl_T0_l0,
201 cf495bcf bellard
     gen_op_movl_T0_l1,
202 cf495bcf bellard
     gen_op_movl_T0_l2,
203 cf495bcf bellard
     gen_op_movl_T0_l3,
204 cf495bcf bellard
     gen_op_movl_T0_l4,
205 cf495bcf bellard
     gen_op_movl_T0_l5,
206 cf495bcf bellard
     gen_op_movl_T0_l6,
207 cf495bcf bellard
     gen_op_movl_T0_l7,
208 cf495bcf bellard
     gen_op_movl_T0_i0,
209 cf495bcf bellard
     gen_op_movl_T0_i1,
210 cf495bcf bellard
     gen_op_movl_T0_i2,
211 cf495bcf bellard
     gen_op_movl_T0_i3,
212 cf495bcf bellard
     gen_op_movl_T0_i4,
213 cf495bcf bellard
     gen_op_movl_T0_i5,
214 cf495bcf bellard
     gen_op_movl_T0_i6,
215 cf495bcf bellard
     gen_op_movl_T0_i7,
216 cf495bcf bellard
     },
217 cf495bcf bellard
    {
218 cf495bcf bellard
     gen_op_movl_T1_g0,
219 cf495bcf bellard
     gen_op_movl_T1_g1,
220 cf495bcf bellard
     gen_op_movl_T1_g2,
221 cf495bcf bellard
     gen_op_movl_T1_g3,
222 cf495bcf bellard
     gen_op_movl_T1_g4,
223 cf495bcf bellard
     gen_op_movl_T1_g5,
224 cf495bcf bellard
     gen_op_movl_T1_g6,
225 cf495bcf bellard
     gen_op_movl_T1_g7,
226 cf495bcf bellard
     gen_op_movl_T1_o0,
227 cf495bcf bellard
     gen_op_movl_T1_o1,
228 cf495bcf bellard
     gen_op_movl_T1_o2,
229 cf495bcf bellard
     gen_op_movl_T1_o3,
230 cf495bcf bellard
     gen_op_movl_T1_o4,
231 cf495bcf bellard
     gen_op_movl_T1_o5,
232 cf495bcf bellard
     gen_op_movl_T1_o6,
233 cf495bcf bellard
     gen_op_movl_T1_o7,
234 cf495bcf bellard
     gen_op_movl_T1_l0,
235 cf495bcf bellard
     gen_op_movl_T1_l1,
236 cf495bcf bellard
     gen_op_movl_T1_l2,
237 cf495bcf bellard
     gen_op_movl_T1_l3,
238 cf495bcf bellard
     gen_op_movl_T1_l4,
239 cf495bcf bellard
     gen_op_movl_T1_l5,
240 cf495bcf bellard
     gen_op_movl_T1_l6,
241 cf495bcf bellard
     gen_op_movl_T1_l7,
242 cf495bcf bellard
     gen_op_movl_T1_i0,
243 cf495bcf bellard
     gen_op_movl_T1_i1,
244 cf495bcf bellard
     gen_op_movl_T1_i2,
245 cf495bcf bellard
     gen_op_movl_T1_i3,
246 cf495bcf bellard
     gen_op_movl_T1_i4,
247 cf495bcf bellard
     gen_op_movl_T1_i5,
248 cf495bcf bellard
     gen_op_movl_T1_i6,
249 cf495bcf bellard
     gen_op_movl_T1_i7,
250 cf495bcf bellard
     },
251 cf495bcf bellard
    {
252 cf495bcf bellard
     gen_op_movl_T2_g0,
253 cf495bcf bellard
     gen_op_movl_T2_g1,
254 cf495bcf bellard
     gen_op_movl_T2_g2,
255 cf495bcf bellard
     gen_op_movl_T2_g3,
256 cf495bcf bellard
     gen_op_movl_T2_g4,
257 cf495bcf bellard
     gen_op_movl_T2_g5,
258 cf495bcf bellard
     gen_op_movl_T2_g6,
259 cf495bcf bellard
     gen_op_movl_T2_g7,
260 cf495bcf bellard
     gen_op_movl_T2_o0,
261 cf495bcf bellard
     gen_op_movl_T2_o1,
262 cf495bcf bellard
     gen_op_movl_T2_o2,
263 cf495bcf bellard
     gen_op_movl_T2_o3,
264 cf495bcf bellard
     gen_op_movl_T2_o4,
265 cf495bcf bellard
     gen_op_movl_T2_o5,
266 cf495bcf bellard
     gen_op_movl_T2_o6,
267 cf495bcf bellard
     gen_op_movl_T2_o7,
268 cf495bcf bellard
     gen_op_movl_T2_l0,
269 cf495bcf bellard
     gen_op_movl_T2_l1,
270 cf495bcf bellard
     gen_op_movl_T2_l2,
271 cf495bcf bellard
     gen_op_movl_T2_l3,
272 cf495bcf bellard
     gen_op_movl_T2_l4,
273 cf495bcf bellard
     gen_op_movl_T2_l5,
274 cf495bcf bellard
     gen_op_movl_T2_l6,
275 cf495bcf bellard
     gen_op_movl_T2_l7,
276 cf495bcf bellard
     gen_op_movl_T2_i0,
277 cf495bcf bellard
     gen_op_movl_T2_i1,
278 cf495bcf bellard
     gen_op_movl_T2_i2,
279 cf495bcf bellard
     gen_op_movl_T2_i3,
280 cf495bcf bellard
     gen_op_movl_T2_i4,
281 cf495bcf bellard
     gen_op_movl_T2_i5,
282 cf495bcf bellard
     gen_op_movl_T2_i6,
283 cf495bcf bellard
     gen_op_movl_T2_i7,
284 cf495bcf bellard
     }
285 7a3f1944 bellard
};
286 7a3f1944 bellard
287 a68156d0 blueswir1
static GenOpFunc1 * const gen_op_movl_TN_im[3] = {
288 cf495bcf bellard
    gen_op_movl_T0_im,
289 cf495bcf bellard
    gen_op_movl_T1_im,
290 cf495bcf bellard
    gen_op_movl_T2_im
291 7a3f1944 bellard
};
292 7a3f1944 bellard
293 3475187d bellard
// Sign extending version
294 3475187d bellard
static GenOpFunc1 * const gen_op_movl_TN_sim[3] = {
295 3475187d bellard
    gen_op_movl_T0_sim,
296 3475187d bellard
    gen_op_movl_T1_sim,
297 3475187d bellard
    gen_op_movl_T2_sim
298 3475187d bellard
};
299 3475187d bellard
300 3475187d bellard
#ifdef TARGET_SPARC64
301 3475187d bellard
#define GEN32(func, NAME) \
302 a68156d0 blueswir1
static GenOpFunc * const NAME ## _table [64] = {                              \
303 3475187d bellard
NAME ## 0, NAME ## 1, NAME ## 2, NAME ## 3,                                   \
304 3475187d bellard
NAME ## 4, NAME ## 5, NAME ## 6, NAME ## 7,                                   \
305 3475187d bellard
NAME ## 8, NAME ## 9, NAME ## 10, NAME ## 11,                                 \
306 3475187d bellard
NAME ## 12, NAME ## 13, NAME ## 14, NAME ## 15,                               \
307 3475187d bellard
NAME ## 16, NAME ## 17, NAME ## 18, NAME ## 19,                               \
308 3475187d bellard
NAME ## 20, NAME ## 21, NAME ## 22, NAME ## 23,                               \
309 3475187d bellard
NAME ## 24, NAME ## 25, NAME ## 26, NAME ## 27,                               \
310 3475187d bellard
NAME ## 28, NAME ## 29, NAME ## 30, NAME ## 31,                               \
311 3475187d bellard
NAME ## 32, 0, NAME ## 34, 0, NAME ## 36, 0, NAME ## 38, 0,                   \
312 3475187d bellard
NAME ## 40, 0, NAME ## 42, 0, NAME ## 44, 0, NAME ## 46, 0,                   \
313 3475187d bellard
NAME ## 48, 0, NAME ## 50, 0, NAME ## 52, 0, NAME ## 54, 0,                   \
314 3475187d bellard
NAME ## 56, 0, NAME ## 58, 0, NAME ## 60, 0, NAME ## 62, 0,                   \
315 3475187d bellard
};                                                                            \
316 3475187d bellard
static inline void func(int n)                                                \
317 3475187d bellard
{                                                                             \
318 3475187d bellard
    NAME ## _table[n]();                                                      \
319 3475187d bellard
}
320 3475187d bellard
#else
321 e8af50a3 bellard
#define GEN32(func, NAME) \
322 a68156d0 blueswir1
static GenOpFunc *const NAME ## _table [32] = {                               \
323 e8af50a3 bellard
NAME ## 0, NAME ## 1, NAME ## 2, NAME ## 3,                                   \
324 e8af50a3 bellard
NAME ## 4, NAME ## 5, NAME ## 6, NAME ## 7,                                   \
325 e8af50a3 bellard
NAME ## 8, NAME ## 9, NAME ## 10, NAME ## 11,                                 \
326 e8af50a3 bellard
NAME ## 12, NAME ## 13, NAME ## 14, NAME ## 15,                               \
327 e8af50a3 bellard
NAME ## 16, NAME ## 17, NAME ## 18, NAME ## 19,                               \
328 e8af50a3 bellard
NAME ## 20, NAME ## 21, NAME ## 22, NAME ## 23,                               \
329 e8af50a3 bellard
NAME ## 24, NAME ## 25, NAME ## 26, NAME ## 27,                               \
330 e8af50a3 bellard
NAME ## 28, NAME ## 29, NAME ## 30, NAME ## 31,                               \
331 e8af50a3 bellard
};                                                                            \
332 e8af50a3 bellard
static inline void func(int n)                                                \
333 e8af50a3 bellard
{                                                                             \
334 e8af50a3 bellard
    NAME ## _table[n]();                                                      \
335 e8af50a3 bellard
}
336 3475187d bellard
#endif
337 e8af50a3 bellard
338 e8af50a3 bellard
/* floating point registers moves */
339 e8af50a3 bellard
GEN32(gen_op_load_fpr_FT0, gen_op_load_fpr_FT0_fprf);
340 e8af50a3 bellard
GEN32(gen_op_load_fpr_FT1, gen_op_load_fpr_FT1_fprf);
341 e8af50a3 bellard
GEN32(gen_op_store_FT0_fpr, gen_op_store_FT0_fpr_fprf);
342 e8af50a3 bellard
GEN32(gen_op_store_FT1_fpr, gen_op_store_FT1_fpr_fprf);
343 e8af50a3 bellard
344 e8af50a3 bellard
GEN32(gen_op_load_fpr_DT0, gen_op_load_fpr_DT0_fprf);
345 e8af50a3 bellard
GEN32(gen_op_load_fpr_DT1, gen_op_load_fpr_DT1_fprf);
346 e8af50a3 bellard
GEN32(gen_op_store_DT0_fpr, gen_op_store_DT0_fpr_fprf);
347 e8af50a3 bellard
GEN32(gen_op_store_DT1_fpr, gen_op_store_DT1_fpr_fprf);
348 e8af50a3 bellard
349 6ea4a6c8 blueswir1
#ifdef ALIGN_7_BUGS_FIXED
350 6ea4a6c8 blueswir1
#else
351 6ea4a6c8 blueswir1
#ifndef CONFIG_USER_ONLY
352 6ea4a6c8 blueswir1
#define gen_op_check_align_T0_7()
353 6ea4a6c8 blueswir1
#endif
354 6ea4a6c8 blueswir1
#endif
355 6ea4a6c8 blueswir1
356 81ad8ba2 blueswir1
/* moves */
357 81ad8ba2 blueswir1
#ifdef CONFIG_USER_ONLY
358 3475187d bellard
#define supervisor(dc) 0
359 81ad8ba2 blueswir1
#ifdef TARGET_SPARC64
360 e9ebed4d blueswir1
#define hypervisor(dc) 0
361 81ad8ba2 blueswir1
#endif
362 3475187d bellard
#define gen_op_ldst(name)        gen_op_##name##_raw()
363 3475187d bellard
#else
364 6f27aba6 blueswir1
#define supervisor(dc) (dc->mem_idx >= 1)
365 81ad8ba2 blueswir1
#ifdef TARGET_SPARC64
366 81ad8ba2 blueswir1
#define hypervisor(dc) (dc->mem_idx == 2)
367 6f27aba6 blueswir1
#define OP_LD_TABLE(width)                                              \
368 6f27aba6 blueswir1
    static GenOpFunc * const gen_op_##width[] = {                       \
369 6f27aba6 blueswir1
        &gen_op_##width##_user,                                         \
370 6f27aba6 blueswir1
        &gen_op_##width##_kernel,                                       \
371 6f27aba6 blueswir1
        &gen_op_##width##_hypv,                                         \
372 6f27aba6 blueswir1
    };
373 6f27aba6 blueswir1
#else
374 0f8a249a blueswir1
#define OP_LD_TABLE(width)                                              \
375 a68156d0 blueswir1
    static GenOpFunc * const gen_op_##width[] = {                       \
376 0f8a249a blueswir1
        &gen_op_##width##_user,                                         \
377 0f8a249a blueswir1
        &gen_op_##width##_kernel,                                       \
378 81ad8ba2 blueswir1
    };
379 3475187d bellard
#endif
380 6f27aba6 blueswir1
#define gen_op_ldst(name)        (*gen_op_##name[dc->mem_idx])()
381 6f27aba6 blueswir1
#endif
382 e8af50a3 bellard
383 81ad8ba2 blueswir1
#ifndef CONFIG_USER_ONLY
384 e8af50a3 bellard
OP_LD_TABLE(ld);
385 e8af50a3 bellard
OP_LD_TABLE(st);
386 e8af50a3 bellard
OP_LD_TABLE(ldub);
387 e8af50a3 bellard
OP_LD_TABLE(lduh);
388 e8af50a3 bellard
OP_LD_TABLE(ldsb);
389 e8af50a3 bellard
OP_LD_TABLE(ldsh);
390 e8af50a3 bellard
OP_LD_TABLE(stb);
391 e8af50a3 bellard
OP_LD_TABLE(sth);
392 e8af50a3 bellard
OP_LD_TABLE(std);
393 e8af50a3 bellard
OP_LD_TABLE(ldstub);
394 e8af50a3 bellard
OP_LD_TABLE(swap);
395 e8af50a3 bellard
OP_LD_TABLE(ldd);
396 e8af50a3 bellard
OP_LD_TABLE(stf);
397 e8af50a3 bellard
OP_LD_TABLE(stdf);
398 e8af50a3 bellard
OP_LD_TABLE(ldf);
399 e8af50a3 bellard
OP_LD_TABLE(lddf);
400 e8af50a3 bellard
401 3475187d bellard
#ifdef TARGET_SPARC64
402 dc011987 blueswir1
OP_LD_TABLE(lduw);
403 3475187d bellard
OP_LD_TABLE(ldsw);
404 3475187d bellard
OP_LD_TABLE(ldx);
405 3475187d bellard
OP_LD_TABLE(stx);
406 81ad8ba2 blueswir1
#endif
407 81ad8ba2 blueswir1
#endif
408 81ad8ba2 blueswir1
409 81ad8ba2 blueswir1
/* asi moves */
410 81ad8ba2 blueswir1
#ifdef TARGET_SPARC64
411 81ad8ba2 blueswir1
static inline void gen_ld_asi(int insn, int size, int sign)
412 81ad8ba2 blueswir1
{
413 81ad8ba2 blueswir1
    int asi, offset;
414 81ad8ba2 blueswir1
415 81ad8ba2 blueswir1
    if (IS_IMM) {
416 81ad8ba2 blueswir1
        offset = GET_FIELD(insn, 25, 31);
417 81ad8ba2 blueswir1
        gen_op_ld_asi_reg(offset, size, sign);
418 81ad8ba2 blueswir1
    } else {
419 81ad8ba2 blueswir1
        asi = GET_FIELD(insn, 19, 26);
420 81ad8ba2 blueswir1
        gen_op_ld_asi(asi, size, sign);
421 81ad8ba2 blueswir1
    }
422 81ad8ba2 blueswir1
}
423 81ad8ba2 blueswir1
424 81ad8ba2 blueswir1
static inline void gen_st_asi(int insn, int size)
425 81ad8ba2 blueswir1
{
426 81ad8ba2 blueswir1
    int asi, offset;
427 81ad8ba2 blueswir1
428 81ad8ba2 blueswir1
    if (IS_IMM) {
429 81ad8ba2 blueswir1
        offset = GET_FIELD(insn, 25, 31);
430 81ad8ba2 blueswir1
        gen_op_st_asi_reg(offset, size);
431 81ad8ba2 blueswir1
    } else {
432 81ad8ba2 blueswir1
        asi = GET_FIELD(insn, 19, 26);
433 81ad8ba2 blueswir1
        gen_op_st_asi(asi, size);
434 81ad8ba2 blueswir1
    }
435 81ad8ba2 blueswir1
}
436 81ad8ba2 blueswir1
437 3391c818 blueswir1
static inline void gen_ldf_asi(int insn, int size)
438 3391c818 blueswir1
{
439 3391c818 blueswir1
    int asi, offset, rd;
440 3391c818 blueswir1
441 0387d928 blueswir1
    rd = DFPREG(GET_FIELD(insn, 2, 6));
442 3391c818 blueswir1
    if (IS_IMM) {
443 3391c818 blueswir1
        offset = GET_FIELD(insn, 25, 31);
444 3391c818 blueswir1
        gen_op_ldf_asi_reg(offset, size, rd);
445 3391c818 blueswir1
    } else {
446 3391c818 blueswir1
        asi = GET_FIELD(insn, 19, 26);
447 3391c818 blueswir1
        gen_op_ldf_asi(asi, size, rd);
448 3391c818 blueswir1
    }
449 3391c818 blueswir1
}
450 3391c818 blueswir1
451 3391c818 blueswir1
static inline void gen_stf_asi(int insn, int size)
452 3391c818 blueswir1
{
453 3391c818 blueswir1
    int asi, offset, rd;
454 3391c818 blueswir1
455 0387d928 blueswir1
    rd = DFPREG(GET_FIELD(insn, 2, 6));
456 3391c818 blueswir1
    if (IS_IMM) {
457 3391c818 blueswir1
        offset = GET_FIELD(insn, 25, 31);
458 3391c818 blueswir1
        gen_op_stf_asi_reg(offset, size, rd);
459 3391c818 blueswir1
    } else {
460 3391c818 blueswir1
        asi = GET_FIELD(insn, 19, 26);
461 3391c818 blueswir1
        gen_op_stf_asi(asi, size, rd);
462 3391c818 blueswir1
    }
463 3391c818 blueswir1
}
464 3391c818 blueswir1
465 81ad8ba2 blueswir1
static inline void gen_swap_asi(int insn)
466 81ad8ba2 blueswir1
{
467 81ad8ba2 blueswir1
    int asi, offset;
468 81ad8ba2 blueswir1
469 81ad8ba2 blueswir1
    if (IS_IMM) {
470 81ad8ba2 blueswir1
        offset = GET_FIELD(insn, 25, 31);
471 81ad8ba2 blueswir1
        gen_op_swap_asi_reg(offset);
472 81ad8ba2 blueswir1
    } else {
473 81ad8ba2 blueswir1
        asi = GET_FIELD(insn, 19, 26);
474 81ad8ba2 blueswir1
        gen_op_swap_asi(asi);
475 81ad8ba2 blueswir1
    }
476 81ad8ba2 blueswir1
}
477 81ad8ba2 blueswir1
478 81ad8ba2 blueswir1
static inline void gen_ldstub_asi(int insn)
479 81ad8ba2 blueswir1
{
480 81ad8ba2 blueswir1
    int asi, offset;
481 81ad8ba2 blueswir1
482 81ad8ba2 blueswir1
    if (IS_IMM) {
483 81ad8ba2 blueswir1
        offset = GET_FIELD(insn, 25, 31);
484 81ad8ba2 blueswir1
        gen_op_ldstub_asi_reg(offset);
485 81ad8ba2 blueswir1
    } else {
486 81ad8ba2 blueswir1
        asi = GET_FIELD(insn, 19, 26);
487 81ad8ba2 blueswir1
        gen_op_ldstub_asi(asi);
488 81ad8ba2 blueswir1
    }
489 81ad8ba2 blueswir1
}
490 81ad8ba2 blueswir1
491 81ad8ba2 blueswir1
static inline void gen_ldda_asi(int insn)
492 81ad8ba2 blueswir1
{
493 81ad8ba2 blueswir1
    int asi, offset;
494 81ad8ba2 blueswir1
495 81ad8ba2 blueswir1
    if (IS_IMM) {
496 81ad8ba2 blueswir1
        offset = GET_FIELD(insn, 25, 31);
497 81ad8ba2 blueswir1
        gen_op_ldda_asi_reg(offset);
498 81ad8ba2 blueswir1
    } else {
499 81ad8ba2 blueswir1
        asi = GET_FIELD(insn, 19, 26);
500 81ad8ba2 blueswir1
        gen_op_ldda_asi(asi);
501 81ad8ba2 blueswir1
    }
502 81ad8ba2 blueswir1
}
503 81ad8ba2 blueswir1
504 81ad8ba2 blueswir1
static inline void gen_stda_asi(int insn)
505 81ad8ba2 blueswir1
{
506 81ad8ba2 blueswir1
    int asi, offset;
507 81ad8ba2 blueswir1
508 81ad8ba2 blueswir1
    if (IS_IMM) {
509 81ad8ba2 blueswir1
        offset = GET_FIELD(insn, 25, 31);
510 81ad8ba2 blueswir1
        gen_op_stda_asi_reg(offset);
511 81ad8ba2 blueswir1
    } else {
512 81ad8ba2 blueswir1
        asi = GET_FIELD(insn, 19, 26);
513 81ad8ba2 blueswir1
        gen_op_stda_asi(asi);
514 81ad8ba2 blueswir1
    }
515 81ad8ba2 blueswir1
}
516 81ad8ba2 blueswir1
517 81ad8ba2 blueswir1
static inline void gen_cas_asi(int insn)
518 81ad8ba2 blueswir1
{
519 81ad8ba2 blueswir1
    int asi, offset;
520 81ad8ba2 blueswir1
521 81ad8ba2 blueswir1
    if (IS_IMM) {
522 81ad8ba2 blueswir1
        offset = GET_FIELD(insn, 25, 31);
523 81ad8ba2 blueswir1
        gen_op_cas_asi_reg(offset);
524 81ad8ba2 blueswir1
    } else {
525 81ad8ba2 blueswir1
        asi = GET_FIELD(insn, 19, 26);
526 81ad8ba2 blueswir1
        gen_op_cas_asi(asi);
527 81ad8ba2 blueswir1
    }
528 81ad8ba2 blueswir1
}
529 81ad8ba2 blueswir1
530 81ad8ba2 blueswir1
static inline void gen_casx_asi(int insn)
531 81ad8ba2 blueswir1
{
532 81ad8ba2 blueswir1
    int asi, offset;
533 81ad8ba2 blueswir1
534 81ad8ba2 blueswir1
    if (IS_IMM) {
535 81ad8ba2 blueswir1
        offset = GET_FIELD(insn, 25, 31);
536 81ad8ba2 blueswir1
        gen_op_casx_asi_reg(offset);
537 81ad8ba2 blueswir1
    } else {
538 81ad8ba2 blueswir1
        asi = GET_FIELD(insn, 19, 26);
539 81ad8ba2 blueswir1
        gen_op_casx_asi(asi);
540 81ad8ba2 blueswir1
    }
541 81ad8ba2 blueswir1
}
542 81ad8ba2 blueswir1
543 81ad8ba2 blueswir1
#elif !defined(CONFIG_USER_ONLY)
544 81ad8ba2 blueswir1
545 81ad8ba2 blueswir1
static inline void gen_ld_asi(int insn, int size, int sign)
546 81ad8ba2 blueswir1
{
547 81ad8ba2 blueswir1
    int asi;
548 81ad8ba2 blueswir1
549 81ad8ba2 blueswir1
    asi = GET_FIELD(insn, 19, 26);
550 81ad8ba2 blueswir1
    gen_op_ld_asi(asi, size, sign);
551 81ad8ba2 blueswir1
}
552 81ad8ba2 blueswir1
553 81ad8ba2 blueswir1
static inline void gen_st_asi(int insn, int size)
554 81ad8ba2 blueswir1
{
555 81ad8ba2 blueswir1
    int asi;
556 81ad8ba2 blueswir1
557 81ad8ba2 blueswir1
    asi = GET_FIELD(insn, 19, 26);
558 81ad8ba2 blueswir1
    gen_op_st_asi(asi, size);
559 81ad8ba2 blueswir1
}
560 81ad8ba2 blueswir1
561 81ad8ba2 blueswir1
static inline void gen_ldstub_asi(int insn)
562 81ad8ba2 blueswir1
{
563 81ad8ba2 blueswir1
    int asi;
564 81ad8ba2 blueswir1
565 81ad8ba2 blueswir1
    asi = GET_FIELD(insn, 19, 26);
566 81ad8ba2 blueswir1
    gen_op_ldstub_asi(asi);
567 81ad8ba2 blueswir1
}
568 81ad8ba2 blueswir1
569 81ad8ba2 blueswir1
static inline void gen_swap_asi(int insn)
570 81ad8ba2 blueswir1
{
571 81ad8ba2 blueswir1
    int asi;
572 81ad8ba2 blueswir1
573 81ad8ba2 blueswir1
    asi = GET_FIELD(insn, 19, 26);
574 81ad8ba2 blueswir1
    gen_op_swap_asi(asi);
575 81ad8ba2 blueswir1
}
576 81ad8ba2 blueswir1
577 81ad8ba2 blueswir1
static inline void gen_ldda_asi(int insn)
578 81ad8ba2 blueswir1
{
579 81ad8ba2 blueswir1
    int asi;
580 81ad8ba2 blueswir1
581 81ad8ba2 blueswir1
    asi = GET_FIELD(insn, 19, 26);
582 81ad8ba2 blueswir1
    gen_op_ld_asi(asi, 8, 0);
583 81ad8ba2 blueswir1
}
584 81ad8ba2 blueswir1
585 81ad8ba2 blueswir1
static inline void gen_stda_asi(int insn)
586 81ad8ba2 blueswir1
{
587 81ad8ba2 blueswir1
    int asi;
588 81ad8ba2 blueswir1
589 81ad8ba2 blueswir1
    asi = GET_FIELD(insn, 19, 26);
590 81ad8ba2 blueswir1
    gen_op_st_asi(asi, 8);
591 81ad8ba2 blueswir1
}
592 3475187d bellard
#endif
593 3475187d bellard
594 3475187d bellard
static inline void gen_movl_imm_TN(int reg, uint32_t imm)
595 7a3f1944 bellard
{
596 83469015 bellard
    gen_op_movl_TN_im[reg](imm);
597 7a3f1944 bellard
}
598 7a3f1944 bellard
599 3475187d bellard
static inline void gen_movl_imm_T1(uint32_t val)
600 7a3f1944 bellard
{
601 cf495bcf bellard
    gen_movl_imm_TN(1, val);
602 7a3f1944 bellard
}
603 7a3f1944 bellard
604 3475187d bellard
static inline void gen_movl_imm_T0(uint32_t val)
605 7a3f1944 bellard
{
606 cf495bcf bellard
    gen_movl_imm_TN(0, val);
607 7a3f1944 bellard
}
608 7a3f1944 bellard
609 3475187d bellard
static inline void gen_movl_simm_TN(int reg, int32_t imm)
610 3475187d bellard
{
611 3475187d bellard
    gen_op_movl_TN_sim[reg](imm);
612 3475187d bellard
}
613 3475187d bellard
614 3475187d bellard
static inline void gen_movl_simm_T1(int32_t val)
615 3475187d bellard
{
616 3475187d bellard
    gen_movl_simm_TN(1, val);
617 3475187d bellard
}
618 3475187d bellard
619 3475187d bellard
static inline void gen_movl_simm_T0(int32_t val)
620 3475187d bellard
{
621 3475187d bellard
    gen_movl_simm_TN(0, val);
622 3475187d bellard
}
623 3475187d bellard
624 cf495bcf bellard
static inline void gen_movl_reg_TN(int reg, int t)
625 7a3f1944 bellard
{
626 cf495bcf bellard
    if (reg)
627 0f8a249a blueswir1
        gen_op_movl_reg_TN[t][reg] ();
628 cf495bcf bellard
    else
629 0f8a249a blueswir1
        gen_movl_imm_TN(t, 0);
630 7a3f1944 bellard
}
631 7a3f1944 bellard
632 cf495bcf bellard
static inline void gen_movl_reg_T0(int reg)
633 7a3f1944 bellard
{
634 cf495bcf bellard
    gen_movl_reg_TN(reg, 0);
635 7a3f1944 bellard
}
636 7a3f1944 bellard
637 cf495bcf bellard
static inline void gen_movl_reg_T1(int reg)
638 7a3f1944 bellard
{
639 cf495bcf bellard
    gen_movl_reg_TN(reg, 1);
640 7a3f1944 bellard
}
641 7a3f1944 bellard
642 cf495bcf bellard
static inline void gen_movl_reg_T2(int reg)
643 7a3f1944 bellard
{
644 cf495bcf bellard
    gen_movl_reg_TN(reg, 2);
645 7a3f1944 bellard
}
646 7a3f1944 bellard
647 cf495bcf bellard
static inline void gen_movl_TN_reg(int reg, int t)
648 7a3f1944 bellard
{
649 cf495bcf bellard
    if (reg)
650 0f8a249a blueswir1
        gen_op_movl_TN_reg[t][reg] ();
651 7a3f1944 bellard
}
652 7a3f1944 bellard
653 cf495bcf bellard
static inline void gen_movl_T0_reg(int reg)
654 7a3f1944 bellard
{
655 cf495bcf bellard
    gen_movl_TN_reg(reg, 0);
656 7a3f1944 bellard
}
657 7a3f1944 bellard
658 cf495bcf bellard
static inline void gen_movl_T1_reg(int reg)
659 7a3f1944 bellard
{
660 cf495bcf bellard
    gen_movl_TN_reg(reg, 1);
661 7a3f1944 bellard
}
662 7a3f1944 bellard
663 3475187d bellard
static inline void gen_jmp_im(target_ulong pc)
664 3475187d bellard
{
665 3475187d bellard
#ifdef TARGET_SPARC64
666 3475187d bellard
    if (pc == (uint32_t)pc) {
667 3475187d bellard
        gen_op_jmp_im(pc);
668 3475187d bellard
    } else {
669 3475187d bellard
        gen_op_jmp_im64(pc >> 32, pc);
670 3475187d bellard
    }
671 3475187d bellard
#else
672 3475187d bellard
    gen_op_jmp_im(pc);
673 3475187d bellard
#endif
674 3475187d bellard
}
675 3475187d bellard
676 3475187d bellard
static inline void gen_movl_npc_im(target_ulong npc)
677 3475187d bellard
{
678 3475187d bellard
#ifdef TARGET_SPARC64
679 3475187d bellard
    if (npc == (uint32_t)npc) {
680 3475187d bellard
        gen_op_movl_npc_im(npc);
681 3475187d bellard
    } else {
682 3475187d bellard
        gen_op_movq_npc_im64(npc >> 32, npc);
683 3475187d bellard
    }
684 3475187d bellard
#else
685 3475187d bellard
    gen_op_movl_npc_im(npc);
686 3475187d bellard
#endif
687 3475187d bellard
}
688 3475187d bellard
689 5fafdf24 ths
static inline void gen_goto_tb(DisasContext *s, int tb_num,
690 6e256c93 bellard
                               target_ulong pc, target_ulong npc)
691 6e256c93 bellard
{
692 6e256c93 bellard
    TranslationBlock *tb;
693 6e256c93 bellard
694 6e256c93 bellard
    tb = s->tb;
695 6e256c93 bellard
    if ((pc & TARGET_PAGE_MASK) == (tb->pc & TARGET_PAGE_MASK) &&
696 6e256c93 bellard
        (npc & TARGET_PAGE_MASK) == (tb->pc & TARGET_PAGE_MASK))  {
697 6e256c93 bellard
        /* jump to same page: we can use a direct jump */
698 6e256c93 bellard
        if (tb_num == 0)
699 6e256c93 bellard
            gen_op_goto_tb0(TBPARAM(tb));
700 6e256c93 bellard
        else
701 6e256c93 bellard
            gen_op_goto_tb1(TBPARAM(tb));
702 6e256c93 bellard
        gen_jmp_im(pc);
703 6e256c93 bellard
        gen_movl_npc_im(npc);
704 6e256c93 bellard
        gen_op_movl_T0_im((long)tb + tb_num);
705 6e256c93 bellard
        gen_op_exit_tb();
706 6e256c93 bellard
    } else {
707 6e256c93 bellard
        /* jump to another page: currently not optimized */
708 6e256c93 bellard
        gen_jmp_im(pc);
709 6e256c93 bellard
        gen_movl_npc_im(npc);
710 6e256c93 bellard
        gen_op_movl_T0_0();
711 6e256c93 bellard
        gen_op_exit_tb();
712 6e256c93 bellard
    }
713 6e256c93 bellard
}
714 6e256c93 bellard
715 46525e1f blueswir1
static inline void gen_branch2(DisasContext *dc, target_ulong pc1,
716 46525e1f blueswir1
                               target_ulong pc2)
717 83469015 bellard
{
718 83469015 bellard
    int l1;
719 83469015 bellard
720 83469015 bellard
    l1 = gen_new_label();
721 83469015 bellard
722 83469015 bellard
    gen_op_jz_T2_label(l1);
723 83469015 bellard
724 6e256c93 bellard
    gen_goto_tb(dc, 0, pc1, pc1 + 4);
725 83469015 bellard
726 83469015 bellard
    gen_set_label(l1);
727 6e256c93 bellard
    gen_goto_tb(dc, 1, pc2, pc2 + 4);
728 83469015 bellard
}
729 83469015 bellard
730 46525e1f blueswir1
static inline void gen_branch_a(DisasContext *dc, target_ulong pc1,
731 46525e1f blueswir1
                                target_ulong pc2)
732 83469015 bellard
{
733 83469015 bellard
    int l1;
734 83469015 bellard
735 83469015 bellard
    l1 = gen_new_label();
736 83469015 bellard
737 83469015 bellard
    gen_op_jz_T2_label(l1);
738 83469015 bellard
739 6e256c93 bellard
    gen_goto_tb(dc, 0, pc2, pc1);
740 83469015 bellard
741 83469015 bellard
    gen_set_label(l1);
742 6e256c93 bellard
    gen_goto_tb(dc, 1, pc2 + 4, pc2 + 8);
743 83469015 bellard
}
744 83469015 bellard
745 46525e1f blueswir1
static inline void gen_branch(DisasContext *dc, target_ulong pc,
746 46525e1f blueswir1
                              target_ulong npc)
747 83469015 bellard
{
748 6e256c93 bellard
    gen_goto_tb(dc, 0, pc, npc);
749 83469015 bellard
}
750 83469015 bellard
751 46525e1f blueswir1
static inline void gen_generic_branch(target_ulong npc1, target_ulong npc2)
752 83469015 bellard
{
753 83469015 bellard
    int l1, l2;
754 83469015 bellard
755 83469015 bellard
    l1 = gen_new_label();
756 83469015 bellard
    l2 = gen_new_label();
757 83469015 bellard
    gen_op_jz_T2_label(l1);
758 83469015 bellard
759 83469015 bellard
    gen_movl_npc_im(npc1);
760 83469015 bellard
    gen_op_jmp_label(l2);
761 83469015 bellard
762 83469015 bellard
    gen_set_label(l1);
763 83469015 bellard
    gen_movl_npc_im(npc2);
764 83469015 bellard
    gen_set_label(l2);
765 83469015 bellard
}
766 83469015 bellard
767 83469015 bellard
/* call this function before using T2 as it may have been set for a jump */
768 83469015 bellard
static inline void flush_T2(DisasContext * dc)
769 83469015 bellard
{
770 83469015 bellard
    if (dc->npc == JUMP_PC) {
771 46525e1f blueswir1
        gen_generic_branch(dc->jump_pc[0], dc->jump_pc[1]);
772 83469015 bellard
        dc->npc = DYNAMIC_PC;
773 83469015 bellard
    }
774 83469015 bellard
}
775 83469015 bellard
776 72cbca10 bellard
static inline void save_npc(DisasContext * dc)
777 72cbca10 bellard
{
778 72cbca10 bellard
    if (dc->npc == JUMP_PC) {
779 46525e1f blueswir1
        gen_generic_branch(dc->jump_pc[0], dc->jump_pc[1]);
780 72cbca10 bellard
        dc->npc = DYNAMIC_PC;
781 72cbca10 bellard
    } else if (dc->npc != DYNAMIC_PC) {
782 3475187d bellard
        gen_movl_npc_im(dc->npc);
783 72cbca10 bellard
    }
784 72cbca10 bellard
}
785 72cbca10 bellard
786 72cbca10 bellard
static inline void save_state(DisasContext * dc)
787 72cbca10 bellard
{
788 3475187d bellard
    gen_jmp_im(dc->pc);
789 72cbca10 bellard
    save_npc(dc);
790 72cbca10 bellard
}
791 72cbca10 bellard
792 0bee699e bellard
static inline void gen_mov_pc_npc(DisasContext * dc)
793 0bee699e bellard
{
794 0bee699e bellard
    if (dc->npc == JUMP_PC) {
795 46525e1f blueswir1
        gen_generic_branch(dc->jump_pc[0], dc->jump_pc[1]);
796 0bee699e bellard
        gen_op_mov_pc_npc();
797 0bee699e bellard
        dc->pc = DYNAMIC_PC;
798 0bee699e bellard
    } else if (dc->npc == DYNAMIC_PC) {
799 0bee699e bellard
        gen_op_mov_pc_npc();
800 0bee699e bellard
        dc->pc = DYNAMIC_PC;
801 0bee699e bellard
    } else {
802 0bee699e bellard
        dc->pc = dc->npc;
803 0bee699e bellard
    }
804 0bee699e bellard
}
805 0bee699e bellard
806 3475187d bellard
static GenOpFunc * const gen_cond[2][16] = {
807 3475187d bellard
    {
808 0f8a249a blueswir1
        gen_op_eval_bn,
809 0f8a249a blueswir1
        gen_op_eval_be,
810 0f8a249a blueswir1
        gen_op_eval_ble,
811 0f8a249a blueswir1
        gen_op_eval_bl,
812 0f8a249a blueswir1
        gen_op_eval_bleu,
813 0f8a249a blueswir1
        gen_op_eval_bcs,
814 0f8a249a blueswir1
        gen_op_eval_bneg,
815 0f8a249a blueswir1
        gen_op_eval_bvs,
816 0f8a249a blueswir1
        gen_op_eval_ba,
817 0f8a249a blueswir1
        gen_op_eval_bne,
818 0f8a249a blueswir1
        gen_op_eval_bg,
819 0f8a249a blueswir1
        gen_op_eval_bge,
820 0f8a249a blueswir1
        gen_op_eval_bgu,
821 0f8a249a blueswir1
        gen_op_eval_bcc,
822 0f8a249a blueswir1
        gen_op_eval_bpos,
823 0f8a249a blueswir1
        gen_op_eval_bvc,
824 3475187d bellard
    },
825 3475187d bellard
    {
826 3475187d bellard
#ifdef TARGET_SPARC64
827 0f8a249a blueswir1
        gen_op_eval_bn,
828 0f8a249a blueswir1
        gen_op_eval_xbe,
829 0f8a249a blueswir1
        gen_op_eval_xble,
830 0f8a249a blueswir1
        gen_op_eval_xbl,
831 0f8a249a blueswir1
        gen_op_eval_xbleu,
832 0f8a249a blueswir1
        gen_op_eval_xbcs,
833 0f8a249a blueswir1
        gen_op_eval_xbneg,
834 0f8a249a blueswir1
        gen_op_eval_xbvs,
835 0f8a249a blueswir1
        gen_op_eval_ba,
836 0f8a249a blueswir1
        gen_op_eval_xbne,
837 0f8a249a blueswir1
        gen_op_eval_xbg,
838 0f8a249a blueswir1
        gen_op_eval_xbge,
839 0f8a249a blueswir1
        gen_op_eval_xbgu,
840 0f8a249a blueswir1
        gen_op_eval_xbcc,
841 0f8a249a blueswir1
        gen_op_eval_xbpos,
842 0f8a249a blueswir1
        gen_op_eval_xbvc,
843 3475187d bellard
#endif
844 3475187d bellard
    },
845 3475187d bellard
};
846 3475187d bellard
847 3475187d bellard
static GenOpFunc * const gen_fcond[4][16] = {
848 3475187d bellard
    {
849 0f8a249a blueswir1
        gen_op_eval_bn,
850 0f8a249a blueswir1
        gen_op_eval_fbne,
851 0f8a249a blueswir1
        gen_op_eval_fblg,
852 0f8a249a blueswir1
        gen_op_eval_fbul,
853 0f8a249a blueswir1
        gen_op_eval_fbl,
854 0f8a249a blueswir1
        gen_op_eval_fbug,
855 0f8a249a blueswir1
        gen_op_eval_fbg,
856 0f8a249a blueswir1
        gen_op_eval_fbu,
857 0f8a249a blueswir1
        gen_op_eval_ba,
858 0f8a249a blueswir1
        gen_op_eval_fbe,
859 0f8a249a blueswir1
        gen_op_eval_fbue,
860 0f8a249a blueswir1
        gen_op_eval_fbge,
861 0f8a249a blueswir1
        gen_op_eval_fbuge,
862 0f8a249a blueswir1
        gen_op_eval_fble,
863 0f8a249a blueswir1
        gen_op_eval_fbule,
864 0f8a249a blueswir1
        gen_op_eval_fbo,
865 3475187d bellard
    },
866 3475187d bellard
#ifdef TARGET_SPARC64
867 3475187d bellard
    {
868 0f8a249a blueswir1
        gen_op_eval_bn,
869 0f8a249a blueswir1
        gen_op_eval_fbne_fcc1,
870 0f8a249a blueswir1
        gen_op_eval_fblg_fcc1,
871 0f8a249a blueswir1
        gen_op_eval_fbul_fcc1,
872 0f8a249a blueswir1
        gen_op_eval_fbl_fcc1,
873 0f8a249a blueswir1
        gen_op_eval_fbug_fcc1,
874 0f8a249a blueswir1
        gen_op_eval_fbg_fcc1,
875 0f8a249a blueswir1
        gen_op_eval_fbu_fcc1,
876 0f8a249a blueswir1
        gen_op_eval_ba,
877 0f8a249a blueswir1
        gen_op_eval_fbe_fcc1,
878 0f8a249a blueswir1
        gen_op_eval_fbue_fcc1,
879 0f8a249a blueswir1
        gen_op_eval_fbge_fcc1,
880 0f8a249a blueswir1
        gen_op_eval_fbuge_fcc1,
881 0f8a249a blueswir1
        gen_op_eval_fble_fcc1,
882 0f8a249a blueswir1
        gen_op_eval_fbule_fcc1,
883 0f8a249a blueswir1
        gen_op_eval_fbo_fcc1,
884 3475187d bellard
    },
885 3475187d bellard
    {
886 0f8a249a blueswir1
        gen_op_eval_bn,
887 0f8a249a blueswir1
        gen_op_eval_fbne_fcc2,
888 0f8a249a blueswir1
        gen_op_eval_fblg_fcc2,
889 0f8a249a blueswir1
        gen_op_eval_fbul_fcc2,
890 0f8a249a blueswir1
        gen_op_eval_fbl_fcc2,
891 0f8a249a blueswir1
        gen_op_eval_fbug_fcc2,
892 0f8a249a blueswir1
        gen_op_eval_fbg_fcc2,
893 0f8a249a blueswir1
        gen_op_eval_fbu_fcc2,
894 0f8a249a blueswir1
        gen_op_eval_ba,
895 0f8a249a blueswir1
        gen_op_eval_fbe_fcc2,
896 0f8a249a blueswir1
        gen_op_eval_fbue_fcc2,
897 0f8a249a blueswir1
        gen_op_eval_fbge_fcc2,
898 0f8a249a blueswir1
        gen_op_eval_fbuge_fcc2,
899 0f8a249a blueswir1
        gen_op_eval_fble_fcc2,
900 0f8a249a blueswir1
        gen_op_eval_fbule_fcc2,
901 0f8a249a blueswir1
        gen_op_eval_fbo_fcc2,
902 3475187d bellard
    },
903 3475187d bellard
    {
904 0f8a249a blueswir1
        gen_op_eval_bn,
905 0f8a249a blueswir1
        gen_op_eval_fbne_fcc3,
906 0f8a249a blueswir1
        gen_op_eval_fblg_fcc3,
907 0f8a249a blueswir1
        gen_op_eval_fbul_fcc3,
908 0f8a249a blueswir1
        gen_op_eval_fbl_fcc3,
909 0f8a249a blueswir1
        gen_op_eval_fbug_fcc3,
910 0f8a249a blueswir1
        gen_op_eval_fbg_fcc3,
911 0f8a249a blueswir1
        gen_op_eval_fbu_fcc3,
912 0f8a249a blueswir1
        gen_op_eval_ba,
913 0f8a249a blueswir1
        gen_op_eval_fbe_fcc3,
914 0f8a249a blueswir1
        gen_op_eval_fbue_fcc3,
915 0f8a249a blueswir1
        gen_op_eval_fbge_fcc3,
916 0f8a249a blueswir1
        gen_op_eval_fbuge_fcc3,
917 0f8a249a blueswir1
        gen_op_eval_fble_fcc3,
918 0f8a249a blueswir1
        gen_op_eval_fbule_fcc3,
919 0f8a249a blueswir1
        gen_op_eval_fbo_fcc3,
920 3475187d bellard
    },
921 3475187d bellard
#else
922 3475187d bellard
    {}, {}, {},
923 3475187d bellard
#endif
924 3475187d bellard
};
925 7a3f1944 bellard
926 3475187d bellard
#ifdef TARGET_SPARC64
927 3475187d bellard
static void gen_cond_reg(int cond)
928 e8af50a3 bellard
{
929 0f8a249a blueswir1
        switch (cond) {
930 0f8a249a blueswir1
        case 0x1:
931 0f8a249a blueswir1
            gen_op_eval_brz();
932 0f8a249a blueswir1
            break;
933 0f8a249a blueswir1
        case 0x2:
934 0f8a249a blueswir1
            gen_op_eval_brlez();
935 0f8a249a blueswir1
            break;
936 0f8a249a blueswir1
        case 0x3:
937 0f8a249a blueswir1
            gen_op_eval_brlz();
938 0f8a249a blueswir1
            break;
939 0f8a249a blueswir1
        case 0x5:
940 0f8a249a blueswir1
            gen_op_eval_brnz();
941 0f8a249a blueswir1
            break;
942 0f8a249a blueswir1
        case 0x6:
943 0f8a249a blueswir1
            gen_op_eval_brgz();
944 0f8a249a blueswir1
            break;
945 e8af50a3 bellard
        default:
946 0f8a249a blueswir1
        case 0x7:
947 0f8a249a blueswir1
            gen_op_eval_brgez();
948 0f8a249a blueswir1
            break;
949 0f8a249a blueswir1
        }
950 e8af50a3 bellard
}
951 3475187d bellard
#endif
952 cf495bcf bellard
953 0bee699e bellard
/* XXX: potentially incorrect if dynamic npc */
954 3475187d bellard
static void do_branch(DisasContext * dc, int32_t offset, uint32_t insn, int cc)
955 7a3f1944 bellard
{
956 cf495bcf bellard
    unsigned int cond = GET_FIELD(insn, 3, 6), a = (insn & (1 << 29));
957 af7bf89b bellard
    target_ulong target = dc->pc + offset;
958 5fafdf24 ths
959 cf495bcf bellard
    if (cond == 0x0) {
960 0f8a249a blueswir1
        /* unconditional not taken */
961 0f8a249a blueswir1
        if (a) {
962 0f8a249a blueswir1
            dc->pc = dc->npc + 4;
963 0f8a249a blueswir1
            dc->npc = dc->pc + 4;
964 0f8a249a blueswir1
        } else {
965 0f8a249a blueswir1
            dc->pc = dc->npc;
966 0f8a249a blueswir1
            dc->npc = dc->pc + 4;
967 0f8a249a blueswir1
        }
968 cf495bcf bellard
    } else if (cond == 0x8) {
969 0f8a249a blueswir1
        /* unconditional taken */
970 0f8a249a blueswir1
        if (a) {
971 0f8a249a blueswir1
            dc->pc = target;
972 0f8a249a blueswir1
            dc->npc = dc->pc + 4;
973 0f8a249a blueswir1
        } else {
974 0f8a249a blueswir1
            dc->pc = dc->npc;
975 0f8a249a blueswir1
            dc->npc = target;
976 0f8a249a blueswir1
        }
977 cf495bcf bellard
    } else {
978 72cbca10 bellard
        flush_T2(dc);
979 3475187d bellard
        gen_cond[cc][cond]();
980 0f8a249a blueswir1
        if (a) {
981 0f8a249a blueswir1
            gen_branch_a(dc, target, dc->npc);
982 cf495bcf bellard
            dc->is_br = 1;
983 0f8a249a blueswir1
        } else {
984 cf495bcf bellard
            dc->pc = dc->npc;
985 72cbca10 bellard
            dc->jump_pc[0] = target;
986 72cbca10 bellard
            dc->jump_pc[1] = dc->npc + 4;
987 72cbca10 bellard
            dc->npc = JUMP_PC;
988 0f8a249a blueswir1
        }
989 cf495bcf bellard
    }
990 7a3f1944 bellard
}
991 7a3f1944 bellard
992 0bee699e bellard
/* XXX: potentially incorrect if dynamic npc */
993 3475187d bellard
static void do_fbranch(DisasContext * dc, int32_t offset, uint32_t insn, int cc)
994 e8af50a3 bellard
{
995 e8af50a3 bellard
    unsigned int cond = GET_FIELD(insn, 3, 6), a = (insn & (1 << 29));
996 af7bf89b bellard
    target_ulong target = dc->pc + offset;
997 af7bf89b bellard
998 e8af50a3 bellard
    if (cond == 0x0) {
999 0f8a249a blueswir1
        /* unconditional not taken */
1000 0f8a249a blueswir1
        if (a) {
1001 0f8a249a blueswir1
            dc->pc = dc->npc + 4;
1002 0f8a249a blueswir1
            dc->npc = dc->pc + 4;
1003 0f8a249a blueswir1
        } else {
1004 0f8a249a blueswir1
            dc->pc = dc->npc;
1005 0f8a249a blueswir1
            dc->npc = dc->pc + 4;
1006 0f8a249a blueswir1
        }
1007 e8af50a3 bellard
    } else if (cond == 0x8) {
1008 0f8a249a blueswir1
        /* unconditional taken */
1009 0f8a249a blueswir1
        if (a) {
1010 0f8a249a blueswir1
            dc->pc = target;
1011 0f8a249a blueswir1
            dc->npc = dc->pc + 4;
1012 0f8a249a blueswir1
        } else {
1013 0f8a249a blueswir1
            dc->pc = dc->npc;
1014 0f8a249a blueswir1
            dc->npc = target;
1015 0f8a249a blueswir1
        }
1016 e8af50a3 bellard
    } else {
1017 e8af50a3 bellard
        flush_T2(dc);
1018 3475187d bellard
        gen_fcond[cc][cond]();
1019 0f8a249a blueswir1
        if (a) {
1020 0f8a249a blueswir1
            gen_branch_a(dc, target, dc->npc);
1021 e8af50a3 bellard
            dc->is_br = 1;
1022 0f8a249a blueswir1
        } else {
1023 e8af50a3 bellard
            dc->pc = dc->npc;
1024 e8af50a3 bellard
            dc->jump_pc[0] = target;
1025 e8af50a3 bellard
            dc->jump_pc[1] = dc->npc + 4;
1026 e8af50a3 bellard
            dc->npc = JUMP_PC;
1027 0f8a249a blueswir1
        }
1028 e8af50a3 bellard
    }
1029 e8af50a3 bellard
}
1030 e8af50a3 bellard
1031 3475187d bellard
#ifdef TARGET_SPARC64
1032 3475187d bellard
/* XXX: potentially incorrect if dynamic npc */
1033 3475187d bellard
static void do_branch_reg(DisasContext * dc, int32_t offset, uint32_t insn)
1034 7a3f1944 bellard
{
1035 3475187d bellard
    unsigned int cond = GET_FIELD_SP(insn, 25, 27), a = (insn & (1 << 29));
1036 3475187d bellard
    target_ulong target = dc->pc + offset;
1037 3475187d bellard
1038 3475187d bellard
    flush_T2(dc);
1039 3475187d bellard
    gen_cond_reg(cond);
1040 3475187d bellard
    if (a) {
1041 0f8a249a blueswir1
        gen_branch_a(dc, target, dc->npc);
1042 0f8a249a blueswir1
        dc->is_br = 1;
1043 3475187d bellard
    } else {
1044 0f8a249a blueswir1
        dc->pc = dc->npc;
1045 0f8a249a blueswir1
        dc->jump_pc[0] = target;
1046 0f8a249a blueswir1
        dc->jump_pc[1] = dc->npc + 4;
1047 0f8a249a blueswir1
        dc->npc = JUMP_PC;
1048 3475187d bellard
    }
1049 7a3f1944 bellard
}
1050 7a3f1944 bellard
1051 3475187d bellard
static GenOpFunc * const gen_fcmps[4] = {
1052 3475187d bellard
    gen_op_fcmps,
1053 3475187d bellard
    gen_op_fcmps_fcc1,
1054 3475187d bellard
    gen_op_fcmps_fcc2,
1055 3475187d bellard
    gen_op_fcmps_fcc3,
1056 3475187d bellard
};
1057 3475187d bellard
1058 3475187d bellard
static GenOpFunc * const gen_fcmpd[4] = {
1059 3475187d bellard
    gen_op_fcmpd,
1060 3475187d bellard
    gen_op_fcmpd_fcc1,
1061 3475187d bellard
    gen_op_fcmpd_fcc2,
1062 3475187d bellard
    gen_op_fcmpd_fcc3,
1063 3475187d bellard
};
1064 417454b0 blueswir1
1065 417454b0 blueswir1
static GenOpFunc * const gen_fcmpes[4] = {
1066 417454b0 blueswir1
    gen_op_fcmpes,
1067 417454b0 blueswir1
    gen_op_fcmpes_fcc1,
1068 417454b0 blueswir1
    gen_op_fcmpes_fcc2,
1069 417454b0 blueswir1
    gen_op_fcmpes_fcc3,
1070 417454b0 blueswir1
};
1071 417454b0 blueswir1
1072 417454b0 blueswir1
static GenOpFunc * const gen_fcmped[4] = {
1073 417454b0 blueswir1
    gen_op_fcmped,
1074 417454b0 blueswir1
    gen_op_fcmped_fcc1,
1075 417454b0 blueswir1
    gen_op_fcmped_fcc2,
1076 417454b0 blueswir1
    gen_op_fcmped_fcc3,
1077 417454b0 blueswir1
};
1078 417454b0 blueswir1
1079 3475187d bellard
#endif
1080 3475187d bellard
1081 a80dde08 bellard
static int gen_trap_ifnofpu(DisasContext * dc)
1082 a80dde08 bellard
{
1083 a80dde08 bellard
#if !defined(CONFIG_USER_ONLY)
1084 a80dde08 bellard
    if (!dc->fpu_enabled) {
1085 a80dde08 bellard
        save_state(dc);
1086 a80dde08 bellard
        gen_op_exception(TT_NFPU_INSN);
1087 a80dde08 bellard
        dc->is_br = 1;
1088 a80dde08 bellard
        return 1;
1089 a80dde08 bellard
    }
1090 a80dde08 bellard
#endif
1091 a80dde08 bellard
    return 0;
1092 a80dde08 bellard
}
1093 a80dde08 bellard
1094 0bee699e bellard
/* before an instruction, dc->pc must be static */
1095 cf495bcf bellard
static void disas_sparc_insn(DisasContext * dc)
1096 cf495bcf bellard
{
1097 cf495bcf bellard
    unsigned int insn, opc, rs1, rs2, rd;
1098 7a3f1944 bellard
1099 0fa85d43 bellard
    insn = ldl_code(dc->pc);
1100 cf495bcf bellard
    opc = GET_FIELD(insn, 0, 1);
1101 7a3f1944 bellard
1102 cf495bcf bellard
    rd = GET_FIELD(insn, 2, 6);
1103 cf495bcf bellard
    switch (opc) {
1104 0f8a249a blueswir1
    case 0:                     /* branches/sethi */
1105 0f8a249a blueswir1
        {
1106 0f8a249a blueswir1
            unsigned int xop = GET_FIELD(insn, 7, 9);
1107 0f8a249a blueswir1
            int32_t target;
1108 0f8a249a blueswir1
            switch (xop) {
1109 3475187d bellard
#ifdef TARGET_SPARC64
1110 0f8a249a blueswir1
            case 0x1:           /* V9 BPcc */
1111 0f8a249a blueswir1
                {
1112 0f8a249a blueswir1
                    int cc;
1113 0f8a249a blueswir1
1114 0f8a249a blueswir1
                    target = GET_FIELD_SP(insn, 0, 18);
1115 0f8a249a blueswir1
                    target = sign_extend(target, 18);
1116 0f8a249a blueswir1
                    target <<= 2;
1117 0f8a249a blueswir1
                    cc = GET_FIELD_SP(insn, 20, 21);
1118 0f8a249a blueswir1
                    if (cc == 0)
1119 0f8a249a blueswir1
                        do_branch(dc, target, insn, 0);
1120 0f8a249a blueswir1
                    else if (cc == 2)
1121 0f8a249a blueswir1
                        do_branch(dc, target, insn, 1);
1122 0f8a249a blueswir1
                    else
1123 0f8a249a blueswir1
                        goto illegal_insn;
1124 0f8a249a blueswir1
                    goto jmp_insn;
1125 0f8a249a blueswir1
                }
1126 0f8a249a blueswir1
            case 0x3:           /* V9 BPr */
1127 0f8a249a blueswir1
                {
1128 0f8a249a blueswir1
                    target = GET_FIELD_SP(insn, 0, 13) |
1129 13846e70 bellard
                        (GET_FIELD_SP(insn, 20, 21) << 14);
1130 0f8a249a blueswir1
                    target = sign_extend(target, 16);
1131 0f8a249a blueswir1
                    target <<= 2;
1132 0f8a249a blueswir1
                    rs1 = GET_FIELD(insn, 13, 17);
1133 0f8a249a blueswir1
                    gen_movl_reg_T0(rs1);
1134 0f8a249a blueswir1
                    do_branch_reg(dc, target, insn);
1135 0f8a249a blueswir1
                    goto jmp_insn;
1136 0f8a249a blueswir1
                }
1137 0f8a249a blueswir1
            case 0x5:           /* V9 FBPcc */
1138 0f8a249a blueswir1
                {
1139 0f8a249a blueswir1
                    int cc = GET_FIELD_SP(insn, 20, 21);
1140 a80dde08 bellard
                    if (gen_trap_ifnofpu(dc))
1141 a80dde08 bellard
                        goto jmp_insn;
1142 0f8a249a blueswir1
                    target = GET_FIELD_SP(insn, 0, 18);
1143 0f8a249a blueswir1
                    target = sign_extend(target, 19);
1144 0f8a249a blueswir1
                    target <<= 2;
1145 0f8a249a blueswir1
                    do_fbranch(dc, target, insn, cc);
1146 0f8a249a blueswir1
                    goto jmp_insn;
1147 0f8a249a blueswir1
                }
1148 a4d17f19 blueswir1
#else
1149 0f8a249a blueswir1
            case 0x7:           /* CBN+x */
1150 0f8a249a blueswir1
                {
1151 0f8a249a blueswir1
                    goto ncp_insn;
1152 0f8a249a blueswir1
                }
1153 0f8a249a blueswir1
#endif
1154 0f8a249a blueswir1
            case 0x2:           /* BN+x */
1155 0f8a249a blueswir1
                {
1156 0f8a249a blueswir1
                    target = GET_FIELD(insn, 10, 31);
1157 0f8a249a blueswir1
                    target = sign_extend(target, 22);
1158 0f8a249a blueswir1
                    target <<= 2;
1159 0f8a249a blueswir1
                    do_branch(dc, target, insn, 0);
1160 0f8a249a blueswir1
                    goto jmp_insn;
1161 0f8a249a blueswir1
                }
1162 0f8a249a blueswir1
            case 0x6:           /* FBN+x */
1163 0f8a249a blueswir1
                {
1164 a80dde08 bellard
                    if (gen_trap_ifnofpu(dc))
1165 a80dde08 bellard
                        goto jmp_insn;
1166 0f8a249a blueswir1
                    target = GET_FIELD(insn, 10, 31);
1167 0f8a249a blueswir1
                    target = sign_extend(target, 22);
1168 0f8a249a blueswir1
                    target <<= 2;
1169 0f8a249a blueswir1
                    do_fbranch(dc, target, insn, 0);
1170 0f8a249a blueswir1
                    goto jmp_insn;
1171 0f8a249a blueswir1
                }
1172 0f8a249a blueswir1
            case 0x4:           /* SETHI */
1173 e80cfcfc bellard
#define OPTIM
1174 e80cfcfc bellard
#if defined(OPTIM)
1175 0f8a249a blueswir1
                if (rd) { // nop
1176 e80cfcfc bellard
#endif
1177 0f8a249a blueswir1
                    uint32_t value = GET_FIELD(insn, 10, 31);
1178 0f8a249a blueswir1
                    gen_movl_imm_T0(value << 10);
1179 0f8a249a blueswir1
                    gen_movl_T0_reg(rd);
1180 e80cfcfc bellard
#if defined(OPTIM)
1181 0f8a249a blueswir1
                }
1182 e80cfcfc bellard
#endif
1183 0f8a249a blueswir1
                break;
1184 0f8a249a blueswir1
            case 0x0:           /* UNIMPL */
1185 0f8a249a blueswir1
            default:
1186 3475187d bellard
                goto illegal_insn;
1187 0f8a249a blueswir1
            }
1188 0f8a249a blueswir1
            break;
1189 0f8a249a blueswir1
        }
1190 0f8a249a blueswir1
        break;
1191 cf495bcf bellard
    case 1:
1192 0f8a249a blueswir1
        /*CALL*/ {
1193 0f8a249a blueswir1
            target_long target = GET_FIELDs(insn, 2, 31) << 2;
1194 cf495bcf bellard
1195 83469015 bellard
#ifdef TARGET_SPARC64
1196 0f8a249a blueswir1
            if (dc->pc == (uint32_t)dc->pc) {
1197 0f8a249a blueswir1
                gen_op_movl_T0_im(dc->pc);
1198 0f8a249a blueswir1
            } else {
1199 0f8a249a blueswir1
                gen_op_movq_T0_im64(dc->pc >> 32, dc->pc);
1200 0f8a249a blueswir1
            }
1201 83469015 bellard
#else
1202 0f8a249a blueswir1
            gen_op_movl_T0_im(dc->pc);
1203 83469015 bellard
#endif
1204 0f8a249a blueswir1
            gen_movl_T0_reg(15);
1205 0f8a249a blueswir1
            target += dc->pc;
1206 0bee699e bellard
            gen_mov_pc_npc(dc);
1207 0f8a249a blueswir1
            dc->npc = target;
1208 0f8a249a blueswir1
        }
1209 0f8a249a blueswir1
        goto jmp_insn;
1210 0f8a249a blueswir1
    case 2:                     /* FPU & Logical Operations */
1211 0f8a249a blueswir1
        {
1212 0f8a249a blueswir1
            unsigned int xop = GET_FIELD(insn, 7, 12);
1213 0f8a249a blueswir1
            if (xop == 0x3a) {  /* generate trap */
1214 cf495bcf bellard
                int cond;
1215 3475187d bellard
1216 cf495bcf bellard
                rs1 = GET_FIELD(insn, 13, 17);
1217 cf495bcf bellard
                gen_movl_reg_T0(rs1);
1218 0f8a249a blueswir1
                if (IS_IMM) {
1219 0f8a249a blueswir1
                    rs2 = GET_FIELD(insn, 25, 31);
1220 e80cfcfc bellard
#if defined(OPTIM)
1221 0f8a249a blueswir1
                    if (rs2 != 0) {
1222 e80cfcfc bellard
#endif
1223 0f8a249a blueswir1
                        gen_movl_simm_T1(rs2);
1224 0f8a249a blueswir1
                        gen_op_add_T1_T0();
1225 e80cfcfc bellard
#if defined(OPTIM)
1226 0f8a249a blueswir1
                    }
1227 e80cfcfc bellard
#endif
1228 cf495bcf bellard
                } else {
1229 cf495bcf bellard
                    rs2 = GET_FIELD(insn, 27, 31);
1230 e80cfcfc bellard
#if defined(OPTIM)
1231 0f8a249a blueswir1
                    if (rs2 != 0) {
1232 e80cfcfc bellard
#endif
1233 0f8a249a blueswir1
                        gen_movl_reg_T1(rs2);
1234 0f8a249a blueswir1
                        gen_op_add_T1_T0();
1235 e80cfcfc bellard
#if defined(OPTIM)
1236 0f8a249a blueswir1
                    }
1237 e80cfcfc bellard
#endif
1238 cf495bcf bellard
                }
1239 cf495bcf bellard
                cond = GET_FIELD(insn, 3, 6);
1240 cf495bcf bellard
                if (cond == 0x8) {
1241 a80dde08 bellard
                    save_state(dc);
1242 cf495bcf bellard
                    gen_op_trap_T0();
1243 af7bf89b bellard
                } else if (cond != 0) {
1244 3475187d bellard
#ifdef TARGET_SPARC64
1245 0f8a249a blueswir1
                    /* V9 icc/xcc */
1246 0f8a249a blueswir1
                    int cc = GET_FIELD_SP(insn, 11, 12);
1247 0f8a249a blueswir1
                    flush_T2(dc);
1248 a80dde08 bellard
                    save_state(dc);
1249 0f8a249a blueswir1
                    if (cc == 0)
1250 0f8a249a blueswir1
                        gen_cond[0][cond]();
1251 0f8a249a blueswir1
                    else if (cc == 2)
1252 0f8a249a blueswir1
                        gen_cond[1][cond]();
1253 0f8a249a blueswir1
                    else
1254 0f8a249a blueswir1
                        goto illegal_insn;
1255 3475187d bellard
#else
1256 0f8a249a blueswir1
                    flush_T2(dc);
1257 a80dde08 bellard
                    save_state(dc);
1258 0f8a249a blueswir1
                    gen_cond[0][cond]();
1259 3475187d bellard
#endif
1260 cf495bcf bellard
                    gen_op_trapcc_T0();
1261 cf495bcf bellard
                }
1262 a80dde08 bellard
                gen_op_next_insn();
1263 a80dde08 bellard
                gen_op_movl_T0_0();
1264 a80dde08 bellard
                gen_op_exit_tb();
1265 a80dde08 bellard
                dc->is_br = 1;
1266 a80dde08 bellard
                goto jmp_insn;
1267 cf495bcf bellard
            } else if (xop == 0x28) {
1268 cf495bcf bellard
                rs1 = GET_FIELD(insn, 13, 17);
1269 cf495bcf bellard
                switch(rs1) {
1270 cf495bcf bellard
                case 0: /* rdy */
1271 65fe7b09 blueswir1
#ifndef TARGET_SPARC64
1272 65fe7b09 blueswir1
                case 0x01 ... 0x0e: /* undefined in the SPARCv8
1273 65fe7b09 blueswir1
                                       manual, rdy on the microSPARC
1274 65fe7b09 blueswir1
                                       II */
1275 65fe7b09 blueswir1
                case 0x0f:          /* stbar in the SPARCv8 manual,
1276 65fe7b09 blueswir1
                                       rdy on the microSPARC II */
1277 65fe7b09 blueswir1
                case 0x10 ... 0x1f: /* implementation-dependent in the
1278 65fe7b09 blueswir1
                                       SPARCv8 manual, rdy on the
1279 65fe7b09 blueswir1
                                       microSPARC II */
1280 65fe7b09 blueswir1
#endif
1281 65fe7b09 blueswir1
                    gen_op_movtl_T0_env(offsetof(CPUSPARCState, y));
1282 cf495bcf bellard
                    gen_movl_T0_reg(rd);
1283 cf495bcf bellard
                    break;
1284 3475187d bellard
#ifdef TARGET_SPARC64
1285 0f8a249a blueswir1
                case 0x2: /* V9 rdccr */
1286 3475187d bellard
                    gen_op_rdccr();
1287 3475187d bellard
                    gen_movl_T0_reg(rd);
1288 3475187d bellard
                    break;
1289 0f8a249a blueswir1
                case 0x3: /* V9 rdasi */
1290 0f8a249a blueswir1
                    gen_op_movl_T0_env(offsetof(CPUSPARCState, asi));
1291 3475187d bellard
                    gen_movl_T0_reg(rd);
1292 3475187d bellard
                    break;
1293 0f8a249a blueswir1
                case 0x4: /* V9 rdtick */
1294 3475187d bellard
                    gen_op_rdtick();
1295 3475187d bellard
                    gen_movl_T0_reg(rd);
1296 3475187d bellard
                    break;
1297 0f8a249a blueswir1
                case 0x5: /* V9 rdpc */
1298 0f8a249a blueswir1
                    if (dc->pc == (uint32_t)dc->pc) {
1299 0f8a249a blueswir1
                        gen_op_movl_T0_im(dc->pc);
1300 0f8a249a blueswir1
                    } else {
1301 0f8a249a blueswir1
                        gen_op_movq_T0_im64(dc->pc >> 32, dc->pc);
1302 0f8a249a blueswir1
                    }
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 20c9f095 blueswir1
                    gen_op_rdstick();
1323 83469015 bellard
                    gen_movl_T0_reg(rd);
1324 83469015 bellard
                    break;
1325 0f8a249a blueswir1
                case 0x19: /* System tick compare */
1326 0f8a249a blueswir1
                    gen_op_movtl_T0_env(offsetof(CPUSPARCState, stick_cmpr));
1327 83469015 bellard
                    gen_movl_T0_reg(rd);
1328 83469015 bellard
                    break;
1329 0f8a249a blueswir1
                case 0x10: /* Performance Control */
1330 0f8a249a blueswir1
                case 0x11: /* Performance Instrumentation Counter */
1331 0f8a249a blueswir1
                case 0x12: /* Dispatch Control */
1332 0f8a249a blueswir1
                case 0x14: /* Softint set, WO */
1333 0f8a249a blueswir1
                case 0x15: /* Softint clear, WO */
1334 0f8a249a blueswir1
                case 0x16: /* Softint write */
1335 3475187d bellard
#endif
1336 3475187d bellard
                default:
1337 cf495bcf bellard
                    goto illegal_insn;
1338 cf495bcf bellard
                }
1339 e8af50a3 bellard
#if !defined(CONFIG_USER_ONLY)
1340 e9ebed4d blueswir1
            } else if (xop == 0x29) { /* rdpsr / UA2005 rdhpr */
1341 3475187d bellard
#ifndef TARGET_SPARC64
1342 0f8a249a blueswir1
                if (!supervisor(dc))
1343 0f8a249a blueswir1
                    goto priv_insn;
1344 e8af50a3 bellard
                gen_op_rdpsr();
1345 e9ebed4d blueswir1
#else
1346 e9ebed4d blueswir1
                if (!hypervisor(dc))
1347 e9ebed4d blueswir1
                    goto priv_insn;
1348 e9ebed4d blueswir1
                rs1 = GET_FIELD(insn, 13, 17);
1349 e9ebed4d blueswir1
                switch (rs1) {
1350 e9ebed4d blueswir1
                case 0: // hpstate
1351 e9ebed4d blueswir1
                    // gen_op_rdhpstate();
1352 e9ebed4d blueswir1
                    break;
1353 e9ebed4d blueswir1
                case 1: // htstate
1354 e9ebed4d blueswir1
                    // gen_op_rdhtstate();
1355 e9ebed4d blueswir1
                    break;
1356 e9ebed4d blueswir1
                case 3: // hintp
1357 e9ebed4d blueswir1
                    gen_op_movl_T0_env(offsetof(CPUSPARCState, hintp));
1358 e9ebed4d blueswir1
                    break;
1359 e9ebed4d blueswir1
                case 5: // htba
1360 e9ebed4d blueswir1
                    gen_op_movl_T0_env(offsetof(CPUSPARCState, htba));
1361 e9ebed4d blueswir1
                    break;
1362 e9ebed4d blueswir1
                case 6: // hver
1363 e9ebed4d blueswir1
                    gen_op_movl_T0_env(offsetof(CPUSPARCState, hver));
1364 e9ebed4d blueswir1
                    break;
1365 e9ebed4d blueswir1
                case 31: // hstick_cmpr
1366 e9ebed4d blueswir1
                    gen_op_movl_env_T0(offsetof(CPUSPARCState, hstick_cmpr));
1367 e9ebed4d blueswir1
                    break;
1368 e9ebed4d blueswir1
                default:
1369 e9ebed4d blueswir1
                    goto illegal_insn;
1370 e9ebed4d blueswir1
                }
1371 e9ebed4d blueswir1
#endif
1372 e8af50a3 bellard
                gen_movl_T0_reg(rd);
1373 e8af50a3 bellard
                break;
1374 3475187d bellard
            } else if (xop == 0x2a) { /* rdwim / V9 rdpr */
1375 0f8a249a blueswir1
                if (!supervisor(dc))
1376 0f8a249a blueswir1
                    goto priv_insn;
1377 3475187d bellard
#ifdef TARGET_SPARC64
1378 3475187d bellard
                rs1 = GET_FIELD(insn, 13, 17);
1379 0f8a249a blueswir1
                switch (rs1) {
1380 0f8a249a blueswir1
                case 0: // tpc
1381 0f8a249a blueswir1
                    gen_op_rdtpc();
1382 0f8a249a blueswir1
                    break;
1383 0f8a249a blueswir1
                case 1: // tnpc
1384 0f8a249a blueswir1
                    gen_op_rdtnpc();
1385 0f8a249a blueswir1
                    break;
1386 0f8a249a blueswir1
                case 2: // tstate
1387 0f8a249a blueswir1
                    gen_op_rdtstate();
1388 0f8a249a blueswir1
                    break;
1389 0f8a249a blueswir1
                case 3: // tt
1390 0f8a249a blueswir1
                    gen_op_rdtt();
1391 0f8a249a blueswir1
                    break;
1392 0f8a249a blueswir1
                case 4: // tick
1393 0f8a249a blueswir1
                    gen_op_rdtick();
1394 0f8a249a blueswir1
                    break;
1395 0f8a249a blueswir1
                case 5: // tba
1396 0f8a249a blueswir1
                    gen_op_movtl_T0_env(offsetof(CPUSPARCState, tbr));
1397 0f8a249a blueswir1
                    break;
1398 0f8a249a blueswir1
                case 6: // pstate
1399 0f8a249a blueswir1
                    gen_op_rdpstate();
1400 0f8a249a blueswir1
                    break;
1401 0f8a249a blueswir1
                case 7: // tl
1402 0f8a249a blueswir1
                    gen_op_movl_T0_env(offsetof(CPUSPARCState, tl));
1403 0f8a249a blueswir1
                    break;
1404 0f8a249a blueswir1
                case 8: // pil
1405 0f8a249a blueswir1
                    gen_op_movl_T0_env(offsetof(CPUSPARCState, psrpil));
1406 0f8a249a blueswir1
                    break;
1407 0f8a249a blueswir1
                case 9: // cwp
1408 0f8a249a blueswir1
                    gen_op_rdcwp();
1409 0f8a249a blueswir1
                    break;
1410 0f8a249a blueswir1
                case 10: // cansave
1411 0f8a249a blueswir1
                    gen_op_movl_T0_env(offsetof(CPUSPARCState, cansave));
1412 0f8a249a blueswir1
                    break;
1413 0f8a249a blueswir1
                case 11: // canrestore
1414 0f8a249a blueswir1
                    gen_op_movl_T0_env(offsetof(CPUSPARCState, canrestore));
1415 0f8a249a blueswir1
                    break;
1416 0f8a249a blueswir1
                case 12: // cleanwin
1417 0f8a249a blueswir1
                    gen_op_movl_T0_env(offsetof(CPUSPARCState, cleanwin));
1418 0f8a249a blueswir1
                    break;
1419 0f8a249a blueswir1
                case 13: // otherwin
1420 0f8a249a blueswir1
                    gen_op_movl_T0_env(offsetof(CPUSPARCState, otherwin));
1421 0f8a249a blueswir1
                    break;
1422 0f8a249a blueswir1
                case 14: // wstate
1423 0f8a249a blueswir1
                    gen_op_movl_T0_env(offsetof(CPUSPARCState, wstate));
1424 0f8a249a blueswir1
                    break;
1425 e9ebed4d blueswir1
                case 16: // UA2005 gl
1426 e9ebed4d blueswir1
                    gen_op_movl_T0_env(offsetof(CPUSPARCState, gl));
1427 e9ebed4d blueswir1
                    break;
1428 e9ebed4d blueswir1
                case 26: // UA2005 strand status
1429 e9ebed4d blueswir1
                    if (!hypervisor(dc))
1430 e9ebed4d blueswir1
                        goto priv_insn;
1431 e9ebed4d blueswir1
                    gen_op_movl_T0_env(offsetof(CPUSPARCState, ssr));
1432 e9ebed4d blueswir1
                    break;
1433 0f8a249a blueswir1
                case 31: // ver
1434 0f8a249a blueswir1
                    gen_op_movtl_T0_env(offsetof(CPUSPARCState, version));
1435 0f8a249a blueswir1
                    break;
1436 0f8a249a blueswir1
                case 15: // fq
1437 0f8a249a blueswir1
                default:
1438 0f8a249a blueswir1
                    goto illegal_insn;
1439 0f8a249a blueswir1
                }
1440 3475187d bellard
#else
1441 0f8a249a blueswir1
                gen_op_movl_T0_env(offsetof(CPUSPARCState, wim));
1442 3475187d bellard
#endif
1443 e8af50a3 bellard
                gen_movl_T0_reg(rd);
1444 e8af50a3 bellard
                break;
1445 3475187d bellard
            } else if (xop == 0x2b) { /* rdtbr / V9 flushw */
1446 3475187d bellard
#ifdef TARGET_SPARC64
1447 0f8a249a blueswir1
                gen_op_flushw();
1448 3475187d bellard
#else
1449 0f8a249a blueswir1
                if (!supervisor(dc))
1450 0f8a249a blueswir1
                    goto priv_insn;
1451 0f8a249a blueswir1
                gen_op_movtl_T0_env(offsetof(CPUSPARCState, tbr));
1452 e8af50a3 bellard
                gen_movl_T0_reg(rd);
1453 3475187d bellard
#endif
1454 e8af50a3 bellard
                break;
1455 e8af50a3 bellard
#endif
1456 0f8a249a blueswir1
            } else if (xop == 0x34) {   /* FPU Operations */
1457 a80dde08 bellard
                if (gen_trap_ifnofpu(dc))
1458 a80dde08 bellard
                    goto jmp_insn;
1459 0f8a249a blueswir1
                gen_op_clear_ieee_excp_and_FTT();
1460 e8af50a3 bellard
                rs1 = GET_FIELD(insn, 13, 17);
1461 0f8a249a blueswir1
                rs2 = GET_FIELD(insn, 27, 31);
1462 0f8a249a blueswir1
                xop = GET_FIELD(insn, 18, 26);
1463 0f8a249a blueswir1
                switch (xop) {
1464 0f8a249a blueswir1
                    case 0x1: /* fmovs */
1465 0f8a249a blueswir1
                        gen_op_load_fpr_FT0(rs2);
1466 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
1467 0f8a249a blueswir1
                        break;
1468 0f8a249a blueswir1
                    case 0x5: /* fnegs */
1469 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
1470 0f8a249a blueswir1
                        gen_op_fnegs();
1471 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
1472 0f8a249a blueswir1
                        break;
1473 0f8a249a blueswir1
                    case 0x9: /* fabss */
1474 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
1475 0f8a249a blueswir1
                        gen_op_fabss();
1476 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
1477 0f8a249a blueswir1
                        break;
1478 0f8a249a blueswir1
                    case 0x29: /* fsqrts */
1479 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
1480 0f8a249a blueswir1
                        gen_op_fsqrts();
1481 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
1482 0f8a249a blueswir1
                        break;
1483 0f8a249a blueswir1
                    case 0x2a: /* fsqrtd */
1484 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
1485 0f8a249a blueswir1
                        gen_op_fsqrtd();
1486 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
1487 0f8a249a blueswir1
                        break;
1488 0f8a249a blueswir1
                    case 0x2b: /* fsqrtq */
1489 0f8a249a blueswir1
                        goto nfpu_insn;
1490 0f8a249a blueswir1
                    case 0x41:
1491 0f8a249a blueswir1
                        gen_op_load_fpr_FT0(rs1);
1492 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
1493 0f8a249a blueswir1
                        gen_op_fadds();
1494 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
1495 0f8a249a blueswir1
                        break;
1496 0f8a249a blueswir1
                    case 0x42:
1497 0f8a249a blueswir1
                        gen_op_load_fpr_DT0(DFPREG(rs1));
1498 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
1499 0f8a249a blueswir1
                        gen_op_faddd();
1500 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
1501 0f8a249a blueswir1
                        break;
1502 0f8a249a blueswir1
                    case 0x43: /* faddq */
1503 0f8a249a blueswir1
                        goto nfpu_insn;
1504 0f8a249a blueswir1
                    case 0x45:
1505 0f8a249a blueswir1
                        gen_op_load_fpr_FT0(rs1);
1506 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
1507 0f8a249a blueswir1
                        gen_op_fsubs();
1508 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
1509 0f8a249a blueswir1
                        break;
1510 0f8a249a blueswir1
                    case 0x46:
1511 0f8a249a blueswir1
                        gen_op_load_fpr_DT0(DFPREG(rs1));
1512 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
1513 0f8a249a blueswir1
                        gen_op_fsubd();
1514 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
1515 0f8a249a blueswir1
                        break;
1516 0f8a249a blueswir1
                    case 0x47: /* fsubq */
1517 0f8a249a blueswir1
                        goto nfpu_insn;
1518 0f8a249a blueswir1
                    case 0x49:
1519 0f8a249a blueswir1
                        gen_op_load_fpr_FT0(rs1);
1520 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
1521 0f8a249a blueswir1
                        gen_op_fmuls();
1522 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
1523 0f8a249a blueswir1
                        break;
1524 0f8a249a blueswir1
                    case 0x4a:
1525 0f8a249a blueswir1
                        gen_op_load_fpr_DT0(DFPREG(rs1));
1526 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
1527 0f8a249a blueswir1
                        gen_op_fmuld();
1528 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(rd);
1529 0f8a249a blueswir1
                        break;
1530 0f8a249a blueswir1
                    case 0x4b: /* fmulq */
1531 0f8a249a blueswir1
                        goto nfpu_insn;
1532 0f8a249a blueswir1
                    case 0x4d:
1533 0f8a249a blueswir1
                        gen_op_load_fpr_FT0(rs1);
1534 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
1535 0f8a249a blueswir1
                        gen_op_fdivs();
1536 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
1537 0f8a249a blueswir1
                        break;
1538 0f8a249a blueswir1
                    case 0x4e:
1539 0f8a249a blueswir1
                        gen_op_load_fpr_DT0(DFPREG(rs1));
1540 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
1541 0f8a249a blueswir1
                        gen_op_fdivd();
1542 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
1543 0f8a249a blueswir1
                        break;
1544 0f8a249a blueswir1
                    case 0x4f: /* fdivq */
1545 0f8a249a blueswir1
                        goto nfpu_insn;
1546 0f8a249a blueswir1
                    case 0x69:
1547 0f8a249a blueswir1
                        gen_op_load_fpr_FT0(rs1);
1548 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
1549 0f8a249a blueswir1
                        gen_op_fsmuld();
1550 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
1551 0f8a249a blueswir1
                        break;
1552 0f8a249a blueswir1
                    case 0x6e: /* fdmulq */
1553 0f8a249a blueswir1
                        goto nfpu_insn;
1554 0f8a249a blueswir1
                    case 0xc4:
1555 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
1556 0f8a249a blueswir1
                        gen_op_fitos();
1557 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
1558 0f8a249a blueswir1
                        break;
1559 0f8a249a blueswir1
                    case 0xc6:
1560 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
1561 0f8a249a blueswir1
                        gen_op_fdtos();
1562 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
1563 0f8a249a blueswir1
                        break;
1564 0f8a249a blueswir1
                    case 0xc7: /* fqtos */
1565 0f8a249a blueswir1
                        goto nfpu_insn;
1566 0f8a249a blueswir1
                    case 0xc8:
1567 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
1568 0f8a249a blueswir1
                        gen_op_fitod();
1569 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
1570 0f8a249a blueswir1
                        break;
1571 0f8a249a blueswir1
                    case 0xc9:
1572 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
1573 0f8a249a blueswir1
                        gen_op_fstod();
1574 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
1575 0f8a249a blueswir1
                        break;
1576 0f8a249a blueswir1
                    case 0xcb: /* fqtod */
1577 0f8a249a blueswir1
                        goto nfpu_insn;
1578 0f8a249a blueswir1
                    case 0xcc: /* fitoq */
1579 0f8a249a blueswir1
                        goto nfpu_insn;
1580 0f8a249a blueswir1
                    case 0xcd: /* fstoq */
1581 0f8a249a blueswir1
                        goto nfpu_insn;
1582 0f8a249a blueswir1
                    case 0xce: /* fdtoq */
1583 0f8a249a blueswir1
                        goto nfpu_insn;
1584 0f8a249a blueswir1
                    case 0xd1:
1585 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
1586 0f8a249a blueswir1
                        gen_op_fstoi();
1587 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
1588 0f8a249a blueswir1
                        break;
1589 0f8a249a blueswir1
                    case 0xd2:
1590 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(rs2);
1591 0f8a249a blueswir1
                        gen_op_fdtoi();
1592 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
1593 0f8a249a blueswir1
                        break;
1594 0f8a249a blueswir1
                    case 0xd3: /* fqtoi */
1595 0f8a249a blueswir1
                        goto nfpu_insn;
1596 3475187d bellard
#ifdef TARGET_SPARC64
1597 0f8a249a blueswir1
                    case 0x2: /* V9 fmovd */
1598 0f8a249a blueswir1
                        gen_op_load_fpr_DT0(DFPREG(rs2));
1599 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
1600 0f8a249a blueswir1
                        break;
1601 0f8a249a blueswir1
                    case 0x6: /* V9 fnegd */
1602 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
1603 0f8a249a blueswir1
                        gen_op_fnegd();
1604 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
1605 0f8a249a blueswir1
                        break;
1606 0f8a249a blueswir1
                    case 0xa: /* V9 fabsd */
1607 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
1608 0f8a249a blueswir1
                        gen_op_fabsd();
1609 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
1610 0f8a249a blueswir1
                        break;
1611 0f8a249a blueswir1
                    case 0x81: /* V9 fstox */
1612 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
1613 0f8a249a blueswir1
                        gen_op_fstox();
1614 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
1615 0f8a249a blueswir1
                        break;
1616 0f8a249a blueswir1
                    case 0x82: /* V9 fdtox */
1617 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
1618 0f8a249a blueswir1
                        gen_op_fdtox();
1619 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
1620 0f8a249a blueswir1
                        break;
1621 0f8a249a blueswir1
                    case 0x84: /* V9 fxtos */
1622 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
1623 0f8a249a blueswir1
                        gen_op_fxtos();
1624 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
1625 0f8a249a blueswir1
                        break;
1626 0f8a249a blueswir1
                    case 0x88: /* V9 fxtod */
1627 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
1628 0f8a249a blueswir1
                        gen_op_fxtod();
1629 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(DFPREG(rd));
1630 0f8a249a blueswir1
                        break;
1631 0f8a249a blueswir1
                    case 0x3: /* V9 fmovq */
1632 0f8a249a blueswir1
                    case 0x7: /* V9 fnegq */
1633 0f8a249a blueswir1
                    case 0xb: /* V9 fabsq */
1634 0f8a249a blueswir1
                    case 0x83: /* V9 fqtox */
1635 0f8a249a blueswir1
                    case 0x8c: /* V9 fxtoq */
1636 0f8a249a blueswir1
                        goto nfpu_insn;
1637 0f8a249a blueswir1
#endif
1638 0f8a249a blueswir1
                    default:
1639 0f8a249a blueswir1
                        goto illegal_insn;
1640 0f8a249a blueswir1
                }
1641 0f8a249a blueswir1
            } else if (xop == 0x35) {   /* FPU Operations */
1642 3475187d bellard
#ifdef TARGET_SPARC64
1643 0f8a249a blueswir1
                int cond;
1644 3475187d bellard
#endif
1645 a80dde08 bellard
                if (gen_trap_ifnofpu(dc))
1646 a80dde08 bellard
                    goto jmp_insn;
1647 0f8a249a blueswir1
                gen_op_clear_ieee_excp_and_FTT();
1648 cf495bcf bellard
                rs1 = GET_FIELD(insn, 13, 17);
1649 0f8a249a blueswir1
                rs2 = GET_FIELD(insn, 27, 31);
1650 0f8a249a blueswir1
                xop = GET_FIELD(insn, 18, 26);
1651 3475187d bellard
#ifdef TARGET_SPARC64
1652 0f8a249a blueswir1
                if ((xop & 0x11f) == 0x005) { // V9 fmovsr
1653 0f8a249a blueswir1
                    cond = GET_FIELD_SP(insn, 14, 17);
1654 0f8a249a blueswir1
                    gen_op_load_fpr_FT0(rd);
1655 0f8a249a blueswir1
                    gen_op_load_fpr_FT1(rs2);
1656 0f8a249a blueswir1
                    rs1 = GET_FIELD(insn, 13, 17);
1657 0f8a249a blueswir1
                    gen_movl_reg_T0(rs1);
1658 0f8a249a blueswir1
                    flush_T2(dc);
1659 0f8a249a blueswir1
                    gen_cond_reg(cond);
1660 0f8a249a blueswir1
                    gen_op_fmovs_cc();
1661 0f8a249a blueswir1
                    gen_op_store_FT0_fpr(rd);
1662 0f8a249a blueswir1
                    break;
1663 0f8a249a blueswir1
                } else if ((xop & 0x11f) == 0x006) { // V9 fmovdr
1664 0f8a249a blueswir1
                    cond = GET_FIELD_SP(insn, 14, 17);
1665 0f8a249a blueswir1
                    gen_op_load_fpr_DT0(rd);
1666 0f8a249a blueswir1
                    gen_op_load_fpr_DT1(rs2);
1667 0f8a249a blueswir1
                    flush_T2(dc);
1668 0f8a249a blueswir1
                    rs1 = GET_FIELD(insn, 13, 17);
1669 0f8a249a blueswir1
                    gen_movl_reg_T0(rs1);
1670 0f8a249a blueswir1
                    gen_cond_reg(cond);
1671 0f8a249a blueswir1
                    gen_op_fmovs_cc();
1672 0f8a249a blueswir1
                    gen_op_store_DT0_fpr(rd);
1673 0f8a249a blueswir1
                    break;
1674 0f8a249a blueswir1
                } else if ((xop & 0x11f) == 0x007) { // V9 fmovqr
1675 0f8a249a blueswir1
                    goto nfpu_insn;
1676 0f8a249a blueswir1
                }
1677 0f8a249a blueswir1
#endif
1678 0f8a249a blueswir1
                switch (xop) {
1679 3475187d bellard
#ifdef TARGET_SPARC64
1680 0f8a249a blueswir1
                    case 0x001: /* V9 fmovscc %fcc0 */
1681 0f8a249a blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);
1682 0f8a249a blueswir1
                        gen_op_load_fpr_FT0(rd);
1683 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
1684 0f8a249a blueswir1
                        flush_T2(dc);
1685 0f8a249a blueswir1
                        gen_fcond[0][cond]();
1686 0f8a249a blueswir1
                        gen_op_fmovs_cc();
1687 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
1688 0f8a249a blueswir1
                        break;
1689 0f8a249a blueswir1
                    case 0x002: /* V9 fmovdcc %fcc0 */
1690 0f8a249a blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);
1691 0f8a249a blueswir1
                        gen_op_load_fpr_DT0(rd);
1692 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(rs2);
1693 0f8a249a blueswir1
                        flush_T2(dc);
1694 0f8a249a blueswir1
                        gen_fcond[0][cond]();
1695 0f8a249a blueswir1
                        gen_op_fmovd_cc();
1696 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(rd);
1697 0f8a249a blueswir1
                        break;
1698 0f8a249a blueswir1
                    case 0x003: /* V9 fmovqcc %fcc0 */
1699 0f8a249a blueswir1
                        goto nfpu_insn;
1700 0f8a249a blueswir1
                    case 0x041: /* V9 fmovscc %fcc1 */
1701 0f8a249a blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);
1702 0f8a249a blueswir1
                        gen_op_load_fpr_FT0(rd);
1703 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
1704 0f8a249a blueswir1
                        flush_T2(dc);
1705 0f8a249a blueswir1
                        gen_fcond[1][cond]();
1706 0f8a249a blueswir1
                        gen_op_fmovs_cc();
1707 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
1708 0f8a249a blueswir1
                        break;
1709 0f8a249a blueswir1
                    case 0x042: /* V9 fmovdcc %fcc1 */
1710 0f8a249a blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);
1711 0f8a249a blueswir1
                        gen_op_load_fpr_DT0(rd);
1712 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(rs2);
1713 0f8a249a blueswir1
                        flush_T2(dc);
1714 0f8a249a blueswir1
                        gen_fcond[1][cond]();
1715 0f8a249a blueswir1
                        gen_op_fmovd_cc();
1716 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(rd);
1717 0f8a249a blueswir1
                        break;
1718 0f8a249a blueswir1
                    case 0x043: /* V9 fmovqcc %fcc1 */
1719 0f8a249a blueswir1
                        goto nfpu_insn;
1720 0f8a249a blueswir1
                    case 0x081: /* V9 fmovscc %fcc2 */
1721 0f8a249a blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);
1722 0f8a249a blueswir1
                        gen_op_load_fpr_FT0(rd);
1723 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
1724 0f8a249a blueswir1
                        flush_T2(dc);
1725 0f8a249a blueswir1
                        gen_fcond[2][cond]();
1726 0f8a249a blueswir1
                        gen_op_fmovs_cc();
1727 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
1728 0f8a249a blueswir1
                        break;
1729 0f8a249a blueswir1
                    case 0x082: /* V9 fmovdcc %fcc2 */
1730 0f8a249a blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);
1731 0f8a249a blueswir1
                        gen_op_load_fpr_DT0(rd);
1732 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(rs2);
1733 0f8a249a blueswir1
                        flush_T2(dc);
1734 0f8a249a blueswir1
                        gen_fcond[2][cond]();
1735 0f8a249a blueswir1
                        gen_op_fmovd_cc();
1736 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(rd);
1737 0f8a249a blueswir1
                        break;
1738 0f8a249a blueswir1
                    case 0x083: /* V9 fmovqcc %fcc2 */
1739 0f8a249a blueswir1
                        goto nfpu_insn;
1740 0f8a249a blueswir1
                    case 0x0c1: /* V9 fmovscc %fcc3 */
1741 0f8a249a blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);
1742 0f8a249a blueswir1
                        gen_op_load_fpr_FT0(rd);
1743 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
1744 0f8a249a blueswir1
                        flush_T2(dc);
1745 0f8a249a blueswir1
                        gen_fcond[3][cond]();
1746 0f8a249a blueswir1
                        gen_op_fmovs_cc();
1747 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
1748 0f8a249a blueswir1
                        break;
1749 0f8a249a blueswir1
                    case 0x0c2: /* V9 fmovdcc %fcc3 */
1750 0f8a249a blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);
1751 0f8a249a blueswir1
                        gen_op_load_fpr_DT0(rd);
1752 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(rs2);
1753 0f8a249a blueswir1
                        flush_T2(dc);
1754 0f8a249a blueswir1
                        gen_fcond[3][cond]();
1755 0f8a249a blueswir1
                        gen_op_fmovd_cc();
1756 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(rd);
1757 0f8a249a blueswir1
                        break;
1758 0f8a249a blueswir1
                    case 0x0c3: /* V9 fmovqcc %fcc3 */
1759 0f8a249a blueswir1
                        goto nfpu_insn;
1760 0f8a249a blueswir1
                    case 0x101: /* V9 fmovscc %icc */
1761 0f8a249a blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);
1762 0f8a249a blueswir1
                        gen_op_load_fpr_FT0(rd);
1763 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
1764 0f8a249a blueswir1
                        flush_T2(dc);
1765 0f8a249a blueswir1
                        gen_cond[0][cond]();
1766 0f8a249a blueswir1
                        gen_op_fmovs_cc();
1767 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
1768 0f8a249a blueswir1
                        break;
1769 0f8a249a blueswir1
                    case 0x102: /* V9 fmovdcc %icc */
1770 0f8a249a blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);
1771 0f8a249a blueswir1
                        gen_op_load_fpr_DT0(rd);
1772 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(rs2);
1773 0f8a249a blueswir1
                        flush_T2(dc);
1774 0f8a249a blueswir1
                        gen_cond[0][cond]();
1775 0f8a249a blueswir1
                        gen_op_fmovd_cc();
1776 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(rd);
1777 0f8a249a blueswir1
                        break;
1778 0f8a249a blueswir1
                    case 0x103: /* V9 fmovqcc %icc */
1779 0f8a249a blueswir1
                        goto nfpu_insn;
1780 0f8a249a blueswir1
                    case 0x181: /* V9 fmovscc %xcc */
1781 0f8a249a blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);
1782 0f8a249a blueswir1
                        gen_op_load_fpr_FT0(rd);
1783 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
1784 0f8a249a blueswir1
                        flush_T2(dc);
1785 0f8a249a blueswir1
                        gen_cond[1][cond]();
1786 0f8a249a blueswir1
                        gen_op_fmovs_cc();
1787 0f8a249a blueswir1
                        gen_op_store_FT0_fpr(rd);
1788 0f8a249a blueswir1
                        break;
1789 0f8a249a blueswir1
                    case 0x182: /* V9 fmovdcc %xcc */
1790 0f8a249a blueswir1
                        cond = GET_FIELD_SP(insn, 14, 17);
1791 0f8a249a blueswir1
                        gen_op_load_fpr_DT0(rd);
1792 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(rs2);
1793 0f8a249a blueswir1
                        flush_T2(dc);
1794 0f8a249a blueswir1
                        gen_cond[1][cond]();
1795 0f8a249a blueswir1
                        gen_op_fmovd_cc();
1796 0f8a249a blueswir1
                        gen_op_store_DT0_fpr(rd);
1797 0f8a249a blueswir1
                        break;
1798 0f8a249a blueswir1
                    case 0x183: /* V9 fmovqcc %xcc */
1799 0f8a249a blueswir1
                        goto nfpu_insn;
1800 0f8a249a blueswir1
#endif
1801 0f8a249a blueswir1
                    case 0x51: /* V9 %fcc */
1802 0f8a249a blueswir1
                        gen_op_load_fpr_FT0(rs1);
1803 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
1804 3475187d bellard
#ifdef TARGET_SPARC64
1805 0f8a249a blueswir1
                        gen_fcmps[rd & 3]();
1806 3475187d bellard
#else
1807 0f8a249a blueswir1
                        gen_op_fcmps();
1808 3475187d bellard
#endif
1809 0f8a249a blueswir1
                        break;
1810 0f8a249a blueswir1
                    case 0x52: /* V9 %fcc */
1811 0f8a249a blueswir1
                        gen_op_load_fpr_DT0(DFPREG(rs1));
1812 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
1813 3475187d bellard
#ifdef TARGET_SPARC64
1814 0f8a249a blueswir1
                        gen_fcmpd[rd & 3]();
1815 3475187d bellard
#else
1816 0f8a249a blueswir1
                        gen_op_fcmpd();
1817 0f8a249a blueswir1
#endif
1818 0f8a249a blueswir1
                        break;
1819 0f8a249a blueswir1
                    case 0x53: /* fcmpq */
1820 0f8a249a blueswir1
                        goto nfpu_insn;
1821 0f8a249a blueswir1
                    case 0x55: /* fcmpes, V9 %fcc */
1822 0f8a249a blueswir1
                        gen_op_load_fpr_FT0(rs1);
1823 0f8a249a blueswir1
                        gen_op_load_fpr_FT1(rs2);
1824 3475187d bellard
#ifdef TARGET_SPARC64
1825 0f8a249a blueswir1
                        gen_fcmpes[rd & 3]();
1826 3475187d bellard
#else
1827 0f8a249a blueswir1
                        gen_op_fcmpes();
1828 3475187d bellard
#endif
1829 0f8a249a blueswir1
                        break;
1830 0f8a249a blueswir1
                    case 0x56: /* fcmped, V9 %fcc */
1831 0f8a249a blueswir1
                        gen_op_load_fpr_DT0(DFPREG(rs1));
1832 0f8a249a blueswir1
                        gen_op_load_fpr_DT1(DFPREG(rs2));
1833 3475187d bellard
#ifdef TARGET_SPARC64
1834 0f8a249a blueswir1
                        gen_fcmped[rd & 3]();
1835 3475187d bellard
#else
1836 0f8a249a blueswir1
                        gen_op_fcmped();
1837 0f8a249a blueswir1
#endif
1838 0f8a249a blueswir1
                        break;
1839 0f8a249a blueswir1
                    case 0x57: /* fcmpeq */
1840 0f8a249a blueswir1
                        goto nfpu_insn;
1841 0f8a249a blueswir1
                    default:
1842 0f8a249a blueswir1
                        goto illegal_insn;
1843 0f8a249a blueswir1
                }
1844 e80cfcfc bellard
#if defined(OPTIM)
1845 0f8a249a blueswir1
            } else if (xop == 0x2) {
1846 0f8a249a blueswir1
                // clr/mov shortcut
1847 e80cfcfc bellard
1848 e80cfcfc bellard
                rs1 = GET_FIELD(insn, 13, 17);
1849 0f8a249a blueswir1
                if (rs1 == 0) {
1850 0f8a249a blueswir1
                    // or %g0, x, y -> mov T1, x; mov y, T1
1851 0f8a249a blueswir1
                    if (IS_IMM) {       /* immediate */
1852 0f8a249a blueswir1
                        rs2 = GET_FIELDs(insn, 19, 31);
1853 0f8a249a blueswir1
                        gen_movl_simm_T1(rs2);
1854 0f8a249a blueswir1
                    } else {            /* register */
1855 0f8a249a blueswir1
                        rs2 = GET_FIELD(insn, 27, 31);
1856 0f8a249a blueswir1
                        gen_movl_reg_T1(rs2);
1857 0f8a249a blueswir1
                    }
1858 0f8a249a blueswir1
                    gen_movl_T1_reg(rd);
1859 0f8a249a blueswir1
                } else {
1860 0f8a249a blueswir1
                    gen_movl_reg_T0(rs1);
1861 0f8a249a blueswir1
                    if (IS_IMM) {       /* immediate */
1862 0f8a249a blueswir1
                        // or x, #0, y -> mov T1, x; mov y, T1
1863 0f8a249a blueswir1
                        rs2 = GET_FIELDs(insn, 19, 31);
1864 0f8a249a blueswir1
                        if (rs2 != 0) {
1865 0f8a249a blueswir1
                            gen_movl_simm_T1(rs2);
1866 0f8a249a blueswir1
                            gen_op_or_T1_T0();
1867 0f8a249a blueswir1
                        }
1868 0f8a249a blueswir1
                    } else {            /* register */
1869 0f8a249a blueswir1
                        // or x, %g0, y -> mov T1, x; mov y, T1
1870 0f8a249a blueswir1
                        rs2 = GET_FIELD(insn, 27, 31);
1871 0f8a249a blueswir1
                        if (rs2 != 0) {
1872 0f8a249a blueswir1
                            gen_movl_reg_T1(rs2);
1873 0f8a249a blueswir1
                            gen_op_or_T1_T0();
1874 0f8a249a blueswir1
                        }
1875 0f8a249a blueswir1
                    }
1876 0f8a249a blueswir1
                    gen_movl_T0_reg(rd);
1877 0f8a249a blueswir1
                }
1878 e80cfcfc bellard
#endif
1879 83469015 bellard
#ifdef TARGET_SPARC64
1880 0f8a249a blueswir1
            } else if (xop == 0x25) { /* sll, V9 sllx */
1881 83469015 bellard
                rs1 = GET_FIELD(insn, 13, 17);
1882 0f8a249a blueswir1
                gen_movl_reg_T0(rs1);
1883 0f8a249a blueswir1
                if (IS_IMM) {   /* immediate */
1884 83469015 bellard
                    rs2 = GET_FIELDs(insn, 20, 31);
1885 83469015 bellard
                    gen_movl_simm_T1(rs2);
1886 0f8a249a blueswir1
                } else {                /* register */
1887 83469015 bellard
                    rs2 = GET_FIELD(insn, 27, 31);
1888 83469015 bellard
                    gen_movl_reg_T1(rs2);
1889 83469015 bellard
                }
1890 0f8a249a blueswir1
                if (insn & (1 << 12))
1891 0f8a249a blueswir1
                    gen_op_sllx();
1892 0f8a249a blueswir1
                else
1893 0f8a249a blueswir1
                    gen_op_sll();
1894 0f8a249a blueswir1
                gen_movl_T0_reg(rd);
1895 0f8a249a blueswir1
            } else if (xop == 0x26) { /* srl, V9 srlx */
1896 83469015 bellard
                rs1 = GET_FIELD(insn, 13, 17);
1897 0f8a249a blueswir1
                gen_movl_reg_T0(rs1);
1898 0f8a249a blueswir1
                if (IS_IMM) {   /* immediate */
1899 83469015 bellard
                    rs2 = GET_FIELDs(insn, 20, 31);
1900 83469015 bellard
                    gen_movl_simm_T1(rs2);
1901 0f8a249a blueswir1
                } else {                /* register */
1902 83469015 bellard
                    rs2 = GET_FIELD(insn, 27, 31);
1903 83469015 bellard
                    gen_movl_reg_T1(rs2);
1904 83469015 bellard
                }
1905 0f8a249a blueswir1
                if (insn & (1 << 12))
1906 0f8a249a blueswir1
                    gen_op_srlx();
1907 0f8a249a blueswir1
                else
1908 0f8a249a blueswir1
                    gen_op_srl();
1909 0f8a249a blueswir1
                gen_movl_T0_reg(rd);
1910 0f8a249a blueswir1
            } else if (xop == 0x27) { /* sra, V9 srax */
1911 83469015 bellard
                rs1 = GET_FIELD(insn, 13, 17);
1912 0f8a249a blueswir1
                gen_movl_reg_T0(rs1);
1913 0f8a249a blueswir1
                if (IS_IMM) {   /* immediate */
1914 83469015 bellard
                    rs2 = GET_FIELDs(insn, 20, 31);
1915 83469015 bellard
                    gen_movl_simm_T1(rs2);
1916 0f8a249a blueswir1
                } else {                /* register */
1917 83469015 bellard
                    rs2 = GET_FIELD(insn, 27, 31);
1918 83469015 bellard
                    gen_movl_reg_T1(rs2);
1919 83469015 bellard
                }
1920 0f8a249a blueswir1
                if (insn & (1 << 12))
1921 0f8a249a blueswir1
                    gen_op_srax();
1922 0f8a249a blueswir1
                else
1923 0f8a249a blueswir1
                    gen_op_sra();
1924 0f8a249a blueswir1
                gen_movl_T0_reg(rd);
1925 83469015 bellard
#endif
1926 fcc72045 blueswir1
            } else if (xop < 0x36) {
1927 e80cfcfc bellard
                rs1 = GET_FIELD(insn, 13, 17);
1928 0f8a249a blueswir1
                gen_movl_reg_T0(rs1);
1929 0f8a249a blueswir1
                if (IS_IMM) {   /* immediate */
1930 cf495bcf bellard
                    rs2 = GET_FIELDs(insn, 19, 31);
1931 3475187d bellard
                    gen_movl_simm_T1(rs2);
1932 0f8a249a blueswir1
                } else {                /* register */
1933 cf495bcf bellard
                    rs2 = GET_FIELD(insn, 27, 31);
1934 cf495bcf bellard
                    gen_movl_reg_T1(rs2);
1935 cf495bcf bellard
                }
1936 cf495bcf bellard
                if (xop < 0x20) {
1937 cf495bcf bellard
                    switch (xop & ~0x10) {
1938 cf495bcf bellard
                    case 0x0:
1939 cf495bcf bellard
                        if (xop & 0x10)
1940 cf495bcf bellard
                            gen_op_add_T1_T0_cc();
1941 cf495bcf bellard
                        else
1942 cf495bcf bellard
                            gen_op_add_T1_T0();
1943 cf495bcf bellard
                        break;
1944 cf495bcf bellard
                    case 0x1:
1945 cf495bcf bellard
                        gen_op_and_T1_T0();
1946 cf495bcf bellard
                        if (xop & 0x10)
1947 cf495bcf bellard
                            gen_op_logic_T0_cc();
1948 cf495bcf bellard
                        break;
1949 cf495bcf bellard
                    case 0x2:
1950 0f8a249a blueswir1
                        gen_op_or_T1_T0();
1951 0f8a249a blueswir1
                        if (xop & 0x10)
1952 0f8a249a blueswir1
                            gen_op_logic_T0_cc();
1953 0f8a249a blueswir1
                        break;
1954 cf495bcf bellard
                    case 0x3:
1955 cf495bcf bellard
                        gen_op_xor_T1_T0();
1956 cf495bcf bellard
                        if (xop & 0x10)
1957 cf495bcf bellard
                            gen_op_logic_T0_cc();
1958 cf495bcf bellard
                        break;
1959 cf495bcf bellard
                    case 0x4:
1960 cf495bcf bellard
                        if (xop & 0x10)
1961 cf495bcf bellard
                            gen_op_sub_T1_T0_cc();
1962 cf495bcf bellard
                        else
1963 cf495bcf bellard
                            gen_op_sub_T1_T0();
1964 cf495bcf bellard
                        break;
1965 cf495bcf bellard
                    case 0x5:
1966 cf495bcf bellard
                        gen_op_andn_T1_T0();
1967 cf495bcf bellard
                        if (xop & 0x10)
1968 cf495bcf bellard
                            gen_op_logic_T0_cc();
1969 cf495bcf bellard
                        break;
1970 cf495bcf bellard
                    case 0x6:
1971 cf495bcf bellard
                        gen_op_orn_T1_T0();
1972 cf495bcf bellard
                        if (xop & 0x10)
1973 cf495bcf bellard
                            gen_op_logic_T0_cc();
1974 cf495bcf bellard
                        break;
1975 cf495bcf bellard
                    case 0x7:
1976 cf495bcf bellard
                        gen_op_xnor_T1_T0();
1977 cf495bcf bellard
                        if (xop & 0x10)
1978 cf495bcf bellard
                            gen_op_logic_T0_cc();
1979 cf495bcf bellard
                        break;
1980 cf495bcf bellard
                    case 0x8:
1981 cf495bcf bellard
                        if (xop & 0x10)
1982 af7bf89b bellard
                            gen_op_addx_T1_T0_cc();
1983 af7bf89b bellard
                        else
1984 af7bf89b bellard
                            gen_op_addx_T1_T0();
1985 cf495bcf bellard
                        break;
1986 ded3ab80 pbrook
#ifdef TARGET_SPARC64
1987 0f8a249a blueswir1
                    case 0x9: /* V9 mulx */
1988 ded3ab80 pbrook
                        gen_op_mulx_T1_T0();
1989 ded3ab80 pbrook
                        break;
1990 ded3ab80 pbrook
#endif
1991 cf495bcf bellard
                    case 0xa:
1992 cf495bcf bellard
                        gen_op_umul_T1_T0();
1993 cf495bcf bellard
                        if (xop & 0x10)
1994 cf495bcf bellard
                            gen_op_logic_T0_cc();
1995 cf495bcf bellard
                        break;
1996 cf495bcf bellard
                    case 0xb:
1997 cf495bcf bellard
                        gen_op_smul_T1_T0();
1998 cf495bcf bellard
                        if (xop & 0x10)
1999 cf495bcf bellard
                            gen_op_logic_T0_cc();
2000 cf495bcf bellard
                        break;
2001 cf495bcf bellard
                    case 0xc:
2002 cf495bcf bellard
                        if (xop & 0x10)
2003 af7bf89b bellard
                            gen_op_subx_T1_T0_cc();
2004 af7bf89b bellard
                        else
2005 af7bf89b bellard
                            gen_op_subx_T1_T0();
2006 cf495bcf bellard
                        break;
2007 ded3ab80 pbrook
#ifdef TARGET_SPARC64
2008 0f8a249a blueswir1
                    case 0xd: /* V9 udivx */
2009 ded3ab80 pbrook
                        gen_op_udivx_T1_T0();
2010 ded3ab80 pbrook
                        break;
2011 ded3ab80 pbrook
#endif
2012 cf495bcf bellard
                    case 0xe:
2013 cf495bcf bellard
                        gen_op_udiv_T1_T0();
2014 cf495bcf bellard
                        if (xop & 0x10)
2015 cf495bcf bellard
                            gen_op_div_cc();
2016 cf495bcf bellard
                        break;
2017 cf495bcf bellard
                    case 0xf:
2018 cf495bcf bellard
                        gen_op_sdiv_T1_T0();
2019 cf495bcf bellard
                        if (xop & 0x10)
2020 cf495bcf bellard
                            gen_op_div_cc();
2021 cf495bcf bellard
                        break;
2022 cf495bcf bellard
                    default:
2023 cf495bcf bellard
                        goto illegal_insn;
2024 cf495bcf bellard
                    }
2025 0f8a249a blueswir1
                    gen_movl_T0_reg(rd);
2026 cf495bcf bellard
                } else {
2027 cf495bcf bellard
                    switch (xop) {
2028 0f8a249a blueswir1
                    case 0x20: /* taddcc */
2029 0f8a249a blueswir1
                        gen_op_tadd_T1_T0_cc();
2030 0f8a249a blueswir1
                        gen_movl_T0_reg(rd);
2031 0f8a249a blueswir1
                        break;
2032 0f8a249a blueswir1
                    case 0x21: /* tsubcc */
2033 0f8a249a blueswir1
                        gen_op_tsub_T1_T0_cc();
2034 0f8a249a blueswir1
                        gen_movl_T0_reg(rd);
2035 0f8a249a blueswir1
                        break;
2036 0f8a249a blueswir1
                    case 0x22: /* taddcctv */
2037 90251fb9 blueswir1
                        save_state(dc);
2038 0f8a249a blueswir1
                        gen_op_tadd_T1_T0_ccTV();
2039 0f8a249a blueswir1
                        gen_movl_T0_reg(rd);
2040 0f8a249a blueswir1
                        break;
2041 0f8a249a blueswir1
                    case 0x23: /* tsubcctv */
2042 90251fb9 blueswir1
                        save_state(dc);
2043 0f8a249a blueswir1
                        gen_op_tsub_T1_T0_ccTV();
2044 0f8a249a blueswir1
                        gen_movl_T0_reg(rd);
2045 0f8a249a blueswir1
                        break;
2046 cf495bcf bellard
                    case 0x24: /* mulscc */
2047 cf495bcf bellard
                        gen_op_mulscc_T1_T0();
2048 cf495bcf bellard
                        gen_movl_T0_reg(rd);
2049 cf495bcf bellard
                        break;
2050 83469015 bellard
#ifndef TARGET_SPARC64
2051 0f8a249a blueswir1
                    case 0x25:  /* sll */
2052 0f8a249a blueswir1
                        gen_op_sll();
2053 cf495bcf bellard
                        gen_movl_T0_reg(rd);
2054 cf495bcf bellard
                        break;
2055 83469015 bellard
                    case 0x26:  /* srl */
2056 0f8a249a blueswir1
                        gen_op_srl();
2057 cf495bcf bellard
                        gen_movl_T0_reg(rd);
2058 cf495bcf bellard
                        break;
2059 83469015 bellard
                    case 0x27:  /* sra */
2060 0f8a249a blueswir1
                        gen_op_sra();
2061 cf495bcf bellard
                        gen_movl_T0_reg(rd);
2062 cf495bcf bellard
                        break;
2063 83469015 bellard
#endif
2064 cf495bcf bellard
                    case 0x30:
2065 cf495bcf bellard
                        {
2066 cf495bcf bellard
                            switch(rd) {
2067 3475187d bellard
                            case 0: /* wry */
2068 0f8a249a blueswir1
                                gen_op_xor_T1_T0();
2069 0f8a249a blueswir1
                                gen_op_movtl_env_T0(offsetof(CPUSPARCState, y));
2070 cf495bcf bellard
                                break;
2071 65fe7b09 blueswir1
#ifndef TARGET_SPARC64
2072 65fe7b09 blueswir1
                            case 0x01 ... 0x0f: /* undefined in the
2073 65fe7b09 blueswir1
                                                   SPARCv8 manual, nop
2074 65fe7b09 blueswir1
                                                   on the microSPARC
2075 65fe7b09 blueswir1
                                                   II */
2076 65fe7b09 blueswir1
                            case 0x10 ... 0x1f: /* implementation-dependent
2077 65fe7b09 blueswir1
                                                   in the SPARCv8
2078 65fe7b09 blueswir1
                                                   manual, nop on the
2079 65fe7b09 blueswir1
                                                   microSPARC II */
2080 65fe7b09 blueswir1
                                break;
2081 65fe7b09 blueswir1
#else
2082 0f8a249a blueswir1
                            case 0x2: /* V9 wrccr */
2083 ee0b03fd blueswir1
                                gen_op_xor_T1_T0();
2084 3475187d bellard
                                gen_op_wrccr();
2085 0f8a249a blueswir1
                                break;
2086 0f8a249a blueswir1
                            case 0x3: /* V9 wrasi */
2087 ee0b03fd blueswir1
                                gen_op_xor_T1_T0();
2088 0f8a249a blueswir1
                                gen_op_movl_env_T0(offsetof(CPUSPARCState, asi));
2089 0f8a249a blueswir1
                                break;
2090 0f8a249a blueswir1
                            case 0x6: /* V9 wrfprs */
2091 0f8a249a blueswir1
                                gen_op_xor_T1_T0();
2092 0f8a249a blueswir1
                                gen_op_movl_env_T0(offsetof(CPUSPARCState, fprs));
2093 3299908c blueswir1
                                save_state(dc);
2094 3299908c blueswir1
                                gen_op_next_insn();
2095 3299908c blueswir1
                                gen_op_movl_T0_0();
2096 3299908c blueswir1
                                gen_op_exit_tb();
2097 3299908c blueswir1
                                dc->is_br = 1;
2098 0f8a249a blueswir1
                                break;
2099 0f8a249a blueswir1
                            case 0xf: /* V9 sir, nop if user */
2100 3475187d bellard
#if !defined(CONFIG_USER_ONLY)
2101 0f8a249a blueswir1
                                if (supervisor(dc))
2102 0f8a249a blueswir1
                                    gen_op_sir();
2103 3475187d bellard
#endif
2104 0f8a249a blueswir1
                                break;
2105 0f8a249a blueswir1
                            case 0x13: /* Graphics Status */
2106 725cb90b bellard
                                if (gen_trap_ifnofpu(dc))
2107 725cb90b bellard
                                    goto jmp_insn;
2108 ee0b03fd blueswir1
                                gen_op_xor_T1_T0();
2109 0f8a249a blueswir1
                                gen_op_movtl_env_T0(offsetof(CPUSPARCState, gsr));
2110 0f8a249a blueswir1
                                break;
2111 0f8a249a blueswir1
                            case 0x17: /* Tick compare */
2112 83469015 bellard
#if !defined(CONFIG_USER_ONLY)
2113 0f8a249a blueswir1
                                if (!supervisor(dc))
2114 0f8a249a blueswir1
                                    goto illegal_insn;
2115 83469015 bellard
#endif
2116 ee0b03fd blueswir1
                                gen_op_xor_T1_T0();
2117 20c9f095 blueswir1
                                gen_op_movtl_env_T0(offsetof(CPUSPARCState, tick_cmpr));
2118 20c9f095 blueswir1
                                gen_op_wrtick_cmpr();
2119 0f8a249a blueswir1
                                break;
2120 0f8a249a blueswir1
                            case 0x18: /* System tick */
2121 83469015 bellard
#if !defined(CONFIG_USER_ONLY)
2122 0f8a249a blueswir1
                                if (!supervisor(dc))
2123 0f8a249a blueswir1
                                    goto illegal_insn;
2124 83469015 bellard
#endif
2125 ee0b03fd blueswir1
                                gen_op_xor_T1_T0();
2126 20c9f095 blueswir1
                                gen_op_wrstick();
2127 0f8a249a blueswir1
                                break;
2128 0f8a249a blueswir1
                            case 0x19: /* System tick compare */
2129 83469015 bellard
#if !defined(CONFIG_USER_ONLY)
2130 0f8a249a blueswir1
                                if (!supervisor(dc))
2131 0f8a249a blueswir1
                                    goto illegal_insn;
2132 3475187d bellard
#endif
2133 ee0b03fd blueswir1
                                gen_op_xor_T1_T0();
2134 20c9f095 blueswir1
                                gen_op_movtl_env_T0(offsetof(CPUSPARCState, stick_cmpr));
2135 20c9f095 blueswir1
                                gen_op_wrstick_cmpr();
2136 0f8a249a blueswir1
                                break;
2137 83469015 bellard
2138 0f8a249a blueswir1
                            case 0x10: /* Performance Control */
2139 0f8a249a blueswir1
                            case 0x11: /* Performance Instrumentation Counter */
2140 0f8a249a blueswir1
                            case 0x12: /* Dispatch Control */
2141 0f8a249a blueswir1
                            case 0x14: /* Softint set */
2142 0f8a249a blueswir1
                            case 0x15: /* Softint clear */
2143 0f8a249a blueswir1
                            case 0x16: /* Softint write */
2144 83469015 bellard
#endif
2145 3475187d bellard
                            default:
2146 cf495bcf bellard
                                goto illegal_insn;
2147 cf495bcf bellard
                            }
2148 cf495bcf bellard
                        }
2149 cf495bcf bellard
                        break;
2150 e8af50a3 bellard
#if !defined(CONFIG_USER_ONLY)
2151 af7bf89b bellard
                    case 0x31: /* wrpsr, V9 saved, restored */
2152 e8af50a3 bellard
                        {
2153 0f8a249a blueswir1
                            if (!supervisor(dc))
2154 0f8a249a blueswir1
                                goto priv_insn;
2155 3475187d bellard
#ifdef TARGET_SPARC64
2156 0f8a249a blueswir1
                            switch (rd) {
2157 0f8a249a blueswir1
                            case 0:
2158 0f8a249a blueswir1
                                gen_op_saved();
2159 0f8a249a blueswir1
                                break;
2160 0f8a249a blueswir1
                            case 1:
2161 0f8a249a blueswir1
                                gen_op_restored();
2162 0f8a249a blueswir1
                                break;
2163 e9ebed4d blueswir1
                            case 2: /* UA2005 allclean */
2164 e9ebed4d blueswir1
                            case 3: /* UA2005 otherw */
2165 e9ebed4d blueswir1
                            case 4: /* UA2005 normalw */
2166 e9ebed4d blueswir1
                            case 5: /* UA2005 invalw */
2167 e9ebed4d blueswir1
                                // XXX
2168 0f8a249a blueswir1
                            default:
2169 3475187d bellard
                                goto illegal_insn;
2170 3475187d bellard
                            }
2171 3475187d bellard
#else
2172 e8af50a3 bellard
                            gen_op_xor_T1_T0();
2173 e8af50a3 bellard
                            gen_op_wrpsr();
2174 9e61bde5 bellard
                            save_state(dc);
2175 9e61bde5 bellard
                            gen_op_next_insn();
2176 0f8a249a blueswir1
                            gen_op_movl_T0_0();
2177 0f8a249a blueswir1
                            gen_op_exit_tb();
2178 0f8a249a blueswir1
                            dc->is_br = 1;
2179 3475187d bellard
#endif
2180 e8af50a3 bellard
                        }
2181 e8af50a3 bellard
                        break;
2182 af7bf89b bellard
                    case 0x32: /* wrwim, V9 wrpr */
2183 e8af50a3 bellard
                        {
2184 0f8a249a blueswir1
                            if (!supervisor(dc))
2185 0f8a249a blueswir1
                                goto priv_insn;
2186 e8af50a3 bellard
                            gen_op_xor_T1_T0();
2187 3475187d bellard
#ifdef TARGET_SPARC64
2188 0f8a249a blueswir1
                            switch (rd) {
2189 0f8a249a blueswir1
                            case 0: // tpc
2190 0f8a249a blueswir1
                                gen_op_wrtpc();
2191 0f8a249a blueswir1
                                break;
2192 0f8a249a blueswir1
                            case 1: // tnpc
2193 0f8a249a blueswir1
                                gen_op_wrtnpc();
2194 0f8a249a blueswir1
                                break;
2195 0f8a249a blueswir1
                            case 2: // tstate
2196 0f8a249a blueswir1
                                gen_op_wrtstate();
2197 0f8a249a blueswir1
                                break;
2198 0f8a249a blueswir1
                            case 3: // tt
2199 0f8a249a blueswir1
                                gen_op_wrtt();
2200 0f8a249a blueswir1
                                break;
2201 0f8a249a blueswir1
                            case 4: // tick
2202 0f8a249a blueswir1
                                gen_op_wrtick();
2203 0f8a249a blueswir1
                                break;
2204 0f8a249a blueswir1
                            case 5: // tba
2205 0f8a249a blueswir1
                                gen_op_movtl_env_T0(offsetof(CPUSPARCState, tbr));
2206 0f8a249a blueswir1
                                break;
2207 0f8a249a blueswir1
                            case 6: // pstate
2208 0f8a249a blueswir1
                                gen_op_wrpstate();
2209 ded3ab80 pbrook
                                save_state(dc);
2210 ded3ab80 pbrook
                                gen_op_next_insn();
2211 ded3ab80 pbrook
                                gen_op_movl_T0_0();
2212 ded3ab80 pbrook
                                gen_op_exit_tb();
2213 ded3ab80 pbrook
                                dc->is_br = 1;
2214 0f8a249a blueswir1
                                break;
2215 0f8a249a blueswir1
                            case 7: // tl
2216 0f8a249a blueswir1
                                gen_op_movl_env_T0(offsetof(CPUSPARCState, tl));
2217 0f8a249a blueswir1
                                break;
2218 0f8a249a blueswir1
                            case 8: // pil
2219 0f8a249a blueswir1
                                gen_op_movl_env_T0(offsetof(CPUSPARCState, psrpil));
2220 0f8a249a blueswir1
                                break;
2221 0f8a249a blueswir1
                            case 9: // cwp
2222 0f8a249a blueswir1
                                gen_op_wrcwp();
2223 0f8a249a blueswir1
                                break;
2224 0f8a249a blueswir1
                            case 10: // cansave
2225 0f8a249a blueswir1
                                gen_op_movl_env_T0(offsetof(CPUSPARCState, cansave));
2226 0f8a249a blueswir1
                                break;
2227 0f8a249a blueswir1
                            case 11: // canrestore
2228 0f8a249a blueswir1
                                gen_op_movl_env_T0(offsetof(CPUSPARCState, canrestore));
2229 0f8a249a blueswir1
                                break;
2230 0f8a249a blueswir1
                            case 12: // cleanwin
2231 0f8a249a blueswir1
                                gen_op_movl_env_T0(offsetof(CPUSPARCState, cleanwin));
2232 0f8a249a blueswir1
                                break;
2233 0f8a249a blueswir1
                            case 13: // otherwin
2234 0f8a249a blueswir1
                                gen_op_movl_env_T0(offsetof(CPUSPARCState, otherwin));
2235 0f8a249a blueswir1
                                break;
2236 0f8a249a blueswir1
                            case 14: // wstate
2237 0f8a249a blueswir1
                                gen_op_movl_env_T0(offsetof(CPUSPARCState, wstate));
2238 0f8a249a blueswir1
                                break;
2239 e9ebed4d blueswir1
                            case 16: // UA2005 gl
2240 e9ebed4d blueswir1
                                gen_op_movl_env_T0(offsetof(CPUSPARCState, gl));
2241 e9ebed4d blueswir1
                                break;
2242 e9ebed4d blueswir1
                            case 26: // UA2005 strand status
2243 e9ebed4d blueswir1
                                if (!hypervisor(dc))
2244 e9ebed4d blueswir1
                                    goto priv_insn;
2245 e9ebed4d blueswir1
                                gen_op_movl_env_T0(offsetof(CPUSPARCState, ssr));
2246 e9ebed4d blueswir1
                                break;
2247 0f8a249a blueswir1
                            default:
2248 0f8a249a blueswir1
                                goto illegal_insn;
2249 0f8a249a blueswir1
                            }
2250 3475187d bellard
#else
2251 0f8a249a blueswir1
                            gen_op_wrwim();
2252 3475187d bellard
#endif
2253 e8af50a3 bellard
                        }
2254 e8af50a3 bellard
                        break;
2255 e9ebed4d blueswir1
                    case 0x33: /* wrtbr, UA2005 wrhpr */
2256 e8af50a3 bellard
                        {
2257 e9ebed4d blueswir1
#ifndef TARGET_SPARC64
2258 0f8a249a blueswir1
                            if (!supervisor(dc))
2259 0f8a249a blueswir1
                                goto priv_insn;
2260 e8af50a3 bellard
                            gen_op_xor_T1_T0();
2261 e9ebed4d blueswir1
                            gen_op_movtl_env_T0(offsetof(CPUSPARCState, tbr));
2262 e9ebed4d blueswir1
#else
2263 e9ebed4d blueswir1
                            if (!hypervisor(dc))
2264 e9ebed4d blueswir1
                                goto priv_insn;
2265 e9ebed4d blueswir1
                            gen_op_xor_T1_T0();
2266 e9ebed4d blueswir1
                            switch (rd) {
2267 e9ebed4d blueswir1
                            case 0: // hpstate
2268 e9ebed4d blueswir1
                                // XXX gen_op_wrhpstate();
2269 e9ebed4d blueswir1
                                save_state(dc);
2270 e9ebed4d blueswir1
                                gen_op_next_insn();
2271 e9ebed4d blueswir1
                                gen_op_movl_T0_0();
2272 e9ebed4d blueswir1
                                gen_op_exit_tb();
2273 e9ebed4d blueswir1
                                dc->is_br = 1;
2274 e9ebed4d blueswir1
                                break;
2275 e9ebed4d blueswir1
                            case 1: // htstate
2276 e9ebed4d blueswir1
                                // XXX gen_op_wrhtstate();
2277 e9ebed4d blueswir1
                                break;
2278 e9ebed4d blueswir1
                            case 3: // hintp
2279 e9ebed4d blueswir1
                                gen_op_movl_env_T0(offsetof(CPUSPARCState, hintp));
2280 e9ebed4d blueswir1
                                break;
2281 e9ebed4d blueswir1
                            case 5: // htba
2282 e9ebed4d blueswir1
                                gen_op_movl_env_T0(offsetof(CPUSPARCState, htba));
2283 e9ebed4d blueswir1
                                break;
2284 e9ebed4d blueswir1
                            case 31: // hstick_cmpr
2285 20c9f095 blueswir1
                                gen_op_movtl_env_T0(offsetof(CPUSPARCState, hstick_cmpr));
2286 20c9f095 blueswir1
                                gen_op_wrhstick_cmpr();
2287 e9ebed4d blueswir1
                                break;
2288 e9ebed4d blueswir1
                            case 6: // hver readonly
2289 e9ebed4d blueswir1
                            default:
2290 e9ebed4d blueswir1
                                goto illegal_insn;
2291 e9ebed4d blueswir1
                            }
2292 e9ebed4d blueswir1
#endif
2293 e8af50a3 bellard
                        }
2294 e8af50a3 bellard
                        break;
2295 e8af50a3 bellard
#endif
2296 3475187d bellard
#ifdef TARGET_SPARC64
2297 0f8a249a blueswir1
                    case 0x2c: /* V9 movcc */
2298 0f8a249a blueswir1
                        {
2299 0f8a249a blueswir1
                            int cc = GET_FIELD_SP(insn, 11, 12);
2300 0f8a249a blueswir1
                            int cond = GET_FIELD_SP(insn, 14, 17);
2301 0f8a249a blueswir1
                            if (IS_IMM) {       /* immediate */
2302 0f8a249a blueswir1
                                rs2 = GET_FIELD_SPs(insn, 0, 10);
2303 0f8a249a blueswir1
                                gen_movl_simm_T1(rs2);
2304 0f8a249a blueswir1
                            }
2305 0f8a249a blueswir1
                            else {
2306 0f8a249a blueswir1
                                rs2 = GET_FIELD_SP(insn, 0, 4);
2307 0f8a249a blueswir1
                                gen_movl_reg_T1(rs2);
2308 0f8a249a blueswir1
                            }
2309 0f8a249a blueswir1
                            gen_movl_reg_T0(rd);
2310 0f8a249a blueswir1
                            flush_T2(dc);
2311 0f8a249a blueswir1
                            if (insn & (1 << 18)) {
2312 0f8a249a blueswir1
                                if (cc == 0)
2313 0f8a249a blueswir1
                                    gen_cond[0][cond]();
2314 0f8a249a blueswir1
                                else if (cc == 2)
2315 0f8a249a blueswir1
                                    gen_cond[1][cond]();
2316 0f8a249a blueswir1
                                else
2317 0f8a249a blueswir1
                                    goto illegal_insn;
2318 0f8a249a blueswir1
                            } else {
2319 0f8a249a blueswir1
                                gen_fcond[cc][cond]();
2320 0f8a249a blueswir1
                            }
2321 0f8a249a blueswir1
                            gen_op_mov_cc();
2322 0f8a249a blueswir1
                            gen_movl_T0_reg(rd);
2323 0f8a249a blueswir1
                            break;
2324 0f8a249a blueswir1
                        }
2325 0f8a249a blueswir1
                    case 0x2d: /* V9 sdivx */
2326 3475187d bellard
                        gen_op_sdivx_T1_T0();
2327 0f8a249a blueswir1
                        gen_movl_T0_reg(rd);
2328 0f8a249a blueswir1
                        break;
2329 0f8a249a blueswir1
                    case 0x2e: /* V9 popc */
2330 0f8a249a blueswir1
                        {
2331 0f8a249a blueswir1
                            if (IS_IMM) {       /* immediate */
2332 0f8a249a blueswir1
                                rs2 = GET_FIELD_SPs(insn, 0, 12);
2333 0f8a249a blueswir1
                                gen_movl_simm_T1(rs2);
2334 0f8a249a blueswir1
                                // XXX optimize: popc(constant)
2335 0f8a249a blueswir1
                            }
2336 0f8a249a blueswir1
                            else {
2337 0f8a249a blueswir1
                                rs2 = GET_FIELD_SP(insn, 0, 4);
2338 0f8a249a blueswir1
                                gen_movl_reg_T1(rs2);
2339 0f8a249a blueswir1
                            }
2340 0f8a249a blueswir1
                            gen_op_popc();
2341 0f8a249a blueswir1
                            gen_movl_T0_reg(rd);
2342 0f8a249a blueswir1
                        }
2343 0f8a249a blueswir1
                    case 0x2f: /* V9 movr */
2344 0f8a249a blueswir1
                        {
2345 0f8a249a blueswir1
                            int cond = GET_FIELD_SP(insn, 10, 12);
2346 0f8a249a blueswir1
                            rs1 = GET_FIELD(insn, 13, 17);
2347 0f8a249a blueswir1
                            flush_T2(dc);
2348 0f8a249a blueswir1
                            gen_movl_reg_T0(rs1);
2349 0f8a249a blueswir1
                            gen_cond_reg(cond);
2350 0f8a249a blueswir1
                            if (IS_IMM) {       /* immediate */
2351 0f8a249a blueswir1
                                rs2 = GET_FIELD_SPs(insn, 0, 9);
2352 0f8a249a blueswir1
                                gen_movl_simm_T1(rs2);
2353 0f8a249a blueswir1
                            }
2354 0f8a249a blueswir1
                            else {
2355 0f8a249a blueswir1
                                rs2 = GET_FIELD_SP(insn, 0, 4);
2356 0f8a249a blueswir1
                                gen_movl_reg_T1(rs2);
2357 0f8a249a blueswir1
                            }
2358 0f8a249a blueswir1
                            gen_movl_reg_T0(rd);
2359 0f8a249a blueswir1
                            gen_op_mov_cc();
2360 0f8a249a blueswir1
                            gen_movl_T0_reg(rd);
2361 0f8a249a blueswir1
                            break;
2362 0f8a249a blueswir1
                        }
2363 0f8a249a blueswir1
#endif
2364 0f8a249a blueswir1
                    default:
2365 0f8a249a blueswir1
                        goto illegal_insn;
2366 0f8a249a blueswir1
                    }
2367 0f8a249a blueswir1
                }
2368 3299908c blueswir1
            } else if (xop == 0x36) { /* UltraSparc shutdown, VIS, V8 CPop1 */
2369 3299908c blueswir1
#ifdef TARGET_SPARC64
2370 3299908c blueswir1
                int opf = GET_FIELD_SP(insn, 5, 13);
2371 3299908c blueswir1
                rs1 = GET_FIELD(insn, 13, 17);
2372 3299908c blueswir1
                rs2 = GET_FIELD(insn, 27, 31);
2373 e9ebed4d blueswir1
                if (gen_trap_ifnofpu(dc))
2374 e9ebed4d blueswir1
                    goto jmp_insn;
2375 3299908c blueswir1
2376 3299908c blueswir1
                switch (opf) {
2377 e9ebed4d blueswir1
                case 0x000: /* VIS I edge8cc */
2378 e9ebed4d blueswir1
                case 0x001: /* VIS II edge8n */
2379 e9ebed4d blueswir1
                case 0x002: /* VIS I edge8lcc */
2380 e9ebed4d blueswir1
                case 0x003: /* VIS II edge8ln */
2381 e9ebed4d blueswir1
                case 0x004: /* VIS I edge16cc */
2382 e9ebed4d blueswir1
                case 0x005: /* VIS II edge16n */
2383 e9ebed4d blueswir1
                case 0x006: /* VIS I edge16lcc */
2384 e9ebed4d blueswir1
                case 0x007: /* VIS II edge16ln */
2385 e9ebed4d blueswir1
                case 0x008: /* VIS I edge32cc */
2386 e9ebed4d blueswir1
                case 0x009: /* VIS II edge32n */
2387 e9ebed4d blueswir1
                case 0x00a: /* VIS I edge32lcc */
2388 e9ebed4d blueswir1
                case 0x00b: /* VIS II edge32ln */
2389 e9ebed4d blueswir1
                    // XXX
2390 e9ebed4d blueswir1
                    goto illegal_insn;
2391 e9ebed4d blueswir1
                case 0x010: /* VIS I array8 */
2392 e9ebed4d blueswir1
                    gen_movl_reg_T0(rs1);
2393 e9ebed4d blueswir1
                    gen_movl_reg_T1(rs2);
2394 e9ebed4d blueswir1
                    gen_op_array8();
2395 e9ebed4d blueswir1
                    gen_movl_T0_reg(rd);
2396 e9ebed4d blueswir1
                    break;
2397 e9ebed4d blueswir1
                case 0x012: /* VIS I array16 */
2398 e9ebed4d blueswir1
                    gen_movl_reg_T0(rs1);
2399 e9ebed4d blueswir1
                    gen_movl_reg_T1(rs2);
2400 e9ebed4d blueswir1
                    gen_op_array16();
2401 e9ebed4d blueswir1
                    gen_movl_T0_reg(rd);
2402 e9ebed4d blueswir1
                    break;
2403 e9ebed4d blueswir1
                case 0x014: /* VIS I array32 */
2404 e9ebed4d blueswir1
                    gen_movl_reg_T0(rs1);
2405 e9ebed4d blueswir1
                    gen_movl_reg_T1(rs2);
2406 e9ebed4d blueswir1
                    gen_op_array32();
2407 e9ebed4d blueswir1
                    gen_movl_T0_reg(rd);
2408 e9ebed4d blueswir1
                    break;
2409 3299908c blueswir1
                case 0x018: /* VIS I alignaddr */
2410 3299908c blueswir1
                    gen_movl_reg_T0(rs1);
2411 3299908c blueswir1
                    gen_movl_reg_T1(rs2);
2412 3299908c blueswir1
                    gen_op_alignaddr();
2413 3299908c blueswir1
                    gen_movl_T0_reg(rd);
2414 3299908c blueswir1
                    break;
2415 e9ebed4d blueswir1
                case 0x019: /* VIS II bmask */
2416 3299908c blueswir1
                case 0x01a: /* VIS I alignaddrl */
2417 3299908c blueswir1
                    // XXX
2418 e9ebed4d blueswir1
                    goto illegal_insn;
2419 e9ebed4d blueswir1
                case 0x020: /* VIS I fcmple16 */
2420 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2421 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2422 e9ebed4d blueswir1
                    gen_op_fcmple16();
2423 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2424 e9ebed4d blueswir1
                    break;
2425 e9ebed4d blueswir1
                case 0x022: /* VIS I fcmpne16 */
2426 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2427 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2428 e9ebed4d blueswir1
                    gen_op_fcmpne16();
2429 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2430 3299908c blueswir1
                    break;
2431 e9ebed4d blueswir1
                case 0x024: /* VIS I fcmple32 */
2432 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2433 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2434 e9ebed4d blueswir1
                    gen_op_fcmple32();
2435 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2436 e9ebed4d blueswir1
                    break;
2437 e9ebed4d blueswir1
                case 0x026: /* VIS I fcmpne32 */
2438 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2439 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2440 e9ebed4d blueswir1
                    gen_op_fcmpne32();
2441 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2442 e9ebed4d blueswir1
                    break;
2443 e9ebed4d blueswir1
                case 0x028: /* VIS I fcmpgt16 */
2444 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2445 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2446 e9ebed4d blueswir1
                    gen_op_fcmpgt16();
2447 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2448 e9ebed4d blueswir1
                    break;
2449 e9ebed4d blueswir1
                case 0x02a: /* VIS I fcmpeq16 */
2450 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2451 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2452 e9ebed4d blueswir1
                    gen_op_fcmpeq16();
2453 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2454 e9ebed4d blueswir1
                    break;
2455 e9ebed4d blueswir1
                case 0x02c: /* VIS I fcmpgt32 */
2456 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2457 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2458 e9ebed4d blueswir1
                    gen_op_fcmpgt32();
2459 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2460 e9ebed4d blueswir1
                    break;
2461 e9ebed4d blueswir1
                case 0x02e: /* VIS I fcmpeq32 */
2462 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2463 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2464 e9ebed4d blueswir1
                    gen_op_fcmpeq32();
2465 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2466 e9ebed4d blueswir1
                    break;
2467 e9ebed4d blueswir1
                case 0x031: /* VIS I fmul8x16 */
2468 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2469 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2470 e9ebed4d blueswir1
                    gen_op_fmul8x16();
2471 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2472 e9ebed4d blueswir1
                    break;
2473 e9ebed4d blueswir1
                case 0x033: /* VIS I fmul8x16au */
2474 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2475 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2476 e9ebed4d blueswir1
                    gen_op_fmul8x16au();
2477 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2478 e9ebed4d blueswir1
                    break;
2479 e9ebed4d blueswir1
                case 0x035: /* VIS I fmul8x16al */
2480 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2481 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2482 e9ebed4d blueswir1
                    gen_op_fmul8x16al();
2483 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2484 e9ebed4d blueswir1
                    break;
2485 e9ebed4d blueswir1
                case 0x036: /* VIS I fmul8sux16 */
2486 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2487 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2488 e9ebed4d blueswir1
                    gen_op_fmul8sux16();
2489 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2490 e9ebed4d blueswir1
                    break;
2491 e9ebed4d blueswir1
                case 0x037: /* VIS I fmul8ulx16 */
2492 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2493 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2494 e9ebed4d blueswir1
                    gen_op_fmul8ulx16();
2495 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2496 e9ebed4d blueswir1
                    break;
2497 e9ebed4d blueswir1
                case 0x038: /* VIS I fmuld8sux16 */
2498 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2499 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2500 e9ebed4d blueswir1
                    gen_op_fmuld8sux16();
2501 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2502 e9ebed4d blueswir1
                    break;
2503 e9ebed4d blueswir1
                case 0x039: /* VIS I fmuld8ulx16 */
2504 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2505 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2506 e9ebed4d blueswir1
                    gen_op_fmuld8ulx16();
2507 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2508 e9ebed4d blueswir1
                    break;
2509 e9ebed4d blueswir1
                case 0x03a: /* VIS I fpack32 */
2510 e9ebed4d blueswir1
                case 0x03b: /* VIS I fpack16 */
2511 e9ebed4d blueswir1
                case 0x03d: /* VIS I fpackfix */
2512 e9ebed4d blueswir1
                case 0x03e: /* VIS I pdist */
2513 e9ebed4d blueswir1
                    // XXX
2514 e9ebed4d blueswir1
                    goto illegal_insn;
2515 3299908c blueswir1
                case 0x048: /* VIS I faligndata */
2516 3299908c blueswir1
                    gen_op_load_fpr_DT0(rs1);
2517 3299908c blueswir1
                    gen_op_load_fpr_DT1(rs2);
2518 3299908c blueswir1
                    gen_op_faligndata();
2519 3299908c blueswir1
                    gen_op_store_DT0_fpr(rd);
2520 3299908c blueswir1
                    break;
2521 e9ebed4d blueswir1
                case 0x04b: /* VIS I fpmerge */
2522 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2523 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2524 e9ebed4d blueswir1
                    gen_op_fpmerge();
2525 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2526 e9ebed4d blueswir1
                    break;
2527 e9ebed4d blueswir1
                case 0x04c: /* VIS II bshuffle */
2528 e9ebed4d blueswir1
                    // XXX
2529 e9ebed4d blueswir1
                    goto illegal_insn;
2530 e9ebed4d blueswir1
                case 0x04d: /* VIS I fexpand */
2531 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2532 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2533 e9ebed4d blueswir1
                    gen_op_fexpand();
2534 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2535 e9ebed4d blueswir1
                    break;
2536 e9ebed4d blueswir1
                case 0x050: /* VIS I fpadd16 */
2537 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2538 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2539 e9ebed4d blueswir1
                    gen_op_fpadd16();
2540 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2541 e9ebed4d blueswir1
                    break;
2542 e9ebed4d blueswir1
                case 0x051: /* VIS I fpadd16s */
2543 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs1);
2544 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
2545 e9ebed4d blueswir1
                    gen_op_fpadd16s();
2546 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
2547 e9ebed4d blueswir1
                    break;
2548 e9ebed4d blueswir1
                case 0x052: /* VIS I fpadd32 */
2549 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2550 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2551 e9ebed4d blueswir1
                    gen_op_fpadd32();
2552 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2553 e9ebed4d blueswir1
                    break;
2554 e9ebed4d blueswir1
                case 0x053: /* VIS I fpadd32s */
2555 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs1);
2556 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
2557 e9ebed4d blueswir1
                    gen_op_fpadd32s();
2558 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
2559 e9ebed4d blueswir1
                    break;
2560 e9ebed4d blueswir1
                case 0x054: /* VIS I fpsub16 */
2561 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2562 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2563 e9ebed4d blueswir1
                    gen_op_fpsub16();
2564 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2565 e9ebed4d blueswir1
                    break;
2566 e9ebed4d blueswir1
                case 0x055: /* VIS I fpsub16s */
2567 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs1);
2568 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
2569 e9ebed4d blueswir1
                    gen_op_fpsub16s();
2570 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
2571 e9ebed4d blueswir1
                    break;
2572 e9ebed4d blueswir1
                case 0x056: /* VIS I fpsub32 */
2573 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2574 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2575 e9ebed4d blueswir1
                    gen_op_fpadd32();
2576 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2577 e9ebed4d blueswir1
                    break;
2578 e9ebed4d blueswir1
                case 0x057: /* VIS I fpsub32s */
2579 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs1);
2580 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
2581 e9ebed4d blueswir1
                    gen_op_fpsub32s();
2582 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
2583 e9ebed4d blueswir1
                    break;
2584 3299908c blueswir1
                case 0x060: /* VIS I fzero */
2585 3299908c blueswir1
                    gen_op_movl_DT0_0();
2586 3299908c blueswir1
                    gen_op_store_DT0_fpr(rd);
2587 3299908c blueswir1
                    break;
2588 3299908c blueswir1
                case 0x061: /* VIS I fzeros */
2589 3299908c blueswir1
                    gen_op_movl_FT0_0();
2590 3299908c blueswir1
                    gen_op_store_FT0_fpr(rd);
2591 3299908c blueswir1
                    break;
2592 e9ebed4d blueswir1
                case 0x062: /* VIS I fnor */
2593 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2594 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2595 e9ebed4d blueswir1
                    gen_op_fnor();
2596 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2597 e9ebed4d blueswir1
                    break;
2598 e9ebed4d blueswir1
                case 0x063: /* VIS I fnors */
2599 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs1);
2600 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
2601 e9ebed4d blueswir1
                    gen_op_fnors();
2602 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
2603 e9ebed4d blueswir1
                    break;
2604 e9ebed4d blueswir1
                case 0x064: /* VIS I fandnot2 */
2605 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs1);
2606 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs2);
2607 e9ebed4d blueswir1
                    gen_op_fandnot();
2608 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2609 e9ebed4d blueswir1
                    break;
2610 e9ebed4d blueswir1
                case 0x065: /* VIS I fandnot2s */
2611 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs1);
2612 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs2);
2613 e9ebed4d blueswir1
                    gen_op_fandnots();
2614 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
2615 e9ebed4d blueswir1
                    break;
2616 e9ebed4d blueswir1
                case 0x066: /* VIS I fnot2 */
2617 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2618 e9ebed4d blueswir1
                    gen_op_fnot();
2619 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2620 e9ebed4d blueswir1
                    break;
2621 e9ebed4d blueswir1
                case 0x067: /* VIS I fnot2s */
2622 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
2623 e9ebed4d blueswir1
                    gen_op_fnot();
2624 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
2625 e9ebed4d blueswir1
                    break;
2626 e9ebed4d blueswir1
                case 0x068: /* VIS I fandnot1 */
2627 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2628 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2629 e9ebed4d blueswir1
                    gen_op_fandnot();
2630 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2631 e9ebed4d blueswir1
                    break;
2632 e9ebed4d blueswir1
                case 0x069: /* VIS I fandnot1s */
2633 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs1);
2634 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
2635 e9ebed4d blueswir1
                    gen_op_fandnots();
2636 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
2637 e9ebed4d blueswir1
                    break;
2638 e9ebed4d blueswir1
                case 0x06a: /* VIS I fnot1 */
2639 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs1);
2640 e9ebed4d blueswir1
                    gen_op_fnot();
2641 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2642 e9ebed4d blueswir1
                    break;
2643 e9ebed4d blueswir1
                case 0x06b: /* VIS I fnot1s */
2644 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs1);
2645 e9ebed4d blueswir1
                    gen_op_fnot();
2646 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
2647 e9ebed4d blueswir1
                    break;
2648 e9ebed4d blueswir1
                case 0x06c: /* VIS I fxor */
2649 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2650 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2651 e9ebed4d blueswir1
                    gen_op_fxor();
2652 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2653 e9ebed4d blueswir1
                    break;
2654 e9ebed4d blueswir1
                case 0x06d: /* VIS I fxors */
2655 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs1);
2656 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
2657 e9ebed4d blueswir1
                    gen_op_fxors();
2658 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
2659 e9ebed4d blueswir1
                    break;
2660 e9ebed4d blueswir1
                case 0x06e: /* VIS I fnand */
2661 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2662 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2663 e9ebed4d blueswir1
                    gen_op_fnand();
2664 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2665 e9ebed4d blueswir1
                    break;
2666 e9ebed4d blueswir1
                case 0x06f: /* VIS I fnands */
2667 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs1);
2668 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
2669 e9ebed4d blueswir1
                    gen_op_fnands();
2670 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
2671 e9ebed4d blueswir1
                    break;
2672 e9ebed4d blueswir1
                case 0x070: /* VIS I fand */
2673 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2674 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2675 e9ebed4d blueswir1
                    gen_op_fand();
2676 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2677 e9ebed4d blueswir1
                    break;
2678 e9ebed4d blueswir1
                case 0x071: /* VIS I fands */
2679 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs1);
2680 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
2681 e9ebed4d blueswir1
                    gen_op_fands();
2682 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
2683 e9ebed4d blueswir1
                    break;
2684 e9ebed4d blueswir1
                case 0x072: /* VIS I fxnor */
2685 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2686 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2687 e9ebed4d blueswir1
                    gen_op_fxnor();
2688 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2689 e9ebed4d blueswir1
                    break;
2690 e9ebed4d blueswir1
                case 0x073: /* VIS I fxnors */
2691 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs1);
2692 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
2693 e9ebed4d blueswir1
                    gen_op_fxnors();
2694 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
2695 e9ebed4d blueswir1
                    break;
2696 3299908c blueswir1
                case 0x074: /* VIS I fsrc1 */
2697 3299908c blueswir1
                    gen_op_load_fpr_DT0(rs1);
2698 3299908c blueswir1
                    gen_op_store_DT0_fpr(rd);
2699 3299908c blueswir1
                    break;
2700 3299908c blueswir1
                case 0x075: /* VIS I fsrc1s */
2701 3299908c blueswir1
                    gen_op_load_fpr_FT0(rs1);
2702 3299908c blueswir1
                    gen_op_store_FT0_fpr(rd);
2703 3299908c blueswir1
                    break;
2704 e9ebed4d blueswir1
                case 0x076: /* VIS I fornot2 */
2705 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs1);
2706 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs2);
2707 e9ebed4d blueswir1
                    gen_op_fornot();
2708 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2709 e9ebed4d blueswir1
                    break;
2710 e9ebed4d blueswir1
                case 0x077: /* VIS I fornot2s */
2711 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs1);
2712 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs2);
2713 e9ebed4d blueswir1
                    gen_op_fornots();
2714 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
2715 e9ebed4d blueswir1
                    break;
2716 3299908c blueswir1
                case 0x078: /* VIS I fsrc2 */
2717 3299908c blueswir1
                    gen_op_load_fpr_DT0(rs2);
2718 3299908c blueswir1
                    gen_op_store_DT0_fpr(rd);
2719 3299908c blueswir1
                    break;
2720 3299908c blueswir1
                case 0x079: /* VIS I fsrc2s */
2721 3299908c blueswir1
                    gen_op_load_fpr_FT0(rs2);
2722 3299908c blueswir1
                    gen_op_store_FT0_fpr(rd);
2723 3299908c blueswir1
                    break;
2724 e9ebed4d blueswir1
                case 0x07a: /* VIS I fornot1 */
2725 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2726 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2727 e9ebed4d blueswir1
                    gen_op_fornot();
2728 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2729 e9ebed4d blueswir1
                    break;
2730 e9ebed4d blueswir1
                case 0x07b: /* VIS I fornot1s */
2731 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs1);
2732 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
2733 e9ebed4d blueswir1
                    gen_op_fornots();
2734 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
2735 e9ebed4d blueswir1
                    break;
2736 e9ebed4d blueswir1
                case 0x07c: /* VIS I for */
2737 e9ebed4d blueswir1
                    gen_op_load_fpr_DT0(rs1);
2738 e9ebed4d blueswir1
                    gen_op_load_fpr_DT1(rs2);
2739 e9ebed4d blueswir1
                    gen_op_for();
2740 e9ebed4d blueswir1
                    gen_op_store_DT0_fpr(rd);
2741 e9ebed4d blueswir1
                    break;
2742 e9ebed4d blueswir1
                case 0x07d: /* VIS I fors */
2743 e9ebed4d blueswir1
                    gen_op_load_fpr_FT0(rs1);
2744 e9ebed4d blueswir1
                    gen_op_load_fpr_FT1(rs2);
2745 e9ebed4d blueswir1
                    gen_op_fors();
2746 e9ebed4d blueswir1
                    gen_op_store_FT0_fpr(rd);
2747 e9ebed4d blueswir1
                    break;
2748 3299908c blueswir1
                case 0x07e: /* VIS I fone */
2749 3299908c blueswir1
                    gen_op_movl_DT0_1();
2750 3299908c blueswir1
                    gen_op_store_DT0_fpr(rd);
2751 3299908c blueswir1
                    break;
2752 3299908c blueswir1
                case 0x07f: /* VIS I fones */
2753 3299908c blueswir1
                    gen_op_movl_FT0_1();
2754 3299908c blueswir1
                    gen_op_store_FT0_fpr(rd);
2755 3299908c blueswir1
                    break;
2756 e9ebed4d blueswir1
                case 0x080: /* VIS I shutdown */
2757 e9ebed4d blueswir1
                case 0x081: /* VIS II siam */
2758 e9ebed4d blueswir1
                    // XXX
2759 e9ebed4d blueswir1
                    goto illegal_insn;
2760 3299908c blueswir1
                default:
2761 3299908c blueswir1
                    goto illegal_insn;
2762 3299908c blueswir1
                }
2763 3299908c blueswir1
#else
2764 0f8a249a blueswir1
                goto ncp_insn;
2765 3299908c blueswir1
#endif
2766 3299908c blueswir1
            } else if (xop == 0x37) { /* V8 CPop2, V9 impdep2 */
2767 fcc72045 blueswir1
#ifdef TARGET_SPARC64
2768 0f8a249a blueswir1
                goto illegal_insn;
2769 fcc72045 blueswir1
#else
2770 0f8a249a blueswir1
                goto ncp_insn;
2771 fcc72045 blueswir1
#endif
2772 3475187d bellard
#ifdef TARGET_SPARC64
2773 0f8a249a blueswir1
            } else if (xop == 0x39) { /* V9 return */
2774 3475187d bellard
                rs1 = GET_FIELD(insn, 13, 17);
2775 1ad21e69 blueswir1
                save_state(dc);
2776 0f8a249a blueswir1
                gen_movl_reg_T0(rs1);
2777 0f8a249a blueswir1
                if (IS_IMM) {   /* immediate */
2778 0f8a249a blueswir1
                    rs2 = GET_FIELDs(insn, 19, 31);
2779 3475187d bellard
#if defined(OPTIM)
2780 0f8a249a blueswir1
                    if (rs2) {
2781 3475187d bellard
#endif
2782 0f8a249a blueswir1
                        gen_movl_simm_T1(rs2);
2783 0f8a249a blueswir1
                        gen_op_add_T1_T0();
2784 3475187d bellard
#if defined(OPTIM)
2785 0f8a249a blueswir1
                    }
2786 3475187d bellard
#endif
2787 0f8a249a blueswir1
                } else {                /* register */
2788 3475187d bellard
                    rs2 = GET_FIELD(insn, 27, 31);
2789 3475187d bellard
#if defined(OPTIM)
2790 0f8a249a blueswir1
                    if (rs2) {
2791 3475187d bellard
#endif
2792 0f8a249a blueswir1
                        gen_movl_reg_T1(rs2);
2793 0f8a249a blueswir1
                        gen_op_add_T1_T0();
2794 3475187d bellard
#if defined(OPTIM)
2795 0f8a249a blueswir1
                    }
2796 3475187d bellard
#endif
2797 3475187d bellard
                }
2798 0f8a249a blueswir1
                gen_op_restore();
2799 0f8a249a blueswir1
                gen_mov_pc_npc(dc);
2800 6ea4a6c8 blueswir1
                gen_op_check_align_T0_3();
2801 0f8a249a blueswir1
                gen_op_movl_npc_T0();
2802 0f8a249a blueswir1
                dc->npc = DYNAMIC_PC;
2803 0f8a249a blueswir1
                goto jmp_insn;
2804 3475187d bellard
#endif
2805 0f8a249a blueswir1
            } else {
2806 e80cfcfc bellard
                rs1 = GET_FIELD(insn, 13, 17);
2807 0f8a249a blueswir1
                gen_movl_reg_T0(rs1);
2808 0f8a249a blueswir1
                if (IS_IMM) {   /* immediate */
2809 0f8a249a blueswir1
                    rs2 = GET_FIELDs(insn, 19, 31);
2810 e80cfcfc bellard
#if defined(OPTIM)
2811 0f8a249a blueswir1
                    if (rs2) {
2812 e8af50a3 bellard
#endif
2813 0f8a249a blueswir1
                        gen_movl_simm_T1(rs2);
2814 0f8a249a blueswir1
                        gen_op_add_T1_T0();
2815 e80cfcfc bellard
#if defined(OPTIM)
2816 0f8a249a blueswir1
                    }
2817 e8af50a3 bellard
#endif
2818 0f8a249a blueswir1
                } else {                /* register */
2819 e80cfcfc bellard
                    rs2 = GET_FIELD(insn, 27, 31);
2820 e80cfcfc bellard
#if defined(OPTIM)
2821 0f8a249a blueswir1
                    if (rs2) {
2822 e80cfcfc bellard
#endif
2823 0f8a249a blueswir1
                        gen_movl_reg_T1(rs2);
2824 0f8a249a blueswir1
                        gen_op_add_T1_T0();
2825 e80cfcfc bellard
#if defined(OPTIM)
2826 0f8a249a blueswir1
                    }
2827 e8af50a3 bellard
#endif
2828 cf495bcf bellard
                }
2829 0f8a249a blueswir1
                switch (xop) {
2830 0f8a249a blueswir1
                case 0x38:      /* jmpl */
2831 0f8a249a blueswir1
                    {
2832 0f8a249a blueswir1
                        if (rd != 0) {
2833 ded3ab80 pbrook
#ifdef TARGET_SPARC64
2834 ded3ab80 pbrook
                            if (dc->pc == (uint32_t)dc->pc) {
2835 ded3ab80 pbrook
                                gen_op_movl_T1_im(dc->pc);
2836 ded3ab80 pbrook
                            } else {
2837 ded3ab80 pbrook
                                gen_op_movq_T1_im64(dc->pc >> 32, dc->pc);
2838 ded3ab80 pbrook
                            }
2839 ded3ab80 pbrook
#else
2840 0f8a249a blueswir1
                            gen_op_movl_T1_im(dc->pc);
2841 ded3ab80 pbrook
#endif
2842 0f8a249a blueswir1
                            gen_movl_T1_reg(rd);
2843 0f8a249a blueswir1
                        }
2844 0bee699e bellard
                        gen_mov_pc_npc(dc);
2845 6ea4a6c8 blueswir1
                        gen_op_check_align_T0_3();
2846 0f8a249a blueswir1
                        gen_op_movl_npc_T0();
2847 0f8a249a blueswir1
                        dc->npc = DYNAMIC_PC;
2848 0f8a249a blueswir1
                    }
2849 0f8a249a blueswir1
                    goto jmp_insn;
2850 3475187d bellard
#if !defined(CONFIG_USER_ONLY) && !defined(TARGET_SPARC64)
2851 0f8a249a blueswir1
                case 0x39:      /* rett, V9 return */
2852 0f8a249a blueswir1
                    {
2853 0f8a249a blueswir1
                        if (!supervisor(dc))
2854 0f8a249a blueswir1
                            goto priv_insn;
2855 0bee699e bellard
                        gen_mov_pc_npc(dc);
2856 6ea4a6c8 blueswir1
                        gen_op_check_align_T0_3();
2857 0f8a249a blueswir1
                        gen_op_movl_npc_T0();
2858 0f8a249a blueswir1
                        dc->npc = DYNAMIC_PC;
2859 0f8a249a blueswir1
                        gen_op_rett();
2860 0f8a249a blueswir1
                    }
2861 0f8a249a blueswir1
                    goto jmp_insn;
2862 0f8a249a blueswir1
#endif
2863 0f8a249a blueswir1
                case 0x3b: /* flush */
2864 0f8a249a blueswir1
                    gen_op_flush_T0();
2865 0f8a249a blueswir1
                    break;
2866 0f8a249a blueswir1
                case 0x3c:      /* save */
2867 0f8a249a blueswir1
                    save_state(dc);
2868 0f8a249a blueswir1
                    gen_op_save();
2869 0f8a249a blueswir1
                    gen_movl_T0_reg(rd);
2870 0f8a249a blueswir1
                    break;
2871 0f8a249a blueswir1
                case 0x3d:      /* restore */
2872 0f8a249a blueswir1
                    save_state(dc);
2873 0f8a249a blueswir1
                    gen_op_restore();
2874 0f8a249a blueswir1
                    gen_movl_T0_reg(rd);
2875 0f8a249a blueswir1
                    break;
2876 3475187d bellard
#if !defined(CONFIG_USER_ONLY) && defined(TARGET_SPARC64)
2877 0f8a249a blueswir1
                case 0x3e:      /* V9 done/retry */
2878 0f8a249a blueswir1
                    {
2879 0f8a249a blueswir1
                        switch (rd) {
2880 0f8a249a blueswir1
                        case 0:
2881 0f8a249a blueswir1
                            if (!supervisor(dc))
2882 0f8a249a blueswir1
                                goto priv_insn;
2883 0f8a249a blueswir1
                            dc->npc = DYNAMIC_PC;
2884 0f8a249a blueswir1
                            dc->pc = DYNAMIC_PC;
2885 0f8a249a blueswir1
                            gen_op_done();
2886 0f8a249a blueswir1
                            goto jmp_insn;
2887 0f8a249a blueswir1
                        case 1:
2888 0f8a249a blueswir1
                            if (!supervisor(dc))
2889 0f8a249a blueswir1
                                goto priv_insn;
2890 0f8a249a blueswir1
                            dc->npc = DYNAMIC_PC;
2891 0f8a249a blueswir1
                            dc->pc = DYNAMIC_PC;
2892 0f8a249a blueswir1
                            gen_op_retry();
2893 0f8a249a blueswir1
                            goto jmp_insn;
2894 0f8a249a blueswir1
                        default:
2895 0f8a249a blueswir1
                            goto illegal_insn;
2896 0f8a249a blueswir1
                        }
2897 0f8a249a blueswir1
                    }
2898 0f8a249a blueswir1
                    break;
2899 0f8a249a blueswir1
#endif
2900 0f8a249a blueswir1
                default:
2901 0f8a249a blueswir1
                    goto illegal_insn;
2902 0f8a249a blueswir1
                }
2903 cf495bcf bellard
            }
2904 0f8a249a blueswir1
            break;
2905 0f8a249a blueswir1
        }
2906 0f8a249a blueswir1
        break;
2907 0f8a249a blueswir1
    case 3:                     /* load/store instructions */
2908 0f8a249a blueswir1
        {
2909 0f8a249a blueswir1
            unsigned int xop = GET_FIELD(insn, 7, 12);
2910 0f8a249a blueswir1
            rs1 = GET_FIELD(insn, 13, 17);
2911 2371aaa2 blueswir1
            save_state(dc);
2912 0f8a249a blueswir1
            gen_movl_reg_T0(rs1);
2913 81ad8ba2 blueswir1
            if (xop == 0x3c || xop == 0x3e)
2914 81ad8ba2 blueswir1
            {
2915 81ad8ba2 blueswir1
                rs2 = GET_FIELD(insn, 27, 31);
2916 81ad8ba2 blueswir1
                gen_movl_reg_T1(rs2);
2917 81ad8ba2 blueswir1
            }
2918 81ad8ba2 blueswir1
            else if (IS_IMM) {       /* immediate */
2919 0f8a249a blueswir1
                rs2 = GET_FIELDs(insn, 19, 31);
2920 e80cfcfc bellard
#if defined(OPTIM)
2921 0f8a249a blueswir1
                if (rs2 != 0) {
2922 e80cfcfc bellard
#endif
2923 0f8a249a blueswir1
                    gen_movl_simm_T1(rs2);
2924 0f8a249a blueswir1
                    gen_op_add_T1_T0();
2925 e80cfcfc bellard
#if defined(OPTIM)
2926 0f8a249a blueswir1
                }
2927 e80cfcfc bellard
#endif
2928 0f8a249a blueswir1
            } else {            /* register */
2929 0f8a249a blueswir1
                rs2 = GET_FIELD(insn, 27, 31);
2930 e80cfcfc bellard
#if defined(OPTIM)
2931 0f8a249a blueswir1
                if (rs2 != 0) {
2932 e80cfcfc bellard
#endif
2933 0f8a249a blueswir1
                    gen_movl_reg_T1(rs2);
2934 0f8a249a blueswir1
                    gen_op_add_T1_T0();
2935 e80cfcfc bellard
#if defined(OPTIM)
2936 0f8a249a blueswir1
                }
2937 e80cfcfc bellard
#endif
2938 0f8a249a blueswir1
            }
2939 2f2ecb83 blueswir1
            if (xop < 4 || (xop > 7 && xop < 0x14 && xop != 0x0e) ||
2940 2f2ecb83 blueswir1
                (xop > 0x17 && xop <= 0x1d ) ||
2941 2f2ecb83 blueswir1
                (xop > 0x2c && xop <= 0x33) || xop == 0x1f || xop == 0x3d) {
2942 0f8a249a blueswir1
                switch (xop) {
2943 0f8a249a blueswir1
                case 0x0:       /* load word */
2944 6ea4a6c8 blueswir1
#ifdef CONFIG_USER_ONLY
2945 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_3();
2946 6ea4a6c8 blueswir1
#endif
2947 dc011987 blueswir1
#ifndef TARGET_SPARC64
2948 0f8a249a blueswir1
                    gen_op_ldst(ld);
2949 dc011987 blueswir1
#else
2950 dc011987 blueswir1
                    gen_op_ldst(lduw);
2951 dc011987 blueswir1
#endif
2952 0f8a249a blueswir1
                    break;
2953 0f8a249a blueswir1
                case 0x1:       /* load unsigned byte */
2954 0f8a249a blueswir1
                    gen_op_ldst(ldub);
2955 0f8a249a blueswir1
                    break;
2956 0f8a249a blueswir1
                case 0x2:       /* load unsigned halfword */
2957 6ea4a6c8 blueswir1
#ifdef CONFIG_USER_ONLY
2958 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_1();
2959 6ea4a6c8 blueswir1
#endif
2960 0f8a249a blueswir1
                    gen_op_ldst(lduh);
2961 0f8a249a blueswir1
                    break;
2962 0f8a249a blueswir1
                case 0x3:       /* load double word */
2963 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_7();
2964 0f8a249a blueswir1
                    if (rd & 1)
2965 d4218d99 blueswir1
                        goto illegal_insn;
2966 0f8a249a blueswir1
                    gen_op_ldst(ldd);
2967 0f8a249a blueswir1
                    gen_movl_T0_reg(rd + 1);
2968 0f8a249a blueswir1
                    break;
2969 0f8a249a blueswir1
                case 0x9:       /* load signed byte */
2970 0f8a249a blueswir1
                    gen_op_ldst(ldsb);
2971 0f8a249a blueswir1
                    break;
2972 0f8a249a blueswir1
                case 0xa:       /* load signed halfword */
2973 6ea4a6c8 blueswir1
#ifdef CONFIG_USER_ONLY
2974 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_1();
2975 6ea4a6c8 blueswir1
#endif
2976 0f8a249a blueswir1
                    gen_op_ldst(ldsh);
2977 0f8a249a blueswir1
                    break;
2978 0f8a249a blueswir1
                case 0xd:       /* ldstub -- XXX: should be atomically */
2979 0f8a249a blueswir1
                    gen_op_ldst(ldstub);
2980 0f8a249a blueswir1
                    break;
2981 0f8a249a blueswir1
                case 0x0f:      /* swap register with memory. Also atomically */
2982 6ea4a6c8 blueswir1
#ifdef CONFIG_USER_ONLY
2983 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_3();
2984 6ea4a6c8 blueswir1
#endif
2985 0f8a249a blueswir1
                    gen_movl_reg_T1(rd);
2986 0f8a249a blueswir1
                    gen_op_ldst(swap);
2987 0f8a249a blueswir1
                    break;
2988 3475187d bellard
#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64)
2989 0f8a249a blueswir1
                case 0x10:      /* load word alternate */
2990 3475187d bellard
#ifndef TARGET_SPARC64
2991 0f8a249a blueswir1
                    if (IS_IMM)
2992 0f8a249a blueswir1
                        goto illegal_insn;
2993 0f8a249a blueswir1
                    if (!supervisor(dc))
2994 0f8a249a blueswir1
                        goto priv_insn;
2995 81ad8ba2 blueswir1
#elif CONFIG_USER_ONLY
2996 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_3();
2997 6ea4a6c8 blueswir1
#endif
2998 81ad8ba2 blueswir1
                    gen_ld_asi(insn, 4, 0);
2999 0f8a249a blueswir1
                    break;
3000 0f8a249a blueswir1
                case 0x11:      /* load unsigned byte alternate */
3001 3475187d bellard
#ifndef TARGET_SPARC64
3002 0f8a249a blueswir1
                    if (IS_IMM)
3003 0f8a249a blueswir1
                        goto illegal_insn;
3004 0f8a249a blueswir1
                    if (!supervisor(dc))
3005 0f8a249a blueswir1
                        goto priv_insn;
3006 0f8a249a blueswir1
#endif
3007 81ad8ba2 blueswir1
                    gen_ld_asi(insn, 1, 0);
3008 0f8a249a blueswir1
                    break;
3009 0f8a249a blueswir1
                case 0x12:      /* load unsigned halfword alternate */
3010 3475187d bellard
#ifndef TARGET_SPARC64
3011 0f8a249a blueswir1
                    if (IS_IMM)
3012 0f8a249a blueswir1
                        goto illegal_insn;
3013 0f8a249a blueswir1
                    if (!supervisor(dc))
3014 0f8a249a blueswir1
                        goto priv_insn;
3015 81ad8ba2 blueswir1
#elif CONFIG_USER_ONLY
3016 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_1();
3017 6ea4a6c8 blueswir1
#endif
3018 81ad8ba2 blueswir1
                    gen_ld_asi(insn, 2, 0);
3019 0f8a249a blueswir1
                    break;
3020 0f8a249a blueswir1
                case 0x13:      /* load double word alternate */
3021 3475187d bellard
#ifndef TARGET_SPARC64
3022 0f8a249a blueswir1
                    if (IS_IMM)
3023 0f8a249a blueswir1
                        goto illegal_insn;
3024 0f8a249a blueswir1
                    if (!supervisor(dc))
3025 0f8a249a blueswir1
                        goto priv_insn;
3026 3475187d bellard
#endif
3027 0f8a249a blueswir1
                    if (rd & 1)
3028 d4218d99 blueswir1
                        goto illegal_insn;
3029 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_7();
3030 81ad8ba2 blueswir1
                    gen_ldda_asi(insn);
3031 0f8a249a blueswir1
                    gen_movl_T0_reg(rd + 1);
3032 0f8a249a blueswir1
                    break;
3033 0f8a249a blueswir1
                case 0x19:      /* load signed byte alternate */
3034 3475187d bellard
#ifndef TARGET_SPARC64
3035 0f8a249a blueswir1
                    if (IS_IMM)
3036 0f8a249a blueswir1
                        goto illegal_insn;
3037 0f8a249a blueswir1
                    if (!supervisor(dc))
3038 0f8a249a blueswir1
                        goto priv_insn;
3039 0f8a249a blueswir1
#endif
3040 81ad8ba2 blueswir1
                    gen_ld_asi(insn, 1, 1);
3041 0f8a249a blueswir1
                    break;
3042 0f8a249a blueswir1
                case 0x1a:      /* load signed halfword alternate */
3043 3475187d bellard
#ifndef TARGET_SPARC64
3044 0f8a249a blueswir1
                    if (IS_IMM)
3045 0f8a249a blueswir1
                        goto illegal_insn;
3046 0f8a249a blueswir1
                    if (!supervisor(dc))
3047 0f8a249a blueswir1
                        goto priv_insn;
3048 81ad8ba2 blueswir1
#elif CONFIG_USER_ONLY
3049 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_1();
3050 6ea4a6c8 blueswir1
#endif
3051 81ad8ba2 blueswir1
                    gen_ld_asi(insn, 2, 1);
3052 0f8a249a blueswir1
                    break;
3053 0f8a249a blueswir1
                case 0x1d:      /* ldstuba -- XXX: should be atomically */
3054 3475187d bellard
#ifndef TARGET_SPARC64
3055 0f8a249a blueswir1
                    if (IS_IMM)
3056 0f8a249a blueswir1
                        goto illegal_insn;
3057 0f8a249a blueswir1
                    if (!supervisor(dc))
3058 0f8a249a blueswir1
                        goto priv_insn;
3059 0f8a249a blueswir1
#endif
3060 81ad8ba2 blueswir1
                    gen_ldstub_asi(insn);
3061 0f8a249a blueswir1
                    break;
3062 0f8a249a blueswir1
                case 0x1f:      /* swap reg with alt. memory. Also atomically */
3063 3475187d bellard
#ifndef TARGET_SPARC64
3064 0f8a249a blueswir1
                    if (IS_IMM)
3065 0f8a249a blueswir1
                        goto illegal_insn;
3066 0f8a249a blueswir1
                    if (!supervisor(dc))
3067 0f8a249a blueswir1
                        goto priv_insn;
3068 81ad8ba2 blueswir1
#elif CONFIG_USER_ONLY
3069 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_3();
3070 6ea4a6c8 blueswir1
#endif
3071 81ad8ba2 blueswir1
                    gen_movl_reg_T1(rd);
3072 81ad8ba2 blueswir1
                    gen_swap_asi(insn);
3073 0f8a249a blueswir1
                    break;
3074 3475187d bellard
3075 3475187d bellard
#ifndef TARGET_SPARC64
3076 0f8a249a blueswir1
                case 0x30: /* ldc */
3077 0f8a249a blueswir1
                case 0x31: /* ldcsr */
3078 0f8a249a blueswir1
                case 0x33: /* lddc */
3079 0f8a249a blueswir1
                    goto ncp_insn;
3080 3475187d bellard
#endif
3081 3475187d bellard
#endif
3082 3475187d bellard
#ifdef TARGET_SPARC64
3083 0f8a249a blueswir1
                case 0x08: /* V9 ldsw */
3084 6ea4a6c8 blueswir1
#ifdef CONFIG_USER_ONLY
3085 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_3();
3086 6ea4a6c8 blueswir1
#endif
3087 0f8a249a blueswir1
                    gen_op_ldst(ldsw);
3088 0f8a249a blueswir1
                    break;
3089 0f8a249a blueswir1
                case 0x0b: /* V9 ldx */
3090 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_7();
3091 0f8a249a blueswir1
                    gen_op_ldst(ldx);
3092 0f8a249a blueswir1
                    break;
3093 0f8a249a blueswir1
                case 0x18: /* V9 ldswa */
3094 6ea4a6c8 blueswir1
#ifdef CONFIG_USER_ONLY
3095 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_3();
3096 6ea4a6c8 blueswir1
#endif
3097 81ad8ba2 blueswir1
                    gen_ld_asi(insn, 4, 1);
3098 0f8a249a blueswir1
                    break;
3099 0f8a249a blueswir1
                case 0x1b: /* V9 ldxa */
3100 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_7();
3101 81ad8ba2 blueswir1
                    gen_ld_asi(insn, 8, 0);
3102 0f8a249a blueswir1
                    break;
3103 0f8a249a blueswir1
                case 0x2d: /* V9 prefetch, no effect */
3104 0f8a249a blueswir1
                    goto skip_move;
3105 0f8a249a blueswir1
                case 0x30: /* V9 ldfa */
3106 6ea4a6c8 blueswir1
#ifdef CONFIG_USER_ONLY
3107 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_3();
3108 6ea4a6c8 blueswir1
#endif
3109 3391c818 blueswir1
                    gen_ldf_asi(insn, 4);
3110 81ad8ba2 blueswir1
                    goto skip_move;
3111 0f8a249a blueswir1
                case 0x33: /* V9 lddfa */
3112 3391c818 blueswir1
                    gen_op_check_align_T0_3();
3113 3391c818 blueswir1
                    gen_ldf_asi(insn, 8);
3114 81ad8ba2 blueswir1
                    goto skip_move;
3115 0f8a249a blueswir1
                case 0x3d: /* V9 prefetcha, no effect */
3116 0f8a249a blueswir1
                    goto skip_move;
3117 0f8a249a blueswir1
                case 0x32: /* V9 ldqfa */
3118 0f8a249a blueswir1
                    goto nfpu_insn;
3119 0f8a249a blueswir1
#endif
3120 0f8a249a blueswir1
                default:
3121 0f8a249a blueswir1
                    goto illegal_insn;
3122 0f8a249a blueswir1
                }
3123 0f8a249a blueswir1
                gen_movl_T1_reg(rd);
3124 3475187d bellard
#ifdef TARGET_SPARC64
3125 0f8a249a blueswir1
            skip_move: ;
3126 3475187d bellard
#endif
3127 0f8a249a blueswir1
            } else if (xop >= 0x20 && xop < 0x24) {
3128 a80dde08 bellard
                if (gen_trap_ifnofpu(dc))
3129 a80dde08 bellard
                    goto jmp_insn;
3130 0f8a249a blueswir1
                switch (xop) {
3131 0f8a249a blueswir1
                case 0x20:      /* load fpreg */
3132 6ea4a6c8 blueswir1
#ifdef CONFIG_USER_ONLY
3133 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_3();
3134 6ea4a6c8 blueswir1
#endif
3135 0f8a249a blueswir1
                    gen_op_ldst(ldf);
3136 0f8a249a blueswir1
                    gen_op_store_FT0_fpr(rd);
3137 0f8a249a blueswir1
                    break;
3138 0f8a249a blueswir1
                case 0x21:      /* load fsr */
3139 6ea4a6c8 blueswir1
#ifdef CONFIG_USER_ONLY
3140 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_3();
3141 6ea4a6c8 blueswir1
#endif
3142 0f8a249a blueswir1
                    gen_op_ldst(ldf);
3143 0f8a249a blueswir1
                    gen_op_ldfsr();
3144 0f8a249a blueswir1
                    break;
3145 0f8a249a blueswir1
                case 0x22:      /* load quad fpreg */
3146 0f8a249a blueswir1
                    goto nfpu_insn;
3147 0f8a249a blueswir1
                case 0x23:      /* load double fpreg */
3148 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_7();
3149 0f8a249a blueswir1
                    gen_op_ldst(lddf);
3150 0f8a249a blueswir1
                    gen_op_store_DT0_fpr(DFPREG(rd));
3151 0f8a249a blueswir1
                    break;
3152 0f8a249a blueswir1
                default:
3153 0f8a249a blueswir1
                    goto illegal_insn;
3154 0f8a249a blueswir1
                }
3155 0f8a249a blueswir1
            } else if (xop < 8 || (xop >= 0x14 && xop < 0x18) || \
3156 0f8a249a blueswir1
                       xop == 0xe || xop == 0x1e) {
3157 0f8a249a blueswir1
                gen_movl_reg_T1(rd);
3158 0f8a249a blueswir1
                switch (xop) {
3159 0f8a249a blueswir1
                case 0x4:
3160 6ea4a6c8 blueswir1
#ifdef CONFIG_USER_ONLY
3161 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_3();
3162 6ea4a6c8 blueswir1
#endif
3163 0f8a249a blueswir1
                    gen_op_ldst(st);
3164 0f8a249a blueswir1
                    break;
3165 0f8a249a blueswir1
                case 0x5:
3166 0f8a249a blueswir1
                    gen_op_ldst(stb);
3167 0f8a249a blueswir1
                    break;
3168 0f8a249a blueswir1
                case 0x6:
3169 6ea4a6c8 blueswir1
#ifdef CONFIG_USER_ONLY
3170 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_1();
3171 6ea4a6c8 blueswir1
#endif
3172 0f8a249a blueswir1
                    gen_op_ldst(sth);
3173 0f8a249a blueswir1
                    break;
3174 0f8a249a blueswir1
                case 0x7:
3175 0f8a249a blueswir1
                    if (rd & 1)
3176 d4218d99 blueswir1
                        goto illegal_insn;
3177 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_7();
3178 72cbca10 bellard
                    flush_T2(dc);
3179 0f8a249a blueswir1
                    gen_movl_reg_T2(rd + 1);
3180 0f8a249a blueswir1
                    gen_op_ldst(std);
3181 0f8a249a blueswir1
                    break;
3182 3475187d bellard
#if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64)
3183 0f8a249a blueswir1
                case 0x14:
3184 3475187d bellard
#ifndef TARGET_SPARC64
3185 0f8a249a blueswir1
                    if (IS_IMM)
3186 0f8a249a blueswir1
                        goto illegal_insn;
3187 0f8a249a blueswir1
                    if (!supervisor(dc))
3188 0f8a249a blueswir1
                        goto priv_insn;
3189 3475187d bellard
#endif
3190 6ea4a6c8 blueswir1
#ifdef CONFIG_USER_ONLY
3191 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_3();
3192 6ea4a6c8 blueswir1
#endif
3193 81ad8ba2 blueswir1
                    gen_st_asi(insn, 4);
3194 d39c0b99 bellard
                    break;
3195 0f8a249a blueswir1
                case 0x15:
3196 3475187d bellard
#ifndef TARGET_SPARC64
3197 0f8a249a blueswir1
                    if (IS_IMM)
3198 0f8a249a blueswir1
                        goto illegal_insn;
3199 0f8a249a blueswir1
                    if (!supervisor(dc))
3200 0f8a249a blueswir1
                        goto priv_insn;
3201 3475187d bellard
#endif
3202 81ad8ba2 blueswir1
                    gen_st_asi(insn, 1);
3203 d39c0b99 bellard
                    break;
3204 0f8a249a blueswir1
                case 0x16:
3205 3475187d bellard
#ifndef TARGET_SPARC64
3206 0f8a249a blueswir1
                    if (IS_IMM)
3207 0f8a249a blueswir1
                        goto illegal_insn;
3208 0f8a249a blueswir1
                    if (!supervisor(dc))
3209 0f8a249a blueswir1
                        goto priv_insn;
3210 3475187d bellard
#endif
3211 6ea4a6c8 blueswir1
#ifdef CONFIG_USER_ONLY
3212 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_1();
3213 6ea4a6c8 blueswir1
#endif
3214 81ad8ba2 blueswir1
                    gen_st_asi(insn, 2);
3215 d39c0b99 bellard
                    break;
3216 0f8a249a blueswir1
                case 0x17:
3217 3475187d bellard
#ifndef TARGET_SPARC64
3218 0f8a249a blueswir1
                    if (IS_IMM)
3219 0f8a249a blueswir1
                        goto illegal_insn;
3220 0f8a249a blueswir1
                    if (!supervisor(dc))
3221 0f8a249a blueswir1
                        goto priv_insn;
3222 3475187d bellard
#endif
3223 0f8a249a blueswir1
                    if (rd & 1)
3224 d4218d99 blueswir1
                        goto illegal_insn;
3225 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_7();
3226 e8af50a3 bellard
                    flush_T2(dc);
3227 0f8a249a blueswir1
                    gen_movl_reg_T2(rd + 1);
3228 81ad8ba2 blueswir1
                    gen_stda_asi(insn);
3229 d39c0b99 bellard
                    break;
3230 e80cfcfc bellard
#endif
3231 3475187d bellard
#ifdef TARGET_SPARC64
3232 0f8a249a blueswir1
                case 0x0e: /* V9 stx */
3233 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_7();
3234 0f8a249a blueswir1
                    gen_op_ldst(stx);
3235 0f8a249a blueswir1
                    break;
3236 0f8a249a blueswir1
                case 0x1e: /* V9 stxa */
3237 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_7();
3238 81ad8ba2 blueswir1
                    gen_st_asi(insn, 8);
3239 0f8a249a blueswir1
                    break;
3240 3475187d bellard
#endif
3241 0f8a249a blueswir1
                default:
3242 0f8a249a blueswir1
                    goto illegal_insn;
3243 0f8a249a blueswir1
                }
3244 0f8a249a blueswir1
            } else if (xop > 0x23 && xop < 0x28) {
3245 a80dde08 bellard
                if (gen_trap_ifnofpu(dc))
3246 a80dde08 bellard
                    goto jmp_insn;
3247 0f8a249a blueswir1
                switch (xop) {
3248 0f8a249a blueswir1
                case 0x24:
3249 6ea4a6c8 blueswir1
#ifdef CONFIG_USER_ONLY
3250 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_3();
3251 6ea4a6c8 blueswir1
#endif
3252 e8af50a3 bellard
                    gen_op_load_fpr_FT0(rd);
3253 0f8a249a blueswir1
                    gen_op_ldst(stf);
3254 0f8a249a blueswir1
                    break;
3255 0f8a249a blueswir1
                case 0x25: /* stfsr, V9 stxfsr */
3256 6ea4a6c8 blueswir1
#ifdef CONFIG_USER_ONLY
3257 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_3();
3258 6ea4a6c8 blueswir1
#endif
3259 0f8a249a blueswir1
                    gen_op_stfsr();
3260 0f8a249a blueswir1
                    gen_op_ldst(stf);
3261 0f8a249a blueswir1
                    break;
3262 9143e598 blueswir1
#if !defined(CONFIG_USER_ONLY)
3263 0f8a249a blueswir1
                case 0x26: /* stdfq */
3264 0f8a249a blueswir1
                    if (!supervisor(dc))
3265 0f8a249a blueswir1
                        goto priv_insn;
3266 0f8a249a blueswir1
                    if (gen_trap_ifnofpu(dc))
3267 0f8a249a blueswir1
                        goto jmp_insn;
3268 0f8a249a blueswir1
                    goto nfq_insn;
3269 0f8a249a blueswir1
#endif
3270 0f8a249a blueswir1
                case 0x27:
3271 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_7();
3272 3475187d bellard
                    gen_op_load_fpr_DT0(DFPREG(rd));
3273 0f8a249a blueswir1
                    gen_op_ldst(stdf);
3274 0f8a249a blueswir1
                    break;
3275 0f8a249a blueswir1
                default:
3276 0f8a249a blueswir1
                    goto illegal_insn;
3277 0f8a249a blueswir1
                }
3278 0f8a249a blueswir1
            } else if (xop > 0x33 && xop < 0x3f) {
3279 0f8a249a blueswir1
                switch (xop) {
3280 a4d17f19 blueswir1
#ifdef TARGET_SPARC64
3281 0f8a249a blueswir1
                case 0x34: /* V9 stfa */
3282 6ea4a6c8 blueswir1
#ifdef CONFIG_USER_ONLY
3283 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_3();
3284 6ea4a6c8 blueswir1
#endif
3285 3391c818 blueswir1
                    gen_op_load_fpr_FT0(rd);
3286 3391c818 blueswir1
                    gen_stf_asi(insn, 4);
3287 0f8a249a blueswir1
                    break;
3288 0f8a249a blueswir1
                case 0x37: /* V9 stdfa */
3289 3391c818 blueswir1
                    gen_op_check_align_T0_3();
3290 3391c818 blueswir1
                    gen_op_load_fpr_DT0(DFPREG(rd));
3291 3391c818 blueswir1
                    gen_stf_asi(insn, 8);
3292 0f8a249a blueswir1
                    break;
3293 0f8a249a blueswir1
                case 0x3c: /* V9 casa */
3294 6ea4a6c8 blueswir1
#ifdef CONFIG_USER_ONLY
3295 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_3();
3296 6ea4a6c8 blueswir1
#endif
3297 81ad8ba2 blueswir1
                    flush_T2(dc);
3298 81ad8ba2 blueswir1
                    gen_movl_reg_T2(rd);
3299 81ad8ba2 blueswir1
                    gen_cas_asi(insn);
3300 81ad8ba2 blueswir1
                    gen_movl_T1_reg(rd);
3301 0f8a249a blueswir1
                    break;
3302 0f8a249a blueswir1
                case 0x3e: /* V9 casxa */
3303 6ea4a6c8 blueswir1
                    gen_op_check_align_T0_7();
3304 81ad8ba2 blueswir1
                    flush_T2(dc);
3305 81ad8ba2 blueswir1
                    gen_movl_reg_T2(rd);
3306 81ad8ba2 blueswir1
                    gen_casx_asi(insn);
3307 81ad8ba2 blueswir1
                    gen_movl_T1_reg(rd);
3308 0f8a249a blueswir1
                    break;
3309 0f8a249a blueswir1
                case 0x36: /* V9 stqfa */
3310 0f8a249a blueswir1
                    goto nfpu_insn;
3311 a4d17f19 blueswir1
#else
3312 0f8a249a blueswir1
                case 0x34: /* stc */
3313 0f8a249a blueswir1
                case 0x35: /* stcsr */
3314 0f8a249a blueswir1
                case 0x36: /* stdcq */
3315 0f8a249a blueswir1
                case 0x37: /* stdc */
3316 0f8a249a blueswir1
                    goto ncp_insn;
3317 0f8a249a blueswir1
#endif
3318 0f8a249a blueswir1
                default:
3319 0f8a249a blueswir1
                    goto illegal_insn;
3320 0f8a249a blueswir1
                }
3321 e8af50a3 bellard
            }
3322 0f8a249a blueswir1
            else
3323 0f8a249a blueswir1
                goto illegal_insn;
3324 0f8a249a blueswir1
        }
3325 0f8a249a blueswir1
        break;
3326 cf495bcf bellard
    }
3327 cf495bcf bellard
    /* default case for non jump instructions */
3328 72cbca10 bellard
    if (dc->npc == DYNAMIC_PC) {
3329 0f8a249a blueswir1
        dc->pc = DYNAMIC_PC;
3330 0f8a249a blueswir1
        gen_op_next_insn();
3331 72cbca10 bellard
    } else if (dc->npc == JUMP_PC) {
3332 72cbca10 bellard
        /* we can do a static jump */
3333 46525e1f blueswir1
        gen_branch2(dc, dc->jump_pc[0], dc->jump_pc[1]);
3334 72cbca10 bellard
        dc->is_br = 1;
3335 72cbca10 bellard
    } else {
3336 0f8a249a blueswir1
        dc->pc = dc->npc;
3337 0f8a249a blueswir1
        dc->npc = dc->npc + 4;
3338 cf495bcf bellard
    }
3339 e80cfcfc bellard
 jmp_insn:
3340 cf495bcf bellard
    return;
3341 cf495bcf bellard
 illegal_insn:
3342 72cbca10 bellard
    save_state(dc);
3343 cf495bcf bellard
    gen_op_exception(TT_ILL_INSN);
3344 cf495bcf bellard
    dc->is_br = 1;
3345 e8af50a3 bellard
    return;
3346 e80cfcfc bellard
#if !defined(CONFIG_USER_ONLY)
3347 e8af50a3 bellard
 priv_insn:
3348 e8af50a3 bellard
    save_state(dc);
3349 e8af50a3 bellard
    gen_op_exception(TT_PRIV_INSN);
3350 e8af50a3 bellard
    dc->is_br = 1;
3351 e80cfcfc bellard
    return;
3352 e80cfcfc bellard
#endif
3353 e80cfcfc bellard
 nfpu_insn:
3354 e80cfcfc bellard
    save_state(dc);
3355 e80cfcfc bellard
    gen_op_fpexception_im(FSR_FTT_UNIMPFPOP);
3356 e80cfcfc bellard
    dc->is_br = 1;
3357 fcc72045 blueswir1
    return;
3358 9143e598 blueswir1
#if !defined(CONFIG_USER_ONLY)
3359 9143e598 blueswir1
 nfq_insn:
3360 9143e598 blueswir1
    save_state(dc);
3361 9143e598 blueswir1
    gen_op_fpexception_im(FSR_FTT_SEQ_ERROR);
3362 9143e598 blueswir1
    dc->is_br = 1;
3363 9143e598 blueswir1
    return;
3364 9143e598 blueswir1
#endif
3365 fcc72045 blueswir1
#ifndef TARGET_SPARC64
3366 fcc72045 blueswir1
 ncp_insn:
3367 fcc72045 blueswir1
    save_state(dc);
3368 fcc72045 blueswir1
    gen_op_exception(TT_NCP_INSN);
3369 fcc72045 blueswir1
    dc->is_br = 1;
3370 fcc72045 blueswir1
    return;
3371 fcc72045 blueswir1
#endif
3372 7a3f1944 bellard
}
3373 7a3f1944 bellard
3374 cf495bcf bellard
static inline int gen_intermediate_code_internal(TranslationBlock * tb,
3375 0f8a249a blueswir1
                                                 int spc, CPUSPARCState *env)
3376 7a3f1944 bellard
{
3377 72cbca10 bellard
    target_ulong pc_start, last_pc;
3378 cf495bcf bellard
    uint16_t *gen_opc_end;
3379 cf495bcf bellard
    DisasContext dc1, *dc = &dc1;
3380 e8af50a3 bellard
    int j, lj = -1;
3381 cf495bcf bellard
3382 cf495bcf bellard
    memset(dc, 0, sizeof(DisasContext));
3383 cf495bcf bellard
    dc->tb = tb;
3384 72cbca10 bellard
    pc_start = tb->pc;
3385 cf495bcf bellard
    dc->pc = pc_start;
3386 e80cfcfc bellard
    last_pc = dc->pc;
3387 72cbca10 bellard
    dc->npc = (target_ulong) tb->cs_base;
3388 6f27aba6 blueswir1
    dc->mem_idx = cpu_mmu_index(env);
3389 6f27aba6 blueswir1
    dc->fpu_enabled = cpu_fpu_enabled(env);
3390 cf495bcf bellard
    gen_opc_ptr = gen_opc_buf;
3391 cf495bcf bellard
    gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
3392 cf495bcf bellard
    gen_opparam_ptr = gen_opparam_buf;
3393 83469015 bellard
    nb_gen_labels = 0;
3394 cf495bcf bellard
3395 cf495bcf bellard
    do {
3396 e8af50a3 bellard
        if (env->nb_breakpoints > 0) {
3397 e8af50a3 bellard
            for(j = 0; j < env->nb_breakpoints; j++) {
3398 e8af50a3 bellard
                if (env->breakpoints[j] == dc->pc) {
3399 0f8a249a blueswir1
                    if (dc->pc != pc_start)
3400 0f8a249a blueswir1
                        save_state(dc);
3401 e80cfcfc bellard
                    gen_op_debug();
3402 0f8a249a blueswir1
                    gen_op_movl_T0_0();
3403 0f8a249a blueswir1
                    gen_op_exit_tb();
3404 0f8a249a blueswir1
                    dc->is_br = 1;
3405 e80cfcfc bellard
                    goto exit_gen_loop;
3406 e8af50a3 bellard
                }
3407 e8af50a3 bellard
            }
3408 e8af50a3 bellard
        }
3409 e8af50a3 bellard
        if (spc) {
3410 e8af50a3 bellard
            if (loglevel > 0)
3411 e8af50a3 bellard
                fprintf(logfile, "Search PC...\n");
3412 e8af50a3 bellard
            j = gen_opc_ptr - gen_opc_buf;
3413 e8af50a3 bellard
            if (lj < j) {
3414 e8af50a3 bellard
                lj++;
3415 e8af50a3 bellard
                while (lj < j)
3416 e8af50a3 bellard
                    gen_opc_instr_start[lj++] = 0;
3417 e8af50a3 bellard
                gen_opc_pc[lj] = dc->pc;
3418 e8af50a3 bellard
                gen_opc_npc[lj] = dc->npc;
3419 e8af50a3 bellard
                gen_opc_instr_start[lj] = 1;
3420 e8af50a3 bellard
            }
3421 e8af50a3 bellard
        }
3422 0f8a249a blueswir1
        last_pc = dc->pc;
3423 0f8a249a blueswir1
        disas_sparc_insn(dc);
3424 0f8a249a blueswir1
3425 0f8a249a blueswir1
        if (dc->is_br)
3426 0f8a249a blueswir1
            break;
3427 0f8a249a blueswir1
        /* if the next PC is different, we abort now */
3428 0f8a249a blueswir1
        if (dc->pc != (last_pc + 4))
3429 0f8a249a blueswir1
            break;
3430 d39c0b99 bellard
        /* if we reach a page boundary, we stop generation so that the
3431 d39c0b99 bellard
           PC of a TT_TFAULT exception is always in the right page */
3432 d39c0b99 bellard
        if ((dc->pc & (TARGET_PAGE_SIZE - 1)) == 0)
3433 d39c0b99 bellard
            break;
3434 e80cfcfc bellard
        /* if single step mode, we generate only one instruction and
3435 e80cfcfc bellard
           generate an exception */
3436 e80cfcfc bellard
        if (env->singlestep_enabled) {
3437 3475187d bellard
            gen_jmp_im(dc->pc);
3438 e80cfcfc bellard
            gen_op_movl_T0_0();
3439 e80cfcfc bellard
            gen_op_exit_tb();
3440 e80cfcfc bellard
            break;
3441 e80cfcfc bellard
        }
3442 cf495bcf bellard
    } while ((gen_opc_ptr < gen_opc_end) &&
3443 0f8a249a blueswir1
             (dc->pc - pc_start) < (TARGET_PAGE_SIZE - 32));
3444 e80cfcfc bellard
3445 e80cfcfc bellard
 exit_gen_loop:
3446 72cbca10 bellard
    if (!dc->is_br) {
3447 5fafdf24 ths
        if (dc->pc != DYNAMIC_PC &&
3448 72cbca10 bellard
            (dc->npc != DYNAMIC_PC && dc->npc != JUMP_PC)) {
3449 72cbca10 bellard
            /* static PC and NPC: we can use direct chaining */
3450 46525e1f blueswir1
            gen_branch(dc, dc->pc, dc->npc);
3451 72cbca10 bellard
        } else {
3452 72cbca10 bellard
            if (dc->pc != DYNAMIC_PC)
3453 3475187d bellard
                gen_jmp_im(dc->pc);
3454 72cbca10 bellard
            save_npc(dc);
3455 72cbca10 bellard
            gen_op_movl_T0_0();
3456 72cbca10 bellard
            gen_op_exit_tb();
3457 72cbca10 bellard
        }
3458 72cbca10 bellard
    }
3459 cf495bcf bellard
    *gen_opc_ptr = INDEX_op_end;
3460 e8af50a3 bellard
    if (spc) {
3461 e8af50a3 bellard
        j = gen_opc_ptr - gen_opc_buf;
3462 e8af50a3 bellard
        lj++;
3463 e8af50a3 bellard
        while (lj <= j)
3464 e8af50a3 bellard
            gen_opc_instr_start[lj++] = 0;
3465 e8af50a3 bellard
#if 0
3466 e8af50a3 bellard
        if (loglevel > 0) {
3467 e8af50a3 bellard
            page_dump(logfile);
3468 e8af50a3 bellard
        }
3469 e8af50a3 bellard
#endif
3470 c3278b7b bellard
        gen_opc_jump_pc[0] = dc->jump_pc[0];
3471 c3278b7b bellard
        gen_opc_jump_pc[1] = dc->jump_pc[1];
3472 e8af50a3 bellard
    } else {
3473 e80cfcfc bellard
        tb->size = last_pc + 4 - pc_start;
3474 e8af50a3 bellard
    }
3475 7a3f1944 bellard
#ifdef DEBUG_DISAS
3476 e19e89a5 bellard
    if (loglevel & CPU_LOG_TB_IN_ASM) {
3477 0f8a249a blueswir1
        fprintf(logfile, "--------------\n");
3478 0f8a249a blueswir1
        fprintf(logfile, "IN: %s\n", lookup_symbol(pc_start));
3479 0f8a249a blueswir1
        target_disas(logfile, pc_start, last_pc + 4 - pc_start, 0);
3480 0f8a249a blueswir1
        fprintf(logfile, "\n");
3481 e19e89a5 bellard
        if (loglevel & CPU_LOG_TB_OP) {
3482 e19e89a5 bellard
            fprintf(logfile, "OP:\n");
3483 e19e89a5 bellard
            dump_ops(gen_opc_buf, gen_opparam_buf);
3484 e19e89a5 bellard
            fprintf(logfile, "\n");
3485 e19e89a5 bellard
        }
3486 cf495bcf bellard
    }
3487 7a3f1944 bellard
#endif
3488 cf495bcf bellard
    return 0;
3489 7a3f1944 bellard
}
3490 7a3f1944 bellard
3491 cf495bcf bellard
int gen_intermediate_code(CPUSPARCState * env, TranslationBlock * tb)
3492 7a3f1944 bellard
{
3493 e8af50a3 bellard
    return gen_intermediate_code_internal(tb, 0, env);
3494 7a3f1944 bellard
}
3495 7a3f1944 bellard
3496 cf495bcf bellard
int gen_intermediate_code_pc(CPUSPARCState * env, TranslationBlock * tb)
3497 7a3f1944 bellard
{
3498 e8af50a3 bellard
    return gen_intermediate_code_internal(tb, 1, env);
3499 7a3f1944 bellard
}
3500 7a3f1944 bellard
3501 e80cfcfc bellard
extern int ram_size;
3502 cf495bcf bellard
3503 e80cfcfc bellard
void cpu_reset(CPUSPARCState *env)
3504 e80cfcfc bellard
{
3505 bb05683b bellard
    tlb_flush(env, 1);
3506 cf495bcf bellard
    env->cwp = 0;
3507 cf495bcf bellard
    env->wim = 1;
3508 cf495bcf bellard
    env->regwptr = env->regbase + (env->cwp * 16);
3509 e8af50a3 bellard
#if defined(CONFIG_USER_ONLY)
3510 cf495bcf bellard
    env->user_mode_only = 1;
3511 5ef54116 bellard
#ifdef TARGET_SPARC64
3512 6ef905f6 blueswir1
    env->cleanwin = NWINDOWS - 2;
3513 6ef905f6 blueswir1
    env->cansave = NWINDOWS - 2;
3514 6ef905f6 blueswir1
    env->pstate = PS_RMO | PS_PEF | PS_IE;
3515 6ef905f6 blueswir1
    env->asi = 0x82; // Primary no-fault
3516 5ef54116 bellard
#endif
3517 e8af50a3 bellard
#else
3518 32af58f9 blueswir1
    env->psret = 0;
3519 e8af50a3 bellard
    env->psrs = 1;
3520 0bee699e bellard
    env->psrps = 1;
3521 3475187d bellard
#ifdef TARGET_SPARC64
3522 83469015 bellard
    env->pstate = PS_PRIV;
3523 6f27aba6 blueswir1
    env->hpstate = HS_PRIV;
3524 83469015 bellard
    env->pc = 0x1fff0000000ULL;
3525 3475187d bellard
#else
3526 40ce0a9a blueswir1
    env->pc = 0;
3527 32af58f9 blueswir1
    env->mmuregs[0] &= ~(MMU_E | MMU_NF);
3528 40ce0a9a blueswir1
    env->mmuregs[0] |= MMU_BM;
3529 3475187d bellard
#endif
3530 83469015 bellard
    env->npc = env->pc + 4;
3531 e8af50a3 bellard
#endif
3532 e80cfcfc bellard
}
3533 e80cfcfc bellard
3534 e80cfcfc bellard
CPUSPARCState *cpu_sparc_init(void)
3535 e80cfcfc bellard
{
3536 e80cfcfc bellard
    CPUSPARCState *env;
3537 e80cfcfc bellard
3538 c68ea704 bellard
    env = qemu_mallocz(sizeof(CPUSPARCState));
3539 c68ea704 bellard
    if (!env)
3540 0f8a249a blueswir1
        return NULL;
3541 c68ea704 bellard
    cpu_exec_init(env);
3542 e80cfcfc bellard
    cpu_reset(env);
3543 cf495bcf bellard
    return (env);
3544 7a3f1944 bellard
}
3545 7a3f1944 bellard
3546 62724a37 blueswir1
static const sparc_def_t sparc_defs[] = {
3547 62724a37 blueswir1
#ifdef TARGET_SPARC64
3548 62724a37 blueswir1
    {
3549 62724a37 blueswir1
        .name = "TI UltraSparc II",
3550 62724a37 blueswir1
        .iu_version = ((0x17ULL << 48) | (0x11ULL << 32) | (0 << 24)
3551 62724a37 blueswir1
                       | (MAXTL << 8) | (NWINDOWS - 1)),
3552 62724a37 blueswir1
        .fpu_version = 0x00000000,
3553 62724a37 blueswir1
        .mmu_version = 0,
3554 62724a37 blueswir1
    },
3555 62724a37 blueswir1
#else
3556 62724a37 blueswir1
    {
3557 62724a37 blueswir1
        .name = "Fujitsu MB86904",
3558 62724a37 blueswir1
        .iu_version = 0x04 << 24, /* Impl 0, ver 4 */
3559 62724a37 blueswir1
        .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
3560 62724a37 blueswir1
        .mmu_version = 0x04 << 24, /* Impl 0, ver 4 */
3561 62724a37 blueswir1
    },
3562 e0353fe2 blueswir1
    {
3563 5ef62c5c blueswir1
        .name = "Fujitsu MB86907",
3564 5ef62c5c blueswir1
        .iu_version = 0x05 << 24, /* Impl 0, ver 5 */
3565 5ef62c5c blueswir1
        .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
3566 5ef62c5c blueswir1
        .mmu_version = 0x05 << 24, /* Impl 0, ver 5 */
3567 5ef62c5c blueswir1
    },
3568 5ef62c5c blueswir1
    {
3569 5ef62c5c blueswir1
        .name = "TI MicroSparc I",
3570 5ef62c5c blueswir1
        .iu_version = 0x41000000,
3571 5ef62c5c blueswir1
        .fpu_version = 4 << 17,
3572 5ef62c5c blueswir1
        .mmu_version = 0x41000000,
3573 5ef62c5c blueswir1
    },
3574 5ef62c5c blueswir1
    {
3575 e0353fe2 blueswir1
        .name = "TI SuperSparc II",
3576 e0353fe2 blueswir1
        .iu_version = 0x40000000,
3577 5ef62c5c blueswir1
        .fpu_version = 0 << 17,
3578 5ef62c5c blueswir1
        .mmu_version = 0x04000000,
3579 5ef62c5c blueswir1
    },
3580 5ef62c5c blueswir1
    {
3581 5ef62c5c blueswir1
        .name = "Ross RT620",
3582 5ef62c5c blueswir1
        .iu_version = 0x1e000000,
3583 5ef62c5c blueswir1
        .fpu_version = 1 << 17,
3584 5ef62c5c blueswir1
        .mmu_version = 0x17000000,
3585 e0353fe2 blueswir1
    },
3586 62724a37 blueswir1
#endif
3587 62724a37 blueswir1
};
3588 62724a37 blueswir1
3589 62724a37 blueswir1
int sparc_find_by_name(const unsigned char *name, const sparc_def_t **def)
3590 62724a37 blueswir1
{
3591 62724a37 blueswir1
    int ret;
3592 62724a37 blueswir1
    unsigned int i;
3593 62724a37 blueswir1
3594 62724a37 blueswir1
    ret = -1;
3595 62724a37 blueswir1
    *def = NULL;
3596 62724a37 blueswir1
    for (i = 0; i < sizeof(sparc_defs) / sizeof(sparc_def_t); i++) {
3597 62724a37 blueswir1
        if (strcasecmp(name, sparc_defs[i].name) == 0) {
3598 62724a37 blueswir1
            *def = &sparc_defs[i];
3599 62724a37 blueswir1
            ret = 0;
3600 62724a37 blueswir1
            break;
3601 62724a37 blueswir1
        }
3602 62724a37 blueswir1
    }
3603 62724a37 blueswir1
3604 62724a37 blueswir1
    return ret;
3605 62724a37 blueswir1
}
3606 62724a37 blueswir1
3607 62724a37 blueswir1
void sparc_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
3608 62724a37 blueswir1
{
3609 62724a37 blueswir1
    unsigned int i;
3610 62724a37 blueswir1
3611 62724a37 blueswir1
    for (i = 0; i < sizeof(sparc_defs) / sizeof(sparc_def_t); i++) {
3612 62724a37 blueswir1
        (*cpu_fprintf)(f, "Sparc %16s IU " TARGET_FMT_lx " FPU %08x MMU %08x\n",
3613 62724a37 blueswir1
                       sparc_defs[i].name,
3614 62724a37 blueswir1
                       sparc_defs[i].iu_version,
3615 62724a37 blueswir1
                       sparc_defs[i].fpu_version,
3616 62724a37 blueswir1
                       sparc_defs[i].mmu_version);
3617 62724a37 blueswir1
    }
3618 62724a37 blueswir1
}
3619 62724a37 blueswir1
3620 952a328f blueswir1
int cpu_sparc_register (CPUSPARCState *env, const sparc_def_t *def, unsigned int cpu)
3621 62724a37 blueswir1
{
3622 62724a37 blueswir1
    env->version = def->iu_version;
3623 62724a37 blueswir1
    env->fsr = def->fpu_version;
3624 62724a37 blueswir1
#if !defined(TARGET_SPARC64)
3625 40ce0a9a blueswir1
    env->mmuregs[0] |= def->mmu_version;
3626 952a328f blueswir1
    env->mxccregs[7] = ((cpu + 8) & 0xf) << 24;
3627 62724a37 blueswir1
#endif
3628 62724a37 blueswir1
    return 0;
3629 62724a37 blueswir1
}
3630 62724a37 blueswir1
3631 7a3f1944 bellard
#define GET_FLAG(a,b) ((env->psr & a)?b:'-')
3632 7a3f1944 bellard
3633 5fafdf24 ths
void cpu_dump_state(CPUState *env, FILE *f,
3634 7fe48483 bellard
                    int (*cpu_fprintf)(FILE *f, const char *fmt, ...),
3635 7fe48483 bellard
                    int flags)
3636 7a3f1944 bellard
{
3637 cf495bcf bellard
    int i, x;
3638 cf495bcf bellard
3639 af7bf89b bellard
    cpu_fprintf(f, "pc: " TARGET_FMT_lx "  npc: " TARGET_FMT_lx "\n", env->pc, env->npc);
3640 7fe48483 bellard
    cpu_fprintf(f, "General Registers:\n");
3641 cf495bcf bellard
    for (i = 0; i < 4; i++)
3642 0f8a249a blueswir1
        cpu_fprintf(f, "%%g%c: " TARGET_FMT_lx "\t", i + '0', env->gregs[i]);
3643 7fe48483 bellard
    cpu_fprintf(f, "\n");
3644 cf495bcf bellard
    for (; i < 8; i++)
3645 0f8a249a blueswir1
        cpu_fprintf(f, "%%g%c: " TARGET_FMT_lx "\t", i + '0', env->gregs[i]);
3646 7fe48483 bellard
    cpu_fprintf(f, "\nCurrent Register Window:\n");
3647 cf495bcf bellard
    for (x = 0; x < 3; x++) {
3648 0f8a249a blueswir1
        for (i = 0; i < 4; i++)
3649 0f8a249a blueswir1
            cpu_fprintf(f, "%%%c%d: " TARGET_FMT_lx "\t",
3650 0f8a249a blueswir1
                    (x == 0 ? 'o' : (x == 1 ? 'l' : 'i')), i,
3651 0f8a249a blueswir1
                    env->regwptr[i + x * 8]);
3652 0f8a249a blueswir1
        cpu_fprintf(f, "\n");
3653 0f8a249a blueswir1
        for (; i < 8; i++)
3654 0f8a249a blueswir1
            cpu_fprintf(f, "%%%c%d: " TARGET_FMT_lx "\t",
3655 0f8a249a blueswir1
                    (x == 0 ? 'o' : x == 1 ? 'l' : 'i'), i,
3656 0f8a249a blueswir1
                    env->regwptr[i + x * 8]);
3657 0f8a249a blueswir1
        cpu_fprintf(f, "\n");
3658 cf495bcf bellard
    }
3659 7fe48483 bellard
    cpu_fprintf(f, "\nFloating Point Registers:\n");
3660 e8af50a3 bellard
    for (i = 0; i < 32; i++) {
3661 e8af50a3 bellard
        if ((i & 3) == 0)
3662 7fe48483 bellard
            cpu_fprintf(f, "%%f%02d:", i);
3663 7fe48483 bellard
        cpu_fprintf(f, " %016lf", env->fpr[i]);
3664 e8af50a3 bellard
        if ((i & 3) == 3)
3665 7fe48483 bellard
            cpu_fprintf(f, "\n");
3666 e8af50a3 bellard
    }
3667 ded3ab80 pbrook
#ifdef TARGET_SPARC64
3668 3299908c blueswir1
    cpu_fprintf(f, "pstate: 0x%08x ccr: 0x%02x asi: 0x%02x tl: %d fprs: %d\n",
3669 0f8a249a blueswir1
                env->pstate, GET_CCR(env), env->asi, env->tl, env->fprs);
3670 ded3ab80 pbrook
    cpu_fprintf(f, "cansave: %d canrestore: %d otherwin: %d wstate %d cleanwin %d cwp %d\n",
3671 0f8a249a blueswir1
                env->cansave, env->canrestore, env->otherwin, env->wstate,
3672 0f8a249a blueswir1
                env->cleanwin, NWINDOWS - 1 - env->cwp);
3673 ded3ab80 pbrook
#else
3674 7fe48483 bellard
    cpu_fprintf(f, "psr: 0x%08x -> %c%c%c%c %c%c%c wim: 0x%08x\n", GET_PSR(env),
3675 0f8a249a blueswir1
            GET_FLAG(PSR_ZERO, 'Z'), GET_FLAG(PSR_OVF, 'V'),
3676 0f8a249a blueswir1
            GET_FLAG(PSR_NEG, 'N'), GET_FLAG(PSR_CARRY, 'C'),
3677 0f8a249a blueswir1
            env->psrs?'S':'-', env->psrps?'P':'-',
3678 0f8a249a blueswir1
            env->psret?'E':'-', env->wim);
3679 ded3ab80 pbrook
#endif
3680 3475187d bellard
    cpu_fprintf(f, "fsr: 0x%08x\n", GET_FSR32(env));
3681 7a3f1944 bellard
}
3682 edfcbd99 bellard
3683 e80cfcfc bellard
#if defined(CONFIG_USER_ONLY)
3684 9b3c35e0 j_mayer
target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
3685 edfcbd99 bellard
{
3686 edfcbd99 bellard
    return addr;
3687 edfcbd99 bellard
}
3688 658138bc bellard
3689 e80cfcfc bellard
#else
3690 af7bf89b bellard
extern int get_physical_address (CPUState *env, target_phys_addr_t *physical, int *prot,
3691 af7bf89b bellard
                                 int *access_index, target_ulong address, int rw,
3692 6ebbf390 j_mayer
                                 int mmu_idx);
3693 0fa85d43 bellard
3694 9b3c35e0 j_mayer
target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
3695 e80cfcfc bellard
{
3696 af7bf89b bellard
    target_phys_addr_t phys_addr;
3697 e80cfcfc bellard
    int prot, access_index;
3698 e80cfcfc bellard
3699 e80cfcfc bellard
    if (get_physical_address(env, &phys_addr, &prot, &access_index, addr, 2, 0) != 0)
3700 6b1575b7 bellard
        if (get_physical_address(env, &phys_addr, &prot, &access_index, addr, 0, 0) != 0)
3701 6b1575b7 bellard
            return -1;
3702 6c36d3fa blueswir1
    if (cpu_get_physical_page_desc(phys_addr) == IO_MEM_UNASSIGNED)
3703 6c36d3fa blueswir1
        return -1;
3704 e80cfcfc bellard
    return phys_addr;
3705 e80cfcfc bellard
}
3706 e80cfcfc bellard
#endif
3707 e80cfcfc bellard
3708 658138bc bellard
void helper_flush(target_ulong addr)
3709 658138bc bellard
{
3710 658138bc bellard
    addr &= ~7;
3711 658138bc bellard
    tb_invalidate_page_range(addr, addr + 8);
3712 658138bc bellard
}