]>
git.proxmox.com Git - qemu.git/blob - target-sh4/translate.c
87c3f43ac839c409ce4c77f61b3cb54124d8b940
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 /* dyngen register indexes */
73 #include "gen-icount.h"
75 static void sh4_translate_init(void)
78 static int done_init
= 0;
79 static const char * const gregnames
[24] = {
80 "R0_BANK0", "R1_BANK0", "R2_BANK0", "R3_BANK0",
81 "R4_BANK0", "R5_BANK0", "R6_BANK0", "R7_BANK0",
82 "R8", "R9", "R10", "R11", "R12", "R13", "R14", "R15",
83 "R0_BANK1", "R1_BANK1", "R2_BANK1", "R3_BANK1",
84 "R4_BANK1", "R5_BANK1", "R6_BANK1", "R7_BANK1"
90 cpu_env
= tcg_global_reg_new(TCG_TYPE_PTR
, TCG_AREG0
, "env");
91 cpu_T
[0] = tcg_global_reg_new(TCG_TYPE_I32
, TCG_AREG1
, "T0");
92 cpu_T
[1] = tcg_global_reg_new(TCG_TYPE_I32
, TCG_AREG2
, "T1");
94 for (i
= 0; i
< 24; i
++)
95 cpu_gregs
[i
] = tcg_global_mem_new(TCG_TYPE_I32
, TCG_AREG0
,
96 offsetof(CPUState
, gregs
[i
]),
99 cpu_pc
= tcg_global_mem_new(TCG_TYPE_I32
, TCG_AREG0
,
100 offsetof(CPUState
, pc
), "PC");
101 cpu_sr
= tcg_global_mem_new(TCG_TYPE_I32
, TCG_AREG0
,
102 offsetof(CPUState
, sr
), "SR");
103 cpu_ssr
= tcg_global_mem_new(TCG_TYPE_I32
, TCG_AREG0
,
104 offsetof(CPUState
, ssr
), "SSR");
105 cpu_spc
= tcg_global_mem_new(TCG_TYPE_I32
, TCG_AREG0
,
106 offsetof(CPUState
, spc
), "SPC");
107 cpu_gbr
= tcg_global_mem_new(TCG_TYPE_I32
, TCG_AREG0
,
108 offsetof(CPUState
, gbr
), "GBR");
109 cpu_vbr
= tcg_global_mem_new(TCG_TYPE_I32
, TCG_AREG0
,
110 offsetof(CPUState
, vbr
), "VBR");
111 cpu_sgr
= tcg_global_mem_new(TCG_TYPE_I32
, TCG_AREG0
,
112 offsetof(CPUState
, sgr
), "SGR");
113 cpu_dbr
= tcg_global_mem_new(TCG_TYPE_I32
, TCG_AREG0
,
114 offsetof(CPUState
, dbr
), "DBR");
115 cpu_mach
= tcg_global_mem_new(TCG_TYPE_I32
, TCG_AREG0
,
116 offsetof(CPUState
, mach
), "MACH");
117 cpu_macl
= tcg_global_mem_new(TCG_TYPE_I32
, TCG_AREG0
,
118 offsetof(CPUState
, macl
), "MACL");
119 cpu_pr
= tcg_global_mem_new(TCG_TYPE_I32
, TCG_AREG0
,
120 offsetof(CPUState
, pr
), "PR");
121 cpu_fpscr
= tcg_global_mem_new(TCG_TYPE_I32
, TCG_AREG0
,
122 offsetof(CPUState
, fpscr
), "FPSCR");
123 cpu_fpul
= tcg_global_mem_new(TCG_TYPE_I32
, TCG_AREG0
,
124 offsetof(CPUState
, fpul
), "FPUL");
126 cpu_flags
= tcg_global_mem_new(TCG_TYPE_I32
, TCG_AREG0
,
127 offsetof(CPUState
, flags
), "_flags_");
128 cpu_delayed_pc
= tcg_global_mem_new(TCG_TYPE_I32
, TCG_AREG0
,
129 offsetof(CPUState
, delayed_pc
),
132 /* register helpers */
134 #define DEF_HELPER(ret, name, params) tcg_register_helper(name, #name);
140 #ifdef CONFIG_USER_ONLY
142 #define GEN_OP_LD(width, reg) \
143 void gen_op_ld##width##_T0_##reg (DisasContext *ctx) { \
144 gen_op_ld##width##_T0_##reg##_raw(); \
146 #define GEN_OP_ST(width, reg) \
147 void gen_op_st##width##_##reg##_T1 (DisasContext *ctx) { \
148 gen_op_st##width##_##reg##_T1_raw(); \
153 #define GEN_OP_LD(width, reg) \
154 void gen_op_ld##width##_T0_##reg (DisasContext *ctx) { \
155 if (ctx->memidx) gen_op_ld##width##_T0_##reg##_kernel(); \
156 else gen_op_ld##width##_T0_##reg##_user();\
158 #define GEN_OP_ST(width, reg) \
159 void gen_op_st##width##_##reg##_T1 (DisasContext *ctx) { \
160 if (ctx->memidx) gen_op_st##width##_##reg##_T1_kernel(); \
161 else gen_op_st##width##_##reg##_T1_user();\
179 void cpu_dump_state(CPUState
* env
, FILE * f
,
180 int (*cpu_fprintf
) (FILE * f
, const char *fmt
, ...),
184 cpu_fprintf(f
, "pc=0x%08x sr=0x%08x pr=0x%08x fpscr=0x%08x\n",
185 env
->pc
, env
->sr
, env
->pr
, env
->fpscr
);
186 cpu_fprintf(f
, "spc=0x%08x ssr=0x%08x gbr=0x%08x vbr=0x%08x\n",
187 env
->spc
, env
->ssr
, env
->gbr
, env
->vbr
);
188 cpu_fprintf(f
, "sgr=0x%08x dbr=0x%08x delayed_pc=0x%08x fpul=0x%08x\n",
189 env
->sgr
, env
->dbr
, env
->delayed_pc
, env
->fpul
);
190 for (i
= 0; i
< 24; i
+= 4) {
191 cpu_fprintf(f
, "r%d=0x%08x r%d=0x%08x r%d=0x%08x r%d=0x%08x\n",
192 i
, env
->gregs
[i
], i
+ 1, env
->gregs
[i
+ 1],
193 i
+ 2, env
->gregs
[i
+ 2], i
+ 3, env
->gregs
[i
+ 3]);
195 if (env
->flags
& DELAY_SLOT
) {
196 cpu_fprintf(f
, "in delay slot (delayed_pc=0x%08x)\n",
198 } else if (env
->flags
& DELAY_SLOT_CONDITIONAL
) {
199 cpu_fprintf(f
, "in conditional delay slot (delayed_pc=0x%08x)\n",
204 void cpu_sh4_reset(CPUSH4State
* env
)
206 #if defined(CONFIG_USER_ONLY)
207 env
->sr
= SR_FD
; /* FD - kernel does lazy fpu context switch */
209 env
->sr
= 0x700000F0; /* MD, RB, BL, I3-I0 */
212 env
->pc
= 0xA0000000;
213 #if defined(CONFIG_USER_ONLY)
214 env
->fpscr
= FPSCR_PR
; /* value for userspace according to the kernel */
215 set_float_rounding_mode(float_round_nearest_even
, &env
->fp_status
); /* ?! */
217 env
->fpscr
= 0x00040001; /* CPU reset value according to SH4 manual */
218 set_float_rounding_mode(float_round_to_zero
, &env
->fp_status
);
223 CPUSH4State
*cpu_sh4_init(const char *cpu_model
)
227 env
= qemu_mallocz(sizeof(CPUSH4State
));
231 sh4_translate_init();
237 static void gen_goto_tb(DisasContext
* ctx
, int n
, target_ulong dest
)
239 TranslationBlock
*tb
;
242 if ((tb
->pc
& TARGET_PAGE_MASK
) == (dest
& TARGET_PAGE_MASK
) &&
243 !ctx
->singlestep_enabled
) {
244 /* Use a direct jump if in same page and singlestep not enabled */
246 tcg_gen_movi_i32(cpu_pc
, dest
);
247 tcg_gen_exit_tb((long) tb
+ n
);
249 tcg_gen_movi_i32(cpu_pc
, dest
);
250 if (ctx
->singlestep_enabled
)
256 static void gen_jump(DisasContext
* ctx
)
258 if (ctx
->delayed_pc
== (uint32_t) - 1) {
259 /* Target is not statically known, it comes necessarily from a
260 delayed jump as immediate jump are conditinal jumps */
261 tcg_gen_mov_i32(cpu_pc
, cpu_delayed_pc
);
262 if (ctx
->singlestep_enabled
)
266 gen_goto_tb(ctx
, 0, ctx
->delayed_pc
);
270 static inline void gen_branch_slot(uint32_t delayed_pc
, int t
)
272 int label
= gen_new_label();
273 tcg_gen_movi_i32(cpu_delayed_pc
, delayed_pc
);
274 tcg_gen_andi_i32(cpu_T
[0], cpu_sr
, SR_T
);
275 tcg_gen_brcondi_i32(TCG_COND_NE
, cpu_T
[0], t
? SR_T
: 0, label
);
276 tcg_gen_ori_i32(cpu_flags
, cpu_flags
, DELAY_SLOT_TRUE
);
277 gen_set_label(label
);
280 /* Immediate conditional jump (bt or bf) */
281 static void gen_conditional_jump(DisasContext
* ctx
,
282 target_ulong ift
, target_ulong ifnott
)
286 l1
= gen_new_label();
287 tcg_gen_andi_i32(cpu_T
[0], cpu_sr
, SR_T
);
288 tcg_gen_brcondi_i32(TCG_COND_EQ
, cpu_T
[0], SR_T
, l1
);
289 gen_goto_tb(ctx
, 0, ifnott
);
291 gen_goto_tb(ctx
, 1, ift
);
294 /* Delayed conditional jump (bt or bf) */
295 static void gen_delayed_conditional_jump(DisasContext
* ctx
)
299 l1
= gen_new_label();
300 tcg_gen_andi_i32(cpu_T
[0], cpu_flags
, DELAY_SLOT_TRUE
);
301 tcg_gen_brcondi_i32(TCG_COND_EQ
, cpu_T
[0], DELAY_SLOT_TRUE
, l1
);
302 gen_goto_tb(ctx
, 1, ctx
->pc
+ 2);
304 tcg_gen_andi_i32(cpu_flags
, cpu_flags
, ~DELAY_SLOT_TRUE
);
308 static inline void gen_set_t(void)
310 tcg_gen_ori_i32(cpu_sr
, cpu_sr
, SR_T
);
313 static inline void gen_clr_t(void)
315 tcg_gen_andi_i32(cpu_sr
, cpu_sr
, ~SR_T
);
318 static inline void gen_cmp(int cond
, TCGv t0
, TCGv t1
)
320 int label1
= gen_new_label();
321 int label2
= gen_new_label();
322 tcg_gen_brcond_i32(cond
, t1
, t0
, label1
);
325 gen_set_label(label1
);
327 gen_set_label(label2
);
330 static inline void gen_cmp_imm(int cond
, TCGv t0
, int32_t imm
)
332 int label1
= gen_new_label();
333 int label2
= gen_new_label();
334 tcg_gen_brcondi_i32(cond
, t0
, imm
, label1
);
337 gen_set_label(label1
);
339 gen_set_label(label2
);
342 static inline void gen_store_flags(uint32_t flags
)
344 tcg_gen_andi_i32(cpu_flags
, cpu_flags
, DELAY_SLOT_TRUE
);
345 tcg_gen_ori_i32(cpu_flags
, cpu_flags
, flags
);
348 #define B3_0 (ctx->opcode & 0xf)
349 #define B6_4 ((ctx->opcode >> 4) & 0x7)
350 #define B7_4 ((ctx->opcode >> 4) & 0xf)
351 #define B7_0 (ctx->opcode & 0xff)
352 #define B7_0s ((int32_t) (int8_t) (ctx->opcode & 0xff))
353 #define B11_0s (ctx->opcode & 0x800 ? 0xfffff000 | (ctx->opcode & 0xfff) : \
354 (ctx->opcode & 0xfff))
355 #define B11_8 ((ctx->opcode >> 8) & 0xf)
356 #define B15_12 ((ctx->opcode >> 12) & 0xf)
358 #define REG(x) ((x) < 8 && (ctx->sr & (SR_MD | SR_RB)) == (SR_MD | SR_RB) ? \
361 #define ALTREG(x) ((x) < 8 && (ctx->sr & (SR_MD | SR_RB)) != (SR_MD | SR_RB) \
364 #define FREG(x) (ctx->fpscr & FPSCR_FR ? (x) ^ 0x10 : (x))
365 #define XHACK(x) ((((x) & 1 ) << 4) | ((x) & 0xe))
366 #define XREG(x) (ctx->fpscr & FPSCR_FR ? XHACK(x) ^ 0x10 : XHACK(x))
367 #define DREG(x) FREG(x) /* Assumes lsb of (x) is always 0 */
369 #define CHECK_NOT_DELAY_SLOT \
370 if (ctx->flags & (DELAY_SLOT | DELAY_SLOT_CONDITIONAL)) \
371 {gen_op_raise_slot_illegal_instruction (); ctx->bstate = BS_EXCP; \
374 void _decode_opc(DisasContext
* ctx
)
377 fprintf(stderr
, "Translating opcode 0x%04x\n", ctx
->opcode
);
379 switch (ctx
->opcode
) {
380 case 0x0019: /* div0u */
381 tcg_gen_andi_i32(cpu_sr
, cpu_sr
, ~(SR_M
| SR_Q
| SR_T
));
383 case 0x000b: /* rts */
385 tcg_gen_mov_i32(cpu_delayed_pc
, cpu_pr
);
386 ctx
->flags
|= DELAY_SLOT
;
387 ctx
->delayed_pc
= (uint32_t) - 1;
389 case 0x0028: /* clrmac */
390 tcg_gen_movi_i32(cpu_mach
, 0);
391 tcg_gen_movi_i32(cpu_macl
, 0);
393 case 0x0048: /* clrs */
394 tcg_gen_andi_i32(cpu_sr
, cpu_sr
, ~SR_S
);
396 case 0x0008: /* clrt */
399 case 0x0038: /* ldtlb */
400 #if defined(CONFIG_USER_ONLY)
401 assert(0); /* XXXXX */
406 case 0x002b: /* rte */
408 tcg_gen_mov_i32(cpu_sr
, cpu_ssr
);
409 tcg_gen_mov_i32(cpu_delayed_pc
, cpu_spc
);
410 ctx
->flags
|= DELAY_SLOT
;
411 ctx
->delayed_pc
= (uint32_t) - 1;
413 case 0x0058: /* sets */
414 tcg_gen_ori_i32(cpu_sr
, cpu_sr
, SR_S
);
416 case 0x0018: /* sett */
419 case 0xfbfd: /* frchg */
421 ctx
->bstate
= BS_STOP
;
423 case 0xf3fd: /* fschg */
425 ctx
->bstate
= BS_STOP
;
427 case 0x0009: /* nop */
429 case 0x001b: /* sleep */
433 gen_op_raise_illegal_instruction();
434 ctx
->bstate
= BS_EXCP
;
439 switch (ctx
->opcode
& 0xf000) {
440 case 0x1000: /* mov.l Rm,@(disp,Rn) */
441 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
442 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
443 tcg_gen_addi_i32(cpu_T
[1], cpu_T
[1], B3_0
* 4);
444 gen_op_stl_T0_T1(ctx
);
446 case 0x5000: /* mov.l @(disp,Rm),Rn */
447 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
448 tcg_gen_addi_i32(cpu_T
[0], cpu_T
[0], B3_0
* 4);
449 gen_op_ldl_T0_T0(ctx
);
450 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[0]);
452 case 0xe000: /* mov #imm,Rn */
453 tcg_gen_movi_i32(cpu_gregs
[REG(B11_8
)], B7_0s
);
455 case 0x9000: /* mov.w @(disp,PC),Rn */
456 tcg_gen_movi_i32(cpu_T
[0], ctx
->pc
+ 4 + B7_0
* 2);
457 gen_op_ldw_T0_T0(ctx
);
458 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[0]);
460 case 0xd000: /* mov.l @(disp,PC),Rn */
461 tcg_gen_movi_i32(cpu_T
[0], (ctx
->pc
+ 4 + B7_0
* 4) & ~3);
462 gen_op_ldl_T0_T0(ctx
);
463 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[0]);
465 case 0x7000: /* add #imm,Rn */
466 tcg_gen_addi_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], B7_0s
);
468 case 0xa000: /* bra disp */
470 ctx
->delayed_pc
= ctx
->pc
+ 4 + B11_0s
* 2;
471 tcg_gen_movi_i32(cpu_delayed_pc
, ctx
->delayed_pc
);
472 ctx
->flags
|= DELAY_SLOT
;
474 case 0xb000: /* bsr disp */
476 tcg_gen_movi_i32(cpu_pr
, ctx
->pc
+ 4);
477 ctx
->delayed_pc
= ctx
->pc
+ 4 + B11_0s
* 2;
478 tcg_gen_movi_i32(cpu_delayed_pc
, ctx
->delayed_pc
);
479 ctx
->flags
|= DELAY_SLOT
;
483 switch (ctx
->opcode
& 0xf00f) {
484 case 0x6003: /* mov Rm,Rn */
485 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
486 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[0]);
488 case 0x2000: /* mov.b Rm,@Rn */
489 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
490 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
491 gen_op_stb_T0_T1(ctx
);
493 case 0x2001: /* mov.w Rm,@Rn */
494 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
495 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
496 gen_op_stw_T0_T1(ctx
);
498 case 0x2002: /* mov.l Rm,@Rn */
499 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
500 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
501 gen_op_stl_T0_T1(ctx
);
503 case 0x6000: /* mov.b @Rm,Rn */
504 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
505 gen_op_ldb_T0_T0(ctx
);
506 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[0]);
508 case 0x6001: /* mov.w @Rm,Rn */
509 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
510 gen_op_ldw_T0_T0(ctx
);
511 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[0]);
513 case 0x6002: /* mov.l @Rm,Rn */
514 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
515 gen_op_ldl_T0_T0(ctx
);
516 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[0]);
518 case 0x2004: /* mov.b Rm,@-Rn */
519 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
520 tcg_gen_subi_i32(cpu_gregs
[REG(B11_8
)],
521 cpu_gregs
[REG(B11_8
)], 1); /* modify register status */
522 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
523 tcg_gen_addi_i32(cpu_gregs
[REG(B11_8
)],
524 cpu_gregs
[REG(B11_8
)], 1); /* recover register status */
525 gen_op_stb_T0_T1(ctx
); /* might cause re-execution */
526 tcg_gen_subi_i32(cpu_gregs
[REG(B11_8
)],
527 cpu_gregs
[REG(B11_8
)], 1); /* modify register status */
529 case 0x2005: /* mov.w Rm,@-Rn */
530 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
531 tcg_gen_subi_i32(cpu_gregs
[REG(B11_8
)],
532 cpu_gregs
[REG(B11_8
)], 2);
533 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
534 tcg_gen_addi_i32(cpu_gregs
[REG(B11_8
)],
535 cpu_gregs
[REG(B11_8
)], 2);
536 gen_op_stw_T0_T1(ctx
);
537 tcg_gen_subi_i32(cpu_gregs
[REG(B11_8
)],
538 cpu_gregs
[REG(B11_8
)], 2);
540 case 0x2006: /* mov.l Rm,@-Rn */
541 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
542 tcg_gen_subi_i32(cpu_gregs
[REG(B11_8
)],
543 cpu_gregs
[REG(B11_8
)], 4);
544 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
545 tcg_gen_addi_i32(cpu_gregs
[REG(B11_8
)],
546 cpu_gregs
[REG(B11_8
)], 4);
547 gen_op_stl_T0_T1(ctx
);
548 tcg_gen_subi_i32(cpu_gregs
[REG(B11_8
)],
549 cpu_gregs
[REG(B11_8
)], 4);
551 case 0x6004: /* mov.b @Rm+,Rn */
552 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
553 gen_op_ldb_T0_T0(ctx
);
554 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[0]);
556 tcg_gen_addi_i32(cpu_gregs
[REG(B7_4
)],
557 cpu_gregs
[REG(B7_4
)], 1);
559 case 0x6005: /* mov.w @Rm+,Rn */
560 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
561 gen_op_ldw_T0_T0(ctx
);
562 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[0]);
564 tcg_gen_addi_i32(cpu_gregs
[REG(B7_4
)],
565 cpu_gregs
[REG(B7_4
)], 2);
567 case 0x6006: /* mov.l @Rm+,Rn */
568 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
569 gen_op_ldl_T0_T0(ctx
);
570 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[0]);
572 tcg_gen_addi_i32(cpu_gregs
[REG(B7_4
)],
573 cpu_gregs
[REG(B7_4
)], 4);
575 case 0x0004: /* mov.b Rm,@(R0,Rn) */
576 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
577 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
578 tcg_gen_add_i32(cpu_T
[1], cpu_T
[1], cpu_gregs
[REG(0)]);
579 gen_op_stb_T0_T1(ctx
);
581 case 0x0005: /* mov.w Rm,@(R0,Rn) */
582 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
583 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
584 tcg_gen_add_i32(cpu_T
[1], cpu_T
[1], cpu_gregs
[REG(0)]);
585 gen_op_stw_T0_T1(ctx
);
587 case 0x0006: /* mov.l Rm,@(R0,Rn) */
588 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
589 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
590 tcg_gen_add_i32(cpu_T
[1], cpu_T
[1], cpu_gregs
[REG(0)]);
591 gen_op_stl_T0_T1(ctx
);
593 case 0x000c: /* mov.b @(R0,Rm),Rn */
594 tcg_gen_add_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)], cpu_gregs
[REG(0)]);
595 gen_op_ldb_T0_T0(ctx
);
596 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[0]);
598 case 0x000d: /* mov.w @(R0,Rm),Rn */
599 tcg_gen_add_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)], cpu_gregs
[REG(0)]);
600 gen_op_ldw_T0_T0(ctx
);
601 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[0]);
603 case 0x000e: /* mov.l @(R0,Rm),Rn */
604 tcg_gen_add_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)], cpu_gregs
[REG(0)]);
605 gen_op_ldl_T0_T0(ctx
);
606 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[0]);
608 case 0x6008: /* swap.b Rm,Rn */
609 tcg_gen_andi_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B7_4
)], 0xffff0000);
610 tcg_gen_andi_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)], 0xff);
611 tcg_gen_shli_i32(cpu_T
[0], cpu_T
[0], 8);
612 tcg_gen_or_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], cpu_T
[0]);
613 tcg_gen_shri_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)], 8);
614 tcg_gen_andi_i32(cpu_T
[0], cpu_T
[0], 0xff);
615 tcg_gen_or_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], cpu_T
[0]);
617 case 0x6009: /* swap.w Rm,Rn */
618 tcg_gen_andi_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)], 0xffff);
619 tcg_gen_shli_i32(cpu_T
[0], cpu_T
[0], 16);
620 tcg_gen_shri_i32(cpu_T
[1], cpu_gregs
[REG(B7_4
)], 16);
621 tcg_gen_andi_i32(cpu_T
[1], cpu_T
[1], 0xffff);
622 tcg_gen_or_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[0], cpu_T
[1]);
624 case 0x200d: /* xtrct Rm,Rn */
625 tcg_gen_andi_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)], 0xffff);
626 tcg_gen_shli_i32(cpu_T
[0], cpu_T
[0], 16);
627 tcg_gen_shri_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)], 16);
628 tcg_gen_andi_i32(cpu_T
[1], cpu_T
[1], 0xffff);
629 tcg_gen_or_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[0], cpu_T
[1]);
631 case 0x300c: /* add Rm,Rn */
632 tcg_gen_add_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B7_4
)]);
634 case 0x300e: /* addc Rm,Rn */
635 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
636 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
638 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[1]);
640 case 0x300f: /* addv Rm,Rn */
641 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
642 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
644 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[1]);
646 case 0x2009: /* and Rm,Rn */
647 tcg_gen_and_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B7_4
)]);
649 case 0x3000: /* cmp/eq Rm,Rn */
650 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
651 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
652 gen_cmp(TCG_COND_EQ
, cpu_T
[0], cpu_T
[1]);
654 case 0x3003: /* cmp/ge Rm,Rn */
655 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
656 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
657 gen_cmp(TCG_COND_GE
, cpu_T
[0], cpu_T
[1]);
659 case 0x3007: /* cmp/gt Rm,Rn */
660 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
661 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
662 gen_cmp(TCG_COND_GT
, cpu_T
[0], cpu_T
[1]);
664 case 0x3006: /* cmp/hi Rm,Rn */
665 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
666 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
667 gen_cmp(TCG_COND_GTU
, cpu_T
[0], cpu_T
[1]);
669 case 0x3002: /* cmp/hs Rm,Rn */
670 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
671 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
672 gen_cmp(TCG_COND_GEU
, cpu_T
[0], cpu_T
[1]);
674 case 0x200c: /* cmp/str Rm,Rn */
675 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
676 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
677 gen_op_cmp_str_T0_T1();
679 case 0x2007: /* div0s Rm,Rn */
680 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
681 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
682 gen_op_div0s_T0_T1();
684 case 0x3004: /* div1 Rm,Rn */
685 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
686 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
688 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[1]);
690 case 0x300d: /* dmuls.l Rm,Rn */
691 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
692 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
693 gen_op_dmulsl_T0_T1();
695 case 0x3005: /* dmulu.l Rm,Rn */
696 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
697 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
698 gen_op_dmulul_T0_T1();
700 case 0x600e: /* exts.b Rm,Rn */
701 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
702 tcg_gen_andi_i32(cpu_T
[0], cpu_T
[0], 0xff);
703 tcg_gen_ext8s_i32(cpu_T
[0], cpu_T
[0]);
704 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[0]);
706 case 0x600f: /* exts.w Rm,Rn */
707 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
708 tcg_gen_andi_i32(cpu_T
[0], cpu_T
[0], 0xffff);
709 tcg_gen_ext16s_i32(cpu_T
[0], cpu_T
[0]);
710 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[0]);
712 case 0x600c: /* extu.b Rm,Rn */
713 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
714 tcg_gen_andi_i32(cpu_T
[0], cpu_T
[0], 0xff);
715 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[0]);
717 case 0x600d: /* extu.w Rm,Rn */
718 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
719 tcg_gen_andi_i32(cpu_T
[0], cpu_T
[0], 0xffff);
720 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[0]);
722 case 0x000f: /* mac.l @Rm+,@Rn+ */
723 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B11_8
)]);
724 gen_op_ldl_T0_T0(ctx
);
725 tcg_gen_mov_i32(cpu_T
[1], cpu_T
[0]);
726 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
727 gen_op_ldl_T0_T0(ctx
);
729 tcg_gen_addi_i32(cpu_gregs
[REG(B7_4
)], cpu_gregs
[REG(B7_4
)], 4);
730 tcg_gen_addi_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], 4);
732 case 0x400f: /* mac.w @Rm+,@Rn+ */
733 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B11_8
)]);
734 gen_op_ldl_T0_T0(ctx
);
735 tcg_gen_mov_i32(cpu_T
[1], cpu_T
[0]);
736 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
737 gen_op_ldl_T0_T0(ctx
);
739 tcg_gen_addi_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], 2);
740 tcg_gen_addi_i32(cpu_gregs
[REG(B7_4
)], cpu_gregs
[REG(B7_4
)], 2);
742 case 0x0007: /* mul.l Rm,Rn */
743 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
744 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
747 case 0x200f: /* muls.w Rm,Rn */
748 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
749 tcg_gen_andi_i32(cpu_T
[0], cpu_T
[0], 0xffff);
750 tcg_gen_ext16s_i32(cpu_T
[0], cpu_T
[0]);
751 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
752 tcg_gen_andi_i32(cpu_T
[1], cpu_T
[1], 0xffff);
753 tcg_gen_ext16s_i32(cpu_T
[1], cpu_T
[1]);
754 gen_op_mulsw_T0_T1();
756 case 0x200e: /* mulu.w Rm,Rn */
757 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
758 tcg_gen_andi_i32(cpu_T
[0], cpu_T
[0], 0xffff);
759 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
760 tcg_gen_andi_i32(cpu_T
[1], cpu_T
[1], 0xffff);
761 gen_op_muluw_T0_T1();
763 case 0x600b: /* neg Rm,Rn */
764 tcg_gen_neg_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B7_4
)]);
766 case 0x600a: /* negc Rm,Rn */
767 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
769 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[0]);
771 case 0x6007: /* not Rm,Rn */
772 tcg_gen_not_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B7_4
)]);
774 case 0x200b: /* or Rm,Rn */
775 tcg_gen_or_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B7_4
)]);
777 case 0x400c: /* shad Rm,Rn */
778 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
779 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
781 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[1]);
783 case 0x400d: /* shld Rm,Rn */
784 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
785 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
787 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[1]);
789 case 0x3008: /* sub Rm,Rn */
790 tcg_gen_sub_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B7_4
)]);
792 case 0x300a: /* subc Rm,Rn */
793 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
794 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
796 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[1]);
798 case 0x300b: /* subv Rm,Rn */
799 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
800 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
802 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[1]);
804 case 0x2008: /* tst Rm,Rn */
805 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
806 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
807 tcg_gen_and_i32(cpu_T
[0], cpu_T
[0], cpu_T
[1]);
808 gen_cmp_imm(TCG_COND_EQ
, cpu_T
[0], 0);
810 case 0x200a: /* xor Rm,Rn */
811 tcg_gen_xor_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B7_4
)]);
813 case 0xf00c: /* fmov {F,D,X}Rm,{F,D,X}Rn - FPSCR: Nothing */
814 if (ctx
->fpscr
& FPSCR_SZ
) {
815 gen_op_fmov_drN_DT0(XREG(B7_4
));
816 gen_op_fmov_DT0_drN(XREG(B11_8
));
818 gen_op_fmov_frN_FT0(FREG(B7_4
));
819 gen_op_fmov_FT0_frN(FREG(B11_8
));
822 case 0xf00a: /* fmov {F,D,X}Rm,@Rn - FPSCR: Nothing */
823 if (ctx
->fpscr
& FPSCR_SZ
) {
824 gen_op_fmov_drN_DT0(XREG(B7_4
));
825 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
826 gen_op_stfq_DT0_T1(ctx
);
828 gen_op_fmov_frN_FT0(FREG(B7_4
));
829 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
830 gen_op_stfl_FT0_T1(ctx
);
833 case 0xf008: /* fmov @Rm,{F,D,X}Rn - FPSCR: Nothing */
834 if (ctx
->fpscr
& FPSCR_SZ
) {
835 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
836 gen_op_ldfq_T0_DT0(ctx
);
837 gen_op_fmov_DT0_drN(XREG(B11_8
));
839 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
840 gen_op_ldfl_T0_FT0(ctx
);
841 gen_op_fmov_FT0_frN(FREG(B11_8
));
844 case 0xf009: /* fmov @Rm+,{F,D,X}Rn - FPSCR: Nothing */
845 if (ctx
->fpscr
& FPSCR_SZ
) {
846 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
847 gen_op_ldfq_T0_DT0(ctx
);
848 gen_op_fmov_DT0_drN(XREG(B11_8
));
849 tcg_gen_addi_i32(cpu_gregs
[REG(B7_4
)],
850 cpu_gregs
[REG(B7_4
)], 8);
852 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
853 gen_op_ldfl_T0_FT0(ctx
);
854 gen_op_fmov_FT0_frN(FREG(B11_8
));
855 tcg_gen_addi_i32(cpu_gregs
[REG(B7_4
)],
856 cpu_gregs
[REG(B7_4
)], 4);
859 case 0xf00b: /* fmov {F,D,X}Rm,@-Rn - FPSCR: Nothing */
860 if (ctx
->fpscr
& FPSCR_SZ
) {
861 tcg_gen_subi_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], 8);
862 gen_op_fmov_drN_DT0(XREG(B7_4
));
863 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
864 tcg_gen_addi_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], 8);
865 gen_op_stfq_DT0_T1(ctx
);
866 tcg_gen_subi_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], 8);
868 tcg_gen_subi_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], 4);
869 gen_op_fmov_frN_FT0(FREG(B7_4
));
870 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
871 tcg_gen_addi_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], 4);
872 gen_op_stfl_FT0_T1(ctx
);
873 tcg_gen_subi_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], 4);
876 case 0xf006: /* fmov @(R0,Rm),{F,D,X}Rm - FPSCR: Nothing */
877 tcg_gen_add_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)], cpu_gregs
[REG(0)]);
878 if (ctx
->fpscr
& FPSCR_SZ
) {
879 gen_op_ldfq_T0_DT0(ctx
);
880 gen_op_fmov_DT0_drN(XREG(B11_8
));
882 gen_op_ldfl_T0_FT0(ctx
);
883 gen_op_fmov_FT0_frN(FREG(B11_8
));
886 case 0xf007: /* fmov {F,D,X}Rn,@(R0,Rn) - FPSCR: Nothing */
887 if (ctx
->fpscr
& FPSCR_SZ
) {
888 gen_op_fmov_drN_DT0(XREG(B7_4
));
889 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
890 tcg_gen_add_i32(cpu_T
[1], cpu_T
[1], cpu_gregs
[REG(0)]);
891 gen_op_stfq_DT0_T1(ctx
);
893 gen_op_fmov_frN_FT0(FREG(B7_4
));
894 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
895 tcg_gen_add_i32(cpu_T
[1], cpu_T
[1], cpu_gregs
[REG(0)]);
896 gen_op_stfl_FT0_T1(ctx
);
899 case 0xf000: /* fadd Rm,Rn - FPSCR: R[PR,Enable.O/U/I]/W[Cause,Flag] */
900 case 0xf001: /* fsub Rm,Rn - FPSCR: R[PR,Enable.O/U/I]/W[Cause,Flag] */
901 case 0xf002: /* fmul Rm,Rn - FPSCR: R[PR,Enable.O/U/I]/W[Cause,Flag] */
902 case 0xf003: /* fdiv Rm,Rn - FPSCR: R[PR,Enable.O/U/I]/W[Cause,Flag] */
903 case 0xf004: /* fcmp/eq Rm,Rn - FPSCR: R[PR,Enable.V]/W[Cause,Flag] */
904 case 0xf005: /* fcmp/gt Rm,Rn - FPSCR: R[PR,Enable.V]/W[Cause,Flag] */
905 if (ctx
->fpscr
& FPSCR_PR
) {
906 if (ctx
->opcode
& 0x0110)
907 break; /* illegal instruction */
908 gen_op_fmov_drN_DT1(DREG(B7_4
));
909 gen_op_fmov_drN_DT0(DREG(B11_8
));
912 gen_op_fmov_frN_FT1(FREG(B7_4
));
913 gen_op_fmov_frN_FT0(FREG(B11_8
));
916 switch (ctx
->opcode
& 0xf00f) {
917 case 0xf000: /* fadd Rm,Rn */
918 ctx
->fpscr
& FPSCR_PR
? gen_op_fadd_DT() : gen_op_fadd_FT();
920 case 0xf001: /* fsub Rm,Rn */
921 ctx
->fpscr
& FPSCR_PR
? gen_op_fsub_DT() : gen_op_fsub_FT();
923 case 0xf002: /* fmul Rm,Rn */
924 ctx
->fpscr
& FPSCR_PR
? gen_op_fmul_DT() : gen_op_fmul_FT();
926 case 0xf003: /* fdiv Rm,Rn */
927 ctx
->fpscr
& FPSCR_PR
? gen_op_fdiv_DT() : gen_op_fdiv_FT();
929 case 0xf004: /* fcmp/eq Rm,Rn */
930 ctx
->fpscr
& FPSCR_PR
? gen_op_fcmp_eq_DT() : gen_op_fcmp_eq_FT();
932 case 0xf005: /* fcmp/gt Rm,Rn */
933 ctx
->fpscr
& FPSCR_PR
? gen_op_fcmp_gt_DT() : gen_op_fcmp_gt_FT();
937 if (ctx
->fpscr
& FPSCR_PR
) {
938 gen_op_fmov_DT0_drN(DREG(B11_8
));
941 gen_op_fmov_FT0_frN(FREG(B11_8
));
946 switch (ctx
->opcode
& 0xff00) {
947 case 0xc900: /* and #imm,R0 */
948 tcg_gen_andi_i32(cpu_gregs
[REG(0)], cpu_gregs
[REG(0)], B7_0
);
950 case 0xcd00: /* and.b #imm,@(R0,GBR) */
951 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(0)]);
952 tcg_gen_add_i32(cpu_T
[0], cpu_T
[0], cpu_gbr
);
953 tcg_gen_mov_i32(cpu_T
[1], cpu_T
[0]);
954 gen_op_ldub_T0_T0(ctx
);
955 tcg_gen_andi_i32(cpu_T
[0], cpu_T
[0], B7_0
);
956 gen_op_stb_T0_T1(ctx
);
958 case 0x8b00: /* bf label */
960 gen_conditional_jump(ctx
, ctx
->pc
+ 2,
961 ctx
->pc
+ 4 + B7_0s
* 2);
962 ctx
->bstate
= BS_BRANCH
;
964 case 0x8f00: /* bf/s label */
966 gen_branch_slot(ctx
->delayed_pc
= ctx
->pc
+ 4 + B7_0s
* 2, 0);
967 ctx
->flags
|= DELAY_SLOT_CONDITIONAL
;
969 case 0x8900: /* bt label */
971 gen_conditional_jump(ctx
, ctx
->pc
+ 4 + B7_0s
* 2,
973 ctx
->bstate
= BS_BRANCH
;
975 case 0x8d00: /* bt/s label */
977 gen_branch_slot(ctx
->delayed_pc
= ctx
->pc
+ 4 + B7_0s
* 2, 1);
978 ctx
->flags
|= DELAY_SLOT_CONDITIONAL
;
980 case 0x8800: /* cmp/eq #imm,R0 */
981 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(0)]);
982 gen_cmp_imm(TCG_COND_EQ
, cpu_T
[0], B7_0s
);
984 case 0xc400: /* mov.b @(disp,GBR),R0 */
986 tcg_gen_addi_i32(cpu_T
[0], cpu_T
[0], B7_0
);
987 gen_op_ldb_T0_T0(ctx
);
988 tcg_gen_mov_i32(cpu_gregs
[REG(0)], cpu_T
[0]);
990 case 0xc500: /* mov.w @(disp,GBR),R0 */
992 tcg_gen_addi_i32(cpu_T
[0], cpu_T
[0], B7_0
* 2);
993 gen_op_ldw_T0_T0(ctx
);
994 tcg_gen_mov_i32(cpu_gregs
[REG(0)], cpu_T
[0]);
996 case 0xc600: /* mov.l @(disp,GBR),R0 */
998 tcg_gen_addi_i32(cpu_T
[0], cpu_T
[0], B7_0
* 4);
999 gen_op_ldl_T0_T0(ctx
);
1000 tcg_gen_mov_i32(cpu_gregs
[REG(0)], cpu_T
[0]);
1002 case 0xc000: /* mov.b R0,@(disp,GBR) */
1003 gen_op_stc_gbr_T0();
1004 tcg_gen_addi_i32(cpu_T
[0], cpu_T
[0], B7_0
);
1005 tcg_gen_mov_i32(cpu_T
[1], cpu_T
[0]);
1006 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(0)]);
1007 gen_op_stb_T0_T1(ctx
);
1009 case 0xc100: /* mov.w R0,@(disp,GBR) */
1010 gen_op_stc_gbr_T0();
1011 tcg_gen_addi_i32(cpu_T
[0], cpu_T
[0], B7_0
* 2);
1012 tcg_gen_mov_i32(cpu_T
[1], cpu_T
[0]);
1013 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(0)]);
1014 gen_op_stw_T0_T1(ctx
);
1016 case 0xc200: /* mov.l R0,@(disp,GBR) */
1017 gen_op_stc_gbr_T0();
1018 tcg_gen_addi_i32(cpu_T
[0], cpu_T
[0], B7_0
* 4);
1019 tcg_gen_mov_i32(cpu_T
[1], cpu_T
[0]);
1020 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(0)]);
1021 gen_op_stl_T0_T1(ctx
);
1023 case 0x8000: /* mov.b R0,@(disp,Rn) */
1024 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(0)]);
1025 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B7_4
)]);
1026 tcg_gen_addi_i32(cpu_T
[1], cpu_T
[1], B3_0
);
1027 gen_op_stb_T0_T1(ctx
);
1029 case 0x8100: /* mov.w R0,@(disp,Rn) */
1030 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(0)]);
1031 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B7_4
)]);
1032 tcg_gen_addi_i32(cpu_T
[1], cpu_T
[1], B3_0
* 2);
1033 gen_op_stw_T0_T1(ctx
);
1035 case 0x8400: /* mov.b @(disp,Rn),R0 */
1036 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
1037 tcg_gen_addi_i32(cpu_T
[0], cpu_T
[0], B3_0
);
1038 gen_op_ldb_T0_T0(ctx
);
1039 tcg_gen_mov_i32(cpu_gregs
[REG(0)], cpu_T
[0]);
1041 case 0x8500: /* mov.w @(disp,Rn),R0 */
1042 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B7_4
)]);
1043 tcg_gen_addi_i32(cpu_T
[0], cpu_T
[0], B3_0
* 2);
1044 gen_op_ldw_T0_T0(ctx
);
1045 tcg_gen_mov_i32(cpu_gregs
[REG(0)], cpu_T
[0]);
1047 case 0xc700: /* mova @(disp,PC),R0 */
1048 tcg_gen_movi_i32(cpu_gregs
[REG(0)],
1049 ((ctx
->pc
& 0xfffffffc) + 4 + B7_0
* 4) & ~3);
1051 case 0xcb00: /* or #imm,R0 */
1052 tcg_gen_ori_i32(cpu_gregs
[REG(0)], cpu_gregs
[REG(0)], B7_0
);
1054 case 0xcf00: /* or.b #imm,@(R0,GBR) */
1055 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(0)]);
1056 tcg_gen_add_i32(cpu_T
[0], cpu_T
[0], cpu_gbr
);
1057 tcg_gen_mov_i32(cpu_T
[0], cpu_T
[1]);
1058 gen_op_ldub_T0_T0(ctx
);
1059 tcg_gen_ori_i32(cpu_T
[0], cpu_T
[0], B7_0
);
1060 gen_op_stb_T0_T1(ctx
);
1062 case 0xc300: /* trapa #imm */
1063 CHECK_NOT_DELAY_SLOT
tcg_gen_movi_i32(cpu_pc
, ctx
->pc
);
1065 ctx
->bstate
= BS_BRANCH
;
1067 case 0xc800: /* tst #imm,R0 */
1068 tcg_gen_andi_i32(cpu_T
[0], cpu_gregs
[REG(0)], B7_0
);
1069 gen_cmp_imm(TCG_COND_EQ
, cpu_T
[0], 0);
1071 case 0xcc00: /* tst.b #imm,@(R0,GBR) */
1072 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(0)]);
1073 tcg_gen_add_i32(cpu_T
[0], cpu_T
[0], cpu_gbr
);
1074 gen_op_ldub_T0_T0(ctx
);
1075 tcg_gen_andi_i32(cpu_T
[0], cpu_T
[0], B7_0
);
1076 gen_cmp_imm(TCG_COND_EQ
, cpu_T
[0], 0);
1078 case 0xca00: /* xor #imm,R0 */
1079 tcg_gen_xori_i32(cpu_gregs
[REG(0)], cpu_gregs
[REG(0)], B7_0
);
1081 case 0xce00: /* xor.b #imm,@(R0,GBR) */
1082 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(0)]);
1083 tcg_gen_add_i32(cpu_T
[0], cpu_T
[0], cpu_gbr
);
1084 tcg_gen_mov_i32(cpu_T
[1], cpu_T
[0]);
1085 gen_op_ldub_T0_T0(ctx
);
1086 tcg_gen_xori_i32(cpu_T
[0], cpu_T
[0], B7_0
);
1087 gen_op_stb_T0_T1(ctx
);
1091 switch (ctx
->opcode
& 0xf08f) {
1092 case 0x408e: /* ldc Rm,Rn_BANK */
1093 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B11_8
)]);
1094 tcg_gen_mov_i32(cpu_gregs
[ALTREG(B6_4
)], cpu_T
[0]);
1096 case 0x4087: /* ldc.l @Rm+,Rn_BANK */
1097 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B11_8
)]);
1098 gen_op_ldl_T0_T0(ctx
);
1099 tcg_gen_mov_i32(cpu_gregs
[ALTREG(B6_4
)], cpu_T
[0]);
1100 tcg_gen_addi_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], 4);
1102 case 0x0082: /* stc Rm_BANK,Rn */
1103 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[ALTREG(B6_4
)]);
1104 tcg_gen_mov_i32(cpu_gregs
[REG(B11_8
)], cpu_T
[0]);
1106 case 0x4083: /* stc.l Rm_BANK,@-Rn */
1107 tcg_gen_subi_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], 4);
1108 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
1109 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[ALTREG(B6_4
)]);
1110 tcg_gen_addi_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], 4);
1111 gen_op_stl_T0_T1(ctx
);
1112 tcg_gen_subi_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], 4);
1116 switch (ctx
->opcode
& 0xf0ff) {
1117 case 0x0023: /* braf Rn */
1118 CHECK_NOT_DELAY_SLOT
tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B11_8
)]);
1119 tcg_gen_addi_i32(cpu_delayed_pc
, cpu_T
[0], ctx
->pc
+ 4);
1120 ctx
->flags
|= DELAY_SLOT
;
1121 ctx
->delayed_pc
= (uint32_t) - 1;
1123 case 0x0003: /* bsrf Rn */
1124 CHECK_NOT_DELAY_SLOT
tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B11_8
)]);
1125 tcg_gen_movi_i32(cpu_pr
, ctx
->pc
+ 4);
1126 tcg_gen_add_i32(cpu_delayed_pc
, cpu_T
[0], cpu_pr
);
1127 ctx
->flags
|= DELAY_SLOT
;
1128 ctx
->delayed_pc
= (uint32_t) - 1;
1130 case 0x4015: /* cmp/pl Rn */
1131 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B11_8
)]);
1132 gen_cmp_imm(TCG_COND_GT
, cpu_T
[0], 0);
1134 case 0x4011: /* cmp/pz Rn */
1135 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B11_8
)]);
1136 gen_cmp_imm(TCG_COND_GE
, cpu_T
[0], 0);
1138 case 0x4010: /* dt Rn */
1139 tcg_gen_subi_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], 1);
1140 gen_cmp_imm(TCG_COND_EQ
, cpu_gregs
[REG(B11_8
)], 0);
1142 case 0x402b: /* jmp @Rn */
1143 CHECK_NOT_DELAY_SLOT
tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B11_8
)]);
1144 tcg_gen_mov_i32(cpu_delayed_pc
, cpu_T
[0]);
1145 ctx
->flags
|= DELAY_SLOT
;
1146 ctx
->delayed_pc
= (uint32_t) - 1;
1148 case 0x400b: /* jsr @Rn */
1149 CHECK_NOT_DELAY_SLOT
tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B11_8
)]);
1150 tcg_gen_movi_i32(cpu_pr
, ctx
->pc
+ 4);
1151 tcg_gen_mov_i32(cpu_delayed_pc
, cpu_T
[0]);
1152 ctx
->flags
|= DELAY_SLOT
;
1153 ctx
->delayed_pc
= (uint32_t) - 1;
1155 #define LDST(reg,ldnum,ldpnum,ldop,stnum,stpnum,stop,extrald) \
1157 tcg_gen_mov_i32 (cpu_T[0], cpu_gregs[REG(B11_8)]); \
1158 gen_op_##ldop##_T0_##reg (); \
1162 tcg_gen_mov_i32 (cpu_T[0], cpu_gregs[REG(B11_8)]); \
1163 gen_op_ldl_T0_T0 (ctx); \
1164 tcg_gen_addi_i32(cpu_gregs[REG(B11_8)], \
1165 cpu_gregs[REG(B11_8)], 4); \
1166 gen_op_##ldop##_T0_##reg (); \
1170 gen_op_##stop##_##reg##_T0 (); \
1171 tcg_gen_mov_i32 (cpu_gregs[REG(B11_8)], cpu_T[0]); \
1174 gen_op_##stop##_##reg##_T0 (); \
1175 tcg_gen_subi_i32(cpu_gregs[REG(B11_8)], \
1176 cpu_gregs[REG(B11_8)], 4); \
1177 tcg_gen_mov_i32 (cpu_T[1], cpu_gregs[REG(B11_8)]); \
1178 tcg_gen_addi_i32(cpu_gregs[REG(B11_8)], \
1179 cpu_gregs[REG(B11_8)], 4); \
1180 gen_op_stl_T0_T1 (ctx); \
1181 tcg_gen_subi_i32(cpu_gregs[REG(B11_8)], \
1182 cpu_gregs[REG(B11_8)], 4); \
1184 LDST(sr
, 0x400e, 0x4007, ldc
, 0x0002, 0x4003, stc
, ctx
->bstate
=
1186 LDST(gbr
, 0x401e, 0x4017, ldc
, 0x0012, 0x4013, stc
,)
1187 LDST(vbr
, 0x402e, 0x4027, ldc
, 0x0022, 0x4023, stc
,)
1188 LDST(ssr
, 0x403e, 0x4037, ldc
, 0x0032, 0x4033, stc
,)
1189 LDST(spc
, 0x404e, 0x4047, ldc
, 0x0042, 0x4043, stc
,)
1190 LDST(dbr
, 0x40fa, 0x40f6, ldc
, 0x00fa, 0x40f2, stc
,)
1191 LDST(mach
, 0x400a, 0x4006, lds
, 0x000a, 0x4002, sts
,)
1192 LDST(macl
, 0x401a, 0x4016, lds
, 0x001a, 0x4012, sts
,)
1193 LDST(pr
, 0x402a, 0x4026, lds
, 0x002a, 0x4022, sts
,)
1194 LDST(fpul
, 0x405a, 0x4056, lds
, 0x005a, 0x4052, sts
,)
1195 LDST(fpscr
, 0x406a, 0x4066, lds
, 0x006a, 0x4062, sts
, ctx
->bstate
=
1197 case 0x00c3: /* movca.l R0,@Rm */
1198 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(0)]);
1199 tcg_gen_mov_i32(cpu_T
[1], cpu_gregs
[REG(B11_8
)]);
1200 gen_op_stl_T0_T1(ctx
);
1202 case 0x0029: /* movt Rn */
1203 tcg_gen_andi_i32(cpu_gregs
[REG(B11_8
)], cpu_sr
, SR_T
);
1205 case 0x0093: /* ocbi @Rn */
1206 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B11_8
)]);
1207 gen_op_ldl_T0_T0(ctx
);
1209 case 0x00a3: /* ocbp @Rn */
1210 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B11_8
)]);
1211 gen_op_ldl_T0_T0(ctx
);
1213 case 0x00b3: /* ocbwb @Rn */
1214 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B11_8
)]);
1215 gen_op_ldl_T0_T0(ctx
);
1217 case 0x0083: /* pref @Rn */
1219 case 0x4024: /* rotcl Rn */
1220 gen_op_rotcl_Rn(REG(B11_8
));
1222 case 0x4025: /* rotcr Rn */
1223 gen_op_rotcr_Rn(REG(B11_8
));
1225 case 0x4004: /* rotl Rn */
1226 gen_op_rotl_Rn(REG(B11_8
));
1228 case 0x4005: /* rotr Rn */
1229 gen_op_rotr_Rn(REG(B11_8
));
1231 case 0x4000: /* shll Rn */
1232 case 0x4020: /* shal Rn */
1233 gen_op_shal_Rn(REG(B11_8
));
1235 case 0x4021: /* shar Rn */
1236 gen_op_shar_Rn(REG(B11_8
));
1238 case 0x4001: /* shlr Rn */
1239 gen_op_shlr_Rn(REG(B11_8
));
1241 case 0x4008: /* shll2 Rn */
1242 tcg_gen_shli_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], 2);
1244 case 0x4018: /* shll8 Rn */
1245 tcg_gen_shli_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], 8);
1247 case 0x4028: /* shll16 Rn */
1248 tcg_gen_shli_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], 16);
1250 case 0x4009: /* shlr2 Rn */
1251 tcg_gen_shri_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], 2);
1253 case 0x4019: /* shlr8 Rn */
1254 tcg_gen_shri_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], 8);
1256 case 0x4029: /* shlr16 Rn */
1257 tcg_gen_shri_i32(cpu_gregs
[REG(B11_8
)], cpu_gregs
[REG(B11_8
)], 16);
1259 case 0x401b: /* tas.b @Rn */
1260 tcg_gen_mov_i32(cpu_T
[0], cpu_gregs
[REG(B11_8
)]);
1261 tcg_gen_mov_i32(cpu_T
[1], cpu_T
[0]);
1262 gen_op_ldub_T0_T0(ctx
);
1263 gen_cmp_imm(TCG_COND_EQ
, cpu_T
[0], 0);
1264 tcg_gen_ori_i32(cpu_T
[0], cpu_T
[0], 0x80);
1265 gen_op_stb_T0_T1(ctx
);
1267 case 0xf00d: /* fsts FPUL,FRn - FPSCR: Nothing */
1268 gen_op_movl_fpul_FT0();
1269 gen_op_fmov_FT0_frN(FREG(B11_8
));
1271 case 0xf01d: /* flds FRm,FPUL - FPSCR: Nothing */
1272 gen_op_fmov_frN_FT0(FREG(B11_8
));
1273 gen_op_movl_FT0_fpul();
1275 case 0xf02d: /* float FPUL,FRn/DRn - FPSCR: R[PR,Enable.I]/W[Cause,Flag] */
1276 if (ctx
->fpscr
& FPSCR_PR
) {
1277 if (ctx
->opcode
& 0x0100)
1278 break; /* illegal instruction */
1280 gen_op_fmov_DT0_drN(DREG(B11_8
));
1284 gen_op_fmov_FT0_frN(FREG(B11_8
));
1287 case 0xf03d: /* ftrc FRm/DRm,FPUL - FPSCR: R[PR,Enable.V]/W[Cause,Flag] */
1288 if (ctx
->fpscr
& FPSCR_PR
) {
1289 if (ctx
->opcode
& 0x0100)
1290 break; /* illegal instruction */
1291 gen_op_fmov_drN_DT0(DREG(B11_8
));
1295 gen_op_fmov_frN_FT0(FREG(B11_8
));
1299 case 0xf04d: /* fneg FRn/DRn - FPSCR: Nothing */
1300 gen_op_fneg_frN(FREG(B11_8
));
1302 case 0xf05d: /* fabs FRn/DRn */
1303 if (ctx
->fpscr
& FPSCR_PR
) {
1304 if (ctx
->opcode
& 0x0100)
1305 break; /* illegal instruction */
1306 gen_op_fmov_drN_DT0(DREG(B11_8
));
1308 gen_op_fmov_DT0_drN(DREG(B11_8
));
1310 gen_op_fmov_frN_FT0(FREG(B11_8
));
1312 gen_op_fmov_FT0_frN(FREG(B11_8
));
1315 case 0xf06d: /* fsqrt FRn */
1316 if (ctx
->fpscr
& FPSCR_PR
) {
1317 if (ctx
->opcode
& 0x0100)
1318 break; /* illegal instruction */
1319 gen_op_fmov_drN_DT0(FREG(B11_8
));
1321 gen_op_fmov_DT0_drN(FREG(B11_8
));
1323 gen_op_fmov_frN_FT0(FREG(B11_8
));
1325 gen_op_fmov_FT0_frN(FREG(B11_8
));
1328 case 0xf07d: /* fsrra FRn */
1330 case 0xf08d: /* fldi0 FRn - FPSCR: R[PR] */
1331 if (!(ctx
->fpscr
& FPSCR_PR
)) {
1332 tcg_gen_movi_i32(cpu_T
[0], 0);
1333 gen_op_fmov_T0_frN(FREG(B11_8
));
1337 case 0xf09d: /* fldi1 FRn - FPSCR: R[PR] */
1338 if (!(ctx
->fpscr
& FPSCR_PR
)) {
1339 tcg_gen_movi_i32(cpu_T
[0], 0x3f800000);
1340 gen_op_fmov_T0_frN(FREG(B11_8
));
1344 case 0xf0ad: /* fcnvsd FPUL,DRn */
1345 gen_op_movl_fpul_FT0();
1346 gen_op_fcnvsd_FT_DT();
1347 gen_op_fmov_DT0_drN(DREG(B11_8
));
1349 case 0xf0bd: /* fcnvds DRn,FPUL */
1350 gen_op_fmov_drN_DT0(DREG(B11_8
));
1351 gen_op_fcnvds_DT_FT();
1352 gen_op_movl_FT0_fpul();
1356 fprintf(stderr
, "unknown instruction 0x%04x at pc 0x%08x\n",
1357 ctx
->opcode
, ctx
->pc
);
1358 gen_op_raise_illegal_instruction();
1359 ctx
->bstate
= BS_EXCP
;
1362 void decode_opc(DisasContext
* ctx
)
1364 uint32_t old_flags
= ctx
->flags
;
1368 if (old_flags
& (DELAY_SLOT
| DELAY_SLOT_CONDITIONAL
)) {
1369 if (ctx
->flags
& DELAY_SLOT_CLEARME
) {
1372 /* go out of the delay slot */
1373 uint32_t new_flags
= ctx
->flags
;
1374 new_flags
&= ~(DELAY_SLOT
| DELAY_SLOT_CONDITIONAL
);
1375 gen_store_flags(new_flags
);
1378 ctx
->bstate
= BS_BRANCH
;
1379 if (old_flags
& DELAY_SLOT_CONDITIONAL
) {
1380 gen_delayed_conditional_jump(ctx
);
1381 } else if (old_flags
& DELAY_SLOT
) {
1387 /* go into a delay slot */
1388 if (ctx
->flags
& (DELAY_SLOT
| DELAY_SLOT_CONDITIONAL
))
1389 gen_store_flags(ctx
->flags
);
1393 gen_intermediate_code_internal(CPUState
* env
, TranslationBlock
* tb
,
1397 target_ulong pc_start
;
1398 static uint16_t *gen_opc_end
;
1404 gen_opc_end
= gen_opc_buf
+ OPC_MAX_SIZE
;
1406 ctx
.flags
= (uint32_t)tb
->flags
;
1407 ctx
.bstate
= BS_NONE
;
1409 ctx
.fpscr
= env
->fpscr
;
1410 ctx
.memidx
= (env
->sr
& SR_MD
) ? 1 : 0;
1411 /* We don't know if the delayed pc came from a dynamic or static branch,
1412 so assume it is a dynamic branch. */
1413 ctx
.delayed_pc
= -1; /* use delayed pc from env pointer */
1415 ctx
.singlestep_enabled
= env
->singlestep_enabled
;
1418 if (loglevel
& CPU_LOG_TB_CPU
) {
1420 "------------------------------------------------\n");
1421 cpu_dump_state(env
, logfile
, fprintf
, 0);
1427 max_insns
= tb
->cflags
& CF_COUNT_MASK
;
1429 max_insns
= CF_COUNT_MASK
;
1431 while (ctx
.bstate
== BS_NONE
&& gen_opc_ptr
< gen_opc_end
) {
1432 if (env
->nb_breakpoints
> 0) {
1433 for (i
= 0; i
< env
->nb_breakpoints
; i
++) {
1434 if (ctx
.pc
== env
->breakpoints
[i
]) {
1435 /* We have hit a breakpoint - make sure PC is up-to-date */
1436 tcg_gen_movi_i32(cpu_pc
, ctx
.pc
);
1438 ctx
.bstate
= BS_EXCP
;
1444 i
= gen_opc_ptr
- gen_opc_buf
;
1448 gen_opc_instr_start
[ii
++] = 0;
1450 gen_opc_pc
[ii
] = ctx
.pc
;
1451 gen_opc_hflags
[ii
] = ctx
.flags
;
1452 gen_opc_instr_start
[ii
] = 1;
1453 gen_opc_icount
[ii
] = num_insns
;
1455 if (num_insns
+ 1 == max_insns
&& (tb
->cflags
& CF_LAST_IO
))
1458 fprintf(stderr
, "Loading opcode at address 0x%08x\n", ctx
.pc
);
1461 ctx
.opcode
= lduw_code(ctx
.pc
);
1465 if ((ctx
.pc
& (TARGET_PAGE_SIZE
- 1)) == 0)
1467 if (env
->singlestep_enabled
)
1469 if (num_insns
>= max_insns
)
1471 #ifdef SH4_SINGLE_STEP
1475 if (tb
->cflags
& CF_LAST_IO
)
1477 if (env
->singlestep_enabled
) {
1480 switch (ctx
.bstate
) {
1482 /* gen_op_interrupt_restart(); */
1486 gen_store_flags(ctx
.flags
| DELAY_SLOT_CLEARME
);
1488 gen_goto_tb(&ctx
, 0, ctx
.pc
);
1491 /* gen_op_interrupt_restart(); */
1500 gen_icount_end(tb
, num_insns
);
1501 *gen_opc_ptr
= INDEX_op_end
;
1503 i
= gen_opc_ptr
- gen_opc_buf
;
1506 gen_opc_instr_start
[ii
++] = 0;
1508 tb
->size
= ctx
.pc
- pc_start
;
1509 tb
->icount
= num_insns
;
1513 #ifdef SH4_DEBUG_DISAS
1514 if (loglevel
& CPU_LOG_TB_IN_ASM
)
1515 fprintf(logfile
, "\n");
1517 if (loglevel
& CPU_LOG_TB_IN_ASM
) {
1518 fprintf(logfile
, "IN:\n"); /* , lookup_symbol(pc_start)); */
1519 target_disas(logfile
, pc_start
, ctx
.pc
- pc_start
, 0);
1520 fprintf(logfile
, "\n");
1525 void gen_intermediate_code(CPUState
* env
, struct TranslationBlock
*tb
)
1527 gen_intermediate_code_internal(env
, tb
, 0);
1530 void gen_intermediate_code_pc(CPUState
* env
, struct TranslationBlock
*tb
)
1532 gen_intermediate_code_internal(env
, tb
, 1);
1535 void gen_pc_load(CPUState
*env
, TranslationBlock
*tb
,
1536 unsigned long searched_pc
, int pc_pos
, void *puc
)
1538 env
->pc
= gen_opc_pc
[pc_pos
];
1539 env
->flags
= gen_opc_hflags
[pc_pos
];