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 | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index 62a154e5083..d66591899f8 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -2971,6 +2971,25 @@ aarch64_load_symref_appropriately (rtx dest, rtx imm,
          tmp_reg = gen_reg_rtx (mode);
 
        emit_move_insn (tmp_reg, gen_rtx_HIGH (mode, copy_rtx (imm)));
+
+       if (TARGET_PECOFF)
+         {
+           poly_int64 offset;
+           HOST_WIDE_INT const_offset;
+           strip_offset (imm, &offset);
+
+           if (offset.is_constant (&const_offset)
+               && abs_hwi (const_offset) >= 1 << 20)
+             {
+               rtx const_int = imm;
+               const_int = XEXP (const_int, 0);
+               XEXP (const_int, 1) = GEN_INT (const_offset % (1 << 20));
+
+               emit_set_insn (tmp_reg, plus_constant (mode, tmp_reg,
+                              const_offset & ~0xfffff));
+             }
+         }
+
        emit_insn (gen_add_losym (dest, tmp_reg, imm));
        return;
       }
-- 
2.34.1

Reply via email to