[PATCH] LoongArch: LoongArch-64 allows larger addends in relocations

Lulu Cai cailulu@loongson.cn
Thu Aug 15 12:27:32 GMT 2024


Allows large addends in relocations so that computation of large
constant offset addresses can be fused.
---
 gas/config/tc-loongarch.c                  |  3 +++
 gas/testsuite/gas/loongarch/large_addend.d | 12 ++++++++++++
 gas/testsuite/gas/loongarch/large_addend.s |  8 ++++++++
 3 files changed, 23 insertions(+)
 create mode 100644 gas/testsuite/gas/loongarch/large_addend.d
 create mode 100644 gas/testsuite/gas/loongarch/large_addend.s

diff --git a/gas/config/tc-loongarch.c b/gas/config/tc-loongarch.c
index 5ca33c6e2e8..66778e0fcf3 100644
--- a/gas/config/tc-loongarch.c
+++ b/gas/config/tc-loongarch.c
@@ -1221,6 +1221,9 @@ append_fixp_and_insn (struct loongarch_cl_insn *ip)
 					 bfd_get_reloc_size (howto),
 					 &reloc_info[i].value, FALSE, r_type);
 	    }
+	  /* For LoongArch 64, larger addends are allowed.  */
+	  if (LARCH_opts.ase_lp64)
+	    ip->fixp[i]->fx_no_overflow = 1;
 	}
     }
 
diff --git a/gas/testsuite/gas/loongarch/large_addend.d b/gas/testsuite/gas/loongarch/large_addend.d
new file mode 100644
index 00000000000..18eb33a3ae9
--- /dev/null
+++ b/gas/testsuite/gas/loongarch/large_addend.d
@@ -0,0 +1,12 @@
+#as:
+#objdump: -r
+#skip: loongarch32-*-*
+
+.*:     file format elf64-loongarch
+
+RELOCATION RECORDS FOR \[\.text\]:
+OFFSET           TYPE              VALUE
+0000000000000000 R_LARCH_PCALA_HI20  _start\+0x7fffabcd12345678
+0000000000000004 R_LARCH_PCALA_LO12  _start\+0x7fffabcd12345678
+0000000000000008 R_LARCH_PCALA64_LO20  _start\+0x7fffabcd12345678
+000000000000000c R_LARCH_PCALA64_HI12  _start\+0x7fffabcd12345678
diff --git a/gas/testsuite/gas/loongarch/large_addend.s b/gas/testsuite/gas/loongarch/large_addend.s
new file mode 100644
index 00000000000..7db905251be
--- /dev/null
+++ b/gas/testsuite/gas/loongarch/large_addend.s
@@ -0,0 +1,8 @@
+    .text
+    .global _start
+_start:
+    pcalau12i	$a0, %pc_hi20(_start+0x7fffabcd12345678)
+    addi.d	$a1, $zero, %pc_lo12(_start+0x7fffabcd12345678)
+    lu32i.d	$a1, %pc64_lo20(_start+0x7fffabcd12345678)
+    lu52i.d	$a1, $a1, %pc64_hi12(_start+0x7fffabcd12345678)
+    add.d	$a0, $a1, $a0
-- 
2.34.1



More information about the Binutils mailing list