@@ -1,8 +1,4 @@
-DEF_HELPER_1(raise_illegal_instruction, noreturn, env)
-DEF_HELPER_1(raise_access_fault, noreturn, env)
-DEF_HELPER_1(raise_privilege_violation, noreturn, env)
DEF_HELPER_1(wait, noreturn, env)
-DEF_HELPER_2(trap, noreturn, env, i32)
DEF_HELPER_3(fadd, f32, env, f32, f32)
DEF_HELPER_3(fsub, f32, env, f32, f32)
DEF_HELPER_3(fmul, f32, env, f32, f32)
@@ -25,10 +25,6 @@
#include "fpu/softfloat.h"
#include "tcg/debug-assert.h"
-static inline G_NORETURN
-void raise_exception(CPURXState *env, int index,
- uintptr_t retaddr);
-
static void _set_psw(CPURXState *env, uint32_t psw, uint32_t rte)
{
uint32_t prev_u;
@@ -115,7 +111,7 @@ static void update_fpsw(CPURXState *env, float32 ret, uintptr_t retaddr)
enable = FIELD_EX32(env->fpsw, FPSW, ENABLE);
enable |= 1 << 5; /* CE always enabled */
if (cause & enable) {
- raise_exception(env, RX_EXCP_ACCESS, retaddr);
+ cpu_raise_excp_restore(env_cpu(env), RX_EXCP_ACCESS, retaddr);
}
}
}
@@ -419,32 +415,6 @@ uint32_t helper_divu(CPURXState *env, uint32_t num, uint32_t den)
return ret;
}
-/* exception */
-static inline G_NORETURN
-void raise_exception(CPURXState *env, int index,
- uintptr_t retaddr)
-{
- CPUState *cs = env_cpu(env);
-
- cs->exception_index = index;
- cpu_loop_exit_restore(cs, retaddr);
-}
-
-G_NORETURN void helper_raise_privilege_violation(CPURXState *env)
-{
- raise_exception(env, RX_EXCP_PRIVILEGE_VIOLATION, GETPC());
-}
-
-G_NORETURN void helper_raise_access_fault(CPURXState *env)
-{
- raise_exception(env, RX_EXCP_ACCESS, GETPC());
-}
-
-G_NORETURN void helper_raise_illegal_instruction(CPURXState *env)
-{
- raise_exception(env, RX_EXCP_ILLEGAL_INSTRUCTION, GETPC());
-}
-
G_NORETURN void helper_wait(CPURXState *env)
{
CPUState *cs = env_cpu(env);
@@ -452,10 +422,5 @@ G_NORETURN void helper_wait(CPURXState *env)
cs->halted = 1;
env->in_sleep = 1;
env->psw_i = 1;
- raise_exception(env, EXCP_HLT, 0);
-}
-
-G_NORETURN void helper_trap(CPURXState *env, uint32_t vec)
-{
- raise_exception(env, RX_EXCP_TRAP_BASE + vec, 0);
+ cpu_raise_excp(env_cpu(env), EXCP_HLT);
}
@@ -245,7 +245,8 @@ static int is_privileged(DisasContext *ctx, int is_exception)
{
if (FIELD_EX32(ctx->tb_flags, PSW, PM)) {
if (is_exception) {
- gen_helper_raise_privilege_violation(tcg_env);
+ gen_helper_raise_excp_restore(
+ tcg_env, tcg_constant_i32(RX_EXCP_PRIVILEGE_VIOLATION));
}
return 0;
} else {
@@ -2173,7 +2174,8 @@ static bool trans_RTE(DisasContext *ctx, arg_RTE *a)
static bool do_trap(DisasContext *ctx, uint8_t vec)
{
tcg_gen_movi_i32(cpu_pc, ctx->base.pc_next);
- gen_helper_trap(tcg_env, tcg_constant_i32(vec));
+ gen_helper_raise_excp(
+ tcg_env, tcg_constant_i32(RX_EXCP_TRAP_BASE + vec));
ctx->base.is_jmp = DISAS_NORETURN;
return true;
}
@@ -2227,7 +2229,8 @@ static void rx_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
ctx->pc = ctx->base.pc_next;
insn = decode_load(ctx);
if (!decode(ctx, insn)) {
- gen_helper_raise_illegal_instruction(tcg_env);
+ gen_helper_raise_excp_restore(
+ tcg_env, tcg_constant_i32(RX_EXCP_ILLEGAL_INSTRUCTION));
}
}
Translate privilege and illegal instructions through the shared exception helpers, and use them for BRK, INT, FPSW, and WAIT paths where applicable. Remove the redundant RX exception helpers. Signed-off-by: Yonggang Luo <luoyonggang@gmail.com> --- target/rx/helper.h | 4 ---- target/rx/op_helper.c | 39 ++------------------------------------- target/rx/translate.c | 9 ++++++--- 3 files changed, 8 insertions(+), 44 deletions(-)