diff options
author | Evgeny Karpov <evgeny.karpov@microsoft.com> | 2024-09-12 13:19:32 +0200 |
---|---|---|
committer | Evgeny Karpov <eukarpov@gmail.com> | 2024-11-19 14:27:33 +0100 |
commit | 55788176f1e103a2912bb3b4b6fad65c480276f9 (patch) | |
tree | b929f6055b3737ec4195ef133005c3e7dd651d85 /gcc | |
parent | 71381ecc1ed4868e6912d0ddaabd6b5a68b738d8 (diff) | |
download | gcc-55788176f1e103a2912bb3b4b6fad65c480276f9.zip gcc-55788176f1e103a2912bb3b4b6fad65c480276f9.tar.gz gcc-55788176f1e103a2912bb3b4b6fad65c480276f9.tar.bz2 |
aarch64: Extend the offset limit in "symbol + offset" from 1MB to 16MB
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/aarch64/aarch64.cc | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc index e5e993d..a2945f7 100644 --- a/gcc/config/aarch64/aarch64.cc +++ b/gcc/config/aarch64/aarch64.cc @@ -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; } |