diff options
author | pbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162> | 2006-06-18 19:12:54 +0000 |
---|---|---|
committer | pbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162> | 2006-06-18 19:12:54 +0000 |
commit | 9c2a9ea1b1fe221566ca6c3f873da1454cadd263 (patch) | |
tree | b0384568db3ada60f572ef5750a8d316d0f266d1 /target-sh4/translate.c | |
parent | 397e923f7f78e99bc547b0a730c225d78dfe878b (diff) |
SH bugfixes.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1991 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'target-sh4/translate.c')
-rw-r--r-- | target-sh4/translate.c | 32 |
1 files changed, 13 insertions, 19 deletions
diff --git a/target-sh4/translate.c b/target-sh4/translate.c index 0dca45ee9c..358f975e0c 100644 --- a/target-sh4/translate.c +++ b/target-sh4/translate.c @@ -124,7 +124,11 @@ void cpu_dump_state(CPUState * env, FILE * f, void cpu_sh4_reset(CPUSH4State * env) { +#if defined(CONFIG_USER_ONLY) + env->sr = 0x00000000; +#else env->sr = 0x700000F0; /* MD, RB, BL, I3-I0 */ +#endif env->vbr = 0; env->pc = 0xA0000000; env->fpscr = 0x00040001; @@ -209,10 +213,10 @@ static void gen_delayed_conditional_jump(DisasContext * ctx) int l1; l1 = gen_new_label(); - gen_op_jTT2(l1); - gen_goto_tb(ctx, 0, ctx->pc); + gen_op_jdelayed(l1); + gen_goto_tb(ctx, 1, ctx->pc); gen_set_label(l1); - gen_goto_tb(ctx, 1, ctx->delayed_pc); + gen_jump(ctx); } #define B3_0 (ctx->opcode & 0xf) @@ -1160,25 +1164,15 @@ int gen_intermediate_code_internal(CPUState * env, TranslationBlock * tb, #endif } - switch (old_flags & (DELAY_SLOT_CONDITIONAL | DELAY_SLOT)) { - case DELAY_SLOT_CONDITIONAL: - gen_op_clr_delay_slot_conditional(); + if (old_flags & DELAY_SLOT_CONDITIONAL) { gen_delayed_conditional_jump(&ctx); - break; - case DELAY_SLOT: + } else if (old_flags & DELAY_SLOT) { gen_op_clr_delay_slot(); gen_jump(&ctx); - break; - case 0: - if (ctx.flags & BRANCH_EXCEPTION) { - gen_jump_exception(&ctx); - } else if ((ctx.flags & (BRANCH | BRANCH_CONDITIONAL)) == 0) { - gen_goto_tb(&ctx, 0, ctx.pc); - } - break; - default: - /* Both cannot be set at the same time */ - assert(0); + } else if (ctx.flags & BRANCH_EXCEPTION) { + gen_jump_exception(&ctx); + } else if ((ctx.flags & (BRANCH | BRANCH_CONDITIONAL)) == 0) { + gen_goto_tb(&ctx, 0, ctx.pc); } if (env->singlestep_enabled) { |