Translate illegal and FPU-disable exceptions through raise_excp and route the remaining C exception paths through cpu_raise_excp helpers. Remove the redundant SH4 exception helpers.
Signed-off-by: Yonggang Luo <[email protected]> --- target/sh4/helper.h | 4 ---- target/sh4/op_helper.c | 36 +++--------------------------------- target/sh4/translate.c | 12 ++++++++---- 3 files changed, 11 insertions(+), 41 deletions(-) diff --git a/target/sh4/helper.h b/target/sh4/helper.h index 29011d3dbbb..593b20c0af2 100644 --- a/target/sh4/helper.h +++ b/target/sh4/helper.h @@ -1,8 +1,4 @@ DEF_HELPER_1(ldtlb, void, env) -DEF_HELPER_1(raise_illegal_instruction, noreturn, env) -DEF_HELPER_1(raise_slot_illegal_instruction, noreturn, env) -DEF_HELPER_1(raise_fpu_disable, noreturn, env) -DEF_HELPER_1(raise_slot_fpu_disable, noreturn, env) DEF_HELPER_1(sleep, noreturn, env) DEF_HELPER_2(trapa, noreturn, env, i32) DEF_HELPER_1(exclusive, noreturn, env) diff --git a/target/sh4/op_helper.c b/target/sh4/op_helper.c index 8beac9ca034..f38d247c1a2 100644 --- a/target/sh4/op_helper.c +++ b/target/sh4/op_helper.c @@ -55,49 +55,19 @@ void helper_ldtlb(CPUSH4State *env) #endif } -static inline G_NORETURN -void raise_exception(CPUSH4State *env, int index, - uintptr_t retaddr) -{ - CPUState *cs = env_cpu(env); - - cs->exception_index = index; - cpu_loop_exit_restore(cs, retaddr); -} - -void helper_raise_illegal_instruction(CPUSH4State *env) -{ - raise_exception(env, SH4_EXCP_ILLEGAL_INSTRUCTION, 0); -} - -void helper_raise_slot_illegal_instruction(CPUSH4State *env) -{ - raise_exception(env, SH4_EXCP_SLOT_ILLEGAL_INSTRUCTION, 0); -} - -void helper_raise_fpu_disable(CPUSH4State *env) -{ - raise_exception(env, SH4_EXCP_FPU_DISABLE, 0); -} - -void helper_raise_slot_fpu_disable(CPUSH4State *env) -{ - raise_exception(env, SH4_EXCP_SLOT_FPU_DISABLE, 0); -} - void helper_sleep(CPUSH4State *env) { CPUState *cs = env_cpu(env); cs->halted = 1; env->in_sleep = 1; - raise_exception(env, EXCP_HLT, 0); + cpu_raise_excp(cs, EXCP_HLT); } void helper_trapa(CPUSH4State *env, uint32_t tra) { env->tra = tra << 2; - raise_exception(env, SH4_EXCP_TRAPA, 0); + cpu_raise_excp(env_cpu(env), SH4_EXCP_TRAPA); } void helper_exclusive(CPUSH4State *env) @@ -255,7 +225,7 @@ static void update_fpscr(CPUSH4State *env, uintptr_t retaddr) cause = (env->fpscr & FPSCR_CAUSE_MASK) >> FPSCR_CAUSE_SHIFT; enable = (env->fpscr & FPSCR_ENABLE_MASK) >> FPSCR_ENABLE_SHIFT; if (cause & enable) { - raise_exception(env, SH4_EXCP_FPU, retaddr); + cpu_raise_excp_restore(env_cpu(env), SH4_EXCP_FPU, retaddr); } } } diff --git a/target/sh4/translate.c b/target/sh4/translate.c index 5729a757f19..590b62ba3c1 100644 --- a/target/sh4/translate.c +++ b/target/sh4/translate.c @@ -1756,10 +1756,13 @@ static void _decode_opc(DisasContext * ctx) if (ctx->envflags & TB_FLAG_DELAY_SLOT_MASK) { do_illegal_slot: gen_save_cpu_state(ctx, true); - gen_helper_raise_slot_illegal_instruction(tcg_env); + gen_helper_raise_excp(tcg_env, + tcg_constant_i32( + SH4_EXCP_SLOT_ILLEGAL_INSTRUCTION)); } else { gen_save_cpu_state(ctx, true); - gen_helper_raise_illegal_instruction(tcg_env); + gen_helper_raise_excp(tcg_env, + tcg_constant_i32(SH4_EXCP_ILLEGAL_INSTRUCTION)); } ctx->base.is_jmp = DISAS_NORETURN; return; @@ -1767,9 +1770,10 @@ static void _decode_opc(DisasContext * ctx) do_fpu_disabled: gen_save_cpu_state(ctx, true); if (ctx->envflags & TB_FLAG_DELAY_SLOT_MASK) { - gen_helper_raise_slot_fpu_disable(tcg_env); + gen_helper_raise_excp(tcg_env, + tcg_constant_i32(SH4_EXCP_SLOT_FPU_DISABLE)); } else { - gen_helper_raise_fpu_disable(tcg_env); + gen_helper_raise_excp(tcg_env, tcg_constant_i32(SH4_EXCP_FPU_DISABLE)); } ctx->base.is_jmp = DISAS_NORETURN; } -- 2.52.0.windows.1
