On Fri, 30 Sept 2022 at 23:10, Richard Henderson <richard.hender...@linaro.org> wrote: > > In preparation for TARGET_TB_PCREL, reduce reliance on absolute values. > > Signed-off-by: Richard Henderson <richard.hender...@linaro.org> > --- > target/arm/translate.c | 37 +++++++++++++++++++++---------------- > 1 file changed, 21 insertions(+), 16 deletions(-)
> @@ -8368,7 +8372,8 @@ static bool trans_BLX_i(DisasContext *s, arg_BLX_i *a) > } > tcg_gen_movi_i32(cpu_R[14], s->base.pc_next | s->thumb); > store_cpu_field_constant(!s->thumb, thumb); > - gen_jmp(s, (read_pc(s) & ~3) + a->imm); > + /* This difference computes a page offset so ok for TARGET_TB_PCREL. */ > + gen_jmp(s, (read_pc(s) & ~3) - s->pc_curr + a->imm); Could we just calculate the offset of the jump target instead? read_pc() returns s->pc_curr + a constant, so the s->pc_curr cancels out anyway: (read_pc(s) & ~3) - s->pc_curr + a->imm == (pc_curr + (s->thumb ? 4 : 8) & ~3) - pc_curr + imm == pc_curr - pc_curr_low_bits - pc_curr + 4-or-8 + imm == imm + 4-or-8 - low_bits_of_pc That's then more obviously not dependent on the absolute value of the PC. -- PMM