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