xref: /llvm-project/llvm/test/MC/LoongArch/Macros/macros-la.s (revision 89e3a649f207021c0884ed5f8e56321c51854ac3)
1# RUN: llvm-mc --triple=loongarch64 %s | FileCheck %s
2# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=-relax %s -o %t
3# RUN: llvm-readobj -r %t | FileCheck %s --check-prefix=RELOC
4# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=+relax %s -o %t.relax
5# RUN: llvm-readobj -r %t.relax | FileCheck %s --check-prefixes=RELOC,RELAX
6# RUN: llvm-mc --triple=loongarch64 --mattr=+la-global-with-abs \
7# RUN:     %s | FileCheck %s --check-prefix=ABS
8# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=+la-global-with-abs \
9# RUN:     --mattr=-relax %s -o %t
10# RUN: llvm-readobj -r %t | FileCheck %s --check-prefix=GTOABS-RELOC
11# RUN: llvm-mc --filetype=obj --triple=loongarch64 --mattr=+la-global-with-abs \
12# RUN:     --mattr=+relax %s -o %t.relax
13# RUN: llvm-readobj -r %t.relax | FileCheck %s --check-prefixes=GTOABS-RELOC,GTOABS-RELAX
14
15# RELOC:      Relocations [
16# RELOC-NEXT:   Section ({{.*}}) .rela.text {
17
18la.abs $a0, sym_abs
19# CHECK:      lu12i.w $a0, %abs_hi20(sym_abs)
20# CHECK-NEXT: ori $a0, $a0, %abs_lo12(sym_abs)
21# CHECK-NEXT: lu32i.d $a0, %abs64_lo20(sym_abs)
22# CHECK-NEXT: lu52i.d $a0, $a0, %abs64_hi12(sym_abs)
23# CHECK-EMPTY:
24# ABS:        lu12i.w $a0, %abs_hi20(sym_abs)
25# ABS-NEXT:   ori $a0, $a0, %abs_lo12(sym_abs)
26# ABS-NEXT:   lu32i.d $a0, %abs64_lo20(sym_abs)
27# ABS-NEXT:   lu52i.d $a0, $a0, %abs64_hi12(sym_abs)
28# ABS-EMPTY:
29# RELOC-NEXT: R_LARCH_ABS_HI20 sym_abs 0x0
30# RELOC-NEXT: R_LARCH_ABS_LO12 sym_abs 0x0
31# RELOC-NEXT: R_LARCH_ABS64_LO20 sym_abs 0x0
32# RELOC-NEXT: R_LARCH_ABS64_HI12 sym_abs 0x0
33
34la.pcrel $a0, sym_pcrel
35# CHECK-NEXT: pcalau12i $a0, %pc_hi20(sym_pcrel)
36# CHECK-NEXT: addi.d $a0, $a0, %pc_lo12(sym_pcrel)
37# CHECK-EMPTY:
38# ABS-NEXT:   pcalau12i $a0, %pc_hi20(sym_pcrel)
39# ABS-NEXT:   addi.d $a0, $a0, %pc_lo12(sym_pcrel)
40# ABS-EMPTY:
41# RELOC-NEXT: R_LARCH_PCALA_HI20 sym_pcrel 0x0
42# RELAX-NEXT: R_LARCH_RELAX - 0x0
43# RELOC-NEXT: R_LARCH_PCALA_LO12 sym_pcrel 0x0
44# RELAX-NEXT: R_LARCH_RELAX - 0x0
45# GTOABS-RELOC: R_LARCH_PCALA_HI20 sym_pcrel 0x0
46# GTOABS-RELAX-NEXT: R_LARCH_RELAX - 0x0
47# GTOABS-RELOC-NEXT: R_LARCH_PCALA_LO12 sym_pcrel 0x0
48# GTOABS-RELAX-NEXT: R_LARCH_RELAX - 0x0
49
50la.got $a0, sym_got
51# CHECK-NEXT: pcalau12i $a0, %got_pc_hi20(sym_got)
52# CHECK-NEXT: ld.d $a0, $a0, %got_pc_lo12(sym_got)
53# CHECK-EMPTY:
54# ABS-NEXT:   lu12i.w $a0, %got_hi20(sym_got)
55# ABS-NEXT:   ori $a0, $a0, %got_lo12(sym_got)
56# ABS-NEXT:   lu32i.d $a0, %got64_lo20(sym_got)
57# ABS-NEXT:   lu52i.d $a0, $a0, %got64_hi12(sym_got)
58# ABS-NEXT:   ld.d $a0, $a0, 0
59# ABS-EMPTY:
60# RELOC-NEXT: R_LARCH_GOT_PC_HI20 sym_got 0x0
61# RELAX-NEXT: R_LARCH_RELAX - 0x0
62# RELOC-NEXT: R_LARCH_GOT_PC_LO12 sym_got 0x0
63# RELAX-NEXT: R_LARCH_RELAX - 0x0
64
65la.tls.le $a0, sym_le
66# CHECK-NEXT: lu12i.w $a0, %le_hi20(sym_le)
67# CHECK-NEXT: ori $a0, $a0, %le_lo12(sym_le)
68# CHECK-EMPTY:
69# ABS-NEXT:   lu12i.w $a0, %le_hi20(sym_le)
70# ABS-NEXT:   ori $a0, $a0, %le_lo12(sym_le)
71# ABS-EMPTY:
72# RELOC-NEXT: R_LARCH_TLS_LE_HI20 sym_le 0x0
73# RELOC-NEXT: R_LARCH_TLS_LE_LO12 sym_le 0x0
74
75la.tls.ie $a0, sym_ie
76# CHECK-NEXT: pcalau12i $a0, %ie_pc_hi20(sym_ie)
77# CHECK-NEXT: ld.d $a0, $a0, %ie_pc_lo12(sym_ie)
78# CHECK-EMPTY:
79# ABS-NEXT:   lu12i.w $a0, %ie_hi20(sym_ie)
80# ABS-NEXT:   ori $a0, $a0, %ie_lo12(sym_ie)
81# ABS-NEXT:   lu32i.d $a0, %ie64_lo20(sym_ie)
82# ABS-NEXT:   lu52i.d $a0, $a0, %ie64_hi12(sym_ie)
83# ABS-NEXT:   ld.d $a0, $a0, 0
84# ABS-EMPTY:
85# RELOC-NEXT: R_LARCH_TLS_IE_PC_HI20 sym_ie 0x0
86# RELAX-NEXT: R_LARCH_RELAX - 0x0
87# RELOC-NEXT: R_LARCH_TLS_IE_PC_LO12 sym_ie 0x0
88# RELAX-NEXT: R_LARCH_RELAX - 0x0
89
90la.tls.ld $a0, sym_ld
91# CHECK-NEXT: pcalau12i $a0, %ld_pc_hi20(sym_ld)
92# CHECK-NEXT: addi.d $a0, $a0, %got_pc_lo12(sym_ld)
93# CHECK-EMPTY:
94# ABS-NEXT:   lu12i.w $a0, %ld_hi20(sym_ld)
95# ABS-NEXT:   ori $a0, $a0, %got_lo12(sym_ld)
96# ABS-NEXT:   lu32i.d $a0, %got64_lo20(sym_ld)
97# ABS-NEXT:   lu52i.d $a0, $a0, %got64_hi12(sym_ld)
98# ABS-EMPTY:
99# RELOC-NEXT: R_LARCH_TLS_LD_PC_HI20 sym_ld 0x0
100# RELAX-NEXT: R_LARCH_RELAX - 0x0
101# RELOC-NEXT: R_LARCH_GOT_PC_LO12 sym_ld 0x0
102# RELAX-NEXT: R_LARCH_RELAX - 0x0
103
104la.tls.gd $a0, sym_gd
105# CHECK-NEXT: pcalau12i $a0, %gd_pc_hi20(sym_gd)
106# CHECK-NEXT: addi.d $a0, $a0, %got_pc_lo12(sym_gd)
107# CHECK-EMPTY:
108# ABS-NEXT:   lu12i.w $a0, %gd_hi20(sym_gd)
109# ABS-NEXT:   ori $a0, $a0, %got_lo12(sym_gd)
110# ABS-NEXT:   lu32i.d $a0, %got64_lo20(sym_gd)
111# ABS-NEXT:   lu52i.d $a0, $a0, %got64_hi12(sym_gd)
112# ABS-EMPTY:
113# RELOC-NEXT: R_LARCH_TLS_GD_PC_HI20 sym_gd 0x0
114# RELAX-NEXT: R_LARCH_RELAX - 0x0
115# RELOC-NEXT: R_LARCH_GOT_PC_LO12 sym_gd 0x0
116# RELAX-NEXT: R_LARCH_RELAX - 0x0
117
118la.tls.desc $a0, sym_desc
119# CHECK-NEXT: pcalau12i $a0, %desc_pc_hi20(sym_desc)
120# CHECK-NEXT: addi.d $a0, $a0, %desc_pc_lo12(sym_desc)
121# CHECK-NEXT: ld.d $ra, $a0, %desc_ld(sym_desc)
122# CHECK-NEXT: jirl $ra, $ra, %desc_call(sym_desc)
123# CHECK-EMPTY:
124# ABS-NEXT:   lu12i.w $a0, %desc_hi20(sym_desc)
125# ABS-NEXT:   ori $a0, $a0, %desc_lo12(sym_desc)
126# ABS-NEXT:   lu32i.d $a0, %desc64_lo20(sym_desc)
127# ABS-NEXT:   lu52i.d $a0, $a0, %desc64_hi12(sym_desc)
128# ABS-NEXT:   ld.d $ra, $a0, %desc_ld(sym_desc)
129# ABS-NEXT:   jirl $ra, $ra, %desc_call(sym_desc)
130# ABS-EMPTY:
131# RELOC-NEXT: R_LARCH_TLS_DESC_PC_HI20 sym_desc 0x0
132# RELAX-NEXT: R_LARCH_RELAX - 0x0
133# RELOC-NEXT: R_LARCH_TLS_DESC_PC_LO12 sym_desc 0x0
134# RELAX-NEXT: R_LARCH_RELAX - 0x0
135# RELOC-NEXT: R_LARCH_TLS_DESC_LD sym_desc 0x0
136# RELAX-NEXT: R_LARCH_RELAX - 0x0
137# RELOC-NEXT: R_LARCH_TLS_DESC_CALL sym_desc 0x0
138# RELAX-NEXT: R_LARCH_RELAX - 0x0
139
140#############################################################
141## with a temporary register.
142#############################################################
143la.pcrel $a0, $a1, sym_pcrel_large
144# CHECK-NEXT: pcalau12i $a0, %pc_hi20(sym_pcrel_large)
145# CHECK-NEXT: addi.d $a1, $zero, %pc_lo12(sym_pcrel_large)
146# CHECK-NEXT: lu32i.d $a1, %pc64_lo20(sym_pcrel_large)
147# CHECK-NEXT: lu52i.d $a1, $a1, %pc64_hi12(sym_pcrel_large)
148# CHECK-NEXT: add.d $a0, $a0, $a1
149# CHECK-EMPTY:
150# RELOC-NEXT: R_LARCH_PCALA_HI20 sym_pcrel_large 0x0
151# RELOC-NEXT: R_LARCH_PCALA_LO12 sym_pcrel_large 0x0
152# RELOC-NEXT: R_LARCH_PCALA64_LO20 sym_pcrel_large 0x0
153# RELOC-NEXT: R_LARCH_PCALA64_HI12 sym_pcrel_large 0x0
154
155la.got $a0, $a1, sym_got_large
156# CHECK-NEXT: pcalau12i $a0, %got_pc_hi20(sym_got_large)
157# CHECK-NEXT: addi.d $a1, $zero, %got_pc_lo12(sym_got_large)
158# CHECK-NEXT: lu32i.d $a1, %got64_pc_lo20(sym_got_large)
159# CHECK-NEXT: lu52i.d $a1, $a1, %got64_pc_hi12(sym_got_large)
160# CHECK-NEXT: ldx.d $a0, $a0, $a1
161# CHECK-EMPTY:
162# RELOC-NEXT: R_LARCH_GOT_PC_HI20 sym_got_large 0x0
163# RELOC-NEXT: R_LARCH_GOT_PC_LO12 sym_got_large 0x0
164# RELOC-NEXT: R_LARCH_GOT64_PC_LO20 sym_got_large 0x0
165# RELOC-NEXT: R_LARCH_GOT64_PC_HI12 sym_got_large 0x0
166
167la.tls.ie $a0, $a1, sym_ie_large
168# CHECK-NEXT: pcalau12i $a0, %ie_pc_hi20(sym_ie_large)
169# CHECK-NEXT: addi.d $a1, $zero, %ie_pc_lo12(sym_ie_large)
170# CHECK-NEXT: lu32i.d $a1, %ie64_pc_lo20(sym_ie_large)
171# CHECK-NEXT: lu52i.d $a1, $a1, %ie64_pc_hi12(sym_ie_large)
172# CHECK-NEXT: ldx.d $a0, $a0, $a1
173# CHECK-EMPTY:
174# RELOC-NEXT: R_LARCH_TLS_IE_PC_HI20 sym_ie_large 0x0
175# RELOC-NEXT: R_LARCH_TLS_IE_PC_LO12 sym_ie_large 0x0
176# RELOC-NEXT: R_LARCH_TLS_IE64_PC_LO20 sym_ie_large 0x0
177# RELOC-NEXT: R_LARCH_TLS_IE64_PC_HI12 sym_ie_large 0x0
178
179la.tls.ld $a0, $a1, sym_ld_large
180# CHECK-NEXT: pcalau12i $a0, %ld_pc_hi20(sym_ld_large)
181# CHECK-NEXT: addi.d $a1, $zero, %got_pc_lo12(sym_ld_large)
182# CHECK-NEXT: lu32i.d $a1, %got64_pc_lo20(sym_ld_large)
183# CHECK-NEXT: lu52i.d $a1, $a1, %got64_pc_hi12(sym_ld_large)
184# CHECK-NEXT: add.d $a0, $a0, $a1
185# CHECK-EMPTY:
186# RELOC-NEXT: R_LARCH_TLS_LD_PC_HI20 sym_ld_large 0x0
187# RELOC-NEXT: R_LARCH_GOT_PC_LO12 sym_ld_large 0x0
188# RELOC-NEXT: R_LARCH_GOT64_PC_LO20 sym_ld_large 0x0
189# RELOC-NEXT: R_LARCH_GOT64_PC_HI12 sym_ld_large 0x0
190
191la.tls.gd $a0, $a1, sym_gd_large
192# CHECK-NEXT: pcalau12i $a0, %gd_pc_hi20(sym_gd_large)
193# CHECK-NEXT: addi.d $a1, $zero, %got_pc_lo12(sym_gd_large)
194# CHECK-NEXT: lu32i.d $a1, %got64_pc_lo20(sym_gd_large)
195# CHECK-NEXT: lu52i.d $a1, $a1, %got64_pc_hi12(sym_gd_large)
196# CHECK-NEXT: add.d $a0, $a0, $a1
197# CHECK-EMPTY:
198# RELOC-NEXT: R_LARCH_TLS_GD_PC_HI20 sym_gd_large 0x0
199# RELOC-NEXT: R_LARCH_GOT_PC_LO12 sym_gd_large 0x0
200# RELOC-NEXT: R_LARCH_GOT64_PC_LO20 sym_gd_large 0x0
201# RELOC-NEXT: R_LARCH_GOT64_PC_HI12 sym_gd_large 0x0
202
203la.tls.desc $a0, $a1, sym_desc_large
204# CHECK-NEXT: pcalau12i $a0, %desc_pc_hi20(sym_desc_large)
205# CHECK-NEXT: addi.d $a1, $zero, %desc_pc_lo12(sym_desc_large)
206# CHECK-NEXT: lu32i.d $a1, %desc64_pc_lo20(sym_desc_large)
207# CHECK-NEXT: lu52i.d $a1, $a1, %desc64_pc_hi12(sym_desc_large)
208# CHECK-NEXT: add.d $a0, $a0, $a1
209# CHECK-NEXT: ld.d $ra, $a0, %desc_ld(sym_desc_large)
210# CHECK-NEXT: jirl $ra, $ra, %desc_call(sym_desc_large)
211# CHECK-EMPTY:
212# RELOC-NEXT: R_LARCH_TLS_DESC_PC_HI20 sym_desc_large 0x0
213# RELOC-NEXT: R_LARCH_TLS_DESC_PC_LO12 sym_desc_large 0x0
214# RELOC-NEXT: R_LARCH_TLS_DESC64_PC_LO20 sym_desc_large 0x0
215# RELOC-NEXT: R_LARCH_TLS_DESC64_PC_HI12 sym_desc_large 0x0
216# RELOC-NEXT: R_LARCH_TLS_DESC_LD sym_desc_large 0x0
217# RELOC-NEXT: R_LARCH_TLS_DESC_CALL sym_desc_large 0x0
218
219
220# RELOC-NEXT:   }
221# RELOC-NEXT: ]
222