4 * Copyright (c) 2005 Samuel Tardieu
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.
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.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28 #define SH4_DEBUG_DISAS
29 //#define SH4_SINGLE_STEP
36 #include "qemu-common.h"
38 typedef struct DisasContext {
39 struct TranslationBlock *tb;
48 int singlestep_enabled;
52 BS_NONE = 0, /* We go out of the TB without reaching a branch or an
55 BS_STOP = 1, /* We want to stop translation for any reason */
56 BS_BRANCH = 2, /* We reached a branch condition */
57 BS_EXCP = 3, /* We reached an exception condition */
60 /* global register indexes */
62 static TCGv cpu_gregs[24];
63 static TCGv cpu_pc, cpu_sr, cpu_ssr, cpu_spc, cpu_gbr;
64 static TCGv cpu_vbr, cpu_sgr, cpu_dbr, cpu_mach, cpu_macl;
65 static TCGv cpu_pr, cpu_fpscr, cpu_fpul, cpu_flags;
67 /* internal register indexes */
68 static TCGv cpu_flags, cpu_delayed_pc;
70 #include "gen-icount.h"
72 static void sh4_translate_init(void)
75 static int done_init = 0;
76 static const char * const gregnames[24] = {
77 "R0_BANK0", "R1_BANK0", "R2_BANK0", "R3_BANK0",
78 "R4_BANK0", "R5_BANK0", "R6_BANK0", "R7_BANK0",
79 "R8", "R9", "R10", "R11", "R12", "R13", "R14", "R15",
80 "R0_BANK1", "R1_BANK1", "R2_BANK1", "R3_BANK1",
81 "R4_BANK1", "R5_BANK1", "R6_BANK1", "R7_BANK1"
87 cpu_env = tcg_global_reg_new(TCG_TYPE_PTR, TCG_AREG0, "env");
89 for (i = 0; i < 24; i++)
90 cpu_gregs[i] = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0,
91 offsetof(CPUState, gregs[i]),
94 cpu_pc = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0,
95 offsetof(CPUState, pc), "PC");
96 cpu_sr = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0,
97 offsetof(CPUState, sr), "SR");
98 cpu_ssr = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0,
99 offsetof(CPUState, ssr), "SSR");
100 cpu_spc = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0,
101 offsetof(CPUState, spc), "SPC");
102 cpu_gbr = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0,
103 offsetof(CPUState, gbr), "GBR");
104 cpu_vbr = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0,
105 offsetof(CPUState, vbr), "VBR");
106 cpu_sgr = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0,
107 offsetof(CPUState, sgr), "SGR");
108 cpu_dbr = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0,
109 offsetof(CPUState, dbr), "DBR");
110 cpu_mach = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0,
111 offsetof(CPUState, mach), "MACH");
112 cpu_macl = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0,
113 offsetof(CPUState, macl), "MACL");
114 cpu_pr = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0,
115 offsetof(CPUState, pr), "PR");
116 cpu_fpscr = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0,
117 offsetof(CPUState, fpscr), "FPSCR");
118 cpu_fpul = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0,
119 offsetof(CPUState, fpul), "FPUL");
121 cpu_flags = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0,
122 offsetof(CPUState, flags), "_flags_");
123 cpu_delayed_pc = tcg_global_mem_new(TCG_TYPE_I32, TCG_AREG0,
124 offsetof(CPUState, delayed_pc),
127 /* register helpers */
129 #define DEF_HELPER(ret, name, params) tcg_register_helper(name, #name);
135 void cpu_dump_state(CPUState * env, FILE * f,
136 int (*cpu_fprintf) (FILE * f, const char *fmt, ...),
140 cpu_fprintf(f, "pc=0x%08x sr=0x%08x pr=0x%08x fpscr=0x%08x\n",
141 env->pc, env->sr, env->pr, env->fpscr);
142 cpu_fprintf(f, "spc=0x%08x ssr=0x%08x gbr=0x%08x vbr=0x%08x\n",
143 env->spc, env->ssr, env->gbr, env->vbr);
144 cpu_fprintf(f, "sgr=0x%08x dbr=0x%08x delayed_pc=0x%08x fpul=0x%08x\n",
145 env->sgr, env->dbr, env->delayed_pc, env->fpul);
146 for (i = 0; i < 24; i += 4) {
147 cpu_fprintf(f, "r%d=0x%08x r%d=0x%08x r%d=0x%08x r%d=0x%08x\n",
148 i, env->gregs[i], i + 1, env->gregs[i + 1],
149 i + 2, env->gregs[i + 2], i + 3, env->gregs[i + 3]);
151 if (env->flags & DELAY_SLOT) {
152 cpu_fprintf(f, "in delay slot (delayed_pc=0x%08x)\n",
154 } else if (env->flags & DELAY_SLOT_CONDITIONAL) {
155 cpu_fprintf(f, "in conditional delay slot (delayed_pc=0x%08x)\n",
160 void cpu_sh4_reset(CPUSH4State * env)
162 #if defined(CONFIG_USER_ONLY)
163 env->sr = SR_FD; /* FD - kernel does lazy fpu context switch */
165 env->sr = 0x700000F0; /* MD, RB, BL, I3-I0 */
168 env->pc = 0xA0000000;
169 #if defined(CONFIG_USER_ONLY)
170 env->fpscr = FPSCR_PR; /* value for userspace according to the kernel */
171 set_float_rounding_mode(float_round_nearest_even, &env->fp_status); /* ?! */
173 env->fpscr = 0x00040001; /* CPU reset value according to SH4 manual */
174 set_float_rounding_mode(float_round_to_zero, &env->fp_status);
179 CPUSH4State *cpu_sh4_init(const char *cpu_model)
183 env = qemu_mallocz(sizeof(CPUSH4State));
187 sh4_translate_init();
193 static void gen_goto_tb(DisasContext * ctx, int n, target_ulong dest)
195 TranslationBlock *tb;
198 if ((tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK) &&
199 !ctx->singlestep_enabled) {
200 /* Use a direct jump if in same page and singlestep not enabled */
202 tcg_gen_movi_i32(cpu_pc, dest);
203 tcg_gen_exit_tb((long) tb + n);
205 tcg_gen_movi_i32(cpu_pc, dest);
206 if (ctx->singlestep_enabled)
207 tcg_gen_helper_0_0(helper_debug);
212 static void gen_jump(DisasContext * ctx)
214 if (ctx->delayed_pc == (uint32_t) - 1) {
215 /* Target is not statically known, it comes necessarily from a
216 delayed jump as immediate jump are conditinal jumps */
217 tcg_gen_mov_i32(cpu_pc, cpu_delayed_pc);
218 if (ctx->singlestep_enabled)
219 tcg_gen_helper_0_0(helper_debug);
222 gen_goto_tb(ctx, 0, ctx->delayed_pc);
226 static inline void gen_branch_slot(uint32_t delayed_pc, int t)
229 int label = gen_new_label();
230 tcg_gen_movi_i32(cpu_delayed_pc, delayed_pc);
231 sr = tcg_temp_new(TCG_TYPE_I32);
232 tcg_gen_andi_i32(sr, cpu_sr, SR_T);
233 tcg_gen_brcondi_i32(TCG_COND_NE, sr, t ? SR_T : 0, label);
234 tcg_gen_ori_i32(cpu_flags, cpu_flags, DELAY_SLOT_TRUE);
235 gen_set_label(label);
238 /* Immediate conditional jump (bt or bf) */
239 static void gen_conditional_jump(DisasContext * ctx,
240 target_ulong ift, target_ulong ifnott)
245 l1 = gen_new_label();
246 sr = tcg_temp_new(TCG_TYPE_I32);
247 tcg_gen_andi_i32(sr, cpu_sr, SR_T);
248 tcg_gen_brcondi_i32(TCG_COND_EQ, sr, SR_T, l1);
249 gen_goto_tb(ctx, 0, ifnott);
251 gen_goto_tb(ctx, 1, ift);
254 /* Delayed conditional jump (bt or bf) */
255 static void gen_delayed_conditional_jump(DisasContext * ctx)
260 l1 = gen_new_label();
261 ds = tcg_temp_new(TCG_TYPE_I32);
262 tcg_gen_andi_i32(ds, cpu_flags, DELAY_SLOT_TRUE);
263 tcg_gen_brcondi_i32(TCG_COND_EQ, ds, DELAY_SLOT_TRUE, l1);
264 gen_goto_tb(ctx, 1, ctx->pc + 2);
266 tcg_gen_andi_i32(cpu_flags, cpu_flags, ~DELAY_SLOT_TRUE);
270 static inline void gen_set_t(void)
272 tcg_gen_ori_i32(cpu_sr, cpu_sr, SR_T);
275 static inline void gen_clr_t(void)
277 tcg_gen_andi_i32(cpu_sr, cpu_sr, ~SR_T);
280 static inline void gen_cmp(int cond, TCGv t0, TCGv t1)
282 int label1 = gen_new_label();
283 int label2 = gen_new_label();
284 tcg_gen_brcond_i32(cond, t1, t0, label1);
287 gen_set_label(label1);
289 gen_set_label(label2);
292 static inline void gen_cmp_imm(int cond, TCGv t0, int32_t imm)
294 int label1 = gen_new_label();
295 int label2 = gen_new_label();
296 tcg_gen_brcondi_i32(cond, t0, imm, label1);
299 gen_set_label(label1);
301 gen_set_label(label2);
304 static inline void gen_store_flags(uint32_t flags)
306 tcg_gen_andi_i32(cpu_flags, cpu_flags, DELAY_SLOT_TRUE);
307 tcg_gen_ori_i32(cpu_flags, cpu_flags, flags);
310 static inline void gen_copy_bit_i32(TCGv t0, int p0, TCGv t1, int p1)
312 TCGv tmp = tcg_temp_new(TCG_TYPE_I32);
317 tcg_gen_andi_i32(tmp, t1, (1 << p1));
318 tcg_gen_andi_i32(t0, t0, ~(1 << p0));
320 tcg_gen_shri_i32(tmp, tmp, p1 - p0);
322 tcg_gen_shli_i32(tmp, tmp, p0 - p1);
323 tcg_gen_or_i32(t0, t0, tmp);
329 static inline void gen_load_fpr32(TCGv t, int reg)
331 tcg_gen_ld_i32(t, cpu_env, offsetof(CPUState, fregs[reg]));
334 static inline void gen_load_fpr64(TCGv t, int reg)
336 TCGv tmp1 = tcg_temp_new(TCG_TYPE_I32);
337 TCGv tmp2 = tcg_temp_new(TCG_TYPE_I64);
339 tcg_gen_ld_i32(tmp1, cpu_env, offsetof(CPUState, fregs[reg]));
340 tcg_gen_extu_i32_i64(t, tmp1);
341 tcg_gen_shli_i64(t, t, 32);
342 tcg_gen_ld_i32(tmp1, cpu_env, offsetof(CPUState, fregs[reg + 1]));
343 tcg_gen_extu_i32_i64(tmp2, tmp1);
345 tcg_gen_or_i64(t, t, tmp2);
349 static inline void gen_store_fpr32(TCGv t, int reg)
351 tcg_gen_st_i32(t, cpu_env, offsetof(CPUState, fregs[reg]));
354 static inline void gen_store_fpr64 (TCGv t, int reg)
356 TCGv tmp = tcg_temp_new(TCG_TYPE_I32);
358 tcg_gen_trunc_i64_i32(tmp, t);
359 tcg_gen_st_i32(tmp, cpu_env, offsetof(CPUState, fregs[reg + 1]));
360 tcg_gen_shri_i64(t, t, 32);
361 tcg_gen_trunc_i64_i32(tmp, t);
362 tcg_gen_st_i32(tmp, cpu_env, offsetof(CPUState, fregs[reg]));
366 #define B3_0 (ctx->opcode & 0xf)
367 #define B6_4 ((ctx->opcode >> 4) & 0x7)
368 #define B7_4 ((ctx->opcode >> 4) & 0xf)
369 #define B7_0 (ctx->opcode & 0xff)
370 #define B7_0s ((int32_t) (int8_t) (ctx->opcode & 0xff))
371 #define B11_0s (ctx->opcode & 0x800 ? 0xfffff000 | (ctx->opcode & 0xfff) : \
372 (ctx->opcode & 0xfff))
373 #define B11_8 ((ctx->opcode >> 8) & 0xf)
374 #define B15_12 ((ctx->opcode >> 12) & 0xf)
376 #define REG(x) ((x) < 8 && (ctx->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB) ? \
377 (cpu_gregs[x + 16]) : (cpu_gregs[x]))
379 #define ALTREG(x) ((x) < 8 && (ctx->sr & (SR_MD | SR_RB)) != (SR_MD | SR_RB) \
380 ? (cpu_gregs[x + 16]) : (cpu_gregs[x]))
382 #define FREG(x) (ctx->fpscr & FPSCR_FR ? (x) ^ 0x10 : (x))
383 #define XHACK(x) ((((x) & 1 ) << 4) | ((x) & 0xe))
384 #define XREG(x) (ctx->fpscr & FPSCR_FR ? XHACK(x) ^ 0x10 : XHACK(x))
385 #define DREG(x) FREG(x) /* Assumes lsb of (x) is always 0 */
387 #define CHECK_NOT_DELAY_SLOT \
388 if (ctx->flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL)) \
389 {tcg_gen_helper_0_0(helper_raise_slot_illegal_instruction); ctx->bstate = BS_EXCP; \
392 void _decode_opc(DisasContext * ctx)
395 fprintf(stderr, "Translating opcode 0x%04x\n", ctx->opcode);
397 switch (ctx->opcode) {
398 case 0x0019: /* div0u */
399 tcg_gen_andi_i32(cpu_sr, cpu_sr, ~(SR_M | SR_Q | SR_T));
401 case 0x000b: /* rts */
403 tcg_gen_mov_i32(cpu_delayed_pc, cpu_pr);
404 ctx->flags |= DELAY_SLOT;
405 ctx->delayed_pc = (uint32_t) - 1;
407 case 0x0028: /* clrmac */
408 tcg_gen_movi_i32(cpu_mach, 0);
409 tcg_gen_movi_i32(cpu_macl, 0);
411 case 0x0048: /* clrs */
412 tcg_gen_andi_i32(cpu_sr, cpu_sr, ~SR_S);
414 case 0x0008: /* clrt */
417 case 0x0038: /* ldtlb */
418 #if defined(CONFIG_USER_ONLY)
419 assert(0); /* XXXXX */
421 tcg_gen_helper_0_0(helper_ldtlb);
424 case 0x002b: /* rte */
426 tcg_gen_mov_i32(cpu_sr, cpu_ssr);
427 tcg_gen_mov_i32(cpu_delayed_pc, cpu_spc);
428 ctx->flags |= DELAY_SLOT;
429 ctx->delayed_pc = (uint32_t) - 1;
431 case 0x0058: /* sets */
432 tcg_gen_ori_i32(cpu_sr, cpu_sr, SR_S);
434 case 0x0018: /* sett */
437 case 0xfbfd: /* frchg */
438 tcg_gen_xori_i32(cpu_fpscr, cpu_fpscr, FPSCR_FR);
439 ctx->bstate = BS_STOP;
441 case 0xf3fd: /* fschg */
442 tcg_gen_xori_i32(cpu_fpscr, cpu_fpscr, FPSCR_SZ);
443 ctx->bstate = BS_STOP;
445 case 0x0009: /* nop */
447 case 0x001b: /* sleep */
449 tcg_gen_helper_0_0(helper_sleep);
451 tcg_gen_helper_0_0(helper_raise_illegal_instruction);
452 ctx->bstate = BS_EXCP;
457 switch (ctx->opcode & 0xf000) {
458 case 0x1000: /* mov.l Rm,@(disp,Rn) */
460 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
461 tcg_gen_addi_i32(addr, REG(B11_8), B3_0 * 4);
462 tcg_gen_qemu_st32(REG(B7_4), addr, ctx->memidx);
466 case 0x5000: /* mov.l @(disp,Rm),Rn */
468 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
469 tcg_gen_addi_i32(addr, REG(B7_4), B3_0 * 4);
470 tcg_gen_qemu_ld32s(REG(B11_8), addr, ctx->memidx);
474 case 0xe000: /* mov #imm,Rn */
475 tcg_gen_movi_i32(REG(B11_8), B7_0s);
477 case 0x9000: /* mov.w @(disp,PC),Rn */
479 TCGv addr = tcg_const_i32(ctx->pc + 4 + B7_0 * 2);
480 tcg_gen_qemu_ld16s(REG(B11_8), addr, ctx->memidx);
484 case 0xd000: /* mov.l @(disp,PC),Rn */
486 TCGv addr = tcg_const_i32((ctx->pc + 4 + B7_0 * 4) & ~3);
487 tcg_gen_qemu_ld32s(REG(B11_8), addr, ctx->memidx);
491 case 0x7000: /* add #imm,Rn */
492 tcg_gen_addi_i32(REG(B11_8), REG(B11_8), B7_0s);
494 case 0xa000: /* bra disp */
496 ctx->delayed_pc = ctx->pc + 4 + B11_0s * 2;
497 tcg_gen_movi_i32(cpu_delayed_pc, ctx->delayed_pc);
498 ctx->flags |= DELAY_SLOT;
500 case 0xb000: /* bsr disp */
502 tcg_gen_movi_i32(cpu_pr, ctx->pc + 4);
503 ctx->delayed_pc = ctx->pc + 4 + B11_0s * 2;
504 tcg_gen_movi_i32(cpu_delayed_pc, ctx->delayed_pc);
505 ctx->flags |= DELAY_SLOT;
509 switch (ctx->opcode & 0xf00f) {
510 case 0x6003: /* mov Rm,Rn */
511 tcg_gen_mov_i32(REG(B11_8), REG(B7_4));
513 case 0x2000: /* mov.b Rm,@Rn */
514 tcg_gen_qemu_st8(REG(B7_4), REG(B11_8), ctx->memidx);
516 case 0x2001: /* mov.w Rm,@Rn */
517 tcg_gen_qemu_st16(REG(B7_4), REG(B11_8), ctx->memidx);
519 case 0x2002: /* mov.l Rm,@Rn */
520 tcg_gen_qemu_st32(REG(B7_4), REG(B11_8), ctx->memidx);
522 case 0x6000: /* mov.b @Rm,Rn */
523 tcg_gen_qemu_ld8s(REG(B11_8), REG(B7_4), ctx->memidx);
525 case 0x6001: /* mov.w @Rm,Rn */
526 tcg_gen_qemu_ld16s(REG(B11_8), REG(B7_4), ctx->memidx);
528 case 0x6002: /* mov.l @Rm,Rn */
529 tcg_gen_qemu_ld32s(REG(B11_8), REG(B7_4), ctx->memidx);
531 case 0x2004: /* mov.b Rm,@-Rn */
533 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
534 tcg_gen_subi_i32(addr, REG(B11_8), 1);
535 tcg_gen_qemu_st8(REG(B7_4), addr, ctx->memidx); /* might cause re-execution */
536 tcg_gen_subi_i32(REG(B11_8), REG(B11_8), 1); /* modify register status */
540 case 0x2005: /* mov.w Rm,@-Rn */
542 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
543 tcg_gen_subi_i32(addr, REG(B11_8), 2);
544 tcg_gen_qemu_st16(REG(B7_4), addr, ctx->memidx);
545 tcg_gen_subi_i32(REG(B11_8), REG(B11_8), 2);
549 case 0x2006: /* mov.l Rm,@-Rn */
551 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
552 tcg_gen_subi_i32(addr, REG(B11_8), 4);
553 tcg_gen_qemu_st32(REG(B7_4), addr, ctx->memidx);
554 tcg_gen_subi_i32(REG(B11_8), REG(B11_8), 4);
557 case 0x6004: /* mov.b @Rm+,Rn */
558 tcg_gen_qemu_ld8s(REG(B11_8), REG(B7_4), ctx->memidx);
560 tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 1);
562 case 0x6005: /* mov.w @Rm+,Rn */
563 tcg_gen_qemu_ld16s(REG(B11_8), REG(B7_4), ctx->memidx);
565 tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 2);
567 case 0x6006: /* mov.l @Rm+,Rn */
568 tcg_gen_qemu_ld32s(REG(B11_8), REG(B7_4), ctx->memidx);
570 tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 4);
572 case 0x0004: /* mov.b Rm,@(R0,Rn) */
574 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
575 tcg_gen_add_i32(addr, REG(B11_8), REG(0));
576 tcg_gen_qemu_st8(REG(B7_4), addr, ctx->memidx);
580 case 0x0005: /* mov.w Rm,@(R0,Rn) */
582 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
583 tcg_gen_add_i32(addr, REG(B11_8), REG(0));
584 tcg_gen_qemu_st16(REG(B7_4), addr, ctx->memidx);
588 case 0x0006: /* mov.l Rm,@(R0,Rn) */
590 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
591 tcg_gen_add_i32(addr, REG(B11_8), REG(0));
592 tcg_gen_qemu_st32(REG(B7_4), addr, ctx->memidx);
596 case 0x000c: /* mov.b @(R0,Rm),Rn */
598 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
599 tcg_gen_add_i32(addr, REG(B7_4), REG(0));
600 tcg_gen_qemu_ld8s(REG(B11_8), addr, ctx->memidx);
604 case 0x000d: /* mov.w @(R0,Rm),Rn */
606 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
607 tcg_gen_add_i32(addr, REG(B7_4), REG(0));
608 tcg_gen_qemu_ld16s(REG(B11_8), addr, ctx->memidx);
612 case 0x000e: /* mov.l @(R0,Rm),Rn */
614 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
615 tcg_gen_add_i32(addr, REG(B7_4), REG(0));
616 tcg_gen_qemu_ld32s(REG(B11_8), addr, ctx->memidx);
620 case 0x6008: /* swap.b Rm,Rn */
623 high = tcg_temp_new(TCG_TYPE_I32);
624 tcg_gen_ext8u_i32(high, REG(B7_4));
625 tcg_gen_shli_i32(high, high, 8);
626 low = tcg_temp_new(TCG_TYPE_I32);
627 tcg_gen_shri_i32(low, REG(B7_4), 8);
628 tcg_gen_ext8u_i32(low, low);
629 tcg_gen_or_i32(REG(B11_8), high, low);
634 case 0x6009: /* swap.w Rm,Rn */
637 high = tcg_temp_new(TCG_TYPE_I32);
638 tcg_gen_ext16u_i32(high, REG(B7_4));
639 tcg_gen_shli_i32(high, high, 16);
640 low = tcg_temp_new(TCG_TYPE_I32);
641 tcg_gen_shri_i32(low, REG(B7_4), 16);
642 tcg_gen_ext16u_i32(low, low);
643 tcg_gen_or_i32(REG(B11_8), high, low);
648 case 0x200d: /* xtrct Rm,Rn */
651 high = tcg_temp_new(TCG_TYPE_I32);
652 tcg_gen_ext16u_i32(high, REG(B7_4));
653 tcg_gen_shli_i32(high, high, 16);
654 low = tcg_temp_new(TCG_TYPE_I32);
655 tcg_gen_shri_i32(low, REG(B11_8), 16);
656 tcg_gen_ext16u_i32(low, low);
657 tcg_gen_or_i32(REG(B11_8), high, low);
662 case 0x300c: /* add Rm,Rn */
663 tcg_gen_add_i32(REG(B11_8), REG(B11_8), REG(B7_4));
665 case 0x300e: /* addc Rm,Rn */
666 tcg_gen_helper_1_2(helper_addc, REG(B11_8), REG(B7_4), REG(B11_8));
668 case 0x300f: /* addv Rm,Rn */
669 tcg_gen_helper_1_2(helper_addv, REG(B11_8), REG(B7_4), REG(B11_8));
671 case 0x2009: /* and Rm,Rn */
672 tcg_gen_and_i32(REG(B11_8), REG(B11_8), REG(B7_4));
674 case 0x3000: /* cmp/eq Rm,Rn */
675 gen_cmp(TCG_COND_EQ, REG(B7_4), REG(B11_8));
677 case 0x3003: /* cmp/ge Rm,Rn */
678 gen_cmp(TCG_COND_GE, REG(B7_4), REG(B11_8));
680 case 0x3007: /* cmp/gt Rm,Rn */
681 gen_cmp(TCG_COND_GT, REG(B7_4), REG(B11_8));
683 case 0x3006: /* cmp/hi Rm,Rn */
684 gen_cmp(TCG_COND_GTU, REG(B7_4), REG(B11_8));
686 case 0x3002: /* cmp/hs Rm,Rn */
687 gen_cmp(TCG_COND_GEU, REG(B7_4), REG(B11_8));
689 case 0x200c: /* cmp/str Rm,Rn */
691 int label1 = gen_new_label();
692 int label2 = gen_new_label();
693 TCGv cmp1 = tcg_temp_local_new(TCG_TYPE_I32);
694 TCGv cmp2 = tcg_temp_local_new(TCG_TYPE_I32);
695 tcg_gen_xor_i32(cmp1, REG(B7_4), REG(B11_8));
696 tcg_gen_andi_i32(cmp2, cmp1, 0xff000000);
697 tcg_gen_brcondi_i32(TCG_COND_EQ, cmp2, 0, label1);
698 tcg_gen_andi_i32(cmp2, cmp1, 0x00ff0000);
699 tcg_gen_brcondi_i32(TCG_COND_EQ, cmp2, 0, label1);
700 tcg_gen_andi_i32(cmp2, cmp1, 0x0000ff00);
701 tcg_gen_brcondi_i32(TCG_COND_EQ, cmp2, 0, label1);
702 tcg_gen_andi_i32(cmp2, cmp1, 0x000000ff);
703 tcg_gen_brcondi_i32(TCG_COND_EQ, cmp2, 0, label1);
704 tcg_gen_andi_i32(cpu_sr, cpu_sr, ~SR_T);
706 gen_set_label(label1);
707 tcg_gen_ori_i32(cpu_sr, cpu_sr, SR_T);
708 gen_set_label(label2);
713 case 0x2007: /* div0s Rm,Rn */
715 gen_copy_bit_i32(cpu_sr, 8, REG(B11_8), 31); /* SR_Q */
716 gen_copy_bit_i32(cpu_sr, 9, REG(B7_4), 31); /* SR_M */
717 TCGv val = tcg_temp_new(TCG_TYPE_I32);
718 tcg_gen_xor_i32(val, REG(B7_4), REG(B11_8));
719 gen_copy_bit_i32(cpu_sr, 0, val, 31); /* SR_T */
723 case 0x3004: /* div1 Rm,Rn */
724 tcg_gen_helper_1_2(helper_div1, REG(B11_8), REG(B7_4), REG(B11_8));
726 case 0x300d: /* dmuls.l Rm,Rn */
728 TCGv tmp1 = tcg_temp_new(TCG_TYPE_I64);
729 TCGv tmp2 = tcg_temp_new(TCG_TYPE_I64);
731 tcg_gen_ext_i32_i64(tmp1, REG(B7_4));
732 tcg_gen_ext_i32_i64(tmp2, REG(B11_8));
733 tcg_gen_mul_i64(tmp1, tmp1, tmp2);
734 tcg_gen_trunc_i64_i32(cpu_macl, tmp1);
735 tcg_gen_shri_i64(tmp1, tmp1, 32);
736 tcg_gen_trunc_i64_i32(cpu_mach, tmp1);
742 case 0x3005: /* dmulu.l Rm,Rn */
744 TCGv tmp1 = tcg_temp_new(TCG_TYPE_I64);
745 TCGv tmp2 = tcg_temp_new(TCG_TYPE_I64);
747 tcg_gen_extu_i32_i64(tmp1, REG(B7_4));
748 tcg_gen_extu_i32_i64(tmp2, REG(B11_8));
749 tcg_gen_mul_i64(tmp1, tmp1, tmp2);
750 tcg_gen_trunc_i64_i32(cpu_macl, tmp1);
751 tcg_gen_shri_i64(tmp1, tmp1, 32);
752 tcg_gen_trunc_i64_i32(cpu_mach, tmp1);
758 case 0x600e: /* exts.b Rm,Rn */
759 tcg_gen_ext8s_i32(REG(B11_8), REG(B7_4));
761 case 0x600f: /* exts.w Rm,Rn */
762 tcg_gen_ext16s_i32(REG(B11_8), REG(B7_4));
764 case 0x600c: /* extu.b Rm,Rn */
765 tcg_gen_ext8u_i32(REG(B11_8), REG(B7_4));
767 case 0x600d: /* extu.w Rm,Rn */
768 tcg_gen_ext16u_i32(REG(B11_8), REG(B7_4));
770 case 0x000f: /* mac.l @Rm+,@Rn+ */
773 arg0 = tcg_temp_new(TCG_TYPE_I32);
774 tcg_gen_qemu_ld32s(arg0, REG(B7_4), ctx->memidx);
775 arg1 = tcg_temp_new(TCG_TYPE_I32);
776 tcg_gen_qemu_ld32s(arg1, REG(B11_8), ctx->memidx);
777 tcg_gen_helper_0_2(helper_macl, arg0, arg1);
780 tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 4);
781 tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4);
784 case 0x400f: /* mac.w @Rm+,@Rn+ */
787 arg0 = tcg_temp_new(TCG_TYPE_I32);
788 tcg_gen_qemu_ld32s(arg0, REG(B7_4), ctx->memidx);
789 arg1 = tcg_temp_new(TCG_TYPE_I32);
790 tcg_gen_qemu_ld32s(arg1, REG(B11_8), ctx->memidx);
791 tcg_gen_helper_0_2(helper_macw, arg0, arg1);
794 tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 2);
795 tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 2);
798 case 0x0007: /* mul.l Rm,Rn */
799 tcg_gen_mul_i32(cpu_macl, REG(B7_4), REG(B11_8));
801 case 0x200f: /* muls.w Rm,Rn */
804 arg0 = tcg_temp_new(TCG_TYPE_I32);
805 tcg_gen_ext16s_i32(arg0, REG(B7_4));
806 arg1 = tcg_temp_new(TCG_TYPE_I32);
807 tcg_gen_ext16s_i32(arg1, REG(B11_8));
808 tcg_gen_mul_i32(cpu_macl, arg0, arg1);
813 case 0x200e: /* mulu.w Rm,Rn */
816 arg0 = tcg_temp_new(TCG_TYPE_I32);
817 tcg_gen_ext16u_i32(arg0, REG(B7_4));
818 arg1 = tcg_temp_new(TCG_TYPE_I32);
819 tcg_gen_ext16u_i32(arg1, REG(B11_8));
820 tcg_gen_mul_i32(cpu_macl, arg0, arg1);
825 case 0x600b: /* neg Rm,Rn */
826 tcg_gen_neg_i32(REG(B11_8), REG(B7_4));
828 case 0x600a: /* negc Rm,Rn */
829 tcg_gen_helper_1_1(helper_negc, REG(B11_8), REG(B7_4));
831 case 0x6007: /* not Rm,Rn */
832 tcg_gen_not_i32(REG(B11_8), REG(B7_4));
834 case 0x200b: /* or Rm,Rn */
835 tcg_gen_or_i32(REG(B11_8), REG(B11_8), REG(B7_4));
837 case 0x400c: /* shad Rm,Rn */
839 int label1 = gen_new_label();
840 int label2 = gen_new_label();
841 int label3 = gen_new_label();
842 int label4 = gen_new_label();
843 TCGv shift = tcg_temp_local_new(TCG_TYPE_I32);
844 tcg_gen_brcondi_i32(TCG_COND_LT, REG(B7_4), 0, label1);
845 /* Rm positive, shift to the left */
846 tcg_gen_andi_i32(shift, REG(B7_4), 0x1f);
847 tcg_gen_shl_i32(REG(B11_8), REG(B11_8), shift);
849 /* Rm negative, shift to the right */
850 gen_set_label(label1);
851 tcg_gen_andi_i32(shift, REG(B7_4), 0x1f);
852 tcg_gen_brcondi_i32(TCG_COND_EQ, shift, 0, label2);
853 tcg_gen_not_i32(shift, REG(B7_4));
854 tcg_gen_andi_i32(shift, shift, 0x1f);
855 tcg_gen_addi_i32(shift, shift, 1);
856 tcg_gen_sar_i32(REG(B11_8), REG(B11_8), shift);
859 gen_set_label(label2);
860 tcg_gen_brcondi_i32(TCG_COND_LT, REG(B11_8), 0, label3);
861 tcg_gen_movi_i32(REG(B11_8), 0);
863 gen_set_label(label3);
864 tcg_gen_movi_i32(REG(B11_8), 0xffffffff);
865 gen_set_label(label4);
866 tcg_temp_free(shift);
869 case 0x400d: /* shld Rm,Rn */
871 int label1 = gen_new_label();
872 int label2 = gen_new_label();
873 int label3 = gen_new_label();
874 TCGv shift = tcg_temp_local_new(TCG_TYPE_I32);
875 tcg_gen_brcondi_i32(TCG_COND_LT, REG(B7_4), 0, label1);
876 /* Rm positive, shift to the left */
877 tcg_gen_andi_i32(shift, REG(B7_4), 0x1f);
878 tcg_gen_shl_i32(REG(B11_8), REG(B11_8), shift);
880 /* Rm negative, shift to the right */
881 gen_set_label(label1);
882 tcg_gen_andi_i32(shift, REG(B7_4), 0x1f);
883 tcg_gen_brcondi_i32(TCG_COND_EQ, shift, 0, label2);
884 tcg_gen_not_i32(shift, REG(B7_4));
885 tcg_gen_andi_i32(shift, shift, 0x1f);
886 tcg_gen_addi_i32(shift, shift, 1);
887 tcg_gen_shr_i32(REG(B11_8), REG(B11_8), shift);
890 gen_set_label(label2);
891 tcg_gen_movi_i32(REG(B11_8), 0);
892 gen_set_label(label3);
893 tcg_temp_free(shift);
896 case 0x3008: /* sub Rm,Rn */
897 tcg_gen_sub_i32(REG(B11_8), REG(B11_8), REG(B7_4));
899 case 0x300a: /* subc Rm,Rn */
900 tcg_gen_helper_1_2(helper_subc, REG(B11_8), REG(B7_4), REG(B11_8));
902 case 0x300b: /* subv Rm,Rn */
903 tcg_gen_helper_1_2(helper_subv, REG(B11_8), REG(B7_4), REG(B11_8));
905 case 0x2008: /* tst Rm,Rn */
907 TCGv val = tcg_temp_new(TCG_TYPE_I32);
908 tcg_gen_and_i32(val, REG(B7_4), REG(B11_8));
909 gen_cmp_imm(TCG_COND_EQ, val, 0);
913 case 0x200a: /* xor Rm,Rn */
914 tcg_gen_xor_i32(REG(B11_8), REG(B11_8), REG(B7_4));
916 case 0xf00c: /* fmov {F,D,X}Rm,{F,D,X}Rn - FPSCR: Nothing */
917 if (ctx->fpscr & FPSCR_SZ) {
918 TCGv fp = tcg_temp_new(TCG_TYPE_I64);
919 gen_load_fpr64(fp, XREG(B7_4));
920 gen_store_fpr64(fp, XREG(B11_8));
923 TCGv fp = tcg_temp_new(TCG_TYPE_I32);
924 gen_load_fpr32(fp, FREG(B7_4));
925 gen_store_fpr32(fp, FREG(B11_8));
929 case 0xf00a: /* fmov {F,D,X}Rm,@Rn - FPSCR: Nothing */
930 if (ctx->fpscr & FPSCR_SZ) {
931 TCGv fp = tcg_temp_new(TCG_TYPE_I64);
932 gen_load_fpr64(fp, XREG(B7_4));
933 tcg_gen_qemu_st64(fp, REG(B11_8), ctx->memidx);
936 TCGv fp = tcg_temp_new(TCG_TYPE_I32);
937 gen_load_fpr32(fp, FREG(B7_4));
938 tcg_gen_qemu_st32(fp, REG(B11_8), ctx->memidx);
942 case 0xf008: /* fmov @Rm,{F,D,X}Rn - FPSCR: Nothing */
943 if (ctx->fpscr & FPSCR_SZ) {
944 TCGv fp = tcg_temp_new(TCG_TYPE_I64);
945 tcg_gen_qemu_ld64(fp, REG(B7_4), ctx->memidx);
946 gen_store_fpr64(fp, XREG(B11_8));
949 TCGv fp = tcg_temp_new(TCG_TYPE_I32);
950 tcg_gen_qemu_ld32u(fp, REG(B7_4), ctx->memidx);
951 gen_store_fpr32(fp, FREG(B11_8));
955 case 0xf009: /* fmov @Rm+,{F,D,X}Rn - FPSCR: Nothing */
956 if (ctx->fpscr & FPSCR_SZ) {
957 TCGv fp = tcg_temp_new(TCG_TYPE_I64);
958 tcg_gen_qemu_ld64(fp, REG(B7_4), ctx->memidx);
959 gen_store_fpr64(fp, XREG(B11_8));
961 tcg_gen_addi_i32(REG(B7_4),REG(B7_4), 8);
963 TCGv fp = tcg_temp_new(TCG_TYPE_I32);
964 tcg_gen_qemu_ld32u(fp, REG(B7_4), ctx->memidx);
965 gen_store_fpr32(fp, FREG(B11_8));
967 tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 4);
970 case 0xf00b: /* fmov {F,D,X}Rm,@-Rn - FPSCR: Nothing */
971 if (ctx->fpscr & FPSCR_SZ) {
973 addr = tcg_temp_new(TCG_TYPE_I32);
974 tcg_gen_subi_i32(addr, REG(B11_8), 8);
975 fp = tcg_temp_new(TCG_TYPE_I64);
976 gen_load_fpr64(fp, XREG(B7_4));
977 tcg_gen_qemu_st64(fp, addr, ctx->memidx);
980 tcg_gen_subi_i32(REG(B11_8), REG(B11_8), 8);
983 addr = tcg_temp_new(TCG_TYPE_I32);
984 tcg_gen_subi_i32(addr, REG(B11_8), 4);
985 fp = tcg_temp_new(TCG_TYPE_I32);
986 gen_load_fpr32(fp, FREG(B7_4));
987 tcg_gen_qemu_st32(fp, addr, ctx->memidx);
990 tcg_gen_subi_i32(REG(B11_8), REG(B11_8), 4);
993 case 0xf006: /* fmov @(R0,Rm),{F,D,X}Rm - FPSCR: Nothing */
995 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
996 tcg_gen_add_i32(addr, REG(B7_4), REG(0));
997 if (ctx->fpscr & FPSCR_SZ) {
998 TCGv fp = tcg_temp_new(TCG_TYPE_I64);
999 tcg_gen_qemu_ld64(fp, addr, ctx->memidx);
1000 gen_store_fpr64(fp, XREG(B11_8));
1003 TCGv fp = tcg_temp_new(TCG_TYPE_I32);
1004 tcg_gen_qemu_ld32u(fp, addr, ctx->memidx);
1005 gen_store_fpr32(fp, FREG(B11_8));
1008 tcg_temp_free(addr);
1011 case 0xf007: /* fmov {F,D,X}Rn,@(R0,Rn) - FPSCR: Nothing */
1013 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
1014 tcg_gen_add_i32(addr, REG(B11_8), REG(0));
1015 if (ctx->fpscr & FPSCR_SZ) {
1016 TCGv fp = tcg_temp_new(TCG_TYPE_I64);
1017 gen_load_fpr64(fp, XREG(B7_4));
1018 tcg_gen_qemu_st64(fp, addr, ctx->memidx);
1021 TCGv fp = tcg_temp_new(TCG_TYPE_I32);
1022 gen_load_fpr32(fp, FREG(B7_4));
1023 tcg_gen_qemu_st32(fp, addr, ctx->memidx);
1026 tcg_temp_free(addr);
1029 case 0xf000: /* fadd Rm,Rn - FPSCR: R[PR,Enable.O/U/I]/W[Cause,Flag] */
1030 case 0xf001: /* fsub Rm,Rn - FPSCR: R[PR,Enable.O/U/I]/W[Cause,Flag] */
1031 case 0xf002: /* fmul Rm,Rn - FPSCR: R[PR,Enable.O/U/I]/W[Cause,Flag] */
1032 case 0xf003: /* fdiv Rm,Rn - FPSCR: R[PR,Enable.O/U/I]/W[Cause,Flag] */
1033 case 0xf004: /* fcmp/eq Rm,Rn - FPSCR: R[PR,Enable.V]/W[Cause,Flag] */
1034 case 0xf005: /* fcmp/gt Rm,Rn - FPSCR: R[PR,Enable.V]/W[Cause,Flag] */
1038 if (ctx->fpscr & FPSCR_PR) {
1039 if (ctx->opcode & 0x0110)
1040 break; /* illegal instruction */
1041 fp0 = tcg_temp_new(TCG_TYPE_I64);
1042 fp1 = tcg_temp_new(TCG_TYPE_I64);
1043 gen_load_fpr64(fp0, DREG(B11_8));
1044 gen_load_fpr64(fp1, DREG(B7_4));
1047 fp0 = tcg_temp_new(TCG_TYPE_I32);
1048 fp1 = tcg_temp_new(TCG_TYPE_I32);
1049 gen_load_fpr32(fp0, FREG(B11_8));
1050 gen_load_fpr32(fp1, FREG(B7_4));
1053 switch (ctx->opcode & 0xf00f) {
1054 case 0xf000: /* fadd Rm,Rn */
1055 if (ctx->fpscr & FPSCR_PR)
1056 tcg_gen_helper_1_2(helper_fadd_DT, fp0, fp0, fp1);
1058 tcg_gen_helper_1_2(helper_fadd_FT, fp0, fp0, fp1);
1060 case 0xf001: /* fsub Rm,Rn */
1061 if (ctx->fpscr & FPSCR_PR)
1062 tcg_gen_helper_1_2(helper_fsub_DT, fp0, fp0, fp1);
1064 tcg_gen_helper_1_2(helper_fsub_FT, fp0, fp0, fp1);
1066 case 0xf002: /* fmul Rm,Rn */
1067 if (ctx->fpscr & FPSCR_PR)
1068 tcg_gen_helper_1_2(helper_fmul_DT, fp0, fp0, fp1);
1070 tcg_gen_helper_1_2(helper_fmul_FT, fp0, fp0, fp1);
1072 case 0xf003: /* fdiv Rm,Rn */
1073 if (ctx->fpscr & FPSCR_PR)
1074 tcg_gen_helper_1_2(helper_fdiv_DT, fp0, fp0, fp1);
1076 tcg_gen_helper_1_2(helper_fdiv_FT, fp0, fp0, fp1);
1078 case 0xf004: /* fcmp/eq Rm,Rn */
1079 if (ctx->fpscr & FPSCR_PR)
1080 tcg_gen_helper_0_2(helper_fcmp_eq_DT, fp0, fp1);
1082 tcg_gen_helper_0_2(helper_fcmp_eq_FT, fp0, fp1);
1084 case 0xf005: /* fcmp/gt Rm,Rn */
1085 if (ctx->fpscr & FPSCR_PR)
1086 tcg_gen_helper_0_2(helper_fcmp_gt_DT, fp0, fp1);
1088 tcg_gen_helper_0_2(helper_fcmp_gt_FT, fp0, fp1);
1092 if (ctx->fpscr & FPSCR_PR) {
1093 gen_store_fpr64(fp0, DREG(B11_8));
1096 gen_store_fpr32(fp0, FREG(B11_8));
1104 switch (ctx->opcode & 0xff00) {
1105 case 0xc900: /* and #imm,R0 */
1106 tcg_gen_andi_i32(REG(0), REG(0), B7_0);
1108 case 0xcd00: /* and.b #imm,@(R0,GBR) */
1111 addr = tcg_temp_new(TCG_TYPE_I32);
1112 tcg_gen_add_i32(addr, REG(0), cpu_gbr);
1113 val = tcg_temp_new(TCG_TYPE_I32);
1114 tcg_gen_qemu_ld8u(val, addr, ctx->memidx);
1115 tcg_gen_andi_i32(val, val, B7_0);
1116 tcg_gen_qemu_st8(val, addr, ctx->memidx);
1118 tcg_temp_free(addr);
1121 case 0x8b00: /* bf label */
1122 CHECK_NOT_DELAY_SLOT
1123 gen_conditional_jump(ctx, ctx->pc + 2,
1124 ctx->pc + 4 + B7_0s * 2);
1125 ctx->bstate = BS_BRANCH;
1127 case 0x8f00: /* bf/s label */
1128 CHECK_NOT_DELAY_SLOT
1129 gen_branch_slot(ctx->delayed_pc = ctx->pc + 4 + B7_0s * 2, 0);
1130 ctx->flags |= DELAY_SLOT_CONDITIONAL;
1132 case 0x8900: /* bt label */
1133 CHECK_NOT_DELAY_SLOT
1134 gen_conditional_jump(ctx, ctx->pc + 4 + B7_0s * 2,
1136 ctx->bstate = BS_BRANCH;
1138 case 0x8d00: /* bt/s label */
1139 CHECK_NOT_DELAY_SLOT
1140 gen_branch_slot(ctx->delayed_pc = ctx->pc + 4 + B7_0s * 2, 1);
1141 ctx->flags |= DELAY_SLOT_CONDITIONAL;
1143 case 0x8800: /* cmp/eq #imm,R0 */
1144 gen_cmp_imm(TCG_COND_EQ, REG(0), B7_0s);
1146 case 0xc400: /* mov.b @(disp,GBR),R0 */
1148 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
1149 tcg_gen_addi_i32(addr, cpu_gbr, B7_0);
1150 tcg_gen_qemu_ld8s(REG(0), addr, ctx->memidx);
1151 tcg_temp_free(addr);
1154 case 0xc500: /* mov.w @(disp,GBR),R0 */
1156 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
1157 tcg_gen_addi_i32(addr, cpu_gbr, B7_0 * 2);
1158 tcg_gen_qemu_ld16s(REG(0), addr, ctx->memidx);
1159 tcg_temp_free(addr);
1162 case 0xc600: /* mov.l @(disp,GBR),R0 */
1164 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
1165 tcg_gen_addi_i32(addr, cpu_gbr, B7_0 * 4);
1166 tcg_gen_qemu_ld32s(REG(0), addr, ctx->memidx);
1167 tcg_temp_free(addr);
1170 case 0xc000: /* mov.b R0,@(disp,GBR) */
1172 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
1173 tcg_gen_addi_i32(addr, cpu_gbr, B7_0);
1174 tcg_gen_qemu_st8(REG(0), addr, ctx->memidx);
1175 tcg_temp_free(addr);
1178 case 0xc100: /* mov.w R0,@(disp,GBR) */
1180 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
1181 tcg_gen_addi_i32(addr, cpu_gbr, B7_0 * 2);
1182 tcg_gen_qemu_st16(REG(0), addr, ctx->memidx);
1183 tcg_temp_free(addr);
1186 case 0xc200: /* mov.l R0,@(disp,GBR) */
1188 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
1189 tcg_gen_addi_i32(addr, cpu_gbr, B7_0 * 4);
1190 tcg_gen_qemu_st32(REG(0), addr, ctx->memidx);
1191 tcg_temp_free(addr);
1194 case 0x8000: /* mov.b R0,@(disp,Rn) */
1196 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
1197 tcg_gen_addi_i32(addr, REG(B7_4), B3_0);
1198 tcg_gen_qemu_st8(REG(0), addr, ctx->memidx);
1199 tcg_temp_free(addr);
1202 case 0x8100: /* mov.w R0,@(disp,Rn) */
1204 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
1205 tcg_gen_addi_i32(addr, REG(B7_4), B3_0 * 2);
1206 tcg_gen_qemu_st16(REG(0), addr, ctx->memidx);
1207 tcg_temp_free(addr);
1210 case 0x8400: /* mov.b @(disp,Rn),R0 */
1212 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
1213 tcg_gen_addi_i32(addr, REG(B7_4), B3_0);
1214 tcg_gen_qemu_ld8s(REG(0), addr, ctx->memidx);
1215 tcg_temp_free(addr);
1218 case 0x8500: /* mov.w @(disp,Rn),R0 */
1220 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
1221 tcg_gen_addi_i32(addr, REG(B7_4), B3_0 * 2);
1222 tcg_gen_qemu_ld16s(REG(0), addr, ctx->memidx);
1223 tcg_temp_free(addr);
1226 case 0xc700: /* mova @(disp,PC),R0 */
1227 tcg_gen_movi_i32(REG(0), ((ctx->pc & 0xfffffffc) + 4 + B7_0 * 4) & ~3);
1229 case 0xcb00: /* or #imm,R0 */
1230 tcg_gen_ori_i32(REG(0), REG(0), B7_0);
1232 case 0xcf00: /* or.b #imm,@(R0,GBR) */
1235 addr = tcg_temp_new(TCG_TYPE_I32);
1236 tcg_gen_add_i32(addr, REG(0), cpu_gbr);
1237 val = tcg_temp_new(TCG_TYPE_I32);
1238 tcg_gen_qemu_ld8u(val, addr, ctx->memidx);
1239 tcg_gen_ori_i32(val, val, B7_0);
1240 tcg_gen_qemu_st8(val, addr, ctx->memidx);
1242 tcg_temp_free(addr);
1245 case 0xc300: /* trapa #imm */
1248 CHECK_NOT_DELAY_SLOT
1249 tcg_gen_movi_i32(cpu_pc, ctx->pc);
1250 imm = tcg_const_i32(B7_0);
1251 tcg_gen_helper_0_1(helper_trapa, imm);
1253 ctx->bstate = BS_BRANCH;
1256 case 0xc800: /* tst #imm,R0 */
1258 TCGv val = tcg_temp_new(TCG_TYPE_I32);
1259 tcg_gen_andi_i32(val, REG(0), B7_0);
1260 gen_cmp_imm(TCG_COND_EQ, val, 0);
1264 case 0xcc00: /* tst.b #imm,@(R0,GBR) */
1266 TCGv val = tcg_temp_new(TCG_TYPE_I32);
1267 tcg_gen_add_i32(val, REG(0), cpu_gbr);
1268 tcg_gen_qemu_ld8u(val, val, ctx->memidx);
1269 tcg_gen_andi_i32(val, val, B7_0);
1270 gen_cmp_imm(TCG_COND_EQ, val, 0);
1274 case 0xca00: /* xor #imm,R0 */
1275 tcg_gen_xori_i32(REG(0), REG(0), B7_0);
1277 case 0xce00: /* xor.b #imm,@(R0,GBR) */
1280 addr = tcg_temp_new(TCG_TYPE_I32);
1281 tcg_gen_add_i32(addr, REG(0), cpu_gbr);
1282 val = tcg_temp_new(TCG_TYPE_I32);
1283 tcg_gen_qemu_ld8u(val, addr, ctx->memidx);
1284 tcg_gen_xori_i32(val, val, B7_0);
1285 tcg_gen_qemu_st8(val, addr, ctx->memidx);
1287 tcg_temp_free(addr);
1292 switch (ctx->opcode & 0xf08f) {
1293 case 0x408e: /* ldc Rm,Rn_BANK */
1294 tcg_gen_mov_i32(ALTREG(B6_4), REG(B11_8));
1296 case 0x4087: /* ldc.l @Rm+,Rn_BANK */
1297 tcg_gen_qemu_ld32s(ALTREG(B6_4), REG(B11_8), ctx->memidx);
1298 tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4);
1300 case 0x0082: /* stc Rm_BANK,Rn */
1301 tcg_gen_mov_i32(REG(B11_8), ALTREG(B6_4));
1303 case 0x4083: /* stc.l Rm_BANK,@-Rn */
1305 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
1306 tcg_gen_subi_i32(addr, REG(B11_8), 4);
1307 tcg_gen_qemu_st32(ALTREG(B6_4), addr, ctx->memidx);
1308 tcg_temp_free(addr);
1309 tcg_gen_subi_i32(REG(B11_8), REG(B11_8), 4);
1314 switch (ctx->opcode & 0xf0ff) {
1315 case 0x0023: /* braf Rn */
1316 CHECK_NOT_DELAY_SLOT
1317 tcg_gen_addi_i32(cpu_delayed_pc, REG(B11_8), ctx->pc + 4);
1318 ctx->flags |= DELAY_SLOT;
1319 ctx->delayed_pc = (uint32_t) - 1;
1321 case 0x0003: /* bsrf Rn */
1322 CHECK_NOT_DELAY_SLOT
1323 tcg_gen_movi_i32(cpu_pr, ctx->pc + 4);
1324 tcg_gen_add_i32(cpu_delayed_pc, REG(B11_8), cpu_pr);
1325 ctx->flags |= DELAY_SLOT;
1326 ctx->delayed_pc = (uint32_t) - 1;
1328 case 0x4015: /* cmp/pl Rn */
1329 gen_cmp_imm(TCG_COND_GT, REG(B11_8), 0);
1331 case 0x4011: /* cmp/pz Rn */
1332 gen_cmp_imm(TCG_COND_GE, REG(B11_8), 0);
1334 case 0x4010: /* dt Rn */
1335 tcg_gen_subi_i32(REG(B11_8), REG(B11_8), 1);
1336 gen_cmp_imm(TCG_COND_EQ, REG(B11_8), 0);
1338 case 0x402b: /* jmp @Rn */
1339 CHECK_NOT_DELAY_SLOT
1340 tcg_gen_mov_i32(cpu_delayed_pc, REG(B11_8));
1341 ctx->flags |= DELAY_SLOT;
1342 ctx->delayed_pc = (uint32_t) - 1;
1344 case 0x400b: /* jsr @Rn */
1345 CHECK_NOT_DELAY_SLOT
1346 tcg_gen_movi_i32(cpu_pr, ctx->pc + 4);
1347 tcg_gen_mov_i32(cpu_delayed_pc, REG(B11_8));
1348 ctx->flags |= DELAY_SLOT;
1349 ctx->delayed_pc = (uint32_t) - 1;
1351 case 0x400e: /* lds Rm,SR */
1352 tcg_gen_andi_i32(cpu_sr, REG(B11_8), 0x700083f3);
1353 ctx->bstate = BS_STOP;
1355 case 0x4007: /* lds.l @Rm+,SR */
1357 TCGv val = tcg_temp_new(TCG_TYPE_I32);
1358 tcg_gen_qemu_ld32s(val, REG(B11_8), ctx->memidx);
1359 tcg_gen_andi_i32(cpu_sr, val, 0x700083f3);
1361 tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4);
1362 ctx->bstate = BS_STOP;
1365 case 0x0002: /* sts SR,Rn */
1366 tcg_gen_mov_i32(REG(B11_8), cpu_sr);
1368 case 0x4003: /* sts SR,@-Rn */
1370 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
1371 tcg_gen_subi_i32(addr, REG(B11_8), 4);
1372 tcg_gen_qemu_st32(cpu_sr, addr, ctx->memidx);
1373 tcg_temp_free(addr);
1374 tcg_gen_subi_i32(REG(B11_8), REG(B11_8), 4);
1377 #define LDST(reg,ldnum,ldpnum,stnum,stpnum) \
1379 tcg_gen_mov_i32 (cpu_##reg, REG(B11_8)); \
1382 tcg_gen_qemu_ld32s (cpu_##reg, REG(B11_8), ctx->memidx); \
1383 tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4); \
1386 tcg_gen_mov_i32 (REG(B11_8), cpu_##reg); \
1390 TCGv addr = tcg_temp_new(TCG_TYPE_I32); \
1391 tcg_gen_subi_i32(addr, REG(B11_8), 4); \
1392 tcg_gen_qemu_st32 (cpu_##reg, addr, ctx->memidx); \
1393 tcg_temp_free(addr); \
1394 tcg_gen_subi_i32(REG(B11_8), REG(B11_8), 4); \
1397 LDST(gbr, 0x401e, 0x4017, 0x0012, 0x4013)
1398 LDST(vbr, 0x402e, 0x4027, 0x0022, 0x4023)
1399 LDST(ssr, 0x403e, 0x4037, 0x0032, 0x4033)
1400 LDST(spc, 0x404e, 0x4047, 0x0042, 0x4043)
1401 LDST(dbr, 0x40fa, 0x40f6, 0x00fa, 0x40f2)
1402 LDST(mach, 0x400a, 0x4006, 0x000a, 0x4002)
1403 LDST(macl, 0x401a, 0x4016, 0x001a, 0x4012)
1404 LDST(pr, 0x402a, 0x4026, 0x002a, 0x4022)
1405 LDST(fpul, 0x405a, 0x4056, 0x005a, 0x4052)
1406 case 0x406a: /* lds Rm,FPSCR */
1407 tcg_gen_helper_0_1(helper_ld_fpscr, REG(B11_8));
1408 ctx->bstate = BS_STOP;
1410 case 0x4066: /* lds.l @Rm+,FPSCR */
1412 TCGv addr = tcg_temp_new(TCG_TYPE_I32);
1413 tcg_gen_qemu_ld32s(addr, REG(B11_8), ctx->memidx);
1414 tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4);
1415 tcg_gen_helper_0_1(helper_ld_fpscr, addr);
1416 tcg_temp_free(addr);
1417 ctx->bstate = BS_STOP;
1420 case 0x006a: /* sts FPSCR,Rn */
1421 tcg_gen_andi_i32(REG(B11_8), cpu_fpscr, 0x003fffff);
1423 case 0x4062: /* sts FPSCR,@-Rn */
1426 val = tcg_temp_new(TCG_TYPE_I32);
1427 tcg_gen_andi_i32(val, cpu_fpscr, 0x003fffff);
1428 addr = tcg_temp_new(TCG_TYPE_I32);
1429 tcg_gen_subi_i32(addr, REG(B11_8), 4);
1430 tcg_gen_qemu_st32(val, addr, ctx->memidx);
1431 tcg_temp_free(addr);
1433 tcg_gen_subi_i32(REG(B11_8), REG(B11_8), 4);
1436 case 0x00c3: /* movca.l R0,@Rm */
1437 tcg_gen_qemu_st32(REG(0), REG(B11_8), ctx->memidx);
1439 case 0x0029: /* movt Rn */
1440 tcg_gen_andi_i32(REG(B11_8), cpu_sr, SR_T);
1442 case 0x0093: /* ocbi @Rn */
1444 TCGv dummy = tcg_temp_new(TCG_TYPE_I32);
1445 tcg_gen_qemu_ld32s(dummy, REG(B11_8), ctx->memidx);
1446 tcg_temp_free(dummy);
1449 case 0x00a3: /* ocbp @Rn */
1451 TCGv dummy = tcg_temp_new(TCG_TYPE_I32);
1452 tcg_gen_qemu_ld32s(dummy, REG(B11_8), ctx->memidx);
1453 tcg_temp_free(dummy);
1456 case 0x00b3: /* ocbwb @Rn */
1458 TCGv dummy = tcg_temp_new(TCG_TYPE_I32);
1459 tcg_gen_qemu_ld32s(dummy, REG(B11_8), ctx->memidx);
1460 tcg_temp_free(dummy);
1463 case 0x0083: /* pref @Rn */
1465 case 0x4024: /* rotcl Rn */
1467 TCGv tmp = tcg_temp_new(TCG_TYPE_I32);
1468 tcg_gen_mov_i32(tmp, cpu_sr);
1469 gen_copy_bit_i32(cpu_sr, 0, REG(B11_8), 31);
1470 tcg_gen_shli_i32(REG(B11_8), REG(B11_8), 1);
1471 gen_copy_bit_i32(REG(B11_8), 0, tmp, 0);
1475 case 0x4025: /* rotcr Rn */
1477 TCGv tmp = tcg_temp_new(TCG_TYPE_I32);
1478 tcg_gen_mov_i32(tmp, cpu_sr);
1479 gen_copy_bit_i32(cpu_sr, 0, REG(B11_8), 0);
1480 tcg_gen_shri_i32(REG(B11_8), REG(B11_8), 1);
1481 gen_copy_bit_i32(REG(B11_8), 31, tmp, 0);
1485 case 0x4004: /* rotl Rn */
1486 gen_copy_bit_i32(cpu_sr, 0, REG(B11_8), 31);
1487 tcg_gen_shli_i32(REG(B11_8), REG(B11_8), 1);
1488 gen_copy_bit_i32(REG(B11_8), 0, cpu_sr, 0);
1490 case 0x4005: /* rotr Rn */
1491 gen_copy_bit_i32(cpu_sr, 0, REG(B11_8), 0);
1492 tcg_gen_shri_i32(REG(B11_8), REG(B11_8), 1);
1493 gen_copy_bit_i32(REG(B11_8), 31, cpu_sr, 0);
1495 case 0x4000: /* shll Rn */
1496 case 0x4020: /* shal Rn */
1497 gen_copy_bit_i32(cpu_sr, 0, REG(B11_8), 31);
1498 tcg_gen_shli_i32(REG(B11_8), REG(B11_8), 1);
1500 case 0x4021: /* shar Rn */
1501 gen_copy_bit_i32(cpu_sr, 0, REG(B11_8), 0);
1502 tcg_gen_sari_i32(REG(B11_8), REG(B11_8), 1);
1504 case 0x4001: /* shlr Rn */
1505 gen_copy_bit_i32(cpu_sr, 0, REG(B11_8), 0);
1506 tcg_gen_shri_i32(REG(B11_8), REG(B11_8), 1);
1508 case 0x4008: /* shll2 Rn */
1509 tcg_gen_shli_i32(REG(B11_8), REG(B11_8), 2);
1511 case 0x4018: /* shll8 Rn */
1512 tcg_gen_shli_i32(REG(B11_8), REG(B11_8), 8);
1514 case 0x4028: /* shll16 Rn */
1515 tcg_gen_shli_i32(REG(B11_8), REG(B11_8), 16);
1517 case 0x4009: /* shlr2 Rn */
1518 tcg_gen_shri_i32(REG(B11_8), REG(B11_8), 2);
1520 case 0x4019: /* shlr8 Rn */
1521 tcg_gen_shri_i32(REG(B11_8), REG(B11_8), 8);
1523 case 0x4029: /* shlr16 Rn */
1524 tcg_gen_shri_i32(REG(B11_8), REG(B11_8), 16);
1526 case 0x401b: /* tas.b @Rn */
1529 addr = tcg_temp_local_new(TCG_TYPE_I32);
1530 tcg_gen_mov_i32(addr, REG(B11_8));
1531 val = tcg_temp_local_new(TCG_TYPE_I32);
1532 tcg_gen_qemu_ld8u(val, addr, ctx->memidx);
1533 gen_cmp_imm(TCG_COND_EQ, val, 0);
1534 tcg_gen_ori_i32(val, val, 0x80);
1535 tcg_gen_qemu_st8(val, addr, ctx->memidx);
1537 tcg_temp_free(addr);
1540 case 0xf00d: /* fsts FPUL,FRn - FPSCR: Nothing */
1542 TCGv fp = tcg_temp_new(TCG_TYPE_I32);
1543 tcg_gen_mov_i32(fp, cpu_fpul);
1544 gen_store_fpr32(fp, FREG(B11_8));
1548 case 0xf01d: /* flds FRm,FPUL - FPSCR: Nothing */
1550 TCGv fp = tcg_temp_new(TCG_TYPE_I32);
1551 gen_load_fpr32(fp, FREG(B11_8));
1552 tcg_gen_mov_i32(cpu_fpul, fp);
1556 case 0xf02d: /* float FPUL,FRn/DRn - FPSCR: R[PR,Enable.I]/W[Cause,Flag] */
1557 if (ctx->fpscr & FPSCR_PR) {
1559 if (ctx->opcode & 0x0100)
1560 break; /* illegal instruction */
1561 fp = tcg_temp_new(TCG_TYPE_I64);
1562 tcg_gen_helper_1_1(helper_float_DT, fp, cpu_fpul);
1563 gen_store_fpr64(fp, DREG(B11_8));
1567 TCGv fp = tcg_temp_new(TCG_TYPE_I32);
1568 tcg_gen_helper_1_1(helper_float_FT, fp, cpu_fpul);
1569 gen_store_fpr32(fp, FREG(B11_8));
1573 case 0xf03d: /* ftrc FRm/DRm,FPUL - FPSCR: R[PR,Enable.V]/W[Cause,Flag] */
1574 if (ctx->fpscr & FPSCR_PR) {
1576 if (ctx->opcode & 0x0100)
1577 break; /* illegal instruction */
1578 fp = tcg_temp_new(TCG_TYPE_I64);
1579 gen_load_fpr64(fp, DREG(B11_8));
1580 tcg_gen_helper_1_1(helper_ftrc_DT, cpu_fpul, fp);
1584 TCGv fp = tcg_temp_new(TCG_TYPE_I32);
1585 gen_load_fpr32(fp, FREG(B11_8));
1586 tcg_gen_helper_1_1(helper_ftrc_FT, cpu_fpul, fp);
1590 case 0xf04d: /* fneg FRn/DRn - FPSCR: Nothing */
1592 TCGv fp = tcg_temp_new(TCG_TYPE_I32);
1593 gen_load_fpr32(fp, FREG(B11_8));
1594 tcg_gen_helper_1_1(helper_fneg_T, fp, fp);
1595 gen_store_fpr32(fp, FREG(B11_8));
1599 case 0xf05d: /* fabs FRn/DRn */
1600 if (ctx->fpscr & FPSCR_PR) {
1601 if (ctx->opcode & 0x0100)
1602 break; /* illegal instruction */
1603 TCGv fp = tcg_temp_new(TCG_TYPE_I64);
1604 gen_load_fpr64(fp, DREG(B11_8));
1605 tcg_gen_helper_1_1(helper_fabs_DT, fp, fp);
1606 gen_store_fpr64(fp, DREG(B11_8));
1609 TCGv fp = tcg_temp_new(TCG_TYPE_I32);
1610 gen_load_fpr32(fp, FREG(B11_8));
1611 tcg_gen_helper_1_1(helper_fabs_FT, fp, fp);
1612 gen_store_fpr32(fp, FREG(B11_8));
1616 case 0xf06d: /* fsqrt FRn */
1617 if (ctx->fpscr & FPSCR_PR) {
1618 if (ctx->opcode & 0x0100)
1619 break; /* illegal instruction */
1620 TCGv fp = tcg_temp_new(TCG_TYPE_I64);
1621 gen_load_fpr64(fp, DREG(B11_8));
1622 tcg_gen_helper_1_1(helper_fsqrt_DT, fp, fp);
1623 gen_store_fpr64(fp, DREG(B11_8));
1626 TCGv fp = tcg_temp_new(TCG_TYPE_I32);
1627 gen_load_fpr32(fp, FREG(B11_8));
1628 tcg_gen_helper_1_1(helper_fsqrt_FT, fp, fp);
1629 gen_store_fpr32(fp, FREG(B11_8));
1633 case 0xf07d: /* fsrra FRn */
1635 case 0xf08d: /* fldi0 FRn - FPSCR: R[PR] */
1636 if (!(ctx->fpscr & FPSCR_PR)) {
1637 TCGv val = tcg_const_i32(0);
1638 gen_load_fpr32(val, FREG(B11_8));
1643 case 0xf09d: /* fldi1 FRn - FPSCR: R[PR] */
1644 if (!(ctx->fpscr & FPSCR_PR)) {
1645 TCGv val = tcg_const_i32(0x3f800000);
1646 gen_load_fpr32(val, FREG(B11_8));
1651 case 0xf0ad: /* fcnvsd FPUL,DRn */
1653 TCGv fp = tcg_temp_new(TCG_TYPE_I64);
1654 tcg_gen_helper_1_1(helper_fcnvsd_FT_DT, fp, cpu_fpul);
1655 gen_store_fpr64(fp, DREG(B11_8));
1659 case 0xf0bd: /* fcnvds DRn,FPUL */
1661 TCGv fp = tcg_temp_new(TCG_TYPE_I64);
1662 gen_load_fpr64(fp, DREG(B11_8));
1663 tcg_gen_helper_1_1(helper_fcnvds_DT_FT, cpu_fpul, fp);
1669 fprintf(stderr, "unknown instruction 0x%04x at pc 0x%08x\n",
1670 ctx->opcode, ctx->pc);
1671 tcg_gen_helper_0_0(helper_raise_illegal_instruction);
1672 ctx->bstate = BS_EXCP;
1675 void decode_opc(DisasContext * ctx)
1677 uint32_t old_flags = ctx->flags;
1681 if (old_flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL)) {
1682 if (ctx->flags & DELAY_SLOT_CLEARME) {
1685 /* go out of the delay slot */
1686 uint32_t new_flags = ctx->flags;
1687 new_flags &= ~(DELAY_SLOT | DELAY_SLOT_CONDITIONAL);
1688 gen_store_flags(new_flags);
1691 ctx->bstate = BS_BRANCH;
1692 if (old_flags & DELAY_SLOT_CONDITIONAL) {
1693 gen_delayed_conditional_jump(ctx);
1694 } else if (old_flags & DELAY_SLOT) {
1700 /* go into a delay slot */
1701 if (ctx->flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL))
1702 gen_store_flags(ctx->flags);
1706 gen_intermediate_code_internal(CPUState * env, TranslationBlock * tb,
1710 target_ulong pc_start;
1711 static uint16_t *gen_opc_end;
1717 gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
1719 ctx.flags = (uint32_t)tb->flags;
1720 ctx.bstate = BS_NONE;
1722 ctx.fpscr = env->fpscr;
1723 ctx.memidx = (env->sr & SR_MD) ? 1 : 0;
1724 /* We don't know if the delayed pc came from a dynamic or static branch,
1725 so assume it is a dynamic branch. */
1726 ctx.delayed_pc = -1; /* use delayed pc from env pointer */
1728 ctx.singlestep_enabled = env->singlestep_enabled;
1731 if (loglevel & CPU_LOG_TB_CPU) {
1733 "------------------------------------------------\n");
1734 cpu_dump_state(env, logfile, fprintf, 0);
1740 max_insns = tb->cflags & CF_COUNT_MASK;
1742 max_insns = CF_COUNT_MASK;
1744 while (ctx.bstate == BS_NONE && gen_opc_ptr < gen_opc_end) {
1745 if (env->nb_breakpoints > 0) {
1746 for (i = 0; i < env->nb_breakpoints; i++) {
1747 if (ctx.pc == env->breakpoints[i]) {
1748 /* We have hit a breakpoint - make sure PC is up-to-date */
1749 tcg_gen_movi_i32(cpu_pc, ctx.pc);
1750 tcg_gen_helper_0_0(helper_debug);
1751 ctx.bstate = BS_EXCP;
1757 i = gen_opc_ptr - gen_opc_buf;
1761 gen_opc_instr_start[ii++] = 0;
1763 gen_opc_pc[ii] = ctx.pc;
1764 gen_opc_hflags[ii] = ctx.flags;
1765 gen_opc_instr_start[ii] = 1;
1766 gen_opc_icount[ii] = num_insns;
1768 if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO))
1771 fprintf(stderr, "Loading opcode at address 0x%08x\n", ctx.pc);
1774 ctx.opcode = lduw_code(ctx.pc);
1778 if ((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0)
1780 if (env->singlestep_enabled)
1782 if (num_insns >= max_insns)
1784 #ifdef SH4_SINGLE_STEP
1788 if (tb->cflags & CF_LAST_IO)
1790 if (env->singlestep_enabled) {
1791 tcg_gen_helper_0_0(helper_debug);
1793 switch (ctx.bstate) {
1795 /* gen_op_interrupt_restart(); */
1799 gen_store_flags(ctx.flags | DELAY_SLOT_CLEARME);
1801 gen_goto_tb(&ctx, 0, ctx.pc);
1804 /* gen_op_interrupt_restart(); */
1813 gen_icount_end(tb, num_insns);
1814 *gen_opc_ptr = INDEX_op_end;
1816 i = gen_opc_ptr - gen_opc_buf;
1819 gen_opc_instr_start[ii++] = 0;
1821 tb->size = ctx.pc - pc_start;
1822 tb->icount = num_insns;
1826 #ifdef SH4_DEBUG_DISAS
1827 if (loglevel & CPU_LOG_TB_IN_ASM)
1828 fprintf(logfile, "\n");
1830 if (loglevel & CPU_LOG_TB_IN_ASM) {
1831 fprintf(logfile, "IN:\n"); /* , lookup_symbol(pc_start)); */
1832 target_disas(logfile, pc_start, ctx.pc - pc_start, 0);
1833 fprintf(logfile, "\n");
1838 void gen_intermediate_code(CPUState * env, struct TranslationBlock *tb)
1840 gen_intermediate_code_internal(env, tb, 0);
1843 void gen_intermediate_code_pc(CPUState * env, struct TranslationBlock *tb)
1845 gen_intermediate_code_internal(env, tb, 1);
1848 void gen_pc_load(CPUState *env, TranslationBlock *tb,
1849 unsigned long searched_pc, int pc_pos, void *puc)
1851 env->pc = gen_opc_pc[pc_pos];
1852 env->flags = gen_opc_hflags[pc_pos];