target-alpha: factorize load/store code
[qemu] / target-alpha / translate.c
1 /*
2  *  Alpha emulation cpu translation for qemu.
3  *
4  *  Copyright (c) 2007 Jocelyn Mayer
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 #include <stdint.h>
22 #include <stdlib.h>
23 #include <stdio.h>
24
25 #include "cpu.h"
26 #include "exec-all.h"
27 #include "disas.h"
28 #include "host-utils.h"
29 #include "helper.h"
30 #include "tcg-op.h"
31 #include "qemu-common.h"
32
33 #define DO_SINGLE_STEP
34 #define GENERATE_NOP
35 #define ALPHA_DEBUG_DISAS
36 #define DO_TB_FLUSH
37
38 typedef struct DisasContext DisasContext;
39 struct DisasContext {
40     uint64_t pc;
41     int mem_idx;
42 #if !defined (CONFIG_USER_ONLY)
43     int pal_mode;
44 #endif
45     uint32_t amask;
46 };
47
48 /* global register indexes */
49 static TCGv cpu_env;
50 static TCGv cpu_ir[31];
51 static TCGv cpu_pc;
52
53 /* dyngen register indexes */
54 static TCGv cpu_T[2];
55
56 /* register names */
57 static char cpu_reg_names[10*4+21*5];
58
59 #include "gen-icount.h"
60
61 static void alpha_translate_init(void)
62 {
63     int i;
64     char *p;
65     static int done_init = 0;
66
67     if (done_init)
68         return;
69
70     cpu_env = tcg_global_reg_new(TCG_TYPE_PTR, TCG_AREG0, "env");
71
72 #if TARGET_LONG_BITS > HOST_LONG_BITS
73     cpu_T[0] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
74                                   offsetof(CPUState, t0), "T0");
75     cpu_T[1] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
76                                   offsetof(CPUState, t1), "T1");
77 #else
78     cpu_T[0] = tcg_global_reg_new(TCG_TYPE_I64, TCG_AREG1, "T0");
79     cpu_T[1] = tcg_global_reg_new(TCG_TYPE_I64, TCG_AREG2, "T1");
80 #endif
81
82     p = cpu_reg_names;
83     for (i = 0; i < 31; i++) {
84         sprintf(p, "ir%d", i);
85         cpu_ir[i] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
86                                        offsetof(CPUState, ir[i]), p);
87         p += (i < 10) ? 4 : 5;
88     }
89
90     cpu_pc = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
91                                 offsetof(CPUState, pc), "pc");
92
93     /* register helpers */
94 #undef DEF_HELPER
95 #define DEF_HELPER(ret, name, params) tcg_register_helper(name, #name);
96 #include "helper.h"
97
98     done_init = 1;
99 }
100
101 static always_inline void gen_op_nop (void)
102 {
103 #if defined(GENERATE_NOP)
104     gen_op_no_op();
105 #endif
106 }
107
108 #define GEN32(func, NAME) \
109 static GenOpFunc *NAME ## _table [32] = {                                     \
110 NAME ## 0, NAME ## 1, NAME ## 2, NAME ## 3,                                   \
111 NAME ## 4, NAME ## 5, NAME ## 6, NAME ## 7,                                   \
112 NAME ## 8, NAME ## 9, NAME ## 10, NAME ## 11,                                 \
113 NAME ## 12, NAME ## 13, NAME ## 14, NAME ## 15,                               \
114 NAME ## 16, NAME ## 17, NAME ## 18, NAME ## 19,                               \
115 NAME ## 20, NAME ## 21, NAME ## 22, NAME ## 23,                               \
116 NAME ## 24, NAME ## 25, NAME ## 26, NAME ## 27,                               \
117 NAME ## 28, NAME ## 29, NAME ## 30, NAME ## 31,                               \
118 };                                                                            \
119 static always_inline void func (int n)                                        \
120 {                                                                             \
121     NAME ## _table[n]();                                                      \
122 }
123
124 /* FIR moves */
125 /* Special hacks for fir31 */
126 #define gen_op_load_FT0_fir31 gen_op_reset_FT0
127 #define gen_op_load_FT1_fir31 gen_op_reset_FT1
128 #define gen_op_load_FT2_fir31 gen_op_reset_FT2
129 #define gen_op_store_FT0_fir31 gen_op_nop
130 #define gen_op_store_FT1_fir31 gen_op_nop
131 #define gen_op_store_FT2_fir31 gen_op_nop
132 #define gen_op_cmov_fir31 gen_op_nop
133 GEN32(gen_op_load_FT0_fir, gen_op_load_FT0_fir);
134 GEN32(gen_op_load_FT1_fir, gen_op_load_FT1_fir);
135 GEN32(gen_op_load_FT2_fir, gen_op_load_FT2_fir);
136 GEN32(gen_op_store_FT0_fir, gen_op_store_FT0_fir);
137 GEN32(gen_op_store_FT1_fir, gen_op_store_FT1_fir);
138 GEN32(gen_op_store_FT2_fir, gen_op_store_FT2_fir);
139 GEN32(gen_op_cmov_fir, gen_op_cmov_fir);
140
141 static always_inline void gen_load_fir (DisasContext *ctx, int firn, int Tn)
142 {
143     switch (Tn) {
144     case 0:
145         gen_op_load_FT0_fir(firn);
146         break;
147     case 1:
148         gen_op_load_FT1_fir(firn);
149         break;
150     case 2:
151         gen_op_load_FT2_fir(firn);
152         break;
153     }
154 }
155
156 static always_inline void gen_store_fir (DisasContext *ctx, int firn, int Tn)
157 {
158     switch (Tn) {
159     case 0:
160         gen_op_store_FT0_fir(firn);
161         break;
162     case 1:
163         gen_op_store_FT1_fir(firn);
164         break;
165     case 2:
166         gen_op_store_FT2_fir(firn);
167         break;
168     }
169 }
170
171 /* Memory moves */
172 #if defined(CONFIG_USER_ONLY)
173 #define OP_LD_TABLE(width)                                                    \
174 static GenOpFunc *gen_op_ld##width[] = {                                      \
175     &gen_op_ld##width##_raw,                                                  \
176 }
177 #define OP_ST_TABLE(width)                                                    \
178 static GenOpFunc *gen_op_st##width[] = {                                      \
179     &gen_op_st##width##_raw,                                                  \
180 }
181 #else
182 #define OP_LD_TABLE(width)                                                    \
183 static GenOpFunc *gen_op_ld##width[] = {                                      \
184     &gen_op_ld##width##_kernel,                                               \
185     &gen_op_ld##width##_executive,                                            \
186     &gen_op_ld##width##_supervisor,                                           \
187     &gen_op_ld##width##_user,                                                 \
188 }
189 #define OP_ST_TABLE(width)                                                    \
190 static GenOpFunc *gen_op_st##width[] = {                                      \
191     &gen_op_st##width##_kernel,                                               \
192     &gen_op_st##width##_executive,                                            \
193     &gen_op_st##width##_supervisor,                                           \
194     &gen_op_st##width##_user,                                                 \
195 }
196 #endif
197
198 #define GEN_LD(width)                                                         \
199 OP_LD_TABLE(width);                                                           \
200 static always_inline void gen_ld##width (DisasContext *ctx)                   \
201 {                                                                             \
202     (*gen_op_ld##width[ctx->mem_idx])();                                      \
203 }
204
205 #define GEN_ST(width)                                                         \
206 OP_ST_TABLE(width);                                                           \
207 static always_inline void gen_st##width (DisasContext *ctx)                   \
208 {                                                                             \
209     (*gen_op_st##width[ctx->mem_idx])();                                      \
210 }
211
212 GEN_LD(l);
213 GEN_ST(l);
214 GEN_LD(q);
215 GEN_ST(q);
216 GEN_LD(l_l);
217 GEN_ST(l_c);
218 GEN_LD(q_l);
219 GEN_ST(q_c);
220
221 #if 0 /* currently unused */
222 GEN_LD(f);
223 GEN_ST(f);
224 GEN_LD(g);
225 GEN_ST(g);
226 #endif /* 0 */
227 GEN_LD(s);
228 GEN_ST(s);
229 GEN_LD(t);
230 GEN_ST(t);
231
232 static always_inline void _gen_op_bcond (DisasContext *ctx)
233 {
234 #if 0 // Qemu does not know how to do this...
235     gen_op_bcond(ctx->pc);
236 #else
237     gen_op_bcond(ctx->pc >> 32, ctx->pc);
238 #endif
239 }
240
241 static always_inline void gen_excp (DisasContext *ctx,
242                                     int exception, int error_code)
243 {
244     TCGv tmp1, tmp2;
245
246     tcg_gen_movi_i64(cpu_pc, ctx->pc);
247     tmp1 = tcg_const_i32(exception);
248     tmp2 = tcg_const_i32(error_code);
249     tcg_gen_helper_0_2(helper_excp, tmp1, tmp2);
250     tcg_temp_free(tmp2);
251     tcg_temp_free(tmp1);
252 }
253
254 static always_inline void gen_invalid (DisasContext *ctx)
255 {
256     gen_excp(ctx, EXCP_OPCDEC, 0);
257 }
258
259 static always_inline void gen_load_mem_dyngen (DisasContext *ctx,
260                                         void (*gen_load_op)(DisasContext *ctx),
261                                         int ra, int rb, int32_t disp16,
262                                         int clear)
263 {
264     if (ra == 31 && disp16 == 0) {
265         /* UNOP */
266         gen_op_nop();
267     } else {
268         if (rb != 31)
269             tcg_gen_addi_i64(cpu_T[0], cpu_ir[rb], disp16);
270         else
271             tcg_gen_movi_i64(cpu_T[0], disp16);
272         if (clear)
273             tcg_gen_andi_i64(cpu_T[0], cpu_T[0], ~0x7);
274         (*gen_load_op)(ctx);
275         if (ra != 31)
276             tcg_gen_mov_i64(cpu_ir[ra], cpu_T[1]);
277     }
278 }
279
280 static always_inline void gen_load_mem (DisasContext *ctx,
281                                         void (*tcg_gen_qemu_load)(TCGv t0, TCGv t1, int flags),
282                                         int ra, int rb, int32_t disp16,
283                                         int clear)
284 {
285     TCGv addr;
286
287     if (unlikely(ra == 31))
288         return;
289
290     addr = tcg_temp_new(TCG_TYPE_I64);
291     if (rb != 31) {
292         tcg_gen_addi_i64(addr, cpu_ir[rb], disp16);
293         if (clear)
294             tcg_gen_andi_i64(addr, addr, ~0x7);
295     } else {
296         if (clear)
297             disp16 &= ~0x7;
298         tcg_gen_movi_i64(addr, disp16);
299     }
300     tcg_gen_qemu_load(cpu_ir[ra], addr, ctx->mem_idx);
301     tcg_temp_free(addr);
302 }
303
304 static always_inline void gen_store_mem_dyngen (DisasContext *ctx,
305                                          void (*gen_store_op)(DisasContext *ctx),
306                                          int ra, int rb, int32_t disp16,
307                                          int clear)
308 {
309     if (rb != 31)
310         tcg_gen_addi_i64(cpu_T[0], cpu_ir[rb], disp16);
311     else
312         tcg_gen_movi_i64(cpu_T[0], disp16);
313     if (clear)
314         tcg_gen_andi_i64(cpu_T[0], cpu_T[0], ~0x7);
315     if (ra != 31)
316         tcg_gen_mov_i64(cpu_T[1], cpu_ir[ra]);
317     else
318         tcg_gen_movi_i64(cpu_T[1], 0);
319     (*gen_store_op)(ctx);
320 }
321
322 static always_inline void gen_store_mem (DisasContext *ctx,
323                                          void (*tcg_gen_qemu_store)(TCGv t0, TCGv t1, int flags),
324                                          int ra, int rb, int32_t disp16,
325                                          int clear)
326 {
327     TCGv addr = tcg_temp_new(TCG_TYPE_I64);
328     if (rb != 31) {
329         tcg_gen_addi_i64(addr, cpu_ir[rb], disp16);
330         if (clear)
331             tcg_gen_andi_i64(addr, addr, ~0x7);
332     } else {
333         if (clear)
334             disp16 &= ~0x7;
335         tcg_gen_movi_i64(addr, disp16);
336     }
337     if (ra != 31)
338         tcg_gen_qemu_store(cpu_ir[ra], addr, ctx->mem_idx);
339     else {
340         TCGv zero = tcg_const_i64(0);
341         tcg_gen_qemu_store(zero, addr, ctx->mem_idx);
342         tcg_temp_free(zero);
343     }
344     tcg_temp_free(addr);
345 }
346
347 static always_inline void gen_load_fmem (DisasContext *ctx,
348                                          void (*gen_load_fop)(DisasContext *ctx),
349                                          int ra, int rb, int32_t disp16)
350 {
351     if (rb != 31)
352         tcg_gen_addi_i64(cpu_T[0], cpu_ir[rb], disp16);
353     else
354         tcg_gen_movi_i64(cpu_T[0], disp16);
355     (*gen_load_fop)(ctx);
356     gen_store_fir(ctx, ra, 1);
357 }
358
359 static always_inline void gen_store_fmem (DisasContext *ctx,
360                                           void (*gen_store_fop)(DisasContext *ctx),
361                                           int ra, int rb, int32_t disp16)
362 {
363     if (rb != 31)
364         tcg_gen_addi_i64(cpu_T[0], cpu_ir[rb], disp16);
365     else
366         tcg_gen_movi_i64(cpu_T[0], disp16);
367     gen_load_fir(ctx, ra, 1);
368     (*gen_store_fop)(ctx);
369 }
370
371 static always_inline void gen_bcond (DisasContext *ctx,
372                                      TCGCond cond,
373                                      int ra, int32_t disp16, int mask)
374 {
375     int l1, l2;
376
377     l1 = gen_new_label();
378     l2 = gen_new_label();
379     if (likely(ra != 31)) {
380         if (mask) {
381             TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
382             tcg_gen_andi_i64(tmp, cpu_ir[ra], 1);
383             tcg_gen_brcondi_i64(cond, tmp, 0, l1);
384             tcg_temp_free(tmp);
385         } else
386             tcg_gen_brcondi_i64(cond, cpu_ir[ra], 0, l1);
387     } else {
388         /* Very uncommon case - Do not bother to optimize.  */
389         TCGv tmp = tcg_const_i64(0);
390         tcg_gen_brcondi_i64(cond, tmp, 0, l1);
391         tcg_temp_free(tmp);
392     }
393     tcg_gen_movi_i64(cpu_pc, ctx->pc);
394     tcg_gen_br(l2);
395     gen_set_label(l1);
396     tcg_gen_movi_i64(cpu_pc, ctx->pc + (int64_t)(disp16 << 2));
397     gen_set_label(l2);
398 }
399
400 static always_inline void gen_fbcond (DisasContext *ctx,
401                                       void (*gen_test_op)(void),
402                                       int ra, int32_t disp16)
403 {
404     tcg_gen_movi_i64(cpu_T[1], ctx->pc + (int64_t)(disp16 << 2));
405     gen_load_fir(ctx, ra, 0);
406     (*gen_test_op)();
407     _gen_op_bcond(ctx);
408 }
409
410 static always_inline void gen_cmov (DisasContext *ctx,
411                                     TCGCond inv_cond,
412                                     int ra, int rb, int rc,
413                                     int islit, uint8_t lit, int mask)
414 {
415     int l1;
416
417     if (unlikely(rc == 31))
418         return;
419
420     l1 = gen_new_label();
421
422     if (ra != 31) {
423         if (mask) {
424             TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
425             tcg_gen_andi_i64(tmp, cpu_ir[ra], 1);
426             tcg_gen_brcondi_i64(inv_cond, tmp, 0, l1);
427             tcg_temp_free(tmp);
428         } else
429             tcg_gen_brcondi_i64(inv_cond, cpu_ir[ra], 0, l1);
430     } else {
431         /* Very uncommon case - Do not bother to optimize.  */
432         TCGv tmp = tcg_const_i64(0);
433         tcg_gen_brcondi_i64(inv_cond, tmp, 0, l1);
434         tcg_temp_free(tmp);
435     }
436
437     if (islit)
438         tcg_gen_movi_i64(cpu_ir[rc], lit);
439     else
440         tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
441     gen_set_label(l1);
442 }
443
444 static always_inline void gen_farith2 (DisasContext *ctx,
445                                        void (*gen_arith_fop)(void),
446                                        int rb, int rc)
447 {
448     gen_load_fir(ctx, rb, 0);
449     (*gen_arith_fop)();
450     gen_store_fir(ctx, rc, 0);
451 }
452
453 static always_inline void gen_farith3 (DisasContext *ctx,
454                                        void (*gen_arith_fop)(void),
455                                        int ra, int rb, int rc)
456 {
457     gen_load_fir(ctx, ra, 0);
458     gen_load_fir(ctx, rb, 1);
459     (*gen_arith_fop)();
460     gen_store_fir(ctx, rc, 0);
461 }
462
463 static always_inline void gen_fcmov (DisasContext *ctx,
464                                      void (*gen_test_fop)(void),
465                                      int ra, int rb, int rc)
466 {
467     gen_load_fir(ctx, ra, 0);
468     gen_load_fir(ctx, rb, 1);
469     (*gen_test_fop)();
470     gen_op_cmov_fir(rc);
471 }
472
473 static always_inline void gen_fti (DisasContext *ctx,
474                                    void (*gen_move_fop)(void),
475                                    int ra, int rc)
476 {
477     gen_load_fir(ctx, rc, 0);
478     (*gen_move_fop)();
479     if (ra != 31)
480         tcg_gen_mov_i64(cpu_ir[ra], cpu_T[0]);
481 }
482
483 static always_inline void gen_itf (DisasContext *ctx,
484                                    void (*gen_move_fop)(void),
485                                    int ra, int rc)
486 {
487     if (ra != 31)
488         tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]);
489     else
490         tcg_gen_movi_i64(cpu_T[0], 0);
491     (*gen_move_fop)();
492     gen_store_fir(ctx, rc, 0);
493 }
494
495 /* EXTWH, EXTWH, EXTLH, EXTQH */
496 static always_inline void gen_ext_h(void (*tcg_gen_ext_i64)(TCGv t0, TCGv t1),
497                                     int ra, int rb, int rc,
498                                     int islit, uint8_t lit)
499 {
500     if (unlikely(rc == 31))
501         return;
502
503     if (ra != 31) {
504         if (islit) {
505             if (lit != 0)
506                 tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 64 - ((lit & 7) * 8));
507             else
508                 tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
509         } else {
510             TCGv tmp1, tmp2;
511             tmp1 = tcg_temp_new(TCG_TYPE_I64);
512             tcg_gen_andi_i64(tmp1, cpu_ir[rb], 7);
513             tcg_gen_shli_i64(tmp1, tmp1, 3);
514             tmp2 = tcg_const_i64(64);
515             tcg_gen_sub_i64(tmp1, tmp2, tmp1);
516             tcg_temp_free(tmp2);
517             tcg_gen_shl_i64(cpu_ir[rc], cpu_ir[ra], tmp1);
518             tcg_temp_free(tmp1);
519         }
520         if (tcg_gen_ext_i64)
521             tcg_gen_ext_i64(cpu_ir[rc], cpu_ir[rc]);
522     } else
523         tcg_gen_movi_i64(cpu_ir[rc], 0);
524 }
525
526 /* EXTBL, EXTWL, EXTWL, EXTLL, EXTQL */
527 static always_inline void gen_ext_l(void (*tcg_gen_ext_i64)(TCGv t0, TCGv t1),
528                                     int ra, int rb, int rc,
529                                     int islit, uint8_t lit)
530 {
531     if (unlikely(rc == 31))
532         return;
533
534     if (ra != 31) {
535         if (islit) {
536                 tcg_gen_shri_i64(cpu_ir[rc], cpu_ir[ra], (lit & 7) * 8);
537         } else {
538             TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
539             tcg_gen_andi_i64(tmp, cpu_ir[rb], 7);
540             tcg_gen_shli_i64(tmp, tmp, 3);
541             tcg_gen_shr_i64(cpu_ir[rc], cpu_ir[ra], tmp);
542             tcg_temp_free(tmp);
543         }
544         if (tcg_gen_ext_i64)
545             tcg_gen_ext_i64(cpu_ir[rc], cpu_ir[rc]);
546     } else
547         tcg_gen_movi_i64(cpu_ir[rc], 0);
548 }
549
550 /* Code to call arith3 helpers */
551 static always_inline void gen_arith3_helper(void *helper,
552                                             int ra, int rb, int rc,
553                                             int islit, uint8_t lit)
554 {
555     if (unlikely(rc == 31))
556         return;
557
558     if (ra != 31) {
559         if (islit) {
560             TCGv tmp = tcg_const_i64(lit);
561             tcg_gen_helper_1_2(helper, cpu_ir[rc], cpu_ir[ra], tmp);
562             tcg_temp_free(tmp);
563         } else
564             tcg_gen_helper_1_2(helper, cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
565     } else {
566         TCGv tmp1 = tcg_const_i64(0);
567         if (islit) {
568             TCGv tmp2 = tcg_const_i64(lit);
569             tcg_gen_helper_1_2(helper, cpu_ir[rc], tmp1, tmp2);
570             tcg_temp_free(tmp2);
571         } else
572             tcg_gen_helper_1_2(helper, cpu_ir[rc], tmp1, cpu_ir[rb]);
573         tcg_temp_free(tmp1);
574     }
575 }
576
577 static always_inline void gen_cmp(TCGCond cond,
578                                   int ra, int rb, int rc,
579                                   int islit, uint8_t lit)
580 {
581     int l1, l2;
582     TCGv tmp;
583
584     if (unlikely(rc == 31))
585     return;
586
587     l1 = gen_new_label();
588     l2 = gen_new_label();
589
590     if (ra != 31) {
591         tmp = tcg_temp_new(TCG_TYPE_I64);
592         tcg_gen_mov_i64(tmp, cpu_ir[ra]);
593     } else
594         tmp = tcg_const_i64(0);
595     if (islit)
596         tcg_gen_brcondi_i64(cond, tmp, lit, l1);
597     else
598         tcg_gen_brcond_i64(cond, tmp, cpu_ir[rb], l1);
599
600     tcg_gen_movi_i64(cpu_ir[rc], 0);
601     tcg_gen_br(l2);
602     gen_set_label(l1);
603     tcg_gen_movi_i64(cpu_ir[rc], 1);
604     gen_set_label(l2);
605 }
606
607 static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
608 {
609     uint32_t palcode;
610     int32_t disp21, disp16, disp12;
611     uint16_t fn11, fn16;
612     uint8_t opc, ra, rb, rc, sbz, fpfn, fn7, fn2, islit;
613     uint8_t lit;
614     int ret;
615
616     /* Decode all instruction fields */
617     opc = insn >> 26;
618     ra = (insn >> 21) & 0x1F;
619     rb = (insn >> 16) & 0x1F;
620     rc = insn & 0x1F;
621     sbz = (insn >> 13) & 0x07;
622     islit = (insn >> 12) & 1;
623     if (rb == 31 && !islit) {
624         islit = 1;
625         lit = 0;
626     } else
627         lit = (insn >> 13) & 0xFF;
628     palcode = insn & 0x03FFFFFF;
629     disp21 = ((int32_t)((insn & 0x001FFFFF) << 11)) >> 11;
630     disp16 = (int16_t)(insn & 0x0000FFFF);
631     disp12 = (int32_t)((insn & 0x00000FFF) << 20) >> 20;
632     fn16 = insn & 0x0000FFFF;
633     fn11 = (insn >> 5) & 0x000007FF;
634     fpfn = fn11 & 0x3F;
635     fn7 = (insn >> 5) & 0x0000007F;
636     fn2 = (insn >> 5) & 0x00000003;
637     ret = 0;
638 #if defined ALPHA_DEBUG_DISAS
639     if (logfile != NULL) {
640         fprintf(logfile, "opc %02x ra %d rb %d rc %d disp16 %04x\n",
641                 opc, ra, rb, rc, disp16);
642     }
643 #endif
644     switch (opc) {
645     case 0x00:
646         /* CALL_PAL */
647         if (palcode >= 0x80 && palcode < 0xC0) {
648             /* Unprivileged PAL call */
649             gen_excp(ctx, EXCP_CALL_PAL + ((palcode & 0x1F) << 6), 0);
650 #if !defined (CONFIG_USER_ONLY)
651         } else if (palcode < 0x40) {
652             /* Privileged PAL code */
653             if (ctx->mem_idx & 1)
654                 goto invalid_opc;
655             else
656                 gen_excp(ctx, EXCP_CALL_PALP + ((palcode & 0x1F) << 6), 0);
657 #endif
658         } else {
659             /* Invalid PAL call */
660             goto invalid_opc;
661         }
662         ret = 3;
663         break;
664     case 0x01:
665         /* OPC01 */
666         goto invalid_opc;
667     case 0x02:
668         /* OPC02 */
669         goto invalid_opc;
670     case 0x03:
671         /* OPC03 */
672         goto invalid_opc;
673     case 0x04:
674         /* OPC04 */
675         goto invalid_opc;
676     case 0x05:
677         /* OPC05 */
678         goto invalid_opc;
679     case 0x06:
680         /* OPC06 */
681         goto invalid_opc;
682     case 0x07:
683         /* OPC07 */
684         goto invalid_opc;
685     case 0x08:
686         /* LDA */
687         if (likely(ra != 31)) {
688             if (rb != 31)
689                 tcg_gen_addi_i64(cpu_ir[ra], cpu_ir[rb], disp16);
690             else
691                 tcg_gen_movi_i64(cpu_ir[ra], disp16);
692         }
693         break;
694     case 0x09:
695         /* LDAH */
696         if (likely(ra != 31)) {
697             if (rb != 31)
698                 tcg_gen_addi_i64(cpu_ir[ra], cpu_ir[rb], disp16 << 16);
699             else
700                 tcg_gen_movi_i64(cpu_ir[ra], disp16 << 16);
701         }
702         break;
703     case 0x0A:
704         /* LDBU */
705         if (!(ctx->amask & AMASK_BWX))
706             goto invalid_opc;
707         gen_load_mem(ctx, &tcg_gen_qemu_ld8u, ra, rb, disp16, 0);
708         break;
709     case 0x0B:
710         /* LDQ_U */
711         gen_load_mem(ctx, &tcg_gen_qemu_ld64, ra, rb, disp16, 1);
712         break;
713     case 0x0C:
714         /* LDWU */
715         if (!(ctx->amask & AMASK_BWX))
716             goto invalid_opc;
717         gen_load_mem(ctx, &tcg_gen_qemu_ld16u, ra, rb, disp16, 1);
718         break;
719     case 0x0D:
720         /* STW */
721         gen_store_mem(ctx, &tcg_gen_qemu_st16, ra, rb, disp16, 0);
722         break;
723     case 0x0E:
724         /* STB */
725         gen_store_mem(ctx, &tcg_gen_qemu_st8, ra, rb, disp16, 0);
726         break;
727     case 0x0F:
728         /* STQ_U */
729         gen_store_mem(ctx, &tcg_gen_qemu_st64, ra, rb, disp16, 1);
730         break;
731     case 0x10:
732         switch (fn7) {
733         case 0x00:
734             /* ADDL */
735             if (likely(rc != 31)) {
736                 if (ra != 31) {
737                     if (islit) {
738                         tcg_gen_addi_i64(cpu_ir[rc], cpu_ir[ra], lit);
739                         tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
740                     } else {
741                         tcg_gen_add_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
742                         tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
743                     }
744                 } else {
745                     if (islit)
746                         tcg_gen_movi_i64(cpu_ir[rc], lit);
747                     else
748                         tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
749                 }
750             }
751             break;
752         case 0x02:
753             /* S4ADDL */
754             if (likely(rc != 31)) {
755                 if (ra != 31) {
756                     TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
757                     tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
758                     if (islit)
759                         tcg_gen_addi_i64(tmp, tmp, lit);
760                     else
761                         tcg_gen_add_i64(tmp, tmp, cpu_ir[rb]);
762                     tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
763                     tcg_temp_free(tmp);
764                 } else {
765                     if (islit)
766                         tcg_gen_movi_i64(cpu_ir[rc], lit);
767                     else
768                         tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
769                 }
770             }
771             break;
772         case 0x09:
773             /* SUBL */
774             if (likely(rc != 31)) {
775                 if (ra != 31) {
776                     if (islit)
777                         tcg_gen_subi_i64(cpu_ir[rc], cpu_ir[ra], lit);
778                     else
779                         tcg_gen_sub_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
780                     tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
781                 } else {
782                     if (islit)
783                         tcg_gen_movi_i64(cpu_ir[rc], -lit);
784                     else {
785                         tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
786                         tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
787                 }
788             }
789             break;
790         case 0x0B:
791             /* S4SUBL */
792             if (likely(rc != 31)) {
793                 if (ra != 31) {
794                     TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
795                     tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
796                     if (islit)
797                         tcg_gen_subi_i64(tmp, tmp, lit);
798                     else
799                         tcg_gen_sub_i64(tmp, tmp, cpu_ir[rb]);
800                     tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
801                     tcg_temp_free(tmp);
802                 } else {
803                     if (islit)
804                         tcg_gen_movi_i64(cpu_ir[rc], -lit);
805                     else {
806                         tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
807                         tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
808                     }
809                 }
810             }
811             break;
812         case 0x0F:
813             /* CMPBGE */
814             gen_arith3_helper(helper_cmpbge, ra, rb, rc, islit, lit);
815             break;
816         case 0x12:
817             /* S8ADDL */
818             if (likely(rc != 31)) {
819                 if (ra != 31) {
820                     TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
821                     tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
822                     if (islit)
823                         tcg_gen_addi_i64(tmp, tmp, lit);
824                     else
825                         tcg_gen_add_i64(tmp, tmp, cpu_ir[rb]);
826                     tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
827                     tcg_temp_free(tmp);
828                 } else {
829                     if (islit)
830                         tcg_gen_movi_i64(cpu_ir[rc], lit);
831                     else
832                         tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
833                 }
834             }
835             break;
836         case 0x1B:
837             /* S8SUBL */
838             if (likely(rc != 31)) {
839                 if (ra != 31) {
840                     TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
841                     tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
842                     if (islit)
843                         tcg_gen_subi_i64(tmp, tmp, lit);
844                     else
845                        tcg_gen_sub_i64(tmp, tmp, cpu_ir[rb]);
846                     tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
847                     tcg_temp_free(tmp);
848                 } else {
849                     if (islit)
850                         tcg_gen_movi_i64(cpu_ir[rc], -lit);
851                     else
852                         tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
853                         tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
854                     }
855                 }
856             }
857             break;
858         case 0x1D:
859             /* CMPULT */
860             gen_cmp(TCG_COND_LTU, ra, rb, rc, islit, lit);
861             break;
862         case 0x20:
863             /* ADDQ */
864             if (likely(rc != 31)) {
865                 if (ra != 31) {
866                     if (islit)
867                         tcg_gen_addi_i64(cpu_ir[rc], cpu_ir[ra], lit);
868                     else
869                         tcg_gen_add_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
870                 } else {
871                     if (islit)
872                         tcg_gen_movi_i64(cpu_ir[rc], lit);
873                     else
874                         tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
875                 }
876             }
877             break;
878         case 0x22:
879             /* S4ADDQ */
880             if (likely(rc != 31)) {
881                 if (ra != 31) {
882                     TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
883                     tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
884                     if (islit)
885                         tcg_gen_addi_i64(cpu_ir[rc], tmp, lit);
886                     else
887                         tcg_gen_add_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
888                     tcg_temp_free(tmp);
889                 } else {
890                     if (islit)
891                         tcg_gen_movi_i64(cpu_ir[rc], lit);
892                     else
893                         tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
894                 }
895             }
896             break;
897         case 0x29:
898             /* SUBQ */
899             if (likely(rc != 31)) {
900                 if (ra != 31) {
901                     if (islit)
902                         tcg_gen_subi_i64(cpu_ir[rc], cpu_ir[ra], lit);
903                     else
904                         tcg_gen_sub_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
905                 } else {
906                     if (islit)
907                         tcg_gen_movi_i64(cpu_ir[rc], -lit);
908                     else
909                         tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
910                 }
911             }
912             break;
913         case 0x2B:
914             /* S4SUBQ */
915             if (likely(rc != 31)) {
916                 if (ra != 31) {
917                     TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
918                     tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
919                     if (islit)
920                         tcg_gen_subi_i64(cpu_ir[rc], tmp, lit);
921                     else
922                         tcg_gen_sub_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
923                     tcg_temp_free(tmp);
924                 } else {
925                     if (islit)
926                         tcg_gen_movi_i64(cpu_ir[rc], -lit);
927                     else
928                         tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
929                 }
930             }
931             break;
932         case 0x2D:
933             /* CMPEQ */
934             gen_cmp(TCG_COND_EQ, ra, rb, rc, islit, lit);
935             break;
936         case 0x32:
937             /* S8ADDQ */
938             if (likely(rc != 31)) {
939                 if (ra != 31) {
940                     TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
941                     tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
942                     if (islit)
943                         tcg_gen_addi_i64(cpu_ir[rc], tmp, lit);
944                     else
945                         tcg_gen_add_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
946                     tcg_temp_free(tmp);
947                 } else {
948                     if (islit)
949                         tcg_gen_movi_i64(cpu_ir[rc], lit);
950                     else
951                         tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
952                 }
953             }
954             break;
955         case 0x3B:
956             /* S8SUBQ */
957             if (likely(rc != 31)) {
958                 if (ra != 31) {
959                     TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
960                     tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
961                     if (islit)
962                         tcg_gen_subi_i64(cpu_ir[rc], tmp, lit);
963                     else
964                         tcg_gen_sub_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
965                     tcg_temp_free(tmp);
966                 } else {
967                     if (islit)
968                         tcg_gen_movi_i64(cpu_ir[rc], -lit);
969                     else
970                         tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
971                 }
972             }
973             break;
974         case 0x3D:
975             /* CMPULE */
976             gen_cmp(TCG_COND_LEU, ra, rb, rc, islit, lit);
977             break;
978         case 0x40:
979             /* ADDL/V */
980             gen_arith3_helper(helper_addlv, ra, rb, rc, islit, lit);
981             break;
982         case 0x49:
983             /* SUBL/V */
984             gen_arith3_helper(helper_sublv, ra, rb, rc, islit, lit);
985             break;
986         case 0x4D:
987             /* CMPLT */
988             gen_cmp(TCG_COND_LT, ra, rb, rc, islit, lit);
989             break;
990         case 0x60:
991             /* ADDQ/V */
992             gen_arith3_helper(helper_addqv, ra, rb, rc, islit, lit);
993             break;
994         case 0x69:
995             /* SUBQ/V */
996             gen_arith3_helper(helper_subqv, ra, rb, rc, islit, lit);
997             break;
998         case 0x6D:
999             /* CMPLE */
1000             gen_cmp(TCG_COND_LE, ra, rb, rc, islit, lit);
1001             break;
1002         default:
1003             goto invalid_opc;
1004         }
1005         break;
1006     case 0x11:
1007         switch (fn7) {
1008         case 0x00:
1009             /* AND */
1010             if (likely(rc != 31)) {
1011                 if (ra == 31)
1012                     tcg_gen_movi_i64(cpu_ir[rc], 0);
1013                 else if (islit)
1014                     tcg_gen_andi_i64(cpu_ir[rc], cpu_ir[ra], lit);
1015                 else
1016                     tcg_gen_and_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1017             }
1018             break;
1019         case 0x08:
1020             /* BIC */
1021             if (likely(rc != 31)) {
1022                 if (ra != 31) {
1023                     if (islit)
1024                         tcg_gen_andi_i64(cpu_ir[rc], cpu_ir[ra], ~lit);
1025                     else {
1026                         TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
1027                         tcg_gen_not_i64(tmp, cpu_ir[rb]);
1028                         tcg_gen_and_i64(cpu_ir[rc], cpu_ir[ra], tmp);
1029                         tcg_temp_free(tmp);
1030                     }
1031                 } else
1032                     tcg_gen_movi_i64(cpu_ir[rc], 0);
1033             }
1034             break;
1035         case 0x14:
1036             /* CMOVLBS */
1037             gen_cmov(ctx, TCG_COND_EQ, ra, rb, rc, islit, lit, 1);
1038             break;
1039         case 0x16:
1040             /* CMOVLBC */
1041             gen_cmov(ctx, TCG_COND_NE, ra, rb, rc, islit, lit, 1);
1042             break;
1043         case 0x20:
1044             /* BIS */
1045             if (likely(rc != 31)) {
1046                 if (ra != 31) {
1047                     if (islit)
1048                         tcg_gen_ori_i64(cpu_ir[rc], cpu_ir[ra], lit);
1049                     else
1050                         tcg_gen_or_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1051                 } else {
1052                     if (islit)
1053                         tcg_gen_movi_i64(cpu_ir[rc], lit);
1054                     else
1055                         tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
1056                 }
1057             }
1058             break;
1059         case 0x24:
1060             /* CMOVEQ */
1061             gen_cmov(ctx, TCG_COND_NE, ra, rb, rc, islit, lit, 0);
1062             break;
1063         case 0x26:
1064             /* CMOVNE */
1065             gen_cmov(ctx, TCG_COND_EQ, ra, rb, rc, islit, lit, 0);
1066             break;
1067         case 0x28:
1068             /* ORNOT */
1069             if (likely(rc != 31)) {
1070                 if (ra != 31) {
1071                     if (islit)
1072                         tcg_gen_ori_i64(cpu_ir[rc], cpu_ir[ra], ~lit);
1073                     else {
1074                         TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
1075                         tcg_gen_not_i64(tmp, cpu_ir[rb]);
1076                         tcg_gen_or_i64(cpu_ir[rc], cpu_ir[ra], tmp);
1077                         tcg_temp_free(tmp);
1078                     }
1079                 } else {
1080                     if (islit)
1081                         tcg_gen_movi_i64(cpu_ir[rc], ~lit);
1082                     else
1083                         tcg_gen_not_i64(cpu_ir[rc], cpu_ir[rb]);
1084                 }
1085             }
1086             break;
1087         case 0x40:
1088             /* XOR */
1089             if (likely(rc != 31)) {
1090                 if (ra != 31) {
1091                     if (islit)
1092                         tcg_gen_xori_i64(cpu_ir[rc], cpu_ir[ra], lit);
1093                     else
1094                         tcg_gen_xor_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1095                 } else {
1096                     if (islit)
1097                         tcg_gen_movi_i64(cpu_ir[rc], lit);
1098                     else
1099                         tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
1100                 }
1101             }
1102             break;
1103         case 0x44:
1104             /* CMOVLT */
1105             gen_cmov(ctx, TCG_COND_GE, ra, rb, rc, islit, lit, 0);
1106             break;
1107         case 0x46:
1108             /* CMOVGE */
1109             gen_cmov(ctx, TCG_COND_LT, ra, rb, rc, islit, lit, 0);
1110             break;
1111         case 0x48:
1112             /* EQV */
1113             if (likely(rc != 31)) {
1114                 if (ra != 31) {
1115                     if (islit)
1116                         tcg_gen_xori_i64(cpu_ir[rc], cpu_ir[ra], ~lit);
1117                     else {
1118                         TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
1119                         tcg_gen_not_i64(tmp, cpu_ir[rb]);
1120                         tcg_gen_xor_i64(cpu_ir[rc], cpu_ir[ra], tmp);
1121                         tcg_temp_free(tmp);
1122                     }
1123                 } else {
1124                     if (islit)
1125                         tcg_gen_movi_i64(cpu_ir[rc], ~lit);
1126                     else
1127                         tcg_gen_not_i64(cpu_ir[rc], cpu_ir[rb]);
1128                 }
1129             }
1130             break;
1131         case 0x61:
1132             /* AMASK */
1133             if (likely(rc != 31)) {
1134                 if (islit)
1135                     tcg_gen_movi_i64(cpu_ir[rc], helper_amask(lit));
1136                 else
1137                     tcg_gen_helper_1_1(helper_amask, cpu_ir[rc], cpu_ir[rb]);
1138             }
1139             break;
1140         case 0x64:
1141             /* CMOVLE */
1142             gen_cmov(ctx, TCG_COND_GT, ra, rb, rc, islit, lit, 0);
1143             break;
1144         case 0x66:
1145             /* CMOVGT */
1146             gen_cmov(ctx, TCG_COND_LE, ra, rb, rc, islit, lit, 0);
1147             break;
1148         case 0x6C:
1149             /* IMPLVER */
1150             if (rc != 31)
1151                 tcg_gen_helper_1_0(helper_load_implver, cpu_ir[rc]);
1152             break;
1153         default:
1154             goto invalid_opc;
1155         }
1156         break;
1157     case 0x12:
1158         switch (fn7) {
1159         case 0x02:
1160             /* MSKBL */
1161             gen_arith3_helper(helper_mskbl, ra, rb, rc, islit, lit);
1162             break;
1163         case 0x06:
1164             /* EXTBL */
1165             gen_ext_l(&tcg_gen_ext8u_i64, ra, rb, rc, islit, lit);
1166             break;
1167         case 0x0B:
1168             /* INSBL */
1169             gen_arith3_helper(helper_insbl, ra, rb, rc, islit, lit);
1170             break;
1171         case 0x12:
1172             /* MSKWL */
1173             gen_arith3_helper(helper_mskwl, ra, rb, rc, islit, lit);
1174             break;
1175         case 0x16:
1176             /* EXTWL */
1177             gen_ext_l(&tcg_gen_ext16u_i64, ra, rb, rc, islit, lit);
1178             break;
1179         case 0x1B:
1180             /* INSWL */
1181             gen_arith3_helper(helper_inswl, ra, rb, rc, islit, lit);
1182             break;
1183         case 0x22:
1184             /* MSKLL */
1185             gen_arith3_helper(helper_mskll, ra, rb, rc, islit, lit);
1186             break;
1187         case 0x26:
1188             /* EXTLL */
1189             gen_ext_l(&tcg_gen_ext32u_i64, ra, rb, rc, islit, lit);
1190             break;
1191         case 0x2B:
1192             /* INSLL */
1193             gen_arith3_helper(helper_insll, ra, rb, rc, islit, lit);
1194             break;
1195         case 0x30:
1196             /* ZAP */
1197             gen_arith3_helper(helper_zap, ra, rb, rc, islit, lit);
1198             break;
1199         case 0x31:
1200             /* ZAPNOT */
1201             gen_arith3_helper(helper_zapnot, ra, rb, rc, islit, lit);
1202             break;
1203         case 0x32:
1204             /* MSKQL */
1205             gen_arith3_helper(helper_mskql, ra, rb, rc, islit, lit);
1206             break;
1207         case 0x34:
1208             /* SRL */
1209             if (likely(rc != 31)) {
1210                 if (ra != 31) {
1211                     if (islit)
1212                         tcg_gen_shri_i64(cpu_ir[rc], cpu_ir[ra], lit & 0x3f);
1213                     else {
1214                         TCGv shift = tcg_temp_new(TCG_TYPE_I64);
1215                         tcg_gen_andi_i64(shift, cpu_ir[rb], 0x3f);
1216                         tcg_gen_shr_i64(cpu_ir[rc], cpu_ir[ra], shift);
1217                         tcg_temp_free(shift);
1218                     }
1219                 } else
1220                     tcg_gen_movi_i64(cpu_ir[rc], 0);
1221             }
1222             break;
1223         case 0x36:
1224             /* EXTQL */
1225             gen_ext_l(NULL, ra, rb, rc, islit, lit);
1226             break;
1227         case 0x39:
1228             /* SLL */
1229             if (likely(rc != 31)) {
1230                 if (ra != 31) {
1231                     if (islit)
1232                         tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], lit & 0x3f);
1233                     else {
1234                         TCGv shift = tcg_temp_new(TCG_TYPE_I64);
1235                         tcg_gen_andi_i64(shift, cpu_ir[rb], 0x3f);
1236                         tcg_gen_shl_i64(cpu_ir[rc], cpu_ir[ra], shift);
1237                         tcg_temp_free(shift);
1238                     }
1239                 } else
1240                     tcg_gen_movi_i64(cpu_ir[rc], 0);
1241             }
1242             break;
1243         case 0x3B:
1244             /* INSQL */
1245             gen_arith3_helper(helper_insql, ra, rb, rc, islit, lit);
1246             break;
1247         case 0x3C:
1248             /* SRA */
1249             if (likely(rc != 31)) {
1250                 if (ra != 31) {
1251                     if (islit)
1252                         tcg_gen_sari_i64(cpu_ir[rc], cpu_ir[ra], lit & 0x3f);
1253                     else {
1254                         TCGv shift = tcg_temp_new(TCG_TYPE_I64);
1255                         tcg_gen_andi_i64(shift, cpu_ir[rb], 0x3f);
1256                         tcg_gen_sar_i64(cpu_ir[rc], cpu_ir[ra], shift);
1257                         tcg_temp_free(shift);
1258                     }
1259                 } else
1260                     tcg_gen_movi_i64(cpu_ir[rc], 0);
1261             }
1262             break;
1263         case 0x52:
1264             /* MSKWH */
1265             gen_arith3_helper(helper_mskwh, ra, rb, rc, islit, lit);
1266             break;
1267         case 0x57:
1268             /* INSWH */
1269             gen_arith3_helper(helper_inswh, ra, rb, rc, islit, lit);
1270             break;
1271         case 0x5A:
1272             /* EXTWH */
1273             gen_ext_h(&tcg_gen_ext16u_i64, ra, rb, rc, islit, lit);
1274             break;
1275         case 0x62:
1276             /* MSKLH */
1277             gen_arith3_helper(helper_msklh, ra, rb, rc, islit, lit);
1278             break;
1279         case 0x67:
1280             /* INSLH */
1281             gen_arith3_helper(helper_inslh, ra, rb, rc, islit, lit);
1282             break;
1283         case 0x6A:
1284             /* EXTLH */
1285             gen_ext_h(&tcg_gen_ext16u_i64, ra, rb, rc, islit, lit);
1286             break;
1287         case 0x72:
1288             /* MSKQH */
1289             gen_arith3_helper(helper_mskqh, ra, rb, rc, islit, lit);
1290             break;
1291         case 0x77:
1292             /* INSQH */
1293             gen_arith3_helper(helper_insqh, ra, rb, rc, islit, lit);
1294             break;
1295         case 0x7A:
1296             /* EXTQH */
1297             gen_ext_h(NULL, ra, rb, rc, islit, lit);
1298             break;
1299         default:
1300             goto invalid_opc;
1301         }
1302         break;
1303     case 0x13:
1304         switch (fn7) {
1305         case 0x00:
1306             /* MULL */
1307             if (likely(rc != 31)) {
1308                 if (ra == 31)
1309                     tcg_gen_movi_i64(cpu_ir[rc], 0);
1310                 else {
1311                     if (islit)
1312                         tcg_gen_muli_i64(cpu_ir[rc], cpu_ir[ra], lit);
1313                     else
1314                         tcg_gen_mul_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1315                     tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
1316                 }
1317             }
1318             break;
1319         case 0x20:
1320             /* MULQ */
1321             if (likely(rc != 31)) {
1322                 if (ra == 31)
1323                     tcg_gen_movi_i64(cpu_ir[rc], 0);
1324                 else if (islit)
1325                     tcg_gen_muli_i64(cpu_ir[rc], cpu_ir[ra], lit);
1326                 else
1327                     tcg_gen_mul_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1328             }
1329             break;
1330         case 0x30:
1331             /* UMULH */
1332             gen_arith3_helper(helper_umulh, ra, rb, rc, islit, lit);
1333             break;
1334         case 0x40:
1335             /* MULL/V */
1336             gen_arith3_helper(helper_mullv, ra, rb, rc, islit, lit);
1337             break;
1338         case 0x60:
1339             /* MULQ/V */
1340             gen_arith3_helper(helper_mulqv, ra, rb, rc, islit, lit);
1341             break;
1342         default:
1343             goto invalid_opc;
1344         }
1345         break;
1346     case 0x14:
1347         switch (fpfn) { /* f11 & 0x3F */
1348         case 0x04:
1349             /* ITOFS */
1350             if (!(ctx->amask & AMASK_FIX))
1351                 goto invalid_opc;
1352             gen_itf(ctx, &gen_op_itofs, ra, rc);
1353             break;
1354         case 0x0A:
1355             /* SQRTF */
1356             if (!(ctx->amask & AMASK_FIX))
1357                 goto invalid_opc;
1358             gen_farith2(ctx, &gen_op_sqrtf, rb, rc);
1359             break;
1360         case 0x0B:
1361             /* SQRTS */
1362             if (!(ctx->amask & AMASK_FIX))
1363                 goto invalid_opc;
1364             gen_farith2(ctx, &gen_op_sqrts, rb, rc);
1365             break;
1366         case 0x14:
1367             /* ITOFF */
1368             if (!(ctx->amask & AMASK_FIX))
1369                 goto invalid_opc;
1370 #if 0 // TODO
1371             gen_itf(ctx, &gen_op_itoff, ra, rc);
1372 #else
1373             goto invalid_opc;
1374 #endif
1375             break;
1376         case 0x24:
1377             /* ITOFT */
1378             if (!(ctx->amask & AMASK_FIX))
1379                 goto invalid_opc;
1380             gen_itf(ctx, &gen_op_itoft, ra, rc);
1381             break;
1382         case 0x2A:
1383             /* SQRTG */
1384             if (!(ctx->amask & AMASK_FIX))
1385                 goto invalid_opc;
1386             gen_farith2(ctx, &gen_op_sqrtg, rb, rc);
1387             break;
1388         case 0x02B:
1389             /* SQRTT */
1390             if (!(ctx->amask & AMASK_FIX))
1391                 goto invalid_opc;
1392             gen_farith2(ctx, &gen_op_sqrtt, rb, rc);
1393             break;
1394         default:
1395             goto invalid_opc;
1396         }
1397         break;
1398     case 0x15:
1399         /* VAX floating point */
1400         /* XXX: rounding mode and trap are ignored (!) */
1401         switch (fpfn) { /* f11 & 0x3F */
1402         case 0x00:
1403             /* ADDF */
1404             gen_farith3(ctx, &gen_op_addf, ra, rb, rc);
1405             break;
1406         case 0x01:
1407             /* SUBF */
1408             gen_farith3(ctx, &gen_op_subf, ra, rb, rc);
1409             break;
1410         case 0x02:
1411             /* MULF */
1412             gen_farith3(ctx, &gen_op_mulf, ra, rb, rc);
1413             break;
1414         case 0x03:
1415             /* DIVF */
1416             gen_farith3(ctx, &gen_op_divf, ra, rb, rc);
1417             break;
1418         case 0x1E:
1419             /* CVTDG */
1420 #if 0 // TODO
1421             gen_farith2(ctx, &gen_op_cvtdg, rb, rc);
1422 #else
1423             goto invalid_opc;
1424 #endif
1425             break;
1426         case 0x20:
1427             /* ADDG */
1428             gen_farith3(ctx, &gen_op_addg, ra, rb, rc);
1429             break;
1430         case 0x21:
1431             /* SUBG */
1432             gen_farith3(ctx, &gen_op_subg, ra, rb, rc);
1433             break;
1434         case 0x22:
1435             /* MULG */
1436             gen_farith3(ctx, &gen_op_mulg, ra, rb, rc);
1437             break;
1438         case 0x23:
1439             /* DIVG */
1440             gen_farith3(ctx, &gen_op_divg, ra, rb, rc);
1441             break;
1442         case 0x25:
1443             /* CMPGEQ */
1444             gen_farith3(ctx, &gen_op_cmpgeq, ra, rb, rc);
1445             break;
1446         case 0x26:
1447             /* CMPGLT */
1448             gen_farith3(ctx, &gen_op_cmpglt, ra, rb, rc);
1449             break;
1450         case 0x27:
1451             /* CMPGLE */
1452             gen_farith3(ctx, &gen_op_cmpgle, ra, rb, rc);
1453             break;
1454         case 0x2C:
1455             /* CVTGF */
1456             gen_farith2(ctx, &gen_op_cvtgf, rb, rc);
1457             break;
1458         case 0x2D:
1459             /* CVTGD */
1460 #if 0 // TODO
1461             gen_farith2(ctx, &gen_op_cvtgd, rb, rc);
1462 #else
1463             goto invalid_opc;
1464 #endif
1465             break;
1466         case 0x2F:
1467             /* CVTGQ */
1468             gen_farith2(ctx, &gen_op_cvtgq, rb, rc);
1469             break;
1470         case 0x3C:
1471             /* CVTQF */
1472             gen_farith2(ctx, &gen_op_cvtqf, rb, rc);
1473             break;
1474         case 0x3E:
1475             /* CVTQG */
1476             gen_farith2(ctx, &gen_op_cvtqg, rb, rc);
1477             break;
1478         default:
1479             goto invalid_opc;
1480         }
1481         break;
1482     case 0x16:
1483         /* IEEE floating-point */
1484         /* XXX: rounding mode and traps are ignored (!) */
1485         switch (fpfn) { /* f11 & 0x3F */
1486         case 0x00:
1487             /* ADDS */
1488             gen_farith3(ctx, &gen_op_adds, ra, rb, rc);
1489             break;
1490         case 0x01:
1491             /* SUBS */
1492             gen_farith3(ctx, &gen_op_subs, ra, rb, rc);
1493             break;
1494         case 0x02:
1495             /* MULS */
1496             gen_farith3(ctx, &gen_op_muls, ra, rb, rc);
1497             break;
1498         case 0x03:
1499             /* DIVS */
1500             gen_farith3(ctx, &gen_op_divs, ra, rb, rc);
1501             break;
1502         case 0x20:
1503             /* ADDT */
1504             gen_farith3(ctx, &gen_op_addt, ra, rb, rc);
1505             break;
1506         case 0x21:
1507             /* SUBT */
1508             gen_farith3(ctx, &gen_op_subt, ra, rb, rc);
1509             break;
1510         case 0x22:
1511             /* MULT */
1512             gen_farith3(ctx, &gen_op_mult, ra, rb, rc);
1513             break;
1514         case 0x23:
1515             /* DIVT */
1516             gen_farith3(ctx, &gen_op_divt, ra, rb, rc);
1517             break;
1518         case 0x24:
1519             /* CMPTUN */
1520             gen_farith3(ctx, &gen_op_cmptun, ra, rb, rc);
1521             break;
1522         case 0x25:
1523             /* CMPTEQ */
1524             gen_farith3(ctx, &gen_op_cmpteq, ra, rb, rc);
1525             break;
1526         case 0x26:
1527             /* CMPTLT */
1528             gen_farith3(ctx, &gen_op_cmptlt, ra, rb, rc);
1529             break;
1530         case 0x27:
1531             /* CMPTLE */
1532             gen_farith3(ctx, &gen_op_cmptle, ra, rb, rc);
1533             break;
1534         case 0x2C:
1535             /* XXX: incorrect */
1536             if (fn11 == 0x2AC) {
1537                 /* CVTST */
1538                 gen_farith2(ctx, &gen_op_cvtst, rb, rc);
1539             } else {
1540                 /* CVTTS */
1541                 gen_farith2(ctx, &gen_op_cvtts, rb, rc);
1542             }
1543             break;
1544         case 0x2F:
1545             /* CVTTQ */
1546             gen_farith2(ctx, &gen_op_cvttq, rb, rc);
1547             break;
1548         case 0x3C:
1549             /* CVTQS */
1550             gen_farith2(ctx, &gen_op_cvtqs, rb, rc);
1551             break;
1552         case 0x3E:
1553             /* CVTQT */
1554             gen_farith2(ctx, &gen_op_cvtqt, rb, rc);
1555             break;
1556         default:
1557             goto invalid_opc;
1558         }
1559         break;
1560     case 0x17:
1561         switch (fn11) {
1562         case 0x010:
1563             /* CVTLQ */
1564             gen_farith2(ctx, &gen_op_cvtlq, rb, rc);
1565             break;
1566         case 0x020:
1567             /* CPYS */
1568             if (ra == rb) {
1569                 if (ra == 31 && rc == 31) {
1570                     /* FNOP */
1571                     gen_op_nop();
1572                 } else {
1573                     /* FMOV */
1574                     gen_load_fir(ctx, rb, 0);
1575                     gen_store_fir(ctx, rc, 0);
1576                 }
1577             } else {
1578                 gen_farith3(ctx, &gen_op_cpys, ra, rb, rc);
1579             }
1580             break;
1581         case 0x021:
1582             /* CPYSN */
1583             gen_farith2(ctx, &gen_op_cpysn, rb, rc);
1584             break;
1585         case 0x022:
1586             /* CPYSE */
1587             gen_farith2(ctx, &gen_op_cpyse, rb, rc);
1588             break;
1589         case 0x024:
1590             /* MT_FPCR */
1591             gen_load_fir(ctx, ra, 0);
1592             gen_op_store_fpcr();
1593             break;
1594         case 0x025:
1595             /* MF_FPCR */
1596             gen_op_load_fpcr();
1597             gen_store_fir(ctx, ra, 0);
1598             break;
1599         case 0x02A:
1600             /* FCMOVEQ */
1601             gen_fcmov(ctx, &gen_op_cmpfeq, ra, rb, rc);
1602             break;
1603         case 0x02B:
1604             /* FCMOVNE */
1605             gen_fcmov(ctx, &gen_op_cmpfne, ra, rb, rc);
1606             break;
1607         case 0x02C:
1608             /* FCMOVLT */
1609             gen_fcmov(ctx, &gen_op_cmpflt, ra, rb, rc);
1610             break;
1611         case 0x02D:
1612             /* FCMOVGE */
1613             gen_fcmov(ctx, &gen_op_cmpfge, ra, rb, rc);
1614             break;
1615         case 0x02E:
1616             /* FCMOVLE */
1617             gen_fcmov(ctx, &gen_op_cmpfle, ra, rb, rc);
1618             break;
1619         case 0x02F:
1620             /* FCMOVGT */
1621             gen_fcmov(ctx, &gen_op_cmpfgt, ra, rb, rc);
1622             break;
1623         case 0x030:
1624             /* CVTQL */
1625             gen_farith2(ctx, &gen_op_cvtql, rb, rc);
1626             break;
1627         case 0x130:
1628             /* CVTQL/V */
1629             gen_farith2(ctx, &gen_op_cvtqlv, rb, rc);
1630             break;
1631         case 0x530:
1632             /* CVTQL/SV */
1633             gen_farith2(ctx, &gen_op_cvtqlsv, rb, rc);
1634             break;
1635         default:
1636             goto invalid_opc;
1637         }
1638         break;
1639     case 0x18:
1640         switch ((uint16_t)disp16) {
1641         case 0x0000:
1642             /* TRAPB */
1643             /* No-op. Just exit from the current tb */
1644             ret = 2;
1645             break;
1646         case 0x0400:
1647             /* EXCB */
1648             /* No-op. Just exit from the current tb */
1649             ret = 2;
1650             break;
1651         case 0x4000:
1652             /* MB */
1653             /* No-op */
1654             break;
1655         case 0x4400:
1656             /* WMB */
1657             /* No-op */
1658             break;
1659         case 0x8000:
1660             /* FETCH */
1661             /* No-op */
1662             break;
1663         case 0xA000:
1664             /* FETCH_M */
1665             /* No-op */
1666             break;
1667         case 0xC000:
1668             /* RPCC */
1669             if (ra != 31)
1670                 tcg_gen_helper_1_0(helper_load_pcc, cpu_ir[ra]);
1671             break;
1672         case 0xE000:
1673             /* RC */
1674             if (ra != 31)
1675                 tcg_gen_helper_1_0(helper_rc, cpu_ir[ra]);
1676             break;
1677         case 0xE800:
1678             /* ECB */
1679             /* XXX: TODO: evict tb cache at address rb */
1680 #if 0
1681             ret = 2;
1682 #else
1683             goto invalid_opc;
1684 #endif
1685             break;
1686         case 0xF000:
1687             /* RS */
1688             if (ra != 31)
1689                 tcg_gen_helper_1_0(helper_rs, cpu_ir[ra]);
1690             break;
1691         case 0xF800:
1692             /* WH64 */
1693             /* No-op */
1694             break;
1695         default:
1696             goto invalid_opc;
1697         }
1698         break;
1699     case 0x19:
1700         /* HW_MFPR (PALcode) */
1701 #if defined (CONFIG_USER_ONLY)
1702         goto invalid_opc;
1703 #else
1704         if (!ctx->pal_mode)
1705             goto invalid_opc;
1706         gen_op_mfpr(insn & 0xFF);
1707         if (ra != 31)
1708             tcg_gen_mov_i64(cpu_ir[ra], cpu_T[0]);
1709         break;
1710 #endif
1711     case 0x1A:
1712         if (ra != 31)
1713             tcg_gen_movi_i64(cpu_ir[ra], ctx->pc);
1714         if (rb != 31)
1715             tcg_gen_andi_i64(cpu_pc, cpu_ir[rb], ~3);
1716         else
1717             tcg_gen_movi_i64(cpu_pc, 0);
1718         /* Those four jumps only differ by the branch prediction hint */
1719         switch (fn2) {
1720         case 0x0:
1721             /* JMP */
1722             break;
1723         case 0x1:
1724             /* JSR */
1725             break;
1726         case 0x2:
1727             /* RET */
1728             break;
1729         case 0x3:
1730             /* JSR_COROUTINE */
1731             break;
1732         }
1733         ret = 1;
1734         break;
1735     case 0x1B:
1736         /* HW_LD (PALcode) */
1737 #if defined (CONFIG_USER_ONLY)
1738         goto invalid_opc;
1739 #else
1740         if (!ctx->pal_mode)
1741             goto invalid_opc;
1742         if (rb != 31)
1743             tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
1744         else
1745             tcg_gen_movi_i64(cpu_T[0], 0);
1746         tcg_gen_movi_i64(cpu_T[1], disp12);
1747         tcg_gen_add_i64(cpu_T[0], cpu_T[0], cpu_T[1]);
1748         switch ((insn >> 12) & 0xF) {
1749         case 0x0:
1750             /* Longword physical access */
1751             gen_op_ldl_raw();
1752             break;
1753         case 0x1:
1754             /* Quadword physical access */
1755             gen_op_ldq_raw();
1756             break;
1757         case 0x2:
1758             /* Longword physical access with lock */
1759             gen_op_ldl_l_raw();
1760             break;
1761         case 0x3:
1762             /* Quadword physical access with lock */
1763             gen_op_ldq_l_raw();
1764             break;
1765         case 0x4:
1766             /* Longword virtual PTE fetch */
1767             gen_op_ldl_kernel();
1768             break;
1769         case 0x5:
1770             /* Quadword virtual PTE fetch */
1771             gen_op_ldq_kernel();
1772             break;
1773         case 0x6:
1774             /* Invalid */
1775             goto invalid_opc;
1776         case 0x7:
1777             /* Invalid */
1778             goto invalid_opc;
1779         case 0x8:
1780             /* Longword virtual access */
1781             gen_op_ld_phys_to_virt();
1782             gen_op_ldl_raw();
1783             break;
1784         case 0x9:
1785             /* Quadword virtual access */
1786             gen_op_ld_phys_to_virt();
1787             gen_op_ldq_raw();
1788             break;
1789         case 0xA:
1790             /* Longword virtual access with protection check */
1791             gen_ldl(ctx);
1792             break;
1793         case 0xB:
1794             /* Quadword virtual access with protection check */
1795             gen_ldq(ctx);
1796             break;
1797         case 0xC:
1798             /* Longword virtual access with altenate access mode */
1799             gen_op_set_alt_mode();
1800             gen_op_ld_phys_to_virt();
1801             gen_op_ldl_raw();
1802             gen_op_restore_mode();
1803             break;
1804         case 0xD:
1805             /* Quadword virtual access with altenate access mode */
1806             gen_op_set_alt_mode();
1807             gen_op_ld_phys_to_virt();
1808             gen_op_ldq_raw();
1809             gen_op_restore_mode();
1810             break;
1811         case 0xE:
1812             /* Longword virtual access with alternate access mode and
1813              * protection checks
1814              */
1815             gen_op_set_alt_mode();
1816             gen_op_ldl_data();
1817             gen_op_restore_mode();
1818             break;
1819         case 0xF:
1820             /* Quadword virtual access with alternate access mode and
1821              * protection checks
1822              */
1823             gen_op_set_alt_mode();
1824             gen_op_ldq_data();
1825             gen_op_restore_mode();
1826             break;
1827         }
1828         if (ra != 31)
1829             tcg_gen_mov_i64(cpu_ir[ra], cpu_T[1]);
1830         break;
1831 #endif
1832     case 0x1C:
1833         switch (fn7) {
1834         case 0x00:
1835             /* SEXTB */
1836             if (!(ctx->amask & AMASK_BWX))
1837                 goto invalid_opc;
1838             if (likely(rc != 31)) {
1839                 if (islit)
1840                     tcg_gen_movi_i64(cpu_ir[rc], (int64_t)((int8_t)lit));
1841                 else
1842                     tcg_gen_ext8s_i64(cpu_ir[rc], cpu_ir[rb]);
1843             }
1844             break;
1845         case 0x01:
1846             /* SEXTW */
1847             if (!(ctx->amask & AMASK_BWX))
1848                 goto invalid_opc;
1849             if (likely(rc != 31)) {
1850                 if (islit)
1851                     tcg_gen_movi_i64(cpu_ir[rc], (int64_t)((int16_t)lit));
1852                 else
1853                     tcg_gen_ext16s_i64(cpu_ir[rc], cpu_ir[rb]);
1854             }
1855             break;
1856         case 0x30:
1857             /* CTPOP */
1858             if (!(ctx->amask & AMASK_CIX))
1859                 goto invalid_opc;
1860             if (likely(rc != 31)) {
1861                 if (islit)
1862                     tcg_gen_movi_i64(cpu_ir[rc], ctpop64(lit));
1863                 else
1864                     tcg_gen_helper_1_1(helper_ctpop, cpu_ir[rc], cpu_ir[rb]);
1865             }
1866             break;
1867         case 0x31:
1868             /* PERR */
1869             if (!(ctx->amask & AMASK_MVI))
1870                 goto invalid_opc;
1871             /* XXX: TODO */
1872             goto invalid_opc;
1873             break;
1874         case 0x32:
1875             /* CTLZ */
1876             if (!(ctx->amask & AMASK_CIX))
1877                 goto invalid_opc;
1878             if (likely(rc != 31)) {
1879                 if (islit)
1880                     tcg_gen_movi_i64(cpu_ir[rc], clz64(lit));
1881                 else
1882                     tcg_gen_helper_1_1(helper_ctlz, cpu_ir[rc], cpu_ir[rb]);
1883             }
1884             break;
1885         case 0x33:
1886             /* CTTZ */
1887             if (!(ctx->amask & AMASK_CIX))
1888                 goto invalid_opc;
1889             if (likely(rc != 31)) {
1890                 if (islit)
1891                     tcg_gen_movi_i64(cpu_ir[rc], ctz64(lit));
1892                 else
1893                     tcg_gen_helper_1_1(helper_cttz, cpu_ir[rc], cpu_ir[rb]);
1894             }
1895             break;
1896         case 0x34:
1897             /* UNPKBW */
1898             if (!(ctx->amask & AMASK_MVI))
1899                 goto invalid_opc;
1900             /* XXX: TODO */
1901             goto invalid_opc;
1902             break;
1903         case 0x35:
1904             /* UNPKWL */
1905             if (!(ctx->amask & AMASK_MVI))
1906                 goto invalid_opc;
1907             /* XXX: TODO */
1908             goto invalid_opc;
1909             break;
1910         case 0x36:
1911             /* PKWB */
1912             if (!(ctx->amask & AMASK_MVI))
1913                 goto invalid_opc;
1914             /* XXX: TODO */
1915             goto invalid_opc;
1916             break;
1917         case 0x37:
1918             /* PKLB */
1919             if (!(ctx->amask & AMASK_MVI))
1920                 goto invalid_opc;
1921             /* XXX: TODO */
1922             goto invalid_opc;
1923             break;
1924         case 0x38:
1925             /* MINSB8 */
1926             if (!(ctx->amask & AMASK_MVI))
1927                 goto invalid_opc;
1928             /* XXX: TODO */
1929             goto invalid_opc;
1930             break;
1931         case 0x39:
1932             /* MINSW4 */
1933             if (!(ctx->amask & AMASK_MVI))
1934                 goto invalid_opc;
1935             /* XXX: TODO */
1936             goto invalid_opc;
1937             break;
1938         case 0x3A:
1939             /* MINUB8 */
1940             if (!(ctx->amask & AMASK_MVI))
1941                 goto invalid_opc;
1942             /* XXX: TODO */
1943             goto invalid_opc;
1944             break;
1945         case 0x3B:
1946             /* MINUW4 */
1947             if (!(ctx->amask & AMASK_MVI))
1948                 goto invalid_opc;
1949             /* XXX: TODO */
1950             goto invalid_opc;
1951             break;
1952         case 0x3C:
1953             /* MAXUB8 */
1954             if (!(ctx->amask & AMASK_MVI))
1955                 goto invalid_opc;
1956             /* XXX: TODO */
1957             goto invalid_opc;
1958             break;
1959         case 0x3D:
1960             /* MAXUW4 */
1961             if (!(ctx->amask & AMASK_MVI))
1962                 goto invalid_opc;
1963             /* XXX: TODO */
1964             goto invalid_opc;
1965             break;
1966         case 0x3E:
1967             /* MAXSB8 */
1968             if (!(ctx->amask & AMASK_MVI))
1969                 goto invalid_opc;
1970             /* XXX: TODO */
1971             goto invalid_opc;
1972             break;
1973         case 0x3F:
1974             /* MAXSW4 */
1975             if (!(ctx->amask & AMASK_MVI))
1976                 goto invalid_opc;
1977             /* XXX: TODO */
1978             goto invalid_opc;
1979             break;
1980         case 0x70:
1981             /* FTOIT */
1982             if (!(ctx->amask & AMASK_FIX))
1983                 goto invalid_opc;
1984             gen_fti(ctx, &gen_op_ftoit, ra, rb);
1985             break;
1986         case 0x78:
1987             /* FTOIS */
1988             if (!(ctx->amask & AMASK_FIX))
1989                 goto invalid_opc;
1990             gen_fti(ctx, &gen_op_ftois, ra, rb);
1991             break;
1992         default:
1993             goto invalid_opc;
1994         }
1995         break;
1996     case 0x1D:
1997         /* HW_MTPR (PALcode) */
1998 #if defined (CONFIG_USER_ONLY)
1999         goto invalid_opc;
2000 #else
2001         if (!ctx->pal_mode)
2002             goto invalid_opc;
2003         if (ra != 31)
2004             tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]);
2005         else
2006             tcg_gen_movi_i64(cpu_T[0], 0);
2007         gen_op_mtpr(insn & 0xFF);
2008         ret = 2;
2009         break;
2010 #endif
2011     case 0x1E:
2012         /* HW_REI (PALcode) */
2013 #if defined (CONFIG_USER_ONLY)
2014         goto invalid_opc;
2015 #else
2016         if (!ctx->pal_mode)
2017             goto invalid_opc;
2018         if (rb == 31) {
2019             /* "Old" alpha */
2020             gen_op_hw_rei();
2021         } else {
2022             if (ra != 31)
2023                 tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
2024             else
2025                 tcg_gen_movi_i64(cpu_T[0], 0);
2026             tcg_gen_movi_i64(cpu_T[1], (((int64_t)insn << 51) >> 51));
2027             tcg_gen_add_i64(cpu_T[0], cpu_T[0], cpu_T[1]);
2028             gen_op_hw_ret();
2029         }
2030         ret = 2;
2031         break;
2032 #endif
2033     case 0x1F:
2034         /* HW_ST (PALcode) */
2035 #if defined (CONFIG_USER_ONLY)
2036         goto invalid_opc;
2037 #else
2038         if (!ctx->pal_mode)
2039             goto invalid_opc;
2040         if (ra != 31)
2041             tcg_gen_addi_i64(cpu_T[0], cpu_ir[rb], disp12);
2042         else
2043             tcg_gen_movi_i64(cpu_T[0], disp12);
2044         if (ra != 31)
2045             tcg_gen_mov_i64(cpu_T[1], cpu_ir[ra]);
2046         else
2047             tcg_gen_movi_i64(cpu_T[1], 0);
2048         switch ((insn >> 12) & 0xF) {
2049         case 0x0:
2050             /* Longword physical access */
2051             gen_op_stl_raw();
2052             break;
2053         case 0x1:
2054             /* Quadword physical access */
2055             gen_op_stq_raw();
2056             break;
2057         case 0x2:
2058             /* Longword physical access with lock */
2059             gen_op_stl_c_raw();
2060             break;
2061         case 0x3:
2062             /* Quadword physical access with lock */
2063             gen_op_stq_c_raw();
2064             break;
2065         case 0x4:
2066             /* Longword virtual access */
2067             gen_op_st_phys_to_virt();
2068             gen_op_stl_raw();
2069             break;
2070         case 0x5:
2071             /* Quadword virtual access */
2072             gen_op_st_phys_to_virt();
2073             gen_op_stq_raw();
2074             break;
2075         case 0x6:
2076             /* Invalid */
2077             goto invalid_opc;
2078         case 0x7:
2079             /* Invalid */
2080             goto invalid_opc;
2081         case 0x8:
2082             /* Invalid */
2083             goto invalid_opc;
2084         case 0x9:
2085             /* Invalid */
2086             goto invalid_opc;
2087         case 0xA:
2088             /* Invalid */
2089             goto invalid_opc;
2090         case 0xB:
2091             /* Invalid */
2092             goto invalid_opc;
2093         case 0xC:
2094             /* Longword virtual access with alternate access mode */
2095             gen_op_set_alt_mode();
2096             gen_op_st_phys_to_virt();
2097             gen_op_ldl_raw();
2098             gen_op_restore_mode();
2099             break;
2100         case 0xD:
2101             /* Quadword virtual access with alternate access mode */
2102             gen_op_set_alt_mode();
2103             gen_op_st_phys_to_virt();
2104             gen_op_ldq_raw();
2105             gen_op_restore_mode();
2106             break;
2107         case 0xE:
2108             /* Invalid */
2109             goto invalid_opc;
2110         case 0xF:
2111             /* Invalid */
2112             goto invalid_opc;
2113         }
2114         ret = 2;
2115         break;
2116 #endif
2117     case 0x20:
2118         /* LDF */
2119 #if 0 // TODO
2120         gen_load_fmem(ctx, &gen_ldf, ra, rb, disp16);
2121 #else
2122         goto invalid_opc;
2123 #endif
2124         break;
2125     case 0x21:
2126         /* LDG */
2127 #if 0 // TODO
2128         gen_load_fmem(ctx, &gen_ldg, ra, rb, disp16);
2129 #else
2130         goto invalid_opc;
2131 #endif
2132         break;
2133     case 0x22:
2134         /* LDS */
2135         gen_load_fmem(ctx, &gen_lds, ra, rb, disp16);
2136         break;
2137     case 0x23:
2138         /* LDT */
2139         gen_load_fmem(ctx, &gen_ldt, ra, rb, disp16);
2140         break;
2141     case 0x24:
2142         /* STF */
2143 #if 0 // TODO
2144         gen_store_fmem(ctx, &gen_stf, ra, rb, disp16);
2145 #else
2146         goto invalid_opc;
2147 #endif
2148         break;
2149     case 0x25:
2150         /* STG */
2151 #if 0 // TODO
2152         gen_store_fmem(ctx, &gen_stg, ra, rb, disp16);
2153 #else
2154         goto invalid_opc;
2155 #endif
2156         break;
2157     case 0x26:
2158         /* STS */
2159         gen_store_fmem(ctx, &gen_sts, ra, rb, disp16);
2160         break;
2161     case 0x27:
2162         /* STT */
2163         gen_store_fmem(ctx, &gen_stt, ra, rb, disp16);
2164         break;
2165     case 0x28:
2166         /* LDL */
2167         gen_load_mem(ctx, &tcg_gen_qemu_ld32s, ra, rb, disp16, 0);
2168         break;
2169     case 0x29:
2170         /* LDQ */
2171         gen_load_mem(ctx, &tcg_gen_qemu_ld64, ra, rb, disp16, 0);
2172         break;
2173     case 0x2A:
2174         /* LDL_L */
2175         gen_load_mem_dyngen(ctx, &gen_ldl_l, ra, rb, disp16, 0);
2176         break;
2177     case 0x2B:
2178         /* LDQ_L */
2179         gen_load_mem_dyngen(ctx, &gen_ldq_l, ra, rb, disp16, 0);
2180         break;
2181     case 0x2C:
2182         /* STL */
2183         gen_store_mem(ctx, &tcg_gen_qemu_st32, ra, rb, disp16, 0);
2184         break;
2185     case 0x2D:
2186         /* STQ */
2187         gen_store_mem(ctx, &tcg_gen_qemu_st64, ra, rb, disp16, 0);
2188         break;
2189     case 0x2E:
2190         /* STL_C */
2191         gen_store_mem_dyngen(ctx, &gen_stl_c, ra, rb, disp16, 0);
2192         break;
2193     case 0x2F:
2194         /* STQ_C */
2195         gen_store_mem_dyngen(ctx, &gen_stq_c, ra, rb, disp16, 0);
2196         break;
2197     case 0x30:
2198         /* BR */
2199         if (ra != 31)
2200             tcg_gen_movi_i64(cpu_ir[ra], ctx->pc);
2201         tcg_gen_movi_i64(cpu_pc, ctx->pc + (int64_t)(disp21 << 2));
2202         ret = 1;
2203         break;
2204     case 0x31:
2205         /* FBEQ */
2206         gen_fbcond(ctx, &gen_op_cmpfeq, ra, disp16);
2207         ret = 1;
2208         break;
2209     case 0x32:
2210         /* FBLT */
2211         gen_fbcond(ctx, &gen_op_cmpflt, ra, disp16);
2212         ret = 1;
2213         break;
2214     case 0x33:
2215         /* FBLE */
2216         gen_fbcond(ctx, &gen_op_cmpfle, ra, disp16);
2217         ret = 1;
2218         break;
2219     case 0x34:
2220         /* BSR */
2221         if (ra != 31)
2222             tcg_gen_movi_i64(cpu_ir[ra], ctx->pc);
2223         tcg_gen_movi_i64(cpu_pc, ctx->pc + (int64_t)(disp21 << 2));
2224         ret = 1;
2225         break;
2226     case 0x35:
2227         /* FBNE */
2228         gen_fbcond(ctx, &gen_op_cmpfne, ra, disp16);
2229         ret = 1;
2230         break;
2231     case 0x36:
2232         /* FBGE */
2233         gen_fbcond(ctx, &gen_op_cmpfge, ra, disp16);
2234         ret = 1;
2235         break;
2236     case 0x37:
2237         /* FBGT */
2238         gen_fbcond(ctx, &gen_op_cmpfgt, ra, disp16);
2239         ret = 1;
2240         break;
2241     case 0x38:
2242         /* BLBC */
2243         gen_bcond(ctx, TCG_COND_EQ, ra, disp16, 1);
2244         ret = 1;
2245         break;
2246     case 0x39:
2247         /* BEQ */
2248         gen_bcond(ctx, TCG_COND_EQ, ra, disp16, 0);
2249         ret = 1;
2250         break;
2251     case 0x3A:
2252         /* BLT */
2253         gen_bcond(ctx, TCG_COND_LT, ra, disp16, 0);
2254         ret = 1;
2255         break;
2256     case 0x3B:
2257         /* BLE */
2258         gen_bcond(ctx, TCG_COND_LE, ra, disp16, 0);
2259         ret = 1;
2260         break;
2261     case 0x3C:
2262         /* BLBS */
2263         gen_bcond(ctx, TCG_COND_NE, ra, disp16, 1);
2264         ret = 1;
2265         break;
2266     case 0x3D:
2267         /* BNE */
2268         gen_bcond(ctx, TCG_COND_NE, ra, disp16, 0);
2269         ret = 1;
2270         break;
2271     case 0x3E:
2272         /* BGE */
2273         gen_bcond(ctx, TCG_COND_GE, ra, disp16, 0);
2274         ret = 1;
2275         break;
2276     case 0x3F:
2277         /* BGT */
2278         gen_bcond(ctx, TCG_COND_GT, ra, disp16, 0);
2279         ret = 1;
2280         break;
2281     invalid_opc:
2282         gen_invalid(ctx);
2283         ret = 3;
2284         break;
2285     }
2286
2287     return ret;
2288 }
2289
2290 static always_inline void gen_intermediate_code_internal (CPUState *env,
2291                                                           TranslationBlock *tb,
2292                                                           int search_pc)
2293 {
2294 #if defined ALPHA_DEBUG_DISAS
2295     static int insn_count;
2296 #endif
2297     DisasContext ctx, *ctxp = &ctx;
2298     target_ulong pc_start;
2299     uint32_t insn;
2300     uint16_t *gen_opc_end;
2301     int j, lj = -1;
2302     int ret;
2303     int num_insns;
2304     int max_insns;
2305
2306     pc_start = tb->pc;
2307     gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
2308     ctx.pc = pc_start;
2309     ctx.amask = env->amask;
2310 #if defined (CONFIG_USER_ONLY)
2311     ctx.mem_idx = 0;
2312 #else
2313     ctx.mem_idx = ((env->ps >> 3) & 3);
2314     ctx.pal_mode = env->ipr[IPR_EXC_ADDR] & 1;
2315 #endif
2316     num_insns = 0;
2317     max_insns = tb->cflags & CF_COUNT_MASK;
2318     if (max_insns == 0)
2319         max_insns = CF_COUNT_MASK;
2320
2321     gen_icount_start();
2322     for (ret = 0; ret == 0;) {
2323         if (env->nb_breakpoints > 0) {
2324             for(j = 0; j < env->nb_breakpoints; j++) {
2325                 if (env->breakpoints[j] == ctx.pc) {
2326                     gen_excp(&ctx, EXCP_DEBUG, 0);
2327                     break;
2328                 }
2329             }
2330         }
2331         if (search_pc) {
2332             j = gen_opc_ptr - gen_opc_buf;
2333             if (lj < j) {
2334                 lj++;
2335                 while (lj < j)
2336                     gen_opc_instr_start[lj++] = 0;
2337                 gen_opc_pc[lj] = ctx.pc;
2338                 gen_opc_instr_start[lj] = 1;
2339                 gen_opc_icount[lj] = num_insns;
2340             }
2341         }
2342         if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO))
2343             gen_io_start();
2344 #if defined ALPHA_DEBUG_DISAS
2345         insn_count++;
2346         if (logfile != NULL) {
2347             fprintf(logfile, "pc " TARGET_FMT_lx " mem_idx %d\n",
2348                     ctx.pc, ctx.mem_idx);
2349         }
2350 #endif
2351         insn = ldl_code(ctx.pc);
2352 #if defined ALPHA_DEBUG_DISAS
2353         insn_count++;
2354         if (logfile != NULL) {
2355             fprintf(logfile, "opcode %08x %d\n", insn, insn_count);
2356         }
2357 #endif
2358         num_insns++;
2359         ctx.pc += 4;
2360         ret = translate_one(ctxp, insn);
2361         if (ret != 0)
2362             break;
2363         /* if we reach a page boundary or are single stepping, stop
2364          * generation
2365          */
2366         if (((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0) ||
2367             (env->singlestep_enabled) ||
2368             num_insns >= max_insns) {
2369             break;
2370         }
2371 #if defined (DO_SINGLE_STEP)
2372         break;
2373 #endif
2374     }
2375     if (ret != 1 && ret != 3) {
2376         tcg_gen_movi_i64(cpu_pc, ctx.pc);
2377     }
2378 #if defined (DO_TB_FLUSH)
2379     tcg_gen_helper_0_0(helper_tb_flush);
2380 #endif
2381     if (tb->cflags & CF_LAST_IO)
2382         gen_io_end();
2383     /* Generate the return instruction */
2384     tcg_gen_exit_tb(0);
2385     gen_icount_end(tb, num_insns);
2386     *gen_opc_ptr = INDEX_op_end;
2387     if (search_pc) {
2388         j = gen_opc_ptr - gen_opc_buf;
2389         lj++;
2390         while (lj <= j)
2391             gen_opc_instr_start[lj++] = 0;
2392     } else {
2393         tb->size = ctx.pc - pc_start;
2394         tb->icount = num_insns;
2395     }
2396 #if defined ALPHA_DEBUG_DISAS
2397     if (loglevel & CPU_LOG_TB_CPU) {
2398         cpu_dump_state(env, logfile, fprintf, 0);
2399     }
2400     if (loglevel & CPU_LOG_TB_IN_ASM) {
2401         fprintf(logfile, "IN: %s\n", lookup_symbol(pc_start));
2402         target_disas(logfile, pc_start, ctx.pc - pc_start, 1);
2403         fprintf(logfile, "\n");
2404     }
2405 #endif
2406 }
2407
2408 void gen_intermediate_code (CPUState *env, struct TranslationBlock *tb)
2409 {
2410     gen_intermediate_code_internal(env, tb, 0);
2411 }
2412
2413 void gen_intermediate_code_pc (CPUState *env, struct TranslationBlock *tb)
2414 {
2415     gen_intermediate_code_internal(env, tb, 1);
2416 }
2417
2418 CPUAlphaState * cpu_alpha_init (const char *cpu_model)
2419 {
2420     CPUAlphaState *env;
2421     uint64_t hwpcb;
2422
2423     env = qemu_mallocz(sizeof(CPUAlphaState));
2424     if (!env)
2425         return NULL;
2426     cpu_exec_init(env);
2427     alpha_translate_init();
2428     tlb_flush(env, 1);
2429     /* XXX: should not be hardcoded */
2430     env->implver = IMPLVER_2106x;
2431     env->ps = 0x1F00;
2432 #if defined (CONFIG_USER_ONLY)
2433     env->ps |= 1 << 3;
2434 #endif
2435     pal_init(env);
2436     /* Initialize IPR */
2437     hwpcb = env->ipr[IPR_PCBB];
2438     env->ipr[IPR_ASN] = 0;
2439     env->ipr[IPR_ASTEN] = 0;
2440     env->ipr[IPR_ASTSR] = 0;
2441     env->ipr[IPR_DATFX] = 0;
2442     /* XXX: fix this */
2443     //    env->ipr[IPR_ESP] = ldq_raw(hwpcb + 8);
2444     //    env->ipr[IPR_KSP] = ldq_raw(hwpcb + 0);
2445     //    env->ipr[IPR_SSP] = ldq_raw(hwpcb + 16);
2446     //    env->ipr[IPR_USP] = ldq_raw(hwpcb + 24);
2447     env->ipr[IPR_FEN] = 0;
2448     env->ipr[IPR_IPL] = 31;
2449     env->ipr[IPR_MCES] = 0;
2450     env->ipr[IPR_PERFMON] = 0; /* Implementation specific */
2451     //    env->ipr[IPR_PTBR] = ldq_raw(hwpcb + 32);
2452     env->ipr[IPR_SISR] = 0;
2453     env->ipr[IPR_VIRBND] = -1ULL;
2454
2455     return env;
2456 }
2457
2458 void gen_pc_load(CPUState *env, TranslationBlock *tb,
2459                 unsigned long searched_pc, int pc_pos, void *puc)
2460 {
2461     env->pc = gen_opc_pc[pc_pos];
2462 }