Statistics
| Branch: | Revision:

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

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