skin: check that image file of H/W button exist or not
[sdk/emulator/qemu.git] / target-sh4 / translate.c
1 /*
2  *  SH4 translation
3  *
4  *  Copyright (c) 2005 Samuel Tardieu
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, see <http://www.gnu.org/licenses/>.
18  */
19
20 #define DEBUG_DISAS
21
22 #include "qemu/osdep.h"
23 #include "cpu.h"
24 #include "disas/disas.h"
25 #include "exec/exec-all.h"
26 #include "tcg-op.h"
27 #include "exec/cpu_ldst.h"
28
29 #include "exec/helper-proto.h"
30 #include "exec/helper-gen.h"
31
32 #include "trace-tcg.h"
33 #include "exec/log.h"
34
35
36 typedef struct DisasContext {
37     struct TranslationBlock *tb;
38     target_ulong pc;
39     uint16_t opcode;
40     uint32_t flags;
41     int bstate;
42     int memidx;
43     uint32_t delayed_pc;
44     int singlestep_enabled;
45     uint32_t features;
46     int has_movcal;
47 } DisasContext;
48
49 #if defined(CONFIG_USER_ONLY)
50 #define IS_USER(ctx) 1
51 #else
52 #define IS_USER(ctx) (!(ctx->flags & (1u << SR_MD)))
53 #endif
54
55 enum {
56     BS_NONE     = 0, /* We go out of the TB without reaching a branch or an
57                       * exception condition
58                       */
59     BS_STOP     = 1, /* We want to stop translation for any reason */
60     BS_BRANCH   = 2, /* We reached a branch condition     */
61     BS_EXCP     = 3, /* We reached an exception condition */
62 };
63
64 /* global register indexes */
65 static TCGv_env cpu_env;
66 static TCGv cpu_gregs[24];
67 static TCGv cpu_sr, cpu_sr_m, cpu_sr_q, cpu_sr_t;
68 static TCGv cpu_pc, cpu_ssr, cpu_spc, cpu_gbr;
69 static TCGv cpu_vbr, cpu_sgr, cpu_dbr, cpu_mach, cpu_macl;
70 static TCGv cpu_pr, cpu_fpscr, cpu_fpul, cpu_ldst;
71 static TCGv cpu_fregs[32];
72
73 /* internal register indexes */
74 static TCGv cpu_flags, cpu_delayed_pc;
75
76 #include "exec/gen-icount.h"
77
78 void sh4_translate_init(void)
79 {
80     int i;
81     static int done_init = 0;
82     static const char * const gregnames[24] = {
83         "R0_BANK0", "R1_BANK0", "R2_BANK0", "R3_BANK0",
84         "R4_BANK0", "R5_BANK0", "R6_BANK0", "R7_BANK0",
85         "R8", "R9", "R10", "R11", "R12", "R13", "R14", "R15",
86         "R0_BANK1", "R1_BANK1", "R2_BANK1", "R3_BANK1",
87         "R4_BANK1", "R5_BANK1", "R6_BANK1", "R7_BANK1"
88     };
89     static const char * const fregnames[32] = {
90          "FPR0_BANK0",  "FPR1_BANK0",  "FPR2_BANK0",  "FPR3_BANK0",
91          "FPR4_BANK0",  "FPR5_BANK0",  "FPR6_BANK0",  "FPR7_BANK0",
92          "FPR8_BANK0",  "FPR9_BANK0", "FPR10_BANK0", "FPR11_BANK0",
93         "FPR12_BANK0", "FPR13_BANK0", "FPR14_BANK0", "FPR15_BANK0",
94          "FPR0_BANK1",  "FPR1_BANK1",  "FPR2_BANK1",  "FPR3_BANK1",
95          "FPR4_BANK1",  "FPR5_BANK1",  "FPR6_BANK1",  "FPR7_BANK1",
96          "FPR8_BANK1",  "FPR9_BANK1", "FPR10_BANK1", "FPR11_BANK1",
97         "FPR12_BANK1", "FPR13_BANK1", "FPR14_BANK1", "FPR15_BANK1",
98     };
99
100     if (done_init)
101         return;
102
103     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env");
104     tcg_ctx.tcg_env = cpu_env;
105
106     for (i = 0; i < 24; i++)
107         cpu_gregs[i] = tcg_global_mem_new_i32(cpu_env,
108                                               offsetof(CPUSH4State, gregs[i]),
109                                               gregnames[i]);
110
111     cpu_pc = tcg_global_mem_new_i32(cpu_env,
112                                     offsetof(CPUSH4State, pc), "PC");
113     cpu_sr = tcg_global_mem_new_i32(cpu_env,
114                                     offsetof(CPUSH4State, sr), "SR");
115     cpu_sr_m = tcg_global_mem_new_i32(cpu_env,
116                                       offsetof(CPUSH4State, sr_m), "SR_M");
117     cpu_sr_q = tcg_global_mem_new_i32(cpu_env,
118                                       offsetof(CPUSH4State, sr_q), "SR_Q");
119     cpu_sr_t = tcg_global_mem_new_i32(cpu_env,
120                                       offsetof(CPUSH4State, sr_t), "SR_T");
121     cpu_ssr = tcg_global_mem_new_i32(cpu_env,
122                                      offsetof(CPUSH4State, ssr), "SSR");
123     cpu_spc = tcg_global_mem_new_i32(cpu_env,
124                                      offsetof(CPUSH4State, spc), "SPC");
125     cpu_gbr = tcg_global_mem_new_i32(cpu_env,
126                                      offsetof(CPUSH4State, gbr), "GBR");
127     cpu_vbr = tcg_global_mem_new_i32(cpu_env,
128                                      offsetof(CPUSH4State, vbr), "VBR");
129     cpu_sgr = tcg_global_mem_new_i32(cpu_env,
130                                      offsetof(CPUSH4State, sgr), "SGR");
131     cpu_dbr = tcg_global_mem_new_i32(cpu_env,
132                                      offsetof(CPUSH4State, dbr), "DBR");
133     cpu_mach = tcg_global_mem_new_i32(cpu_env,
134                                       offsetof(CPUSH4State, mach), "MACH");
135     cpu_macl = tcg_global_mem_new_i32(cpu_env,
136                                       offsetof(CPUSH4State, macl), "MACL");
137     cpu_pr = tcg_global_mem_new_i32(cpu_env,
138                                     offsetof(CPUSH4State, pr), "PR");
139     cpu_fpscr = tcg_global_mem_new_i32(cpu_env,
140                                        offsetof(CPUSH4State, fpscr), "FPSCR");
141     cpu_fpul = tcg_global_mem_new_i32(cpu_env,
142                                       offsetof(CPUSH4State, fpul), "FPUL");
143
144     cpu_flags = tcg_global_mem_new_i32(cpu_env,
145                                        offsetof(CPUSH4State, flags), "_flags_");
146     cpu_delayed_pc = tcg_global_mem_new_i32(cpu_env,
147                                             offsetof(CPUSH4State, delayed_pc),
148                                             "_delayed_pc_");
149     cpu_ldst = tcg_global_mem_new_i32(cpu_env,
150                                       offsetof(CPUSH4State, ldst), "_ldst_");
151
152     for (i = 0; i < 32; i++)
153         cpu_fregs[i] = tcg_global_mem_new_i32(cpu_env,
154                                               offsetof(CPUSH4State, fregs[i]),
155                                               fregnames[i]);
156
157     done_init = 1;
158 }
159
160 void superh_cpu_dump_state(CPUState *cs, FILE *f,
161                            fprintf_function cpu_fprintf, int flags)
162 {
163     SuperHCPU *cpu = SUPERH_CPU(cs);
164     CPUSH4State *env = &cpu->env;
165     int i;
166     cpu_fprintf(f, "pc=0x%08x sr=0x%08x pr=0x%08x fpscr=0x%08x\n",
167                 env->pc, cpu_read_sr(env), env->pr, env->fpscr);
168     cpu_fprintf(f, "spc=0x%08x ssr=0x%08x gbr=0x%08x vbr=0x%08x\n",
169                 env->spc, env->ssr, env->gbr, env->vbr);
170     cpu_fprintf(f, "sgr=0x%08x dbr=0x%08x delayed_pc=0x%08x fpul=0x%08x\n",
171                 env->sgr, env->dbr, env->delayed_pc, env->fpul);
172     for (i = 0; i < 24; i += 4) {
173         cpu_fprintf(f, "r%d=0x%08x r%d=0x%08x r%d=0x%08x r%d=0x%08x\n",
174                     i, env->gregs[i], i + 1, env->gregs[i + 1],
175                     i + 2, env->gregs[i + 2], i + 3, env->gregs[i + 3]);
176     }
177     if (env->flags & DELAY_SLOT) {
178         cpu_fprintf(f, "in delay slot (delayed_pc=0x%08x)\n",
179                     env->delayed_pc);
180     } else if (env->flags & DELAY_SLOT_CONDITIONAL) {
181         cpu_fprintf(f, "in conditional delay slot (delayed_pc=0x%08x)\n",
182                     env->delayed_pc);
183     }
184 }
185
186 static void gen_read_sr(TCGv dst)
187 {
188     TCGv t0 = tcg_temp_new();
189     tcg_gen_shli_i32(t0, cpu_sr_q, SR_Q);
190     tcg_gen_or_i32(dst, dst, t0);
191     tcg_gen_shli_i32(t0, cpu_sr_m, SR_M);
192     tcg_gen_or_i32(dst, dst, t0);
193     tcg_gen_shli_i32(t0, cpu_sr_t, SR_T);
194     tcg_gen_or_i32(dst, cpu_sr, t0);
195     tcg_temp_free_i32(t0);
196 }
197
198 static void gen_write_sr(TCGv src)
199 {
200     tcg_gen_andi_i32(cpu_sr, src,
201                      ~((1u << SR_Q) | (1u << SR_M) | (1u << SR_T)));
202     tcg_gen_shri_i32(cpu_sr_q, src, SR_Q);
203     tcg_gen_andi_i32(cpu_sr_q, cpu_sr_q, 1);
204     tcg_gen_shri_i32(cpu_sr_m, src, SR_M);
205     tcg_gen_andi_i32(cpu_sr_m, cpu_sr_m, 1);
206     tcg_gen_shri_i32(cpu_sr_t, src, SR_T);
207     tcg_gen_andi_i32(cpu_sr_t, cpu_sr_t, 1);
208 }
209
210 static inline bool use_goto_tb(DisasContext *ctx, target_ulong dest)
211 {
212     if (unlikely(ctx->singlestep_enabled)) {
213         return false;
214     }
215
216 #ifndef CONFIG_USER_ONLY
217     return (ctx->tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK);
218 #else
219     return true;
220 #endif
221 }
222
223 static void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
224 {
225     if (use_goto_tb(ctx, dest)) {
226         /* Use a direct jump if in same page and singlestep not enabled */
227         tcg_gen_goto_tb(n);
228         tcg_gen_movi_i32(cpu_pc, dest);
229         tcg_gen_exit_tb((uintptr_t)ctx->tb + n);
230     } else {
231         tcg_gen_movi_i32(cpu_pc, dest);
232         if (ctx->singlestep_enabled)
233             gen_helper_debug(cpu_env);
234         tcg_gen_exit_tb(0);
235     }
236 }
237
238 static void gen_jump(DisasContext * ctx)
239 {
240     if (ctx->delayed_pc == (uint32_t) - 1) {
241         /* Target is not statically known, it comes necessarily from a
242            delayed jump as immediate jump are conditinal jumps */
243         tcg_gen_mov_i32(cpu_pc, cpu_delayed_pc);
244         if (ctx->singlestep_enabled)
245             gen_helper_debug(cpu_env);
246         tcg_gen_exit_tb(0);
247     } else {
248         gen_goto_tb(ctx, 0, ctx->delayed_pc);
249     }
250 }
251
252 static inline void gen_branch_slot(uint32_t delayed_pc, int t)
253 {
254     TCGLabel *label = gen_new_label();
255     tcg_gen_movi_i32(cpu_delayed_pc, delayed_pc);
256     tcg_gen_brcondi_i32(t ? TCG_COND_EQ : TCG_COND_NE, cpu_sr_t, 0, label);
257     tcg_gen_ori_i32(cpu_flags, cpu_flags, DELAY_SLOT_TRUE);
258     gen_set_label(label);
259 }
260
261 /* Immediate conditional jump (bt or bf) */
262 static void gen_conditional_jump(DisasContext * ctx,
263                                  target_ulong ift, target_ulong ifnott)
264 {
265     TCGLabel *l1 = gen_new_label();
266     tcg_gen_brcondi_i32(TCG_COND_NE, cpu_sr_t, 0, l1);
267     gen_goto_tb(ctx, 0, ifnott);
268     gen_set_label(l1);
269     gen_goto_tb(ctx, 1, ift);
270 }
271
272 /* Delayed conditional jump (bt or bf) */
273 static void gen_delayed_conditional_jump(DisasContext * ctx)
274 {
275     TCGLabel *l1;
276     TCGv ds;
277
278     l1 = gen_new_label();
279     ds = tcg_temp_new();
280     tcg_gen_andi_i32(ds, cpu_flags, DELAY_SLOT_TRUE);
281     tcg_gen_brcondi_i32(TCG_COND_NE, ds, 0, l1);
282     gen_goto_tb(ctx, 1, ctx->pc + 2);
283     gen_set_label(l1);
284     tcg_gen_andi_i32(cpu_flags, cpu_flags, ~DELAY_SLOT_TRUE);
285     gen_jump(ctx);
286 }
287
288 static inline void gen_store_flags(uint32_t flags)
289 {
290     tcg_gen_andi_i32(cpu_flags, cpu_flags, DELAY_SLOT_TRUE);
291     tcg_gen_ori_i32(cpu_flags, cpu_flags, flags);
292 }
293
294 static inline void gen_load_fpr64(TCGv_i64 t, int reg)
295 {
296     tcg_gen_concat_i32_i64(t, cpu_fregs[reg + 1], cpu_fregs[reg]);
297 }
298
299 static inline void gen_store_fpr64 (TCGv_i64 t, int reg)
300 {
301     TCGv_i32 tmp = tcg_temp_new_i32();
302     tcg_gen_extrl_i64_i32(tmp, t);
303     tcg_gen_mov_i32(cpu_fregs[reg + 1], tmp);
304     tcg_gen_shri_i64(t, t, 32);
305     tcg_gen_extrl_i64_i32(tmp, t);
306     tcg_gen_mov_i32(cpu_fregs[reg], tmp);
307     tcg_temp_free_i32(tmp);
308 }
309
310 #define B3_0 (ctx->opcode & 0xf)
311 #define B6_4 ((ctx->opcode >> 4) & 0x7)
312 #define B7_4 ((ctx->opcode >> 4) & 0xf)
313 #define B7_0 (ctx->opcode & 0xff)
314 #define B7_0s ((int32_t) (int8_t) (ctx->opcode & 0xff))
315 #define B11_0s (ctx->opcode & 0x800 ? 0xfffff000 | (ctx->opcode & 0xfff) : \
316   (ctx->opcode & 0xfff))
317 #define B11_8 ((ctx->opcode >> 8) & 0xf)
318 #define B15_12 ((ctx->opcode >> 12) & 0xf)
319
320 #define REG(x) ((x) < 8 && (ctx->flags & (1u << SR_MD))\
321                         && (ctx->flags & (1u << SR_RB))\
322                 ? (cpu_gregs[x + 16]) : (cpu_gregs[x]))
323
324 #define ALTREG(x) ((x) < 8 && (!(ctx->flags & (1u << SR_MD))\
325                                || !(ctx->flags & (1u << SR_RB)))\
326                 ? (cpu_gregs[x + 16]) : (cpu_gregs[x]))
327
328 #define FREG(x) (ctx->flags & FPSCR_FR ? (x) ^ 0x10 : (x))
329 #define XHACK(x) ((((x) & 1 ) << 4) | ((x) & 0xe))
330 #define XREG(x) (ctx->flags & FPSCR_FR ? XHACK(x) ^ 0x10 : XHACK(x))
331 #define DREG(x) FREG(x) /* Assumes lsb of (x) is always 0 */
332
333 #define CHECK_NOT_DELAY_SLOT \
334   if (ctx->flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL))     \
335   {                                                           \
336       tcg_gen_movi_i32(cpu_pc, ctx->pc);                      \
337       gen_helper_raise_slot_illegal_instruction(cpu_env);     \
338       ctx->bstate = BS_BRANCH;                                \
339       return;                                                 \
340   }
341
342 #define CHECK_PRIVILEGED                                        \
343   if (IS_USER(ctx)) {                                           \
344       tcg_gen_movi_i32(cpu_pc, ctx->pc);                        \
345       if (ctx->flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL)) { \
346           gen_helper_raise_slot_illegal_instruction(cpu_env);   \
347       } else {                                                  \
348           gen_helper_raise_illegal_instruction(cpu_env);        \
349       }                                                         \
350       ctx->bstate = BS_BRANCH;                                  \
351       return;                                                   \
352   }
353
354 #define CHECK_FPU_ENABLED                                       \
355   if (ctx->flags & (1u << SR_FD)) {                             \
356       tcg_gen_movi_i32(cpu_pc, ctx->pc);                        \
357       if (ctx->flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL)) { \
358           gen_helper_raise_slot_fpu_disable(cpu_env);           \
359       } else {                                                  \
360           gen_helper_raise_fpu_disable(cpu_env);                \
361       }                                                         \
362       ctx->bstate = BS_BRANCH;                                  \
363       return;                                                   \
364   }
365
366 static void _decode_opc(DisasContext * ctx)
367 {
368     /* This code tries to make movcal emulation sufficiently
369        accurate for Linux purposes.  This instruction writes
370        memory, and prior to that, always allocates a cache line.
371        It is used in two contexts:
372        - in memcpy, where data is copied in blocks, the first write
373        of to a block uses movca.l for performance.
374        - in arch/sh/mm/cache-sh4.c, movcal.l + ocbi combination is used
375        to flush the cache. Here, the data written by movcal.l is never
376        written to memory, and the data written is just bogus.
377
378        To simulate this, we simulate movcal.l, we store the value to memory,
379        but we also remember the previous content. If we see ocbi, we check
380        if movcal.l for that address was done previously. If so, the write should
381        not have hit the memory, so we restore the previous content.
382        When we see an instruction that is neither movca.l
383        nor ocbi, the previous content is discarded.
384
385        To optimize, we only try to flush stores when we're at the start of
386        TB, or if we already saw movca.l in this TB and did not flush stores
387        yet.  */
388     if (ctx->has_movcal)
389         {
390           int opcode = ctx->opcode & 0xf0ff;
391           if (opcode != 0x0093 /* ocbi */
392               && opcode != 0x00c3 /* movca.l */)
393               {
394                   gen_helper_discard_movcal_backup(cpu_env);
395                   ctx->has_movcal = 0;
396               }
397         }
398
399 #if 0
400     fprintf(stderr, "Translating opcode 0x%04x\n", ctx->opcode);
401 #endif
402
403     switch (ctx->opcode) {
404     case 0x0019:                /* div0u */
405         tcg_gen_movi_i32(cpu_sr_m, 0);
406         tcg_gen_movi_i32(cpu_sr_q, 0);
407         tcg_gen_movi_i32(cpu_sr_t, 0);
408         return;
409     case 0x000b:                /* rts */
410         CHECK_NOT_DELAY_SLOT
411         tcg_gen_mov_i32(cpu_delayed_pc, cpu_pr);
412         ctx->flags |= DELAY_SLOT;
413         ctx->delayed_pc = (uint32_t) - 1;
414         return;
415     case 0x0028:                /* clrmac */
416         tcg_gen_movi_i32(cpu_mach, 0);
417         tcg_gen_movi_i32(cpu_macl, 0);
418         return;
419     case 0x0048:                /* clrs */
420         tcg_gen_andi_i32(cpu_sr, cpu_sr, ~(1u << SR_S));
421         return;
422     case 0x0008:                /* clrt */
423         tcg_gen_movi_i32(cpu_sr_t, 0);
424         return;
425     case 0x0038:                /* ldtlb */
426         CHECK_PRIVILEGED
427         gen_helper_ldtlb(cpu_env);
428         return;
429     case 0x002b:                /* rte */
430         CHECK_PRIVILEGED
431         CHECK_NOT_DELAY_SLOT
432         gen_write_sr(cpu_ssr);
433         tcg_gen_mov_i32(cpu_delayed_pc, cpu_spc);
434         ctx->flags |= DELAY_SLOT;
435         ctx->delayed_pc = (uint32_t) - 1;
436         return;
437     case 0x0058:                /* sets */
438         tcg_gen_ori_i32(cpu_sr, cpu_sr, (1u << SR_S));
439         return;
440     case 0x0018:                /* sett */
441         tcg_gen_movi_i32(cpu_sr_t, 1);
442         return;
443     case 0xfbfd:                /* frchg */
444         tcg_gen_xori_i32(cpu_fpscr, cpu_fpscr, FPSCR_FR);
445         ctx->bstate = BS_STOP;
446         return;
447     case 0xf3fd:                /* fschg */
448         tcg_gen_xori_i32(cpu_fpscr, cpu_fpscr, FPSCR_SZ);
449         ctx->bstate = BS_STOP;
450         return;
451     case 0x0009:                /* nop */
452         return;
453     case 0x001b:                /* sleep */
454         CHECK_PRIVILEGED
455         tcg_gen_movi_i32(cpu_pc, ctx->pc + 2);
456         gen_helper_sleep(cpu_env);
457         return;
458     }
459
460     switch (ctx->opcode & 0xf000) {
461     case 0x1000:                /* mov.l Rm,@(disp,Rn) */
462         {
463             TCGv addr = tcg_temp_new();
464             tcg_gen_addi_i32(addr, REG(B11_8), B3_0 * 4);
465             tcg_gen_qemu_st_i32(REG(B7_4), addr, ctx->memidx, MO_TEUL);
466             tcg_temp_free(addr);
467         }
468         return;
469     case 0x5000:                /* mov.l @(disp,Rm),Rn */
470         {
471             TCGv addr = tcg_temp_new();
472             tcg_gen_addi_i32(addr, REG(B7_4), B3_0 * 4);
473             tcg_gen_qemu_ld_i32(REG(B11_8), addr, ctx->memidx, MO_TESL);
474             tcg_temp_free(addr);
475         }
476         return;
477     case 0xe000:                /* mov #imm,Rn */
478         tcg_gen_movi_i32(REG(B11_8), B7_0s);
479         return;
480     case 0x9000:                /* mov.w @(disp,PC),Rn */
481         {
482             TCGv addr = tcg_const_i32(ctx->pc + 4 + B7_0 * 2);
483             tcg_gen_qemu_ld_i32(REG(B11_8), addr, ctx->memidx, MO_TESW);
484             tcg_temp_free(addr);
485         }
486         return;
487     case 0xd000:                /* mov.l @(disp,PC),Rn */
488         {
489             TCGv addr = tcg_const_i32((ctx->pc + 4 + B7_0 * 4) & ~3);
490             tcg_gen_qemu_ld_i32(REG(B11_8), addr, ctx->memidx, MO_TESL);
491             tcg_temp_free(addr);
492         }
493         return;
494     case 0x7000:                /* add #imm,Rn */
495         tcg_gen_addi_i32(REG(B11_8), REG(B11_8), B7_0s);
496         return;
497     case 0xa000:                /* bra disp */
498         CHECK_NOT_DELAY_SLOT
499         ctx->delayed_pc = ctx->pc + 4 + B11_0s * 2;
500         tcg_gen_movi_i32(cpu_delayed_pc, ctx->delayed_pc);
501         ctx->flags |= DELAY_SLOT;
502         return;
503     case 0xb000:                /* bsr disp */
504         CHECK_NOT_DELAY_SLOT
505         tcg_gen_movi_i32(cpu_pr, ctx->pc + 4);
506         ctx->delayed_pc = ctx->pc + 4 + B11_0s * 2;
507         tcg_gen_movi_i32(cpu_delayed_pc, ctx->delayed_pc);
508         ctx->flags |= DELAY_SLOT;
509         return;
510     }
511
512     switch (ctx->opcode & 0xf00f) {
513     case 0x6003:                /* mov Rm,Rn */
514         tcg_gen_mov_i32(REG(B11_8), REG(B7_4));
515         return;
516     case 0x2000:                /* mov.b Rm,@Rn */
517         tcg_gen_qemu_st_i32(REG(B7_4), REG(B11_8), ctx->memidx, MO_UB);
518         return;
519     case 0x2001:                /* mov.w Rm,@Rn */
520         tcg_gen_qemu_st_i32(REG(B7_4), REG(B11_8), ctx->memidx, MO_TEUW);
521         return;
522     case 0x2002:                /* mov.l Rm,@Rn */
523         tcg_gen_qemu_st_i32(REG(B7_4), REG(B11_8), ctx->memidx, MO_TEUL);
524         return;
525     case 0x6000:                /* mov.b @Rm,Rn */
526         tcg_gen_qemu_ld_i32(REG(B11_8), REG(B7_4), ctx->memidx, MO_SB);
527         return;
528     case 0x6001:                /* mov.w @Rm,Rn */
529         tcg_gen_qemu_ld_i32(REG(B11_8), REG(B7_4), ctx->memidx, MO_TESW);
530         return;
531     case 0x6002:                /* mov.l @Rm,Rn */
532         tcg_gen_qemu_ld_i32(REG(B11_8), REG(B7_4), ctx->memidx, MO_TESL);
533         return;
534     case 0x2004:                /* mov.b Rm,@-Rn */
535         {
536             TCGv addr = tcg_temp_new();
537             tcg_gen_subi_i32(addr, REG(B11_8), 1);
538             /* might cause re-execution */
539             tcg_gen_qemu_st_i32(REG(B7_4), addr, ctx->memidx, MO_UB);
540             tcg_gen_mov_i32(REG(B11_8), addr);                  /* modify register status */
541             tcg_temp_free(addr);
542         }
543         return;
544     case 0x2005:                /* mov.w Rm,@-Rn */
545         {
546             TCGv addr = tcg_temp_new();
547             tcg_gen_subi_i32(addr, REG(B11_8), 2);
548             tcg_gen_qemu_st_i32(REG(B7_4), addr, ctx->memidx, MO_TEUW);
549             tcg_gen_mov_i32(REG(B11_8), addr);
550             tcg_temp_free(addr);
551         }
552         return;
553     case 0x2006:                /* mov.l Rm,@-Rn */
554         {
555             TCGv addr = tcg_temp_new();
556             tcg_gen_subi_i32(addr, REG(B11_8), 4);
557             tcg_gen_qemu_st_i32(REG(B7_4), addr, ctx->memidx, MO_TEUL);
558             tcg_gen_mov_i32(REG(B11_8), addr);
559         }
560         return;
561     case 0x6004:                /* mov.b @Rm+,Rn */
562         tcg_gen_qemu_ld_i32(REG(B11_8), REG(B7_4), ctx->memidx, MO_SB);
563         if ( B11_8 != B7_4 )
564                 tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 1);
565         return;
566     case 0x6005:                /* mov.w @Rm+,Rn */
567         tcg_gen_qemu_ld_i32(REG(B11_8), REG(B7_4), ctx->memidx, MO_TESW);
568         if ( B11_8 != B7_4 )
569                 tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 2);
570         return;
571     case 0x6006:                /* mov.l @Rm+,Rn */
572         tcg_gen_qemu_ld_i32(REG(B11_8), REG(B7_4), ctx->memidx, MO_TESL);
573         if ( B11_8 != B7_4 )
574                 tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 4);
575         return;
576     case 0x0004:                /* mov.b Rm,@(R0,Rn) */
577         {
578             TCGv addr = tcg_temp_new();
579             tcg_gen_add_i32(addr, REG(B11_8), REG(0));
580             tcg_gen_qemu_st_i32(REG(B7_4), addr, ctx->memidx, MO_UB);
581             tcg_temp_free(addr);
582         }
583         return;
584     case 0x0005:                /* mov.w Rm,@(R0,Rn) */
585         {
586             TCGv addr = tcg_temp_new();
587             tcg_gen_add_i32(addr, REG(B11_8), REG(0));
588             tcg_gen_qemu_st_i32(REG(B7_4), addr, ctx->memidx, MO_TEUW);
589             tcg_temp_free(addr);
590         }
591         return;
592     case 0x0006:                /* mov.l Rm,@(R0,Rn) */
593         {
594             TCGv addr = tcg_temp_new();
595             tcg_gen_add_i32(addr, REG(B11_8), REG(0));
596             tcg_gen_qemu_st_i32(REG(B7_4), addr, ctx->memidx, MO_TEUL);
597             tcg_temp_free(addr);
598         }
599         return;
600     case 0x000c:                /* mov.b @(R0,Rm),Rn */
601         {
602             TCGv addr = tcg_temp_new();
603             tcg_gen_add_i32(addr, REG(B7_4), REG(0));
604             tcg_gen_qemu_ld_i32(REG(B11_8), addr, ctx->memidx, MO_SB);
605             tcg_temp_free(addr);
606         }
607         return;
608     case 0x000d:                /* mov.w @(R0,Rm),Rn */
609         {
610             TCGv addr = tcg_temp_new();
611             tcg_gen_add_i32(addr, REG(B7_4), REG(0));
612             tcg_gen_qemu_ld_i32(REG(B11_8), addr, ctx->memidx, MO_TESW);
613             tcg_temp_free(addr);
614         }
615         return;
616     case 0x000e:                /* mov.l @(R0,Rm),Rn */
617         {
618             TCGv addr = tcg_temp_new();
619             tcg_gen_add_i32(addr, REG(B7_4), REG(0));
620             tcg_gen_qemu_ld_i32(REG(B11_8), addr, ctx->memidx, MO_TESL);
621             tcg_temp_free(addr);
622         }
623         return;
624     case 0x6008:                /* swap.b Rm,Rn */
625         {
626             TCGv low = tcg_temp_new();;
627             tcg_gen_ext16u_i32(low, REG(B7_4));
628             tcg_gen_bswap16_i32(low, low);
629             tcg_gen_deposit_i32(REG(B11_8), REG(B7_4), low, 0, 16);
630             tcg_temp_free(low);
631         }
632         return;
633     case 0x6009:                /* swap.w Rm,Rn */
634         tcg_gen_rotli_i32(REG(B11_8), REG(B7_4), 16);
635         return;
636     case 0x200d:                /* xtrct Rm,Rn */
637         {
638             TCGv high, low;
639             high = tcg_temp_new();
640             tcg_gen_shli_i32(high, REG(B7_4), 16);
641             low = tcg_temp_new();
642             tcg_gen_shri_i32(low, REG(B11_8), 16);
643             tcg_gen_or_i32(REG(B11_8), high, low);
644             tcg_temp_free(low);
645             tcg_temp_free(high);
646         }
647         return;
648     case 0x300c:                /* add Rm,Rn */
649         tcg_gen_add_i32(REG(B11_8), REG(B11_8), REG(B7_4));
650         return;
651     case 0x300e:                /* addc Rm,Rn */
652         {
653             TCGv t0, t1;
654             t0 = tcg_const_tl(0);
655             t1 = tcg_temp_new();
656             tcg_gen_add2_i32(t1, cpu_sr_t, cpu_sr_t, t0, REG(B7_4), t0);
657             tcg_gen_add2_i32(REG(B11_8), cpu_sr_t,
658                              REG(B11_8), t0, t1, cpu_sr_t);
659             tcg_temp_free(t0);
660             tcg_temp_free(t1);
661         }
662         return;
663     case 0x300f:                /* addv Rm,Rn */
664         {
665             TCGv t0, t1, t2;
666             t0 = tcg_temp_new();
667             tcg_gen_add_i32(t0, REG(B7_4), REG(B11_8));
668             t1 = tcg_temp_new();
669             tcg_gen_xor_i32(t1, t0, REG(B11_8));
670             t2 = tcg_temp_new();
671             tcg_gen_xor_i32(t2, REG(B7_4), REG(B11_8));
672             tcg_gen_andc_i32(cpu_sr_t, t1, t2);
673             tcg_temp_free(t2);
674             tcg_gen_shri_i32(cpu_sr_t, cpu_sr_t, 31);
675             tcg_temp_free(t1);
676             tcg_gen_mov_i32(REG(B7_4), t0);
677             tcg_temp_free(t0);
678         }
679         return;
680     case 0x2009:                /* and Rm,Rn */
681         tcg_gen_and_i32(REG(B11_8), REG(B11_8), REG(B7_4));
682         return;
683     case 0x3000:                /* cmp/eq Rm,Rn */
684         tcg_gen_setcond_i32(TCG_COND_EQ, cpu_sr_t, REG(B11_8), REG(B7_4));
685         return;
686     case 0x3003:                /* cmp/ge Rm,Rn */
687         tcg_gen_setcond_i32(TCG_COND_GE, cpu_sr_t, REG(B11_8), REG(B7_4));
688         return;
689     case 0x3007:                /* cmp/gt Rm,Rn */
690         tcg_gen_setcond_i32(TCG_COND_GT, cpu_sr_t, REG(B11_8), REG(B7_4));
691         return;
692     case 0x3006:                /* cmp/hi Rm,Rn */
693         tcg_gen_setcond_i32(TCG_COND_GTU, cpu_sr_t, REG(B11_8), REG(B7_4));
694         return;
695     case 0x3002:                /* cmp/hs Rm,Rn */
696         tcg_gen_setcond_i32(TCG_COND_GEU, cpu_sr_t, REG(B11_8), REG(B7_4));
697         return;
698     case 0x200c:                /* cmp/str Rm,Rn */
699         {
700             TCGv cmp1 = tcg_temp_new();
701             TCGv cmp2 = tcg_temp_new();
702             tcg_gen_xor_i32(cmp2, REG(B7_4), REG(B11_8));
703             tcg_gen_subi_i32(cmp1, cmp2, 0x01010101);
704             tcg_gen_andc_i32(cmp1, cmp1, cmp2);
705             tcg_gen_andi_i32(cmp1, cmp1, 0x80808080);
706             tcg_gen_setcondi_i32(TCG_COND_NE, cpu_sr_t, cmp1, 0);
707             tcg_temp_free(cmp2);
708             tcg_temp_free(cmp1);
709         }
710         return;
711     case 0x2007:                /* div0s Rm,Rn */
712         tcg_gen_shri_i32(cpu_sr_q, REG(B11_8), 31);         /* SR_Q */
713         tcg_gen_shri_i32(cpu_sr_m, REG(B7_4), 31);          /* SR_M */
714         tcg_gen_xor_i32(cpu_sr_t, cpu_sr_q, cpu_sr_m);      /* SR_T */
715         return;
716     case 0x3004:                /* div1 Rm,Rn */
717         {
718             TCGv t0 = tcg_temp_new();
719             TCGv t1 = tcg_temp_new();
720             TCGv t2 = tcg_temp_new();
721             TCGv zero = tcg_const_i32(0);
722
723             /* shift left arg1, saving the bit being pushed out and inserting
724                T on the right */
725             tcg_gen_shri_i32(t0, REG(B11_8), 31);
726             tcg_gen_shli_i32(REG(B11_8), REG(B11_8), 1);
727             tcg_gen_or_i32(REG(B11_8), REG(B11_8), cpu_sr_t);
728
729             /* Add or subtract arg0 from arg1 depending if Q == M. To avoid
730                using 64-bit temps, we compute arg0's high part from q ^ m, so
731                that it is 0x00000000 when adding the value or 0xffffffff when
732                subtracting it. */
733             tcg_gen_xor_i32(t1, cpu_sr_q, cpu_sr_m);
734             tcg_gen_subi_i32(t1, t1, 1);
735             tcg_gen_neg_i32(t2, REG(B7_4));
736             tcg_gen_movcond_i32(TCG_COND_EQ, t2, t1, zero, REG(B7_4), t2);
737             tcg_gen_add2_i32(REG(B11_8), t1, REG(B11_8), zero, t2, t1);
738
739             /* compute T and Q depending on carry */
740             tcg_gen_andi_i32(t1, t1, 1);
741             tcg_gen_xor_i32(t1, t1, t0);
742             tcg_gen_xori_i32(cpu_sr_t, t1, 1);
743             tcg_gen_xor_i32(cpu_sr_q, cpu_sr_m, t1);
744
745             tcg_temp_free(zero);
746             tcg_temp_free(t2);
747             tcg_temp_free(t1);
748             tcg_temp_free(t0);
749         }
750         return;
751     case 0x300d:                /* dmuls.l Rm,Rn */
752         tcg_gen_muls2_i32(cpu_macl, cpu_mach, REG(B7_4), REG(B11_8));
753         return;
754     case 0x3005:                /* dmulu.l Rm,Rn */
755         tcg_gen_mulu2_i32(cpu_macl, cpu_mach, REG(B7_4), REG(B11_8));
756         return;
757     case 0x600e:                /* exts.b Rm,Rn */
758         tcg_gen_ext8s_i32(REG(B11_8), REG(B7_4));
759         return;
760     case 0x600f:                /* exts.w Rm,Rn */
761         tcg_gen_ext16s_i32(REG(B11_8), REG(B7_4));
762         return;
763     case 0x600c:                /* extu.b Rm,Rn */
764         tcg_gen_ext8u_i32(REG(B11_8), REG(B7_4));
765         return;
766     case 0x600d:                /* extu.w Rm,Rn */
767         tcg_gen_ext16u_i32(REG(B11_8), REG(B7_4));
768         return;
769     case 0x000f:                /* mac.l @Rm+,@Rn+ */
770         {
771             TCGv arg0, arg1;
772             arg0 = tcg_temp_new();
773             tcg_gen_qemu_ld_i32(arg0, REG(B7_4), ctx->memidx, MO_TESL);
774             arg1 = tcg_temp_new();
775             tcg_gen_qemu_ld_i32(arg1, REG(B11_8), ctx->memidx, MO_TESL);
776             gen_helper_macl(cpu_env, arg0, arg1);
777             tcg_temp_free(arg1);
778             tcg_temp_free(arg0);
779             tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 4);
780             tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4);
781         }
782         return;
783     case 0x400f:                /* mac.w @Rm+,@Rn+ */
784         {
785             TCGv arg0, arg1;
786             arg0 = tcg_temp_new();
787             tcg_gen_qemu_ld_i32(arg0, REG(B7_4), ctx->memidx, MO_TESL);
788             arg1 = tcg_temp_new();
789             tcg_gen_qemu_ld_i32(arg1, REG(B11_8), ctx->memidx, MO_TESL);
790             gen_helper_macw(cpu_env, arg0, arg1);
791             tcg_temp_free(arg1);
792             tcg_temp_free(arg0);
793             tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 2);
794             tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 2);
795         }
796         return;
797     case 0x0007:                /* mul.l Rm,Rn */
798         tcg_gen_mul_i32(cpu_macl, REG(B7_4), REG(B11_8));
799         return;
800     case 0x200f:                /* muls.w Rm,Rn */
801         {
802             TCGv arg0, arg1;
803             arg0 = tcg_temp_new();
804             tcg_gen_ext16s_i32(arg0, REG(B7_4));
805             arg1 = tcg_temp_new();
806             tcg_gen_ext16s_i32(arg1, REG(B11_8));
807             tcg_gen_mul_i32(cpu_macl, arg0, arg1);
808             tcg_temp_free(arg1);
809             tcg_temp_free(arg0);
810         }
811         return;
812     case 0x200e:                /* mulu.w Rm,Rn */
813         {
814             TCGv arg0, arg1;
815             arg0 = tcg_temp_new();
816             tcg_gen_ext16u_i32(arg0, REG(B7_4));
817             arg1 = tcg_temp_new();
818             tcg_gen_ext16u_i32(arg1, REG(B11_8));
819             tcg_gen_mul_i32(cpu_macl, arg0, arg1);
820             tcg_temp_free(arg1);
821             tcg_temp_free(arg0);
822         }
823         return;
824     case 0x600b:                /* neg Rm,Rn */
825         tcg_gen_neg_i32(REG(B11_8), REG(B7_4));
826         return;
827     case 0x600a:                /* negc Rm,Rn */
828         {
829             TCGv t0 = tcg_const_i32(0);
830             tcg_gen_add2_i32(REG(B11_8), cpu_sr_t,
831                              REG(B7_4), t0, cpu_sr_t, t0);
832             tcg_gen_sub2_i32(REG(B11_8), cpu_sr_t,
833                              t0, t0, REG(B11_8), cpu_sr_t);
834             tcg_gen_andi_i32(cpu_sr_t, cpu_sr_t, 1);
835             tcg_temp_free(t0);
836         }
837         return;
838     case 0x6007:                /* not Rm,Rn */
839         tcg_gen_not_i32(REG(B11_8), REG(B7_4));
840         return;
841     case 0x200b:                /* or Rm,Rn */
842         tcg_gen_or_i32(REG(B11_8), REG(B11_8), REG(B7_4));
843         return;
844     case 0x400c:                /* shad Rm,Rn */
845         {
846             TCGv t0 = tcg_temp_new();
847             TCGv t1 = tcg_temp_new();
848             TCGv t2 = tcg_temp_new();
849
850             tcg_gen_andi_i32(t0, REG(B7_4), 0x1f);
851
852             /* positive case: shift to the left */
853             tcg_gen_shl_i32(t1, REG(B11_8), t0);
854
855             /* negative case: shift to the right in two steps to
856                correctly handle the -32 case */
857             tcg_gen_xori_i32(t0, t0, 0x1f);
858             tcg_gen_sar_i32(t2, REG(B11_8), t0);
859             tcg_gen_sari_i32(t2, t2, 1);
860
861             /* select between the two cases */
862             tcg_gen_movi_i32(t0, 0);
863             tcg_gen_movcond_i32(TCG_COND_GE, REG(B11_8), REG(B7_4), t0, t1, t2);
864
865             tcg_temp_free(t0);
866             tcg_temp_free(t1);
867             tcg_temp_free(t2);
868         }
869         return;
870     case 0x400d:                /* shld Rm,Rn */
871         {
872             TCGv t0 = tcg_temp_new();
873             TCGv t1 = tcg_temp_new();
874             TCGv t2 = tcg_temp_new();
875
876             tcg_gen_andi_i32(t0, REG(B7_4), 0x1f);
877
878             /* positive case: shift to the left */
879             tcg_gen_shl_i32(t1, REG(B11_8), t0);
880
881             /* negative case: shift to the right in two steps to
882                correctly handle the -32 case */
883             tcg_gen_xori_i32(t0, t0, 0x1f);
884             tcg_gen_shr_i32(t2, REG(B11_8), t0);
885             tcg_gen_shri_i32(t2, t2, 1);
886
887             /* select between the two cases */
888             tcg_gen_movi_i32(t0, 0);
889             tcg_gen_movcond_i32(TCG_COND_GE, REG(B11_8), REG(B7_4), t0, t1, t2);
890
891             tcg_temp_free(t0);
892             tcg_temp_free(t1);
893             tcg_temp_free(t2);
894         }
895         return;
896     case 0x3008:                /* sub Rm,Rn */
897         tcg_gen_sub_i32(REG(B11_8), REG(B11_8), REG(B7_4));
898         return;
899     case 0x300a:                /* subc Rm,Rn */
900         {
901             TCGv t0, t1;
902             t0 = tcg_const_tl(0);
903             t1 = tcg_temp_new();
904             tcg_gen_add2_i32(t1, cpu_sr_t, cpu_sr_t, t0, REG(B7_4), t0);
905             tcg_gen_sub2_i32(REG(B11_8), cpu_sr_t,
906                              REG(B11_8), t0, t1, cpu_sr_t);
907             tcg_gen_andi_i32(cpu_sr_t, cpu_sr_t, 1);
908             tcg_temp_free(t0);
909             tcg_temp_free(t1);
910         }
911         return;
912     case 0x300b:                /* subv Rm,Rn */
913         {
914             TCGv t0, t1, t2;
915             t0 = tcg_temp_new();
916             tcg_gen_sub_i32(t0, REG(B11_8), REG(B7_4));
917             t1 = tcg_temp_new();
918             tcg_gen_xor_i32(t1, t0, REG(B7_4));
919             t2 = tcg_temp_new();
920             tcg_gen_xor_i32(t2, REG(B11_8), REG(B7_4));
921             tcg_gen_and_i32(t1, t1, t2);
922             tcg_temp_free(t2);
923             tcg_gen_shri_i32(cpu_sr_t, t1, 31);
924             tcg_temp_free(t1);
925             tcg_gen_mov_i32(REG(B11_8), t0);
926             tcg_temp_free(t0);
927         }
928         return;
929     case 0x2008:                /* tst Rm,Rn */
930         {
931             TCGv val = tcg_temp_new();
932             tcg_gen_and_i32(val, REG(B7_4), REG(B11_8));
933             tcg_gen_setcondi_i32(TCG_COND_EQ, cpu_sr_t, val, 0);
934             tcg_temp_free(val);
935         }
936         return;
937     case 0x200a:                /* xor Rm,Rn */
938         tcg_gen_xor_i32(REG(B11_8), REG(B11_8), REG(B7_4));
939         return;
940     case 0xf00c: /* fmov {F,D,X}Rm,{F,D,X}Rn - FPSCR: Nothing */
941         CHECK_FPU_ENABLED
942         if (ctx->flags & FPSCR_SZ) {
943             TCGv_i64 fp = tcg_temp_new_i64();
944             gen_load_fpr64(fp, XREG(B7_4));
945             gen_store_fpr64(fp, XREG(B11_8));
946             tcg_temp_free_i64(fp);
947         } else {
948             tcg_gen_mov_i32(cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B7_4)]);
949         }
950         return;
951     case 0xf00a: /* fmov {F,D,X}Rm,@Rn - FPSCR: Nothing */
952         CHECK_FPU_ENABLED
953         if (ctx->flags & FPSCR_SZ) {
954             TCGv addr_hi = tcg_temp_new();
955             int fr = XREG(B7_4);
956             tcg_gen_addi_i32(addr_hi, REG(B11_8), 4);
957             tcg_gen_qemu_st_i32(cpu_fregs[fr], REG(B11_8),
958                                 ctx->memidx, MO_TEUL);
959             tcg_gen_qemu_st_i32(cpu_fregs[fr+1], addr_hi,
960                                 ctx->memidx, MO_TEUL);
961             tcg_temp_free(addr_hi);
962         } else {
963             tcg_gen_qemu_st_i32(cpu_fregs[FREG(B7_4)], REG(B11_8),
964                                 ctx->memidx, MO_TEUL);
965         }
966         return;
967     case 0xf008: /* fmov @Rm,{F,D,X}Rn - FPSCR: Nothing */
968         CHECK_FPU_ENABLED
969         if (ctx->flags & FPSCR_SZ) {
970             TCGv addr_hi = tcg_temp_new();
971             int fr = XREG(B11_8);
972             tcg_gen_addi_i32(addr_hi, REG(B7_4), 4);
973             tcg_gen_qemu_ld_i32(cpu_fregs[fr], REG(B7_4), ctx->memidx, MO_TEUL);
974             tcg_gen_qemu_ld_i32(cpu_fregs[fr+1], addr_hi, ctx->memidx, MO_TEUL);
975             tcg_temp_free(addr_hi);
976         } else {
977             tcg_gen_qemu_ld_i32(cpu_fregs[FREG(B11_8)], REG(B7_4),
978                                 ctx->memidx, MO_TEUL);
979         }
980         return;
981     case 0xf009: /* fmov @Rm+,{F,D,X}Rn - FPSCR: Nothing */
982         CHECK_FPU_ENABLED
983         if (ctx->flags & FPSCR_SZ) {
984             TCGv addr_hi = tcg_temp_new();
985             int fr = XREG(B11_8);
986             tcg_gen_addi_i32(addr_hi, REG(B7_4), 4);
987             tcg_gen_qemu_ld_i32(cpu_fregs[fr], REG(B7_4), ctx->memidx, MO_TEUL);
988             tcg_gen_qemu_ld_i32(cpu_fregs[fr+1], addr_hi, ctx->memidx, MO_TEUL);
989             tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 8);
990             tcg_temp_free(addr_hi);
991         } else {
992             tcg_gen_qemu_ld_i32(cpu_fregs[FREG(B11_8)], REG(B7_4),
993                                 ctx->memidx, MO_TEUL);
994             tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 4);
995         }
996         return;
997     case 0xf00b: /* fmov {F,D,X}Rm,@-Rn - FPSCR: Nothing */
998         CHECK_FPU_ENABLED
999         TCGv addr = tcg_temp_new_i32();
1000         tcg_gen_subi_i32(addr, REG(B11_8), 4);
1001         if (ctx->flags & FPSCR_SZ) {
1002             int fr = XREG(B7_4);
1003             tcg_gen_qemu_st_i32(cpu_fregs[fr+1], addr, ctx->memidx, MO_TEUL);
1004             tcg_gen_subi_i32(addr, addr, 4);
1005             tcg_gen_qemu_st_i32(cpu_fregs[fr], addr, ctx->memidx, MO_TEUL);
1006         } else {
1007             tcg_gen_qemu_st_i32(cpu_fregs[FREG(B7_4)], addr,
1008                                 ctx->memidx, MO_TEUL);
1009         }
1010         tcg_gen_mov_i32(REG(B11_8), addr);
1011         tcg_temp_free(addr);
1012         return;
1013     case 0xf006: /* fmov @(R0,Rm),{F,D,X}Rm - FPSCR: Nothing */
1014         CHECK_FPU_ENABLED
1015         {
1016             TCGv addr = tcg_temp_new_i32();
1017             tcg_gen_add_i32(addr, REG(B7_4), REG(0));
1018             if (ctx->flags & FPSCR_SZ) {
1019                 int fr = XREG(B11_8);
1020                 tcg_gen_qemu_ld_i32(cpu_fregs[fr], addr,
1021                                     ctx->memidx, MO_TEUL);
1022                 tcg_gen_addi_i32(addr, addr, 4);
1023                 tcg_gen_qemu_ld_i32(cpu_fregs[fr+1], addr,
1024                                     ctx->memidx, MO_TEUL);
1025             } else {
1026                 tcg_gen_qemu_ld_i32(cpu_fregs[FREG(B11_8)], addr,
1027                                     ctx->memidx, MO_TEUL);
1028             }
1029             tcg_temp_free(addr);
1030         }
1031         return;
1032     case 0xf007: /* fmov {F,D,X}Rn,@(R0,Rn) - FPSCR: Nothing */
1033         CHECK_FPU_ENABLED
1034         {
1035             TCGv addr = tcg_temp_new();
1036             tcg_gen_add_i32(addr, REG(B11_8), REG(0));
1037             if (ctx->flags & FPSCR_SZ) {
1038                 int fr = XREG(B7_4);
1039                 tcg_gen_qemu_ld_i32(cpu_fregs[fr], addr,
1040                                     ctx->memidx, MO_TEUL);
1041                 tcg_gen_addi_i32(addr, addr, 4);
1042                 tcg_gen_qemu_ld_i32(cpu_fregs[fr+1], addr,
1043                                     ctx->memidx, MO_TEUL);
1044             } else {
1045                 tcg_gen_qemu_st_i32(cpu_fregs[FREG(B7_4)], addr,
1046                                     ctx->memidx, MO_TEUL);
1047             }
1048             tcg_temp_free(addr);
1049         }
1050         return;
1051     case 0xf000: /* fadd Rm,Rn - FPSCR: R[PR,Enable.O/U/I]/W[Cause,Flag] */
1052     case 0xf001: /* fsub Rm,Rn - FPSCR: R[PR,Enable.O/U/I]/W[Cause,Flag] */
1053     case 0xf002: /* fmul Rm,Rn - FPSCR: R[PR,Enable.O/U/I]/W[Cause,Flag] */
1054     case 0xf003: /* fdiv Rm,Rn - FPSCR: R[PR,Enable.O/U/I]/W[Cause,Flag] */
1055     case 0xf004: /* fcmp/eq Rm,Rn - FPSCR: R[PR,Enable.V]/W[Cause,Flag] */
1056     case 0xf005: /* fcmp/gt Rm,Rn - FPSCR: R[PR,Enable.V]/W[Cause,Flag] */
1057         {
1058             CHECK_FPU_ENABLED
1059             if (ctx->flags & FPSCR_PR) {
1060                 TCGv_i64 fp0, fp1;
1061
1062                 if (ctx->opcode & 0x0110)
1063                     break; /* illegal instruction */
1064                 fp0 = tcg_temp_new_i64();
1065                 fp1 = tcg_temp_new_i64();
1066                 gen_load_fpr64(fp0, DREG(B11_8));
1067                 gen_load_fpr64(fp1, DREG(B7_4));
1068                 switch (ctx->opcode & 0xf00f) {
1069                 case 0xf000:            /* fadd Rm,Rn */
1070                     gen_helper_fadd_DT(fp0, cpu_env, fp0, fp1);
1071                     break;
1072                 case 0xf001:            /* fsub Rm,Rn */
1073                     gen_helper_fsub_DT(fp0, cpu_env, fp0, fp1);
1074                     break;
1075                 case 0xf002:            /* fmul Rm,Rn */
1076                     gen_helper_fmul_DT(fp0, cpu_env, fp0, fp1);
1077                     break;
1078                 case 0xf003:            /* fdiv Rm,Rn */
1079                     gen_helper_fdiv_DT(fp0, cpu_env, fp0, fp1);
1080                     break;
1081                 case 0xf004:            /* fcmp/eq Rm,Rn */
1082                     gen_helper_fcmp_eq_DT(cpu_env, fp0, fp1);
1083                     return;
1084                 case 0xf005:            /* fcmp/gt Rm,Rn */
1085                     gen_helper_fcmp_gt_DT(cpu_env, fp0, fp1);
1086                     return;
1087                 }
1088                 gen_store_fpr64(fp0, DREG(B11_8));
1089                 tcg_temp_free_i64(fp0);
1090                 tcg_temp_free_i64(fp1);
1091             } else {
1092                 switch (ctx->opcode & 0xf00f) {
1093                 case 0xf000:            /* fadd Rm,Rn */
1094                     gen_helper_fadd_FT(cpu_fregs[FREG(B11_8)], cpu_env,
1095                                        cpu_fregs[FREG(B11_8)],
1096                                        cpu_fregs[FREG(B7_4)]);
1097                     break;
1098                 case 0xf001:            /* fsub Rm,Rn */
1099                     gen_helper_fsub_FT(cpu_fregs[FREG(B11_8)], cpu_env,
1100                                        cpu_fregs[FREG(B11_8)],
1101                                        cpu_fregs[FREG(B7_4)]);
1102                     break;
1103                 case 0xf002:            /* fmul Rm,Rn */
1104                     gen_helper_fmul_FT(cpu_fregs[FREG(B11_8)], cpu_env,
1105                                        cpu_fregs[FREG(B11_8)],
1106                                        cpu_fregs[FREG(B7_4)]);
1107                     break;
1108                 case 0xf003:            /* fdiv Rm,Rn */
1109                     gen_helper_fdiv_FT(cpu_fregs[FREG(B11_8)], cpu_env,
1110                                        cpu_fregs[FREG(B11_8)],
1111                                        cpu_fregs[FREG(B7_4)]);
1112                     break;
1113                 case 0xf004:            /* fcmp/eq Rm,Rn */
1114                     gen_helper_fcmp_eq_FT(cpu_env, cpu_fregs[FREG(B11_8)],
1115                                           cpu_fregs[FREG(B7_4)]);
1116                     return;
1117                 case 0xf005:            /* fcmp/gt Rm,Rn */
1118                     gen_helper_fcmp_gt_FT(cpu_env, cpu_fregs[FREG(B11_8)],
1119                                           cpu_fregs[FREG(B7_4)]);
1120                     return;
1121                 }
1122             }
1123         }
1124         return;
1125     case 0xf00e: /* fmac FR0,RM,Rn */
1126         {
1127             CHECK_FPU_ENABLED
1128             if (ctx->flags & FPSCR_PR) {
1129                 break; /* illegal instruction */
1130             } else {
1131                 gen_helper_fmac_FT(cpu_fregs[FREG(B11_8)], cpu_env,
1132                                    cpu_fregs[FREG(0)], cpu_fregs[FREG(B7_4)],
1133                                    cpu_fregs[FREG(B11_8)]);
1134                 return;
1135             }
1136         }
1137     }
1138
1139     switch (ctx->opcode & 0xff00) {
1140     case 0xc900:                /* and #imm,R0 */
1141         tcg_gen_andi_i32(REG(0), REG(0), B7_0);
1142         return;
1143     case 0xcd00:                /* and.b #imm,@(R0,GBR) */
1144         {
1145             TCGv addr, val;
1146             addr = tcg_temp_new();
1147             tcg_gen_add_i32(addr, REG(0), cpu_gbr);
1148             val = tcg_temp_new();
1149             tcg_gen_qemu_ld_i32(val, addr, ctx->memidx, MO_UB);
1150             tcg_gen_andi_i32(val, val, B7_0);
1151             tcg_gen_qemu_st_i32(val, addr, ctx->memidx, MO_UB);
1152             tcg_temp_free(val);
1153             tcg_temp_free(addr);
1154         }
1155         return;
1156     case 0x8b00:                /* bf label */
1157         CHECK_NOT_DELAY_SLOT
1158             gen_conditional_jump(ctx, ctx->pc + 2,
1159                                  ctx->pc + 4 + B7_0s * 2);
1160         ctx->bstate = BS_BRANCH;
1161         return;
1162     case 0x8f00:                /* bf/s label */
1163         CHECK_NOT_DELAY_SLOT
1164         gen_branch_slot(ctx->delayed_pc = ctx->pc + 4 + B7_0s * 2, 0);
1165         ctx->flags |= DELAY_SLOT_CONDITIONAL;
1166         return;
1167     case 0x8900:                /* bt label */
1168         CHECK_NOT_DELAY_SLOT
1169             gen_conditional_jump(ctx, ctx->pc + 4 + B7_0s * 2,
1170                                  ctx->pc + 2);
1171         ctx->bstate = BS_BRANCH;
1172         return;
1173     case 0x8d00:                /* bt/s label */
1174         CHECK_NOT_DELAY_SLOT
1175         gen_branch_slot(ctx->delayed_pc = ctx->pc + 4 + B7_0s * 2, 1);
1176         ctx->flags |= DELAY_SLOT_CONDITIONAL;
1177         return;
1178     case 0x8800:                /* cmp/eq #imm,R0 */
1179         tcg_gen_setcondi_i32(TCG_COND_EQ, cpu_sr_t, REG(0), B7_0s);
1180         return;
1181     case 0xc400:                /* mov.b @(disp,GBR),R0 */
1182         {
1183             TCGv addr = tcg_temp_new();
1184             tcg_gen_addi_i32(addr, cpu_gbr, B7_0);
1185             tcg_gen_qemu_ld_i32(REG(0), addr, ctx->memidx, MO_SB);
1186             tcg_temp_free(addr);
1187         }
1188         return;
1189     case 0xc500:                /* mov.w @(disp,GBR),R0 */
1190         {
1191             TCGv addr = tcg_temp_new();
1192             tcg_gen_addi_i32(addr, cpu_gbr, B7_0 * 2);
1193             tcg_gen_qemu_ld_i32(REG(0), addr, ctx->memidx, MO_TESW);
1194             tcg_temp_free(addr);
1195         }
1196         return;
1197     case 0xc600:                /* mov.l @(disp,GBR),R0 */
1198         {
1199             TCGv addr = tcg_temp_new();
1200             tcg_gen_addi_i32(addr, cpu_gbr, B7_0 * 4);
1201             tcg_gen_qemu_ld_i32(REG(0), addr, ctx->memidx, MO_TESL);
1202             tcg_temp_free(addr);
1203         }
1204         return;
1205     case 0xc000:                /* mov.b R0,@(disp,GBR) */
1206         {
1207             TCGv addr = tcg_temp_new();
1208             tcg_gen_addi_i32(addr, cpu_gbr, B7_0);
1209             tcg_gen_qemu_st_i32(REG(0), addr, ctx->memidx, MO_UB);
1210             tcg_temp_free(addr);
1211         }
1212         return;
1213     case 0xc100:                /* mov.w R0,@(disp,GBR) */
1214         {
1215             TCGv addr = tcg_temp_new();
1216             tcg_gen_addi_i32(addr, cpu_gbr, B7_0 * 2);
1217             tcg_gen_qemu_st_i32(REG(0), addr, ctx->memidx, MO_TEUW);
1218             tcg_temp_free(addr);
1219         }
1220         return;
1221     case 0xc200:                /* mov.l R0,@(disp,GBR) */
1222         {
1223             TCGv addr = tcg_temp_new();
1224             tcg_gen_addi_i32(addr, cpu_gbr, B7_0 * 4);
1225             tcg_gen_qemu_st_i32(REG(0), addr, ctx->memidx, MO_TEUL);
1226             tcg_temp_free(addr);
1227         }
1228         return;
1229     case 0x8000:                /* mov.b R0,@(disp,Rn) */
1230         {
1231             TCGv addr = tcg_temp_new();
1232             tcg_gen_addi_i32(addr, REG(B7_4), B3_0);
1233             tcg_gen_qemu_st_i32(REG(0), addr, ctx->memidx, MO_UB);
1234             tcg_temp_free(addr);
1235         }
1236         return;
1237     case 0x8100:                /* mov.w R0,@(disp,Rn) */
1238         {
1239             TCGv addr = tcg_temp_new();
1240             tcg_gen_addi_i32(addr, REG(B7_4), B3_0 * 2);
1241             tcg_gen_qemu_st_i32(REG(0), addr, ctx->memidx, MO_TEUW);
1242             tcg_temp_free(addr);
1243         }
1244         return;
1245     case 0x8400:                /* mov.b @(disp,Rn),R0 */
1246         {
1247             TCGv addr = tcg_temp_new();
1248             tcg_gen_addi_i32(addr, REG(B7_4), B3_0);
1249             tcg_gen_qemu_ld_i32(REG(0), addr, ctx->memidx, MO_SB);
1250             tcg_temp_free(addr);
1251         }
1252         return;
1253     case 0x8500:                /* mov.w @(disp,Rn),R0 */
1254         {
1255             TCGv addr = tcg_temp_new();
1256             tcg_gen_addi_i32(addr, REG(B7_4), B3_0 * 2);
1257             tcg_gen_qemu_ld_i32(REG(0), addr, ctx->memidx, MO_TESW);
1258             tcg_temp_free(addr);
1259         }
1260         return;
1261     case 0xc700:                /* mova @(disp,PC),R0 */
1262         tcg_gen_movi_i32(REG(0), ((ctx->pc & 0xfffffffc) + 4 + B7_0 * 4) & ~3);
1263         return;
1264     case 0xcb00:                /* or #imm,R0 */
1265         tcg_gen_ori_i32(REG(0), REG(0), B7_0);
1266         return;
1267     case 0xcf00:                /* or.b #imm,@(R0,GBR) */
1268         {
1269             TCGv addr, val;
1270             addr = tcg_temp_new();
1271             tcg_gen_add_i32(addr, REG(0), cpu_gbr);
1272             val = tcg_temp_new();
1273             tcg_gen_qemu_ld_i32(val, addr, ctx->memidx, MO_UB);
1274             tcg_gen_ori_i32(val, val, B7_0);
1275             tcg_gen_qemu_st_i32(val, addr, ctx->memidx, MO_UB);
1276             tcg_temp_free(val);
1277             tcg_temp_free(addr);
1278         }
1279         return;
1280     case 0xc300:                /* trapa #imm */
1281         {
1282             TCGv imm;
1283             CHECK_NOT_DELAY_SLOT
1284             tcg_gen_movi_i32(cpu_pc, ctx->pc);
1285             imm = tcg_const_i32(B7_0);
1286             gen_helper_trapa(cpu_env, imm);
1287             tcg_temp_free(imm);
1288             ctx->bstate = BS_BRANCH;
1289         }
1290         return;
1291     case 0xc800:                /* tst #imm,R0 */
1292         {
1293             TCGv val = tcg_temp_new();
1294             tcg_gen_andi_i32(val, REG(0), B7_0);
1295             tcg_gen_setcondi_i32(TCG_COND_EQ, cpu_sr_t, val, 0);
1296             tcg_temp_free(val);
1297         }
1298         return;
1299     case 0xcc00:                /* tst.b #imm,@(R0,GBR) */
1300         {
1301             TCGv val = tcg_temp_new();
1302             tcg_gen_add_i32(val, REG(0), cpu_gbr);
1303             tcg_gen_qemu_ld_i32(val, val, ctx->memidx, MO_UB);
1304             tcg_gen_andi_i32(val, val, B7_0);
1305             tcg_gen_setcondi_i32(TCG_COND_EQ, cpu_sr_t, val, 0);
1306             tcg_temp_free(val);
1307         }
1308         return;
1309     case 0xca00:                /* xor #imm,R0 */
1310         tcg_gen_xori_i32(REG(0), REG(0), B7_0);
1311         return;
1312     case 0xce00:                /* xor.b #imm,@(R0,GBR) */
1313         {
1314             TCGv addr, val;
1315             addr = tcg_temp_new();
1316             tcg_gen_add_i32(addr, REG(0), cpu_gbr);
1317             val = tcg_temp_new();
1318             tcg_gen_qemu_ld_i32(val, addr, ctx->memidx, MO_UB);
1319             tcg_gen_xori_i32(val, val, B7_0);
1320             tcg_gen_qemu_st_i32(val, addr, ctx->memidx, MO_UB);
1321             tcg_temp_free(val);
1322             tcg_temp_free(addr);
1323         }
1324         return;
1325     }
1326
1327     switch (ctx->opcode & 0xf08f) {
1328     case 0x408e:                /* ldc Rm,Rn_BANK */
1329         CHECK_PRIVILEGED
1330         tcg_gen_mov_i32(ALTREG(B6_4), REG(B11_8));
1331         return;
1332     case 0x4087:                /* ldc.l @Rm+,Rn_BANK */
1333         CHECK_PRIVILEGED
1334         tcg_gen_qemu_ld_i32(ALTREG(B6_4), REG(B11_8), ctx->memidx, MO_TESL);
1335         tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4);
1336         return;
1337     case 0x0082:                /* stc Rm_BANK,Rn */
1338         CHECK_PRIVILEGED
1339         tcg_gen_mov_i32(REG(B11_8), ALTREG(B6_4));
1340         return;
1341     case 0x4083:                /* stc.l Rm_BANK,@-Rn */
1342         CHECK_PRIVILEGED
1343         {
1344             TCGv addr = tcg_temp_new();
1345             tcg_gen_subi_i32(addr, REG(B11_8), 4);
1346             tcg_gen_qemu_st_i32(ALTREG(B6_4), addr, ctx->memidx, MO_TEUL);
1347             tcg_gen_mov_i32(REG(B11_8), addr);
1348             tcg_temp_free(addr);
1349         }
1350         return;
1351     }
1352
1353     switch (ctx->opcode & 0xf0ff) {
1354     case 0x0023:                /* braf Rn */
1355         CHECK_NOT_DELAY_SLOT
1356         tcg_gen_addi_i32(cpu_delayed_pc, REG(B11_8), ctx->pc + 4);
1357         ctx->flags |= DELAY_SLOT;
1358         ctx->delayed_pc = (uint32_t) - 1;
1359         return;
1360     case 0x0003:                /* bsrf Rn */
1361         CHECK_NOT_DELAY_SLOT
1362         tcg_gen_movi_i32(cpu_pr, ctx->pc + 4);
1363         tcg_gen_add_i32(cpu_delayed_pc, REG(B11_8), cpu_pr);
1364         ctx->flags |= DELAY_SLOT;
1365         ctx->delayed_pc = (uint32_t) - 1;
1366         return;
1367     case 0x4015:                /* cmp/pl Rn */
1368         tcg_gen_setcondi_i32(TCG_COND_GT, cpu_sr_t, REG(B11_8), 0);
1369         return;
1370     case 0x4011:                /* cmp/pz Rn */
1371         tcg_gen_setcondi_i32(TCG_COND_GE, cpu_sr_t, REG(B11_8), 0);
1372         return;
1373     case 0x4010:                /* dt Rn */
1374         tcg_gen_subi_i32(REG(B11_8), REG(B11_8), 1);
1375         tcg_gen_setcondi_i32(TCG_COND_EQ, cpu_sr_t, REG(B11_8), 0);
1376         return;
1377     case 0x402b:                /* jmp @Rn */
1378         CHECK_NOT_DELAY_SLOT
1379         tcg_gen_mov_i32(cpu_delayed_pc, REG(B11_8));
1380         ctx->flags |= DELAY_SLOT;
1381         ctx->delayed_pc = (uint32_t) - 1;
1382         return;
1383     case 0x400b:                /* jsr @Rn */
1384         CHECK_NOT_DELAY_SLOT
1385         tcg_gen_movi_i32(cpu_pr, ctx->pc + 4);
1386         tcg_gen_mov_i32(cpu_delayed_pc, REG(B11_8));
1387         ctx->flags |= DELAY_SLOT;
1388         ctx->delayed_pc = (uint32_t) - 1;
1389         return;
1390     case 0x400e:                /* ldc Rm,SR */
1391         CHECK_PRIVILEGED
1392         {
1393             TCGv val = tcg_temp_new();
1394             tcg_gen_andi_i32(val, REG(B11_8), 0x700083f3);
1395             gen_write_sr(val);
1396             tcg_temp_free(val);
1397             ctx->bstate = BS_STOP;
1398         }
1399         return;
1400     case 0x4007:                /* ldc.l @Rm+,SR */
1401         CHECK_PRIVILEGED
1402         {
1403             TCGv val = tcg_temp_new();
1404             tcg_gen_qemu_ld_i32(val, REG(B11_8), ctx->memidx, MO_TESL);
1405             tcg_gen_andi_i32(val, val, 0x700083f3);
1406             gen_write_sr(val);
1407             tcg_temp_free(val);
1408             tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4);
1409             ctx->bstate = BS_STOP;
1410         }
1411         return;
1412     case 0x0002:                /* stc SR,Rn */
1413         CHECK_PRIVILEGED
1414         gen_read_sr(REG(B11_8));
1415         return;
1416     case 0x4003:                /* stc SR,@-Rn */
1417         CHECK_PRIVILEGED
1418         {
1419             TCGv addr = tcg_temp_new();
1420             TCGv val = tcg_temp_new();
1421             tcg_gen_subi_i32(addr, REG(B11_8), 4);
1422             gen_read_sr(val);
1423             tcg_gen_qemu_st_i32(val, addr, ctx->memidx, MO_TEUL);
1424             tcg_gen_mov_i32(REG(B11_8), addr);
1425             tcg_temp_free(val);
1426             tcg_temp_free(addr);
1427         }
1428         return;
1429 #define LD(reg,ldnum,ldpnum,prechk)             \
1430   case ldnum:                                                   \
1431     prechk                                                      \
1432     tcg_gen_mov_i32 (cpu_##reg, REG(B11_8));                    \
1433     return;                                                     \
1434   case ldpnum:                                                  \
1435     prechk                                                      \
1436     tcg_gen_qemu_ld_i32(cpu_##reg, REG(B11_8), ctx->memidx, MO_TESL); \
1437     tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4);                \
1438     return;
1439 #define ST(reg,stnum,stpnum,prechk)             \
1440   case stnum:                                                   \
1441     prechk                                                      \
1442     tcg_gen_mov_i32 (REG(B11_8), cpu_##reg);                    \
1443     return;                                                     \
1444   case stpnum:                                                  \
1445     prechk                                                      \
1446     {                                                           \
1447         TCGv addr = tcg_temp_new();                             \
1448         tcg_gen_subi_i32(addr, REG(B11_8), 4);                  \
1449         tcg_gen_qemu_st_i32(cpu_##reg, addr, ctx->memidx, MO_TEUL); \
1450         tcg_gen_mov_i32(REG(B11_8), addr);                      \
1451         tcg_temp_free(addr);                                    \
1452     }                                                           \
1453     return;
1454 #define LDST(reg,ldnum,ldpnum,stnum,stpnum,prechk)              \
1455         LD(reg,ldnum,ldpnum,prechk)                             \
1456         ST(reg,stnum,stpnum,prechk)
1457         LDST(gbr,  0x401e, 0x4017, 0x0012, 0x4013, {})
1458         LDST(vbr,  0x402e, 0x4027, 0x0022, 0x4023, CHECK_PRIVILEGED)
1459         LDST(ssr,  0x403e, 0x4037, 0x0032, 0x4033, CHECK_PRIVILEGED)
1460         LDST(spc,  0x404e, 0x4047, 0x0042, 0x4043, CHECK_PRIVILEGED)
1461         ST(sgr,  0x003a, 0x4032, CHECK_PRIVILEGED)
1462         LD(sgr,  0x403a, 0x4036, CHECK_PRIVILEGED if (!(ctx->features & SH_FEATURE_SH4A)) break;)
1463         LDST(dbr,  0x40fa, 0x40f6, 0x00fa, 0x40f2, CHECK_PRIVILEGED)
1464         LDST(mach, 0x400a, 0x4006, 0x000a, 0x4002, {})
1465         LDST(macl, 0x401a, 0x4016, 0x001a, 0x4012, {})
1466         LDST(pr,   0x402a, 0x4026, 0x002a, 0x4022, {})
1467         LDST(fpul, 0x405a, 0x4056, 0x005a, 0x4052, {CHECK_FPU_ENABLED})
1468     case 0x406a:                /* lds Rm,FPSCR */
1469         CHECK_FPU_ENABLED
1470         gen_helper_ld_fpscr(cpu_env, REG(B11_8));
1471         ctx->bstate = BS_STOP;
1472         return;
1473     case 0x4066:                /* lds.l @Rm+,FPSCR */
1474         CHECK_FPU_ENABLED
1475         {
1476             TCGv addr = tcg_temp_new();
1477             tcg_gen_qemu_ld_i32(addr, REG(B11_8), ctx->memidx, MO_TESL);
1478             tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4);
1479             gen_helper_ld_fpscr(cpu_env, addr);
1480             tcg_temp_free(addr);
1481             ctx->bstate = BS_STOP;
1482         }
1483         return;
1484     case 0x006a:                /* sts FPSCR,Rn */
1485         CHECK_FPU_ENABLED
1486         tcg_gen_andi_i32(REG(B11_8), cpu_fpscr, 0x003fffff);
1487         return;
1488     case 0x4062:                /* sts FPSCR,@-Rn */
1489         CHECK_FPU_ENABLED
1490         {
1491             TCGv addr, val;
1492             val = tcg_temp_new();
1493             tcg_gen_andi_i32(val, cpu_fpscr, 0x003fffff);
1494             addr = tcg_temp_new();
1495             tcg_gen_subi_i32(addr, REG(B11_8), 4);
1496             tcg_gen_qemu_st_i32(val, addr, ctx->memidx, MO_TEUL);
1497             tcg_gen_mov_i32(REG(B11_8), addr);
1498             tcg_temp_free(addr);
1499             tcg_temp_free(val);
1500         }
1501         return;
1502     case 0x00c3:                /* movca.l R0,@Rm */
1503         {
1504             TCGv val = tcg_temp_new();
1505             tcg_gen_qemu_ld_i32(val, REG(B11_8), ctx->memidx, MO_TEUL);
1506             gen_helper_movcal(cpu_env, REG(B11_8), val);
1507             tcg_gen_qemu_st_i32(REG(0), REG(B11_8), ctx->memidx, MO_TEUL);
1508         }
1509         ctx->has_movcal = 1;
1510         return;
1511     case 0x40a9:
1512         /* MOVUA.L @Rm,R0 (Rm) -> R0
1513            Load non-boundary-aligned data */
1514         tcg_gen_qemu_ld_i32(REG(0), REG(B11_8), ctx->memidx, MO_TEUL);
1515         return;
1516     case 0x40e9:
1517         /* MOVUA.L @Rm+,R0   (Rm) -> R0, Rm + 4 -> Rm
1518            Load non-boundary-aligned data */
1519         tcg_gen_qemu_ld_i32(REG(0), REG(B11_8), ctx->memidx, MO_TEUL);
1520         tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4);
1521         return;
1522     case 0x0029:                /* movt Rn */
1523         tcg_gen_mov_i32(REG(B11_8), cpu_sr_t);
1524         return;
1525     case 0x0073:
1526         /* MOVCO.L
1527                LDST -> T
1528                If (T == 1) R0 -> (Rn)
1529                0 -> LDST
1530         */
1531         if (ctx->features & SH_FEATURE_SH4A) {
1532             TCGLabel *label = gen_new_label();
1533             tcg_gen_mov_i32(cpu_sr_t, cpu_ldst);
1534             tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_ldst, 0, label);
1535             tcg_gen_qemu_st_i32(REG(0), REG(B11_8), ctx->memidx, MO_TEUL);
1536             gen_set_label(label);
1537             tcg_gen_movi_i32(cpu_ldst, 0);
1538             return;
1539         } else
1540             break;
1541     case 0x0063:
1542         /* MOVLI.L @Rm,R0
1543                1 -> LDST
1544                (Rm) -> R0
1545                When interrupt/exception
1546                occurred 0 -> LDST
1547         */
1548         if (ctx->features & SH_FEATURE_SH4A) {
1549             tcg_gen_movi_i32(cpu_ldst, 0);
1550             tcg_gen_qemu_ld_i32(REG(0), REG(B11_8), ctx->memidx, MO_TESL);
1551             tcg_gen_movi_i32(cpu_ldst, 1);
1552             return;
1553         } else
1554             break;
1555     case 0x0093:                /* ocbi @Rn */
1556         {
1557             gen_helper_ocbi(cpu_env, REG(B11_8));
1558         }
1559         return;
1560     case 0x00a3:                /* ocbp @Rn */
1561     case 0x00b3:                /* ocbwb @Rn */
1562         /* These instructions are supposed to do nothing in case of
1563            a cache miss. Given that we only partially emulate caches
1564            it is safe to simply ignore them. */
1565         return;
1566     case 0x0083:                /* pref @Rn */
1567         return;
1568     case 0x00d3:                /* prefi @Rn */
1569         if (ctx->features & SH_FEATURE_SH4A)
1570             return;
1571         else
1572             break;
1573     case 0x00e3:                /* icbi @Rn */
1574         if (ctx->features & SH_FEATURE_SH4A)
1575             return;
1576         else
1577             break;
1578     case 0x00ab:                /* synco */
1579         if (ctx->features & SH_FEATURE_SH4A)
1580             return;
1581         else
1582             break;
1583     case 0x4024:                /* rotcl Rn */
1584         {
1585             TCGv tmp = tcg_temp_new();
1586             tcg_gen_mov_i32(tmp, cpu_sr_t);
1587             tcg_gen_shri_i32(cpu_sr_t, REG(B11_8), 31);
1588             tcg_gen_shli_i32(REG(B11_8), REG(B11_8), 1);
1589             tcg_gen_or_i32(REG(B11_8), REG(B11_8), tmp);
1590             tcg_temp_free(tmp);
1591         }
1592         return;
1593     case 0x4025:                /* rotcr Rn */
1594         {
1595             TCGv tmp = tcg_temp_new();
1596             tcg_gen_shli_i32(tmp, cpu_sr_t, 31);
1597             tcg_gen_andi_i32(cpu_sr_t, REG(B11_8), 1);
1598             tcg_gen_shri_i32(REG(B11_8), REG(B11_8), 1);
1599             tcg_gen_or_i32(REG(B11_8), REG(B11_8), tmp);
1600             tcg_temp_free(tmp);
1601         }
1602         return;
1603     case 0x4004:                /* rotl Rn */
1604         tcg_gen_rotli_i32(REG(B11_8), REG(B11_8), 1);
1605         tcg_gen_andi_i32(cpu_sr_t, REG(B11_8), 0);
1606         return;
1607     case 0x4005:                /* rotr Rn */
1608         tcg_gen_andi_i32(cpu_sr_t, REG(B11_8), 0);
1609         tcg_gen_rotri_i32(REG(B11_8), REG(B11_8), 1);
1610         return;
1611     case 0x4000:                /* shll Rn */
1612     case 0x4020:                /* shal Rn */
1613         tcg_gen_shri_i32(cpu_sr_t, REG(B11_8), 31);
1614         tcg_gen_shli_i32(REG(B11_8), REG(B11_8), 1);
1615         return;
1616     case 0x4021:                /* shar Rn */
1617         tcg_gen_andi_i32(cpu_sr_t, REG(B11_8), 1);
1618         tcg_gen_sari_i32(REG(B11_8), REG(B11_8), 1);
1619         return;
1620     case 0x4001:                /* shlr Rn */
1621         tcg_gen_andi_i32(cpu_sr_t, REG(B11_8), 1);
1622         tcg_gen_shri_i32(REG(B11_8), REG(B11_8), 1);
1623         return;
1624     case 0x4008:                /* shll2 Rn */
1625         tcg_gen_shli_i32(REG(B11_8), REG(B11_8), 2);
1626         return;
1627     case 0x4018:                /* shll8 Rn */
1628         tcg_gen_shli_i32(REG(B11_8), REG(B11_8), 8);
1629         return;
1630     case 0x4028:                /* shll16 Rn */
1631         tcg_gen_shli_i32(REG(B11_8), REG(B11_8), 16);
1632         return;
1633     case 0x4009:                /* shlr2 Rn */
1634         tcg_gen_shri_i32(REG(B11_8), REG(B11_8), 2);
1635         return;
1636     case 0x4019:                /* shlr8 Rn */
1637         tcg_gen_shri_i32(REG(B11_8), REG(B11_8), 8);
1638         return;
1639     case 0x4029:                /* shlr16 Rn */
1640         tcg_gen_shri_i32(REG(B11_8), REG(B11_8), 16);
1641         return;
1642     case 0x401b:                /* tas.b @Rn */
1643         {
1644             TCGv addr, val;
1645             addr = tcg_temp_local_new();
1646             tcg_gen_mov_i32(addr, REG(B11_8));
1647             val = tcg_temp_local_new();
1648             tcg_gen_qemu_ld_i32(val, addr, ctx->memidx, MO_UB);
1649             tcg_gen_setcondi_i32(TCG_COND_EQ, cpu_sr_t, val, 0);
1650             tcg_gen_ori_i32(val, val, 0x80);
1651             tcg_gen_qemu_st_i32(val, addr, ctx->memidx, MO_UB);
1652             tcg_temp_free(val);
1653             tcg_temp_free(addr);
1654         }
1655         return;
1656     case 0xf00d: /* fsts FPUL,FRn - FPSCR: Nothing */
1657         CHECK_FPU_ENABLED
1658         tcg_gen_mov_i32(cpu_fregs[FREG(B11_8)], cpu_fpul);
1659         return;
1660     case 0xf01d: /* flds FRm,FPUL - FPSCR: Nothing */
1661         CHECK_FPU_ENABLED
1662         tcg_gen_mov_i32(cpu_fpul, cpu_fregs[FREG(B11_8)]);
1663         return;
1664     case 0xf02d: /* float FPUL,FRn/DRn - FPSCR: R[PR,Enable.I]/W[Cause,Flag] */
1665         CHECK_FPU_ENABLED
1666         if (ctx->flags & FPSCR_PR) {
1667             TCGv_i64 fp;
1668             if (ctx->opcode & 0x0100)
1669                 break; /* illegal instruction */
1670             fp = tcg_temp_new_i64();
1671             gen_helper_float_DT(fp, cpu_env, cpu_fpul);
1672             gen_store_fpr64(fp, DREG(B11_8));
1673             tcg_temp_free_i64(fp);
1674         }
1675         else {
1676             gen_helper_float_FT(cpu_fregs[FREG(B11_8)], cpu_env, cpu_fpul);
1677         }
1678         return;
1679     case 0xf03d: /* ftrc FRm/DRm,FPUL - FPSCR: R[PR,Enable.V]/W[Cause,Flag] */
1680         CHECK_FPU_ENABLED
1681         if (ctx->flags & FPSCR_PR) {
1682             TCGv_i64 fp;
1683             if (ctx->opcode & 0x0100)
1684                 break; /* illegal instruction */
1685             fp = tcg_temp_new_i64();
1686             gen_load_fpr64(fp, DREG(B11_8));
1687             gen_helper_ftrc_DT(cpu_fpul, cpu_env, fp);
1688             tcg_temp_free_i64(fp);
1689         }
1690         else {
1691             gen_helper_ftrc_FT(cpu_fpul, cpu_env, cpu_fregs[FREG(B11_8)]);
1692         }
1693         return;
1694     case 0xf04d: /* fneg FRn/DRn - FPSCR: Nothing */
1695         CHECK_FPU_ENABLED
1696         {
1697             gen_helper_fneg_T(cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B11_8)]);
1698         }
1699         return;
1700     case 0xf05d: /* fabs FRn/DRn */
1701         CHECK_FPU_ENABLED
1702         if (ctx->flags & FPSCR_PR) {
1703             if (ctx->opcode & 0x0100)
1704                 break; /* illegal instruction */
1705             TCGv_i64 fp = tcg_temp_new_i64();
1706             gen_load_fpr64(fp, DREG(B11_8));
1707             gen_helper_fabs_DT(fp, fp);
1708             gen_store_fpr64(fp, DREG(B11_8));
1709             tcg_temp_free_i64(fp);
1710         } else {
1711             gen_helper_fabs_FT(cpu_fregs[FREG(B11_8)], cpu_fregs[FREG(B11_8)]);
1712         }
1713         return;
1714     case 0xf06d: /* fsqrt FRn */
1715         CHECK_FPU_ENABLED
1716         if (ctx->flags & FPSCR_PR) {
1717             if (ctx->opcode & 0x0100)
1718                 break; /* illegal instruction */
1719             TCGv_i64 fp = tcg_temp_new_i64();
1720             gen_load_fpr64(fp, DREG(B11_8));
1721             gen_helper_fsqrt_DT(fp, cpu_env, fp);
1722             gen_store_fpr64(fp, DREG(B11_8));
1723             tcg_temp_free_i64(fp);
1724         } else {
1725             gen_helper_fsqrt_FT(cpu_fregs[FREG(B11_8)], cpu_env,
1726                                 cpu_fregs[FREG(B11_8)]);
1727         }
1728         return;
1729     case 0xf07d: /* fsrra FRn */
1730         CHECK_FPU_ENABLED
1731         break;
1732     case 0xf08d: /* fldi0 FRn - FPSCR: R[PR] */
1733         CHECK_FPU_ENABLED
1734         if (!(ctx->flags & FPSCR_PR)) {
1735             tcg_gen_movi_i32(cpu_fregs[FREG(B11_8)], 0);
1736         }
1737         return;
1738     case 0xf09d: /* fldi1 FRn - FPSCR: R[PR] */
1739         CHECK_FPU_ENABLED
1740         if (!(ctx->flags & FPSCR_PR)) {
1741             tcg_gen_movi_i32(cpu_fregs[FREG(B11_8)], 0x3f800000);
1742         }
1743         return;
1744     case 0xf0ad: /* fcnvsd FPUL,DRn */
1745         CHECK_FPU_ENABLED
1746         {
1747             TCGv_i64 fp = tcg_temp_new_i64();
1748             gen_helper_fcnvsd_FT_DT(fp, cpu_env, cpu_fpul);
1749             gen_store_fpr64(fp, DREG(B11_8));
1750             tcg_temp_free_i64(fp);
1751         }
1752         return;
1753     case 0xf0bd: /* fcnvds DRn,FPUL */
1754         CHECK_FPU_ENABLED
1755         {
1756             TCGv_i64 fp = tcg_temp_new_i64();
1757             gen_load_fpr64(fp, DREG(B11_8));
1758             gen_helper_fcnvds_DT_FT(cpu_fpul, cpu_env, fp);
1759             tcg_temp_free_i64(fp);
1760         }
1761         return;
1762     case 0xf0ed: /* fipr FVm,FVn */
1763         CHECK_FPU_ENABLED
1764         if ((ctx->flags & FPSCR_PR) == 0) {
1765             TCGv m, n;
1766             m = tcg_const_i32((ctx->opcode >> 8) & 3);
1767             n = tcg_const_i32((ctx->opcode >> 10) & 3);
1768             gen_helper_fipr(cpu_env, m, n);
1769             tcg_temp_free(m);
1770             tcg_temp_free(n);
1771             return;
1772         }
1773         break;
1774     case 0xf0fd: /* ftrv XMTRX,FVn */
1775         CHECK_FPU_ENABLED
1776         if ((ctx->opcode & 0x0300) == 0x0100 &&
1777             (ctx->flags & FPSCR_PR) == 0) {
1778             TCGv n;
1779             n = tcg_const_i32((ctx->opcode >> 10) & 3);
1780             gen_helper_ftrv(cpu_env, n);
1781             tcg_temp_free(n);
1782             return;
1783         }
1784         break;
1785     }
1786 #if 0
1787     fprintf(stderr, "unknown instruction 0x%04x at pc 0x%08x\n",
1788             ctx->opcode, ctx->pc);
1789     fflush(stderr);
1790 #endif
1791     tcg_gen_movi_i32(cpu_pc, ctx->pc);
1792     if (ctx->flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL)) {
1793         gen_helper_raise_slot_illegal_instruction(cpu_env);
1794     } else {
1795         gen_helper_raise_illegal_instruction(cpu_env);
1796     }
1797     ctx->bstate = BS_BRANCH;
1798 }
1799
1800 static void decode_opc(DisasContext * ctx)
1801 {
1802     uint32_t old_flags = ctx->flags;
1803
1804     _decode_opc(ctx);
1805
1806     if (old_flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL)) {
1807         if (ctx->flags & DELAY_SLOT_CLEARME) {
1808             gen_store_flags(0);
1809         } else {
1810             /* go out of the delay slot */
1811             uint32_t new_flags = ctx->flags;
1812             new_flags &= ~(DELAY_SLOT | DELAY_SLOT_CONDITIONAL);
1813             gen_store_flags(new_flags);
1814         }
1815         ctx->flags = 0;
1816         ctx->bstate = BS_BRANCH;
1817         if (old_flags & DELAY_SLOT_CONDITIONAL) {
1818             gen_delayed_conditional_jump(ctx);
1819         } else if (old_flags & DELAY_SLOT) {
1820             gen_jump(ctx);
1821         }
1822
1823     }
1824
1825     /* go into a delay slot */
1826     if (ctx->flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL))
1827         gen_store_flags(ctx->flags);
1828 }
1829
1830 void gen_intermediate_code(CPUSH4State * env, struct TranslationBlock *tb)
1831 {
1832     SuperHCPU *cpu = sh_env_get_cpu(env);
1833     CPUState *cs = CPU(cpu);
1834     DisasContext ctx;
1835     target_ulong pc_start;
1836     int num_insns;
1837     int max_insns;
1838
1839     pc_start = tb->pc;
1840     ctx.pc = pc_start;
1841     ctx.flags = (uint32_t)tb->flags;
1842     ctx.bstate = BS_NONE;
1843     ctx.memidx = (ctx.flags & (1u << SR_MD)) == 0 ? 1 : 0;
1844     /* We don't know if the delayed pc came from a dynamic or static branch,
1845        so assume it is a dynamic branch.  */
1846     ctx.delayed_pc = -1; /* use delayed pc from env pointer */
1847     ctx.tb = tb;
1848     ctx.singlestep_enabled = cs->singlestep_enabled;
1849     ctx.features = env->features;
1850     ctx.has_movcal = (ctx.flags & TB_FLAG_PENDING_MOVCA);
1851
1852     num_insns = 0;
1853     max_insns = tb->cflags & CF_COUNT_MASK;
1854     if (max_insns == 0) {
1855         max_insns = CF_COUNT_MASK;
1856     }
1857     if (max_insns > TCG_MAX_INSNS) {
1858         max_insns = TCG_MAX_INSNS;
1859     }
1860
1861     gen_tb_start(tb);
1862     while (ctx.bstate == BS_NONE && !tcg_op_buf_full()) {
1863         tcg_gen_insn_start(ctx.pc, ctx.flags);
1864         num_insns++;
1865
1866         if (unlikely(cpu_breakpoint_test(cs, ctx.pc, BP_ANY))) {
1867             /* We have hit a breakpoint - make sure PC is up-to-date */
1868             tcg_gen_movi_i32(cpu_pc, ctx.pc);
1869             gen_helper_debug(cpu_env);
1870             ctx.bstate = BS_BRANCH;
1871             /* The address covered by the breakpoint must be included in
1872                [tb->pc, tb->pc + tb->size) in order to for it to be
1873                properly cleared -- thus we increment the PC here so that
1874                the logic setting tb->size below does the right thing.  */
1875             ctx.pc += 2;
1876             break;
1877         }
1878
1879         if (num_insns == max_insns && (tb->cflags & CF_LAST_IO)) {
1880             gen_io_start();
1881         }
1882
1883         ctx.opcode = cpu_lduw_code(env, ctx.pc);
1884         decode_opc(&ctx);
1885         ctx.pc += 2;
1886         if ((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0)
1887             break;
1888         if (cs->singlestep_enabled) {
1889             break;
1890         }
1891         if (num_insns >= max_insns)
1892             break;
1893         if (singlestep)
1894             break;
1895     }
1896     if (tb->cflags & CF_LAST_IO)
1897         gen_io_end();
1898     if (cs->singlestep_enabled) {
1899         tcg_gen_movi_i32(cpu_pc, ctx.pc);
1900         gen_helper_debug(cpu_env);
1901     } else {
1902         switch (ctx.bstate) {
1903         case BS_STOP:
1904             /* gen_op_interrupt_restart(); */
1905             /* fall through */
1906         case BS_NONE:
1907             if (ctx.flags) {
1908                 gen_store_flags(ctx.flags | DELAY_SLOT_CLEARME);
1909             }
1910             gen_goto_tb(&ctx, 0, ctx.pc);
1911             break;
1912         case BS_EXCP:
1913             /* gen_op_interrupt_restart(); */
1914             tcg_gen_exit_tb(0);
1915             break;
1916         case BS_BRANCH:
1917         default:
1918             break;
1919         }
1920     }
1921
1922     gen_tb_end(tb, num_insns);
1923
1924     tb->size = ctx.pc - pc_start;
1925     tb->icount = num_insns;
1926
1927 #ifdef DEBUG_DISAS
1928     if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)
1929         && qemu_log_in_addr_range(pc_start)) {
1930         qemu_log_lock();
1931         qemu_log("IN:\n");      /* , lookup_symbol(pc_start)); */
1932         log_target_disas(cs, pc_start, ctx.pc - pc_start, 0);
1933         qemu_log("\n");
1934         qemu_log_unlock();
1935     }
1936 #endif
1937 }
1938
1939 void restore_state_to_opc(CPUSH4State *env, TranslationBlock *tb,
1940                           target_ulong *data)
1941 {
1942     env->pc = data[0];
1943     env->flags = data[1];
1944 }