Message ID | 20210517205025.3777947-4-matheus.ferst@eldorado.org.br (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Base for adding PowerPC 64-bit instructions | expand |
On Mon, May 17, 2021 at 05:50:05PM -0300, matheus.ferst@eldorado.org.br wrote: > From: Richard Henderson <richard.henderson@linaro.org> > > The translation of branch instructions always results in exit from > the TB. Remove the synthetic "exception" after no more uses. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > Signed-off-by: Matheus Ferst <matheus.ferst@eldorado.org.br> Applied to ppc-for-6.1, thanks. > --- > linux-user/ppc/cpu_loop.c | 3 --- > target/ppc/cpu.h | 2 -- > target/ppc/translate.c | 8 ++------ > 3 files changed, 2 insertions(+), 11 deletions(-) > > diff --git a/linux-user/ppc/cpu_loop.c b/linux-user/ppc/cpu_loop.c > index fe526693d2..fa91ea0eed 100644 > --- a/linux-user/ppc/cpu_loop.c > +++ b/linux-user/ppc/cpu_loop.c > @@ -423,9 +423,6 @@ void cpu_loop(CPUPPCState *env) > cpu_abort(cs, "Maintenance exception while in user mode. " > "Aborting\n"); > break; > - case POWERPC_EXCP_BRANCH: /* branch instruction: */ > - /* We just stopped because of a branch. Go on */ > - break; > case POWERPC_EXCP_SYSCALL_USER: > /* system call in user-mode emulation */ > /* WARNING: > diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h > index 9e38df685d..cab33a3680 100644 > --- a/target/ppc/cpu.h > +++ b/target/ppc/cpu.h > @@ -131,8 +131,6 @@ enum { > POWERPC_EXCP_SYSCALL_VECTORED = 102, /* scv exception */ > /* EOL */ > POWERPC_EXCP_NB = 103, > - /* QEMU exceptions: used internally during code translation */ > - POWERPC_EXCP_BRANCH = 0x201, /* branch instruction */ > /* QEMU exceptions: special cases we want to stop translation */ > POWERPC_EXCP_SYSCALL_USER = 0x203, /* System call in user mode only */ > }; > diff --git a/target/ppc/translate.c b/target/ppc/translate.c > index f57b67be5f..d019454550 100644 > --- a/target/ppc/translate.c > +++ b/target/ppc/translate.c > @@ -4692,7 +4692,6 @@ static void gen_b(DisasContext *ctx) > { > target_ulong li, target; > > - ctx->exception = POWERPC_EXCP_BRANCH; > /* sign extend LI */ > li = LI(ctx->opcode); > li = (li ^ 0x02000000) - 0x02000000; > @@ -4706,6 +4705,7 @@ static void gen_b(DisasContext *ctx) > } > gen_update_cfar(ctx, ctx->cia); > gen_goto_tb(ctx, 0, target); > + ctx->base.is_jmp = DISAS_NORETURN; > } > > #define BCOND_IM 0 > @@ -4718,7 +4718,6 @@ static void gen_bcond(DisasContext *ctx, int type) > uint32_t bo = BO(ctx->opcode); > TCGLabel *l1; > TCGv target; > - ctx->exception = POWERPC_EXCP_BRANCH; > > if (type == BCOND_LR || type == BCOND_CTR || type == BCOND_TAR) { > target = tcg_temp_local_new(); > @@ -4825,6 +4824,7 @@ static void gen_bcond(DisasContext *ctx, int type) > gen_set_label(l1); > gen_goto_tb(ctx, 1, ctx->base.pc_next); > } > + ctx->base.is_jmp = DISAS_NORETURN; > } > > static void gen_bc(DisasContext *ctx) > @@ -9102,7 +9102,6 @@ static void ppc_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs) > /* Check trace mode exceptions */ > if (unlikely(ctx->singlestep_enabled & CPU_SINGLE_STEP && > (ctx->base.pc_next <= 0x100 || ctx->base.pc_next > 0xF00) && > - ctx->exception != POWERPC_EXCP_BRANCH && > ctx->base.is_jmp != DISAS_NORETURN)) { > uint32_t excp = gen_prep_dbgex(ctx); > gen_exception_nip(ctx, excp, ctx->base.pc_next); > @@ -9118,9 +9117,6 @@ static void ppc_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs) > switch (ctx->exception) { > case POWERPC_EXCP_NONE: > break; > - case POWERPC_EXCP_BRANCH: > - ctx->base.is_jmp = DISAS_NORETURN; > - break; > default: > /* Every other ctx->exception should have set NORETURN. */ > g_assert_not_reached();
diff --git a/linux-user/ppc/cpu_loop.c b/linux-user/ppc/cpu_loop.c index fe526693d2..fa91ea0eed 100644 --- a/linux-user/ppc/cpu_loop.c +++ b/linux-user/ppc/cpu_loop.c @@ -423,9 +423,6 @@ void cpu_loop(CPUPPCState *env) cpu_abort(cs, "Maintenance exception while in user mode. " "Aborting\n"); break; - case POWERPC_EXCP_BRANCH: /* branch instruction: */ - /* We just stopped because of a branch. Go on */ - break; case POWERPC_EXCP_SYSCALL_USER: /* system call in user-mode emulation */ /* WARNING: diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h index 9e38df685d..cab33a3680 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h @@ -131,8 +131,6 @@ enum { POWERPC_EXCP_SYSCALL_VECTORED = 102, /* scv exception */ /* EOL */ POWERPC_EXCP_NB = 103, - /* QEMU exceptions: used internally during code translation */ - POWERPC_EXCP_BRANCH = 0x201, /* branch instruction */ /* QEMU exceptions: special cases we want to stop translation */ POWERPC_EXCP_SYSCALL_USER = 0x203, /* System call in user mode only */ }; diff --git a/target/ppc/translate.c b/target/ppc/translate.c index f57b67be5f..d019454550 100644 --- a/target/ppc/translate.c +++ b/target/ppc/translate.c @@ -4692,7 +4692,6 @@ static void gen_b(DisasContext *ctx) { target_ulong li, target; - ctx->exception = POWERPC_EXCP_BRANCH; /* sign extend LI */ li = LI(ctx->opcode); li = (li ^ 0x02000000) - 0x02000000; @@ -4706,6 +4705,7 @@ static void gen_b(DisasContext *ctx) } gen_update_cfar(ctx, ctx->cia); gen_goto_tb(ctx, 0, target); + ctx->base.is_jmp = DISAS_NORETURN; } #define BCOND_IM 0 @@ -4718,7 +4718,6 @@ static void gen_bcond(DisasContext *ctx, int type) uint32_t bo = BO(ctx->opcode); TCGLabel *l1; TCGv target; - ctx->exception = POWERPC_EXCP_BRANCH; if (type == BCOND_LR || type == BCOND_CTR || type == BCOND_TAR) { target = tcg_temp_local_new(); @@ -4825,6 +4824,7 @@ static void gen_bcond(DisasContext *ctx, int type) gen_set_label(l1); gen_goto_tb(ctx, 1, ctx->base.pc_next); } + ctx->base.is_jmp = DISAS_NORETURN; } static void gen_bc(DisasContext *ctx) @@ -9102,7 +9102,6 @@ static void ppc_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs) /* Check trace mode exceptions */ if (unlikely(ctx->singlestep_enabled & CPU_SINGLE_STEP && (ctx->base.pc_next <= 0x100 || ctx->base.pc_next > 0xF00) && - ctx->exception != POWERPC_EXCP_BRANCH && ctx->base.is_jmp != DISAS_NORETURN)) { uint32_t excp = gen_prep_dbgex(ctx); gen_exception_nip(ctx, excp, ctx->base.pc_next); @@ -9118,9 +9117,6 @@ static void ppc_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs) switch (ctx->exception) { case POWERPC_EXCP_NONE: break; - case POWERPC_EXCP_BRANCH: - ctx->base.is_jmp = DISAS_NORETURN; - break; default: /* Every other ctx->exception should have set NORETURN. */ g_assert_not_reached();