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