]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
aarch64: Extend the offset limit in "symbol + offset" from 1MB to 16MB
authorEvgeny Karpov <evgeny.karpov@microsoft.com>
Thu, 12 Sep 2024 11:19:32 +0000 (13:19 +0200)
committerEvgeny Karpov <eukarpov@gmail.com>
Tue, 19 Nov 2024 13:27:33 +0000 (14:27 +0100)
This patch allows using an offset of up to 16MB in "symbol + offset",
instead of 1MB limit that was used previously.

gcc/ChangeLog:

* config/aarch64/aarch64.cc (aarch64_load_symref_appropriately):
Update.

gcc/config/aarch64/aarch64.cc

index e5e993d3985048687049ad2bad820d14fe1b0d77..a2945f7fd0b444ca37f247fd63ddc55b234c659c 100644 (file)
@@ -3030,7 +3030,22 @@ aarch64_load_symref_appropriately (rtx dest, rtx imm,
        if (can_create_pseudo_p ())
          tmp_reg = gen_reg_rtx (mode);
 
+       HOST_WIDE_INT mid_const = 0;
+       if (TARGET_PECOFF)
+         {
+           poly_int64 offset;
+           strip_offset (imm, &offset);
+
+           HOST_WIDE_INT const_offset;
+           if (offset.is_constant (&const_offset))
+             /* Written this way for the sake of negative offsets.  */
+             mid_const = const_offset / (1 << 20) * (1 << 20);
+         }
+       imm = plus_constant (mode, imm, -mid_const);
+
        emit_move_insn (tmp_reg, gen_rtx_HIGH (mode, copy_rtx (imm)));
+       if (mid_const)
+         emit_set_insn (tmp_reg, plus_constant (mode, tmp_reg, mid_const));
        emit_insn (gen_add_losym (dest, tmp_reg, imm));
        return;
       }