[llvm-branch-commits] [lld] [lld][LoongArch] Relax TLS LE/GD/LD (PR #123600)
Fangrui Song via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Sat Feb 15 13:53:24 PST 2025
================
@@ -0,0 +1,115 @@
+# REQUIRES: loongarch
+
+# RUN: llvm-mc --filetype=obj --triple=loongarch32 -mattr=+relax --defsym ELF32=1 %s -o %t.32.o
+# RUN: llvm-mc --filetype=obj --triple=loongarch64 -mattr=+relax %s -o %t.64.o
+
+# RUN: ld.lld %t.32.o -o %t.32
+# RUN: llvm-objdump -d --no-show-raw-insn %t.32 | FileCheck --check-prefixes=RELAX32 %s
+
+# RUN: ld.lld %t.64.o -o %t.64
+# RUN: llvm-objdump -d --no-show-raw-insn %t.64 | FileCheck --check-prefixes=RELAX64 %s
+
+# RELAX32-LABEL: <_start>:
+## .LANCHOR0 at tprel = 8
+# RELAX32-NEXT: addi.w $a0, $tp, 8
+# RELAX32-NEXT: ld.w $a1, $a0, 0
+# RELAX32-NEXT: ld.w $a2, $tp, 8
+## .a at tprel - 4 = 0x7fc
+# RELAX32-NEXT: addi.w $a1, $zero, 1
+# RELAX32-NEXT: addi.w $a1, $a1, 2
+# RELAX32-NEXT: st.w $a1, $tp, 2044
+## .a at tprel = 0x800
+# RELAX32-NEXT: lu12i.w $a0, 1
+# RELAX32-NEXT: add.w $a0, $a0, $tp
+# RELAX32-NEXT: addi.w $a0, $a0, -2048
+
+# RELAX64-LABEL: <_start>:
+## .LANCHOR0 at tprel = 8
+# RELAX64-NEXT: addi.d $a0, $tp, 8
+# RELAX64-NEXT: ld.d $a1, $a0, 0
+# RELAX64-NEXT: ld.d $a2, $tp, 8
+## .a at tprel - 4 = 0x7fc
+# RELAX64-NEXT: addi.d $a1, $zero, 1
+# RELAX64-NEXT: addi.d $a1, $a1, 2
+# RELAX64-NEXT: st.d $a1, $tp, 2044
+## .a at tprel = 0x800
+# RELAX64-NEXT: lu12i.w $a0, 1
+# RELAX64-NEXT: add.d $a0, $a0, $tp
+# RELAX64-NEXT: addi.d $a0, $a0, -2048
+
+.macro add dst, src1, src2, src3
+.ifdef ELF32
+add.w \dst, \src1, \src2, \src3
+.else
+add.d \dst, \src1, \src2, \src3
+.endif
+.endm
+.macro inst op dst, src1, src2
+.ifdef ELF32
+ .ifc \op, addi
+ addi.w \dst, \src1, \src2
+ .else; .ifc \op, ld
+ ld.w \dst, \src1, \src2
+ .else; .ifc \op, st
+ st.w \dst, \src1, \src2
+ .else; .ifc \op, ldptr
+ ldptr.w \dst, \src1, \src2
+ .else
+ .error "Unknown op in ELF32 mode"
+ .endif; .endif; .endif; .endif
+.else
+ .ifc \op, addi
+ addi.d \dst, \src1, \src2
+ .else; .ifc \op, ld
+ ld.d \dst, \src1, \src2
+ .else; .ifc \op, st
+ st.d \dst, \src1, \src2
+ .else; .ifc \op, ldptr
+ ldptr.d \dst, \src1, \src2
+ .else
+ .error "Unknown op in ELF64 mode"
+ .endif; .endif; .endif; .endif
+.endif
+.endm
+
+.macro addi dst, src1, src2
+inst addi \dst, \src1, \src2
+.endm
+.macro ld dst, src1, src2
+inst ld \dst, \src1, \src2
+.endm
+.macro st dst, src1, src2
+inst st \dst, \src1, \src2
+.endm
+.macro ldptr dst, src1, src2
+inst ldptr \dst, \src1, \src2
+.endm
+
+_start:
+## Test instructions not in pairs.
+lu12i.w $a0, %le_hi20_r(.LANCHOR0)
----------------
MaskRay wrote:
indent instructions while keeping labels unindented
https://github.com/llvm/llvm-project/pull/123600
More information about the llvm-branch-commits
mailing list