xref: /llvm-project/llvm/test/MC/RISCV/rvi-pseudos.s (revision 9b55e5d42067c26c633298bbaca0c2802afe95ed)
1# RUN: llvm-mc %s -triple=riscv32 \
2# RUN:     | FileCheck %s --check-prefixes=CHECK,CHECK-NOPIC,CHECK-RV32
3# RUN: llvm-mc %s -triple=riscv64 \
4# RUN:     | FileCheck %s --check-prefixes=CHECK,CHECK-NOPIC,CHECK-RV64
5# RUN: llvm-mc %s -triple=riscv32 -position-independent \
6# RUN:   | FileCheck %s --check-prefixes=CHECK,CHECK-PIC,CHECK-RV32,CHECK-PIC-RV32
7# RUN: llvm-mc %s -triple=riscv64 -position-independent \
8# RUN:   | FileCheck %s --check-prefixes=CHECK,CHECK-PIC,CHECK-RV64,CHECK-PIC-RV64
9
10# CHECK: .Lpcrel_hi0:
11# CHECK: auipc a0, %pcrel_hi(a_symbol)
12# CHECK: addi  a0, a0, %pcrel_lo(.Lpcrel_hi0)
13lla a0, a_symbol
14
15# CHECK: .Lpcrel_hi1:
16# CHECK: auipc a1, %pcrel_hi(another_symbol)
17# CHECK: addi  a1, a1, %pcrel_lo(.Lpcrel_hi1)
18lla a1, another_symbol
19
20# Check that we can load the address of symbols that are spelled like a register
21# CHECK: .Lpcrel_hi2:
22# CHECK: auipc a2, %pcrel_hi(zero)
23# CHECK: addi  a2, a2, %pcrel_lo(.Lpcrel_hi2)
24lla a2, zero
25
26# CHECK: .Lpcrel_hi3:
27# CHECK: auipc a3, %pcrel_hi(ra)
28# CHECK: addi  a3, a3, %pcrel_lo(.Lpcrel_hi3)
29lla a3, ra
30
31# CHECK: .Lpcrel_hi4:
32# CHECK: auipc a4, %pcrel_hi(f1)
33# CHECK: addi  a4, a4, %pcrel_lo(.Lpcrel_hi4)
34lla a4, f1
35
36# CHECK: .Lpcrel_hi5:
37# CHECK: auipc a5, %pcrel_hi(a_symbol+2040)
38# CHECK: addi  a5, a5, %pcrel_lo(.Lpcrel_hi5)
39lla a5, a_symbol + (0xFF << 3)
40
41# CHECK:      .Lpcrel_hi6:
42# CHECK:      auipc a0, %got_pcrel_hi(a_symbol)
43# CHECK-RV32: lw    a0, %pcrel_lo(.Lpcrel_hi6)(a0)
44# CHECK-RV64: ld    a0, %pcrel_lo(.Lpcrel_hi6)(a0)
45lga a0, a_symbol
46
47# CHECK:      .Lpcrel_hi7:
48# CHECK:      auipc a1, %got_pcrel_hi(another_symbol)
49# CHECK-RV32: lw    a1, %pcrel_lo(.Lpcrel_hi7)(a1)
50# CHECK-RV64: ld    a1, %pcrel_lo(.Lpcrel_hi7)(a1)
51lga a1, another_symbol
52
53# CHECK:      .Lpcrel_hi8:
54# CHECK:      auipc a2, %got_pcrel_hi(zero)
55# CHECK-RV32: lw    a2, %pcrel_lo(.Lpcrel_hi8)(a2)
56# CHECK-RV64: ld    a2, %pcrel_lo(.Lpcrel_hi8)(a2)
57lga a2, zero
58
59# CHECK:      .Lpcrel_hi9:
60# CHECK:      auipc a3, %got_pcrel_hi(ra)
61# CHECK-RV32: lw    a3, %pcrel_lo(.Lpcrel_hi9)(a3)
62# CHECK-RV64: ld    a3, %pcrel_lo(.Lpcrel_hi9)(a3)
63lga a3, ra
64
65# CHECK:      .Lpcrel_hi10:
66# CHECK:      auipc a4, %got_pcrel_hi(f1)
67# CHECK-RV32: lw    a4, %pcrel_lo(.Lpcrel_hi10)(a4)
68# CHECK-RV64: ld    a4, %pcrel_lo(.Lpcrel_hi10)(a4)
69lga a4, f1
70
71# CHECK:      .Lpcrel_hi11:
72# CHECK:      auipc a5, %got_pcrel_hi(a_symbol+2040)
73# CHECK-RV32: lw    a5, %pcrel_lo(.Lpcrel_hi11)(a5)
74# CHECK-RV64: ld    a5, %pcrel_lo(.Lpcrel_hi11)(a5)
75lga a5, a_symbol + (0xFF << 3)
76
77# CHECK: .Lpcrel_hi12:
78# CHECK-NOPIC: auipc a0, %pcrel_hi(a_symbol)
79# CHECK-NOPIC: addi  a0, a0, %pcrel_lo(.Lpcrel_hi12)
80# CHECK-PIC:      auipc a0, %got_pcrel_hi(a_symbol)
81# CHECK-PIC-RV32: lw    a0, %pcrel_lo(.Lpcrel_hi12)(a0)
82# CHECK-PIC-RV64: ld    a0, %pcrel_lo(.Lpcrel_hi12)(a0)
83la a0, a_symbol
84
85# CHECK: .Lpcrel_hi13:
86# CHECK-NOPIC: auipc a1, %pcrel_hi(another_symbol)
87# CHECK-NOPIC: addi  a1, a1, %pcrel_lo(.Lpcrel_hi13)
88# CHECK-PIC:      auipc a1, %got_pcrel_hi(another_symbol)
89# CHECK-PIC-RV32: lw    a1, %pcrel_lo(.Lpcrel_hi13)(a1)
90# CHECK-PIC-RV64: ld    a1, %pcrel_lo(.Lpcrel_hi13)(a1)
91la a1, another_symbol
92
93# Check that we can load the address of symbols that are spelled like a register
94# CHECK: .Lpcrel_hi14:
95# CHECK-NOPIC: auipc a2, %pcrel_hi(zero)
96# CHECK-NOPIC: addi  a2, a2, %pcrel_lo(.Lpcrel_hi14)
97# CHECK-PIC:      auipc a2, %got_pcrel_hi(zero)
98# CHECK-PIC-RV32: lw    a2, %pcrel_lo(.Lpcrel_hi14)(a2)
99# CHECK-PIC-RV64: ld    a2, %pcrel_lo(.Lpcrel_hi14)(a2)
100la a2, zero
101
102# CHECK: .Lpcrel_hi15:
103# CHECK-NOPIC: auipc a3, %pcrel_hi(ra)
104# CHECK-NOPIC: addi  a3, a3, %pcrel_lo(.Lpcrel_hi15)
105# CHECK-PIC:      auipc a3, %got_pcrel_hi(ra)
106# CHECK-PIC-RV32: lw    a3, %pcrel_lo(.Lpcrel_hi15)(a3)
107# CHECK-PIC-RV64: ld    a3, %pcrel_lo(.Lpcrel_hi15)(a3)
108la a3, ra
109
110# CHECK: .Lpcrel_hi16:
111# CHECK-NOPIC: auipc a4, %pcrel_hi(f1)
112# CHECK-NOPIC: addi  a4, a4, %pcrel_lo(.Lpcrel_hi16)
113# CHECK-PIC:      auipc a4, %got_pcrel_hi(f1)
114# CHECK-PIC-RV32: lw    a4, %pcrel_lo(.Lpcrel_hi16)(a4)
115# CHECK-PIC-RV64: ld    a4, %pcrel_lo(.Lpcrel_hi16)(a4)
116la a4, f1
117
118# CHECK: .Lpcrel_hi17:
119# CHECK: auipc a0, %tls_ie_pcrel_hi(a_symbol)
120# CHECK-RV32: lw    a0, %pcrel_lo(.Lpcrel_hi17)(a0)
121# CHECK-RV64: ld    a0, %pcrel_lo(.Lpcrel_hi17)(a0)
122la.tls.ie a0, a_symbol
123
124# CHECK: .Lpcrel_hi18:
125# CHECK: auipc a1, %tls_ie_pcrel_hi(another_symbol)
126# CHECK-RV32: lw    a1, %pcrel_lo(.Lpcrel_hi18)(a1)
127# CHECK-RV64: ld    a1, %pcrel_lo(.Lpcrel_hi18)(a1)
128la.tls.ie a1, another_symbol
129
130# Check that we can load the address of symbols that are spelled like a register
131# CHECK: .Lpcrel_hi19:
132# CHECK: auipc a2, %tls_ie_pcrel_hi(zero)
133# CHECK-RV32: lw    a2, %pcrel_lo(.Lpcrel_hi19)(a2)
134# CHECK-RV64: ld    a2, %pcrel_lo(.Lpcrel_hi19)(a2)
135la.tls.ie a2, zero
136
137# CHECK: .Lpcrel_hi20:
138# CHECK: auipc a3, %tls_ie_pcrel_hi(ra)
139# CHECK-RV32: lw    a3, %pcrel_lo(.Lpcrel_hi20)(a3)
140# CHECK-RV64: ld    a3, %pcrel_lo(.Lpcrel_hi20)(a3)
141la.tls.ie a3, ra
142
143# CHECK: .Lpcrel_hi21:
144# CHECK: auipc a4, %tls_ie_pcrel_hi(f1)
145# CHECK-RV32: lw    a4, %pcrel_lo(.Lpcrel_hi21)(a4)
146# CHECK-RV64: ld    a4, %pcrel_lo(.Lpcrel_hi21)(a4)
147la.tls.ie a4, f1
148
149# CHECK: .Lpcrel_hi22:
150# CHECK: auipc a0, %tls_gd_pcrel_hi(a_symbol)
151# CHECK: addi  a0, a0, %pcrel_lo(.Lpcrel_hi22)
152la.tls.gd a0, a_symbol
153
154# CHECK: .Lpcrel_hi23:
155# CHECK: auipc a1, %tls_gd_pcrel_hi(another_symbol)
156# CHECK: addi  a1, a1, %pcrel_lo(.Lpcrel_hi23)
157la.tls.gd a1, another_symbol
158
159# Check that we can load the address of symbols that are spelled like a register
160# CHECK: .Lpcrel_hi24:
161# CHECK: auipc a2, %tls_gd_pcrel_hi(zero)
162# CHECK: addi  a2, a2, %pcrel_lo(.Lpcrel_hi24)
163la.tls.gd a2, zero
164
165# CHECK: .Lpcrel_hi25:
166# CHECK: auipc a3, %tls_gd_pcrel_hi(ra)
167# CHECK: addi  a3, a3, %pcrel_lo(.Lpcrel_hi25)
168la.tls.gd a3, ra
169
170# CHECK: .Lpcrel_hi26:
171# CHECK: auipc a4, %tls_gd_pcrel_hi(f1)
172# CHECK: addi  a4, a4, %pcrel_lo(.Lpcrel_hi26)
173la.tls.gd a4, f1
174
175# CHECK: .Lpcrel_hi27:
176# CHECK: auipc a0, %pcrel_hi(a_symbol)
177# CHECK: lb  a0, %pcrel_lo(.Lpcrel_hi27)(a0)
178lb a0, a_symbol
179
180# CHECK: .Lpcrel_hi28:
181# CHECK: auipc a1, %pcrel_hi(a_symbol)
182# CHECK: lh  a1, %pcrel_lo(.Lpcrel_hi28)(a1)
183lh a1, a_symbol
184
185# CHECK: .Lpcrel_hi29:
186# CHECK: auipc a2, %pcrel_hi(a_symbol)
187# CHECK: lhu  a2, %pcrel_lo(.Lpcrel_hi29)(a2)
188lhu a2, a_symbol
189
190# CHECK: .Lpcrel_hi30:
191# CHECK: auipc a3, %pcrel_hi(a_symbol)
192# CHECK: lw  a3, %pcrel_lo(.Lpcrel_hi30)(a3)
193lw a3, a_symbol
194
195# CHECK: .Lpcrel_hi31:
196# CHECK: auipc a4, %pcrel_hi(a_symbol)
197# CHECK: sb  a3, %pcrel_lo(.Lpcrel_hi31)(a4)
198sb a3, a_symbol, a4
199
200# CHECK: .Lpcrel_hi32:
201# CHECK: auipc a4, %pcrel_hi(a_symbol)
202# CHECK: sh  a3, %pcrel_lo(.Lpcrel_hi32)(a4)
203sh a3, a_symbol, a4
204
205# CHECK: .Lpcrel_hi33:
206# CHECK: auipc a4, %pcrel_hi(a_symbol)
207# CHECK: sw  a3, %pcrel_lo(.Lpcrel_hi33)(a4)
208sw a3, a_symbol, a4
209
210# Check that we can load the address of symbols that are spelled like a register
211# CHECK: .Lpcrel_hi34:
212# CHECK: auipc a2, %pcrel_hi(zero)
213# CHECK: lw  a2, %pcrel_lo(.Lpcrel_hi34)(a2)
214lw a2, zero
215
216# CHECK: .Lpcrel_hi35:
217# CHECK: auipc a4, %pcrel_hi(zero)
218# CHECK: sw  a3, %pcrel_lo(.Lpcrel_hi35)(a4)
219sw a3, zero, a4
220
221## Check that a complex expression can be simplified and matched.
222# CHECK: .Lpcrel_hi36:
223# CHECK: auipc a5, %pcrel_hi((255+a_symbol)-4)
224# CHECK: addi  a5, a5, %pcrel_lo(.Lpcrel_hi36)
225lla a5, (0xFF + a_symbol) - 4
226
227## Check that we don't double-parse a top-level minus.
228# CHECK: .Lpcrel_hi37:
229# CHECK: auipc a5, %pcrel_hi(a_symbol-4)
230# CHECK: addi  a5, a5, %pcrel_lo(.Lpcrel_hi37)
231lla a5, a_symbol - 4
232