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