mirror of https://github.com/xemu-project/xemu.git
target/alpha: Split out gen_goto_tb
Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20240424234436.995410-4-richard.henderson@linaro.org> [PMD: Split bigger patch, part 5/5] Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-Id: <20240503072014.24751-8-philmd@linaro.org>
This commit is contained in:
parent
39482c2edc
commit
82b60d2509
|
@ -425,15 +425,22 @@ static DisasJumpType gen_store_conditional(DisasContext *ctx, int ra, int rb,
|
|||
return DISAS_NEXT;
|
||||
}
|
||||
|
||||
static bool use_goto_tb(DisasContext *ctx, uint64_t dest)
|
||||
static void gen_goto_tb(DisasContext *ctx, int idx, int32_t disp)
|
||||
{
|
||||
return translator_use_goto_tb(&ctx->base, dest);
|
||||
uint64_t dest = ctx->base.pc_next + disp;
|
||||
|
||||
if (translator_use_goto_tb(&ctx->base, dest)) {
|
||||
tcg_gen_goto_tb(idx);
|
||||
tcg_gen_movi_i64(cpu_pc, dest);
|
||||
tcg_gen_exit_tb(ctx->base.tb, idx);
|
||||
} else {
|
||||
tcg_gen_movi_i64(cpu_pc, dest);
|
||||
tcg_gen_lookup_and_goto_ptr();
|
||||
}
|
||||
}
|
||||
|
||||
static DisasJumpType gen_bdirect(DisasContext *ctx, int ra, int32_t disp)
|
||||
{
|
||||
uint64_t dest = ctx->base.pc_next + disp;
|
||||
|
||||
if (ra != 31) {
|
||||
tcg_gen_movi_i64(ctx->ir[ra], ctx->base.pc_next);
|
||||
}
|
||||
|
@ -442,43 +449,19 @@ static DisasJumpType gen_bdirect(DisasContext *ctx, int ra, int32_t disp)
|
|||
if (disp == 0) {
|
||||
return DISAS_NEXT;
|
||||
}
|
||||
|
||||
if (use_goto_tb(ctx, dest)) {
|
||||
tcg_gen_goto_tb(0);
|
||||
tcg_gen_movi_i64(cpu_pc, dest);
|
||||
tcg_gen_exit_tb(ctx->base.tb, 0);
|
||||
} else {
|
||||
tcg_gen_movi_i64(cpu_pc, dest);
|
||||
tcg_gen_lookup_and_goto_ptr();
|
||||
}
|
||||
|
||||
gen_goto_tb(ctx, 0, disp);
|
||||
return DISAS_NORETURN;
|
||||
}
|
||||
|
||||
static DisasJumpType gen_bcond_internal(DisasContext *ctx, TCGCond cond,
|
||||
TCGv cmp, uint64_t imm, int32_t disp)
|
||||
{
|
||||
uint64_t dest = ctx->base.pc_next + disp;
|
||||
TCGLabel *lab_true = gen_new_label();
|
||||
|
||||
tcg_gen_brcondi_i64(cond, cmp, imm, lab_true);
|
||||
if (use_goto_tb(ctx, ctx->base.pc_next)) {
|
||||
tcg_gen_goto_tb(0);
|
||||
tcg_gen_movi_i64(cpu_pc, ctx->base.pc_next);
|
||||
tcg_gen_exit_tb(ctx->base.tb, 0);
|
||||
} else {
|
||||
tcg_gen_movi_i64(cpu_pc, ctx->base.pc_next);
|
||||
tcg_gen_lookup_and_goto_ptr();
|
||||
}
|
||||
gen_goto_tb(ctx, 0, 0);
|
||||
gen_set_label(lab_true);
|
||||
if (use_goto_tb(ctx, dest)) {
|
||||
tcg_gen_goto_tb(1);
|
||||
tcg_gen_movi_i64(cpu_pc, dest);
|
||||
tcg_gen_exit_tb(ctx->base.tb, 1);
|
||||
} else {
|
||||
tcg_gen_movi_i64(cpu_pc, dest);
|
||||
tcg_gen_lookup_and_goto_ptr();
|
||||
}
|
||||
gen_goto_tb(ctx, 1, disp);
|
||||
|
||||
return DISAS_NORETURN;
|
||||
}
|
||||
|
@ -2922,12 +2905,8 @@ static void alpha_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
|
|||
case DISAS_NORETURN:
|
||||
break;
|
||||
case DISAS_TOO_MANY:
|
||||
if (use_goto_tb(ctx, ctx->base.pc_next)) {
|
||||
tcg_gen_goto_tb(0);
|
||||
tcg_gen_movi_i64(cpu_pc, ctx->base.pc_next);
|
||||
tcg_gen_exit_tb(ctx->base.tb, 0);
|
||||
}
|
||||
/* FALLTHRU */
|
||||
gen_goto_tb(ctx, 0, 0);
|
||||
break;
|
||||
case DISAS_PC_STALE:
|
||||
tcg_gen_movi_i64(cpu_pc, ctx->base.pc_next);
|
||||
/* FALLTHRU */
|
||||
|
|
Loading…
Reference in New Issue