This is the only remaining use of gen_bx_im. Simplify, since we know the destination mode is changing. Use gen_jmp for the actual branch.
Signed-off-by: Richard Henderson <richard.hender...@linaro.org> --- target/arm/translate.c | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/target/arm/translate.c b/target/arm/translate.c index 9ae9b23823..dc51e1e622 100644 --- a/target/arm/translate.c +++ b/target/arm/translate.c @@ -813,21 +813,6 @@ static inline void gen_set_pc_im(DisasContext *s, target_ulong val) tcg_gen_movi_i32(cpu_R[15], val); } -/* Set PC and Thumb state from an immediate address. */ -static inline void gen_bx_im(DisasContext *s, uint32_t addr) -{ - TCGv_i32 tmp; - - s->base.is_jmp = DISAS_JUMP; - if (s->thumb != (addr & 1)) { - tmp = tcg_temp_new_i32(); - tcg_gen_movi_i32(tmp, addr & 1); - tcg_gen_st_i32(tmp, cpu_env, offsetof(CPUARMState, thumb)); - tcg_temp_free_i32(tmp); - } - tcg_gen_movi_i32(cpu_R[15], addr & ~1); -} - /* Set PC and Thumb state from var. var is marked as dead. */ static inline void gen_bx(DisasContext *s, TCGv_i32 var) { @@ -10042,12 +10027,18 @@ static bool trans_BL(DisasContext *s, arg_i *a) static bool trans_BLX_i(DisasContext *s, arg_BLX_i *a) { + TCGv_i32 tmp; + /* For A32, ARCH(5) is checked near the start of the uncond block. */ if (s->thumb && (a->imm & 2)) { return false; } tcg_gen_movi_i32(cpu_R[14], s->pc | s->thumb); - gen_bx_im(s, (s->pc_read & ~3) + a->imm + !s->thumb); + tmp = tcg_temp_new_i32(); + tcg_gen_movi_i32(tmp, !s->thumb); + tcg_gen_st_i32(tmp, cpu_env, offsetof(CPUARMState, thumb)); + tcg_temp_free_i32(tmp); + gen_jmp(s, (s->pc_read & ~3) + a->imm); return true; } -- 2.17.1