mirror of https://github.com/xemu-project/xemu.git
target/alpha: Simplify gen_bcond_internal()
Richard Henderson explained on IRC: bcond_internal() used to insist that both branch destination and branch fallthrough are use_goto_tb; if not, we'd use movcond to compute an indirect jump. But it's perfectly fine for e.g. the branch fallthrough to use_goto_tb, and the branch destination to use an indirect branch. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20240424234436.995410-4-richard.henderson@linaro.org> [PMD: Split bigger patch, part 4/5] Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-Id: <20240503072014.24751-7-philmd@linaro.org>
This commit is contained in:
parent
9804ab26d0
commit
39482c2edc
|
@ -461,23 +461,22 @@ static DisasJumpType gen_bcond_internal(DisasContext *ctx, TCGCond cond,
|
|||
uint64_t dest = ctx->base.pc_next + disp;
|
||||
TCGLabel *lab_true = gen_new_label();
|
||||
|
||||
if (use_goto_tb(ctx, dest)) {
|
||||
tcg_gen_brcondi_i64(cond, cmp, imm, lab_true);
|
||||
|
||||
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);
|
||||
|
||||
gen_set_label(lab_true);
|
||||
} else {
|
||||
tcg_gen_movi_i64(cpu_pc, ctx->base.pc_next);
|
||||
tcg_gen_lookup_and_goto_ptr();
|
||||
}
|
||||
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 {
|
||||
TCGv_i64 i = tcg_constant_i64(imm);
|
||||
TCGv_i64 d = tcg_constant_i64(dest);
|
||||
TCGv_i64 p = tcg_constant_i64(ctx->base.pc_next);
|
||||
|
||||
tcg_gen_movcond_i64(cond, cpu_pc, cmp, i, d, p);
|
||||
tcg_gen_movi_i64(cpu_pc, dest);
|
||||
tcg_gen_lookup_and_goto_ptr();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue