1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc --mtriple=loongarch32 --mattr=+lasx --verify-machineinstrs < %s \
3 ; RUN: | FileCheck --check-prefix=LA32 %s
4 ; RUN: llc --mtriple=loongarch64 --mattr=+lasx --verify-machineinstrs < %s \
5 ; RUN: | FileCheck --check-prefix=LA64 %s
6 ; RUN: llc --mtriple=loongarch64 --mattr=+lasx --verify-machineinstrs \
7 ; RUN: --code-model=large < %s | FileCheck --check-prefix=LA64-LARGE %s
9 @g_i8 = dso_local global i8 0
11 define dso_local signext i8 @load_s8() nounwind {
12 ; LA32-LABEL: load_s8:
13 ; LA32: # %bb.0: # %entry
14 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i8)
15 ; LA32-NEXT: ld.b $a0, $a0, %pc_lo12(g_i8)
18 ; LA64-LABEL: load_s8:
19 ; LA64: # %bb.0: # %entry
20 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i8)
21 ; LA64-NEXT: ld.b $a0, $a0, %pc_lo12(g_i8)
24 ; LA64-LARGE-LABEL: load_s8:
25 ; LA64-LARGE: # %bb.0: # %entry
26 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i8)
27 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i8)
28 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i8)
29 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i8)
30 ; LA64-LARGE-NEXT: ldx.b $a0, $a1, $a0
31 ; LA64-LARGE-NEXT: ret
33 %0 = load i8, ptr @g_i8
37 define dso_local zeroext i8 @load_u8() nounwind {
38 ; LA32-LABEL: load_u8:
39 ; LA32: # %bb.0: # %entry
40 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i8)
41 ; LA32-NEXT: ld.bu $a0, $a0, %pc_lo12(g_i8)
44 ; LA64-LABEL: load_u8:
45 ; LA64: # %bb.0: # %entry
46 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i8)
47 ; LA64-NEXT: ld.bu $a0, $a0, %pc_lo12(g_i8)
50 ; LA64-LARGE-LABEL: load_u8:
51 ; LA64-LARGE: # %bb.0: # %entry
52 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i8)
53 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i8)
54 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i8)
55 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i8)
56 ; LA64-LARGE-NEXT: ldx.bu $a0, $a1, $a0
57 ; LA64-LARGE-NEXT: ret
59 %0 = load i8, ptr @g_i8
63 define dso_local void @store_i8() nounwind {
64 ; LA32-LABEL: store_i8:
65 ; LA32: # %bb.0: # %entry
66 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i8)
67 ; LA32-NEXT: ori $a1, $zero, 1
68 ; LA32-NEXT: st.b $a1, $a0, %pc_lo12(g_i8)
71 ; LA64-LABEL: store_i8:
72 ; LA64: # %bb.0: # %entry
73 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i8)
74 ; LA64-NEXT: ori $a1, $zero, 1
75 ; LA64-NEXT: st.b $a1, $a0, %pc_lo12(g_i8)
78 ; LA64-LARGE-LABEL: store_i8:
79 ; LA64-LARGE: # %bb.0: # %entry
80 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i8)
81 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i8)
82 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i8)
83 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i8)
84 ; LA64-LARGE-NEXT: ori $a2, $zero, 1
85 ; LA64-LARGE-NEXT: stx.b $a2, $a1, $a0
86 ; LA64-LARGE-NEXT: ret
92 @g_i16 = dso_local global i16 0
94 define dso_local signext i16 @load_s16() nounwind {
95 ; LA32-LABEL: load_s16:
96 ; LA32: # %bb.0: # %entry
97 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i16)
98 ; LA32-NEXT: ld.h $a0, $a0, %pc_lo12(g_i16)
101 ; LA64-LABEL: load_s16:
102 ; LA64: # %bb.0: # %entry
103 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i16)
104 ; LA64-NEXT: ld.h $a0, $a0, %pc_lo12(g_i16)
107 ; LA64-LARGE-LABEL: load_s16:
108 ; LA64-LARGE: # %bb.0: # %entry
109 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i16)
110 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i16)
111 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i16)
112 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i16)
113 ; LA64-LARGE-NEXT: ldx.h $a0, $a1, $a0
114 ; LA64-LARGE-NEXT: ret
116 %0 = load i16, ptr @g_i16
120 define dso_local zeroext i16 @load_u16() nounwind {
121 ; LA32-LABEL: load_u16:
122 ; LA32: # %bb.0: # %entry
123 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i16)
124 ; LA32-NEXT: ld.hu $a0, $a0, %pc_lo12(g_i16)
127 ; LA64-LABEL: load_u16:
128 ; LA64: # %bb.0: # %entry
129 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i16)
130 ; LA64-NEXT: ld.hu $a0, $a0, %pc_lo12(g_i16)
133 ; LA64-LARGE-LABEL: load_u16:
134 ; LA64-LARGE: # %bb.0: # %entry
135 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i16)
136 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i16)
137 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i16)
138 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i16)
139 ; LA64-LARGE-NEXT: ldx.hu $a0, $a1, $a0
140 ; LA64-LARGE-NEXT: ret
142 %0 = load i16, ptr @g_i16
146 define dso_local void @store_i16() nounwind {
147 ; LA32-LABEL: store_i16:
148 ; LA32: # %bb.0: # %entry
149 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i16)
150 ; LA32-NEXT: ori $a1, $zero, 1
151 ; LA32-NEXT: st.h $a1, $a0, %pc_lo12(g_i16)
154 ; LA64-LABEL: store_i16:
155 ; LA64: # %bb.0: # %entry
156 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i16)
157 ; LA64-NEXT: ori $a1, $zero, 1
158 ; LA64-NEXT: st.h $a1, $a0, %pc_lo12(g_i16)
161 ; LA64-LARGE-LABEL: store_i16:
162 ; LA64-LARGE: # %bb.0: # %entry
163 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i16)
164 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i16)
165 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i16)
166 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i16)
167 ; LA64-LARGE-NEXT: ori $a2, $zero, 1
168 ; LA64-LARGE-NEXT: stx.h $a2, $a1, $a0
169 ; LA64-LARGE-NEXT: ret
171 store i16 1, ptr @g_i16
175 @g_i32 = dso_local global i32 0
177 define dso_local signext i32 @load_s32() nounwind {
178 ; LA32-LABEL: load_s32:
179 ; LA32: # %bb.0: # %entry
180 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i32)
181 ; LA32-NEXT: ld.w $a0, $a0, %pc_lo12(g_i32)
184 ; LA64-LABEL: load_s32:
185 ; LA64: # %bb.0: # %entry
186 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i32)
187 ; LA64-NEXT: ld.w $a0, $a0, %pc_lo12(g_i32)
190 ; LA64-LARGE-LABEL: load_s32:
191 ; LA64-LARGE: # %bb.0: # %entry
192 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i32)
193 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i32)
194 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i32)
195 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i32)
196 ; LA64-LARGE-NEXT: ldx.w $a0, $a1, $a0
197 ; LA64-LARGE-NEXT: ret
199 %0 = load i32, ptr @g_i32
203 define dso_local zeroext i32 @load_u32() nounwind {
204 ; LA32-LABEL: load_u32:
205 ; LA32: # %bb.0: # %entry
206 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i32)
207 ; LA32-NEXT: ld.w $a0, $a0, %pc_lo12(g_i32)
210 ; LA64-LABEL: load_u32:
211 ; LA64: # %bb.0: # %entry
212 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i32)
213 ; LA64-NEXT: ld.wu $a0, $a0, %pc_lo12(g_i32)
216 ; LA64-LARGE-LABEL: load_u32:
217 ; LA64-LARGE: # %bb.0: # %entry
218 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i32)
219 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i32)
220 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i32)
221 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i32)
222 ; LA64-LARGE-NEXT: ldx.wu $a0, $a1, $a0
223 ; LA64-LARGE-NEXT: ret
225 %0 = load i32, ptr @g_i32
229 define dso_local void @store_i32() nounwind {
230 ; LA32-LABEL: store_i32:
231 ; LA32: # %bb.0: # %entry
232 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i32)
233 ; LA32-NEXT: ori $a1, $zero, 1
234 ; LA32-NEXT: st.w $a1, $a0, %pc_lo12(g_i32)
237 ; LA64-LABEL: store_i32:
238 ; LA64: # %bb.0: # %entry
239 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i32)
240 ; LA64-NEXT: ori $a1, $zero, 1
241 ; LA64-NEXT: st.w $a1, $a0, %pc_lo12(g_i32)
244 ; LA64-LARGE-LABEL: store_i32:
245 ; LA64-LARGE: # %bb.0: # %entry
246 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i32)
247 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i32)
248 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i32)
249 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i32)
250 ; LA64-LARGE-NEXT: ori $a2, $zero, 1
251 ; LA64-LARGE-NEXT: stx.w $a2, $a1, $a0
252 ; LA64-LARGE-NEXT: ret
254 store i32 1, ptr @g_i32
258 @g_i64 = dso_local global i64 0
260 define dso_local i64 @load_64() nounwind {
261 ; LA32-LABEL: load_64:
262 ; LA32: # %bb.0: # %entry
263 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i64)
264 ; LA32-NEXT: addi.w $a1, $a0, %pc_lo12(g_i64)
265 ; LA32-NEXT: ld.w $a0, $a1, 0
266 ; LA32-NEXT: ld.w $a1, $a1, 4
269 ; LA64-LABEL: load_64:
270 ; LA64: # %bb.0: # %entry
271 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i64)
272 ; LA64-NEXT: ld.d $a0, $a0, %pc_lo12(g_i64)
275 ; LA64-LARGE-LABEL: load_64:
276 ; LA64-LARGE: # %bb.0: # %entry
277 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i64)
278 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i64)
279 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i64)
280 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i64)
281 ; LA64-LARGE-NEXT: ldx.d $a0, $a1, $a0
282 ; LA64-LARGE-NEXT: ret
284 %0 = load i64, ptr @g_i64
288 define dso_local void @store_i64() nounwind {
289 ; LA32-LABEL: store_i64:
290 ; LA32: # %bb.0: # %entry
291 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i64)
292 ; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_i64)
293 ; LA32-NEXT: st.w $zero, $a0, 4
294 ; LA32-NEXT: ori $a1, $zero, 1
295 ; LA32-NEXT: st.w $a1, $a0, 0
298 ; LA64-LABEL: store_i64:
299 ; LA64: # %bb.0: # %entry
300 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i64)
301 ; LA64-NEXT: ori $a1, $zero, 1
302 ; LA64-NEXT: st.d $a1, $a0, %pc_lo12(g_i64)
305 ; LA64-LARGE-LABEL: store_i64:
306 ; LA64-LARGE: # %bb.0: # %entry
307 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i64)
308 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i64)
309 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i64)
310 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i64)
311 ; LA64-LARGE-NEXT: ori $a2, $zero, 1
312 ; LA64-LARGE-NEXT: stx.d $a2, $a1, $a0
313 ; LA64-LARGE-NEXT: ret
315 store i64 1, ptr @g_i64
319 @g_f32 = dso_local global float 0.0
321 define dso_local float @load_f32() nounwind {
322 ; LA32-LABEL: load_f32:
323 ; LA32: # %bb.0: # %entry
324 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_f32)
325 ; LA32-NEXT: fld.s $fa0, $a0, %pc_lo12(g_f32)
328 ; LA64-LABEL: load_f32:
329 ; LA64: # %bb.0: # %entry
330 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_f32)
331 ; LA64-NEXT: fld.s $fa0, $a0, %pc_lo12(g_f32)
334 ; LA64-LARGE-LABEL: load_f32:
335 ; LA64-LARGE: # %bb.0: # %entry
336 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_f32)
337 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_f32)
338 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_f32)
339 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_f32)
340 ; LA64-LARGE-NEXT: fldx.s $fa0, $a1, $a0
341 ; LA64-LARGE-NEXT: ret
343 %0 = load float, ptr @g_f32
347 define dso_local void @store_f32() nounwind {
348 ; LA32-LABEL: store_f32:
349 ; LA32: # %bb.0: # %entry
350 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_f32)
351 ; LA32-NEXT: lu12i.w $a1, 260096
352 ; LA32-NEXT: st.w $a1, $a0, %pc_lo12(g_f32)
355 ; LA64-LABEL: store_f32:
356 ; LA64: # %bb.0: # %entry
357 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_f32)
358 ; LA64-NEXT: lu12i.w $a1, 260096
359 ; LA64-NEXT: st.w $a1, $a0, %pc_lo12(g_f32)
362 ; LA64-LARGE-LABEL: store_f32:
363 ; LA64-LARGE: # %bb.0: # %entry
364 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_f32)
365 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_f32)
366 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_f32)
367 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_f32)
368 ; LA64-LARGE-NEXT: lu12i.w $a2, 260096
369 ; LA64-LARGE-NEXT: stx.w $a2, $a1, $a0
370 ; LA64-LARGE-NEXT: ret
372 store float 1.0, ptr @g_f32
376 @g_f64 = dso_local global double 0.0
378 define dso_local double @load_f64() nounwind {
379 ; LA32-LABEL: load_f64:
380 ; LA32: # %bb.0: # %entry
381 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_f64)
382 ; LA32-NEXT: fld.d $fa0, $a0, %pc_lo12(g_f64)
385 ; LA64-LABEL: load_f64:
386 ; LA64: # %bb.0: # %entry
387 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_f64)
388 ; LA64-NEXT: fld.d $fa0, $a0, %pc_lo12(g_f64)
391 ; LA64-LARGE-LABEL: load_f64:
392 ; LA64-LARGE: # %bb.0: # %entry
393 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_f64)
394 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_f64)
395 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_f64)
396 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_f64)
397 ; LA64-LARGE-NEXT: fldx.d $fa0, $a1, $a0
398 ; LA64-LARGE-NEXT: ret
400 %0 = load double, ptr @g_f64
404 define dso_local void @store_f64() nounwind {
405 ; LA32-LABEL: store_f64:
406 ; LA32: # %bb.0: # %entry
407 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_f64)
408 ; LA32-NEXT: vldi $vr0, -912
409 ; LA32-NEXT: fst.d $fa0, $a0, %pc_lo12(g_f64)
412 ; LA64-LABEL: store_f64:
413 ; LA64: # %bb.0: # %entry
414 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_f64)
415 ; LA64-NEXT: lu52i.d $a1, $zero, 1023
416 ; LA64-NEXT: st.d $a1, $a0, %pc_lo12(g_f64)
419 ; LA64-LARGE-LABEL: store_f64:
420 ; LA64-LARGE: # %bb.0: # %entry
421 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_f64)
422 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_f64)
423 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_f64)
424 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_f64)
425 ; LA64-LARGE-NEXT: lu52i.d $a2, $zero, 1023
426 ; LA64-LARGE-NEXT: stx.d $a2, $a1, $a0
427 ; LA64-LARGE-NEXT: ret
429 store double 1.0, ptr @g_f64
433 @g_m64 = dso_local global i64 0
435 define dso_local void @store_multi() nounwind {
436 ; LA32-LABEL: store_multi:
437 ; LA32: # %bb.0: # %entry
438 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_m64)
439 ; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_m64)
440 ; LA32-NEXT: st.w $zero, $a0, 4
441 ; LA32-NEXT: ori $a1, $zero, 1
442 ; LA32-NEXT: st.w $a1, $a0, 0
443 ; LA32-NEXT: st.w $zero, $a0, 4
444 ; LA32-NEXT: ori $a1, $zero, 2
445 ; LA32-NEXT: st.w $a1, $a0, 0
448 ; LA64-LABEL: store_multi:
449 ; LA64: # %bb.0: # %entry
450 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_m64)
451 ; LA64-NEXT: ori $a1, $zero, 1
452 ; LA64-NEXT: st.d $a1, $a0, %pc_lo12(g_m64)
453 ; LA64-NEXT: ori $a1, $zero, 2
454 ; LA64-NEXT: st.d $a1, $a0, %pc_lo12(g_m64)
457 ; LA64-LARGE-LABEL: store_multi:
458 ; LA64-LARGE: # %bb.0: # %entry
459 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_m64)
460 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_m64)
461 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_m64)
462 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_m64)
463 ; LA64-LARGE-NEXT: ori $a2, $zero, 1
464 ; LA64-LARGE-NEXT: stx.d $a2, $a1, $a0
465 ; LA64-LARGE-NEXT: ori $a2, $zero, 2
466 ; LA64-LARGE-NEXT: stx.d $a2, $a1, $a0
467 ; LA64-LARGE-NEXT: ret
469 store volatile i64 1, ptr @g_m64
470 store volatile i64 2, ptr @g_m64
474 @g_sf32 = dso_local global float 0.0
476 define dso_local void @store_sf32() nounwind {
477 ; LA32-LABEL: store_sf32:
478 ; LA32: # %bb.0: # %entry
479 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_sf32)
480 ; LA32-NEXT: fld.s $fa0, $a0, %pc_lo12(g_sf32)
481 ; LA32-NEXT: fst.s $fa0, $a0, %pc_lo12(g_sf32)
484 ; LA64-LABEL: store_sf32:
485 ; LA64: # %bb.0: # %entry
486 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_sf32)
487 ; LA64-NEXT: fld.s $fa0, $a0, %pc_lo12(g_sf32)
488 ; LA64-NEXT: fst.s $fa0, $a0, %pc_lo12(g_sf32)
491 ; LA64-LARGE-LABEL: store_sf32:
492 ; LA64-LARGE: # %bb.0: # %entry
493 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_sf32)
494 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_sf32)
495 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_sf32)
496 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_sf32)
497 ; LA64-LARGE-NEXT: fldx.s $fa0, $a1, $a0
498 ; LA64-LARGE-NEXT: fstx.s $fa0, $a1, $a0
499 ; LA64-LARGE-NEXT: ret
501 %0 = load float, ptr @g_sf32
502 store volatile float %0, ptr @g_sf32
506 @g_sf64 = dso_local global double 0.0
508 define dso_local void @store_sf64() nounwind {
509 ; LA32-LABEL: store_sf64:
510 ; LA32: # %bb.0: # %entry
511 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_sf64)
512 ; LA32-NEXT: fld.d $fa0, $a0, %pc_lo12(g_sf64)
513 ; LA32-NEXT: fst.d $fa0, $a0, %pc_lo12(g_sf64)
516 ; LA64-LABEL: store_sf64:
517 ; LA64: # %bb.0: # %entry
518 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_sf64)
519 ; LA64-NEXT: fld.d $fa0, $a0, %pc_lo12(g_sf64)
520 ; LA64-NEXT: fst.d $fa0, $a0, %pc_lo12(g_sf64)
523 ; LA64-LARGE-LABEL: store_sf64:
524 ; LA64-LARGE: # %bb.0: # %entry
525 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_sf64)
526 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_sf64)
527 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_sf64)
528 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_sf64)
529 ; LA64-LARGE-NEXT: fldx.d $fa0, $a1, $a0
530 ; LA64-LARGE-NEXT: fstx.d $fa0, $a1, $a0
531 ; LA64-LARGE-NEXT: ret
533 %0 = load double, ptr @g_sf64
534 store volatile double %0, ptr @g_sf64
538 @g_i32x4_src = dso_local global [4 x i32] zeroinitializer, align 16
539 @g_i32x4_dst = dso_local global [4 x i32] zeroinitializer, align 16
541 define dso_local void @copy_i32x4() nounwind {
542 ; LA32-LABEL: copy_i32x4:
543 ; LA32: # %bb.0: # %entry
544 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i32x4_src)
545 ; LA32-NEXT: vld $vr0, $a0, %pc_lo12(g_i32x4_src)
546 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i32x4_dst)
547 ; LA32-NEXT: vst $vr0, $a0, %pc_lo12(g_i32x4_dst)
550 ; LA64-LABEL: copy_i32x4:
551 ; LA64: # %bb.0: # %entry
552 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i32x4_src)
553 ; LA64-NEXT: vld $vr0, $a0, %pc_lo12(g_i32x4_src)
554 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i32x4_dst)
555 ; LA64-NEXT: vst $vr0, $a0, %pc_lo12(g_i32x4_dst)
558 ; LA64-LARGE-LABEL: copy_i32x4:
559 ; LA64-LARGE: # %bb.0: # %entry
560 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i32x4_src)
561 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i32x4_src)
562 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i32x4_src)
563 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i32x4_src)
564 ; LA64-LARGE-NEXT: vldx $vr0, $a1, $a0
565 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i32x4_dst)
566 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i32x4_dst)
567 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i32x4_dst)
568 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i32x4_dst)
569 ; LA64-LARGE-NEXT: vstx $vr0, $a1, $a0
570 ; LA64-LARGE-NEXT: ret
572 %0 = load <4 x i32>, ptr @g_i32x4_src, align 16
573 store <4 x i32> %0, ptr @g_i32x4_dst, align 16
577 @g_i32x8_src = dso_local global [8 x i32] zeroinitializer, align 32
578 @g_i32x8_dst = dso_local global [8 x i32] zeroinitializer, align 32
580 define dso_local void @copy_i32x8() nounwind {
581 ; LA32-LABEL: copy_i32x8:
582 ; LA32: # %bb.0: # %entry
583 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i32x4_src)
584 ; LA32-NEXT: xvld $xr0, $a0, %pc_lo12(g_i32x4_src)
585 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i32x4_dst)
586 ; LA32-NEXT: xvst $xr0, $a0, %pc_lo12(g_i32x4_dst)
589 ; LA64-LABEL: copy_i32x8:
590 ; LA64: # %bb.0: # %entry
591 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i32x4_src)
592 ; LA64-NEXT: xvld $xr0, $a0, %pc_lo12(g_i32x4_src)
593 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i32x4_dst)
594 ; LA64-NEXT: xvst $xr0, $a0, %pc_lo12(g_i32x4_dst)
597 ; LA64-LARGE-LABEL: copy_i32x8:
598 ; LA64-LARGE: # %bb.0: # %entry
599 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i32x4_src)
600 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i32x4_src)
601 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i32x4_src)
602 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i32x4_src)
603 ; LA64-LARGE-NEXT: xvldx $xr0, $a1, $a0
604 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i32x4_dst)
605 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i32x4_dst)
606 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i32x4_dst)
607 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i32x4_dst)
608 ; LA64-LARGE-NEXT: xvstx $xr0, $a1, $a0
609 ; LA64-LARGE-NEXT: ret
611 %0 = load <8 x i32>, ptr @g_i32x4_src, align 32
612 store <8 x i32> %0, ptr @g_i32x4_dst, align 32
616 @g_i8x16 = dso_local global <16 x i8> zeroinitializer, align 16
618 define void @copy_i8_to_i8x16() {
619 ; LA32-LABEL: copy_i8_to_i8x16:
620 ; LA32: # %bb.0: # %entry
621 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i8)
622 ; LA32-NEXT: vldrepl.b $vr0, $a0, %pc_lo12(g_i8)
623 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i8x16)
624 ; LA32-NEXT: vst $vr0, $a0, %pc_lo12(g_i8x16)
627 ; LA64-LABEL: copy_i8_to_i8x16:
628 ; LA64: # %bb.0: # %entry
629 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i8)
630 ; LA64-NEXT: vldrepl.b $vr0, $a0, %pc_lo12(g_i8)
631 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i8x16)
632 ; LA64-NEXT: vst $vr0, $a0, %pc_lo12(g_i8x16)
635 ; LA64-LARGE-LABEL: copy_i8_to_i8x16:
636 ; LA64-LARGE: # %bb.0: # %entry
637 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i8)
638 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i8)
639 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i8)
640 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i8)
641 ; LA64-LARGE-NEXT: add.d $a0, $a1, $a0
642 ; LA64-LARGE-NEXT: vldrepl.b $vr0, $a0, 0
643 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i8x16)
644 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i8x16)
645 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i8x16)
646 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i8x16)
647 ; LA64-LARGE-NEXT: vstx $vr0, $a1, $a0
648 ; LA64-LARGE-NEXT: ret
650 %0 = call <16 x i8> @llvm.loongarch.lsx.vldrepl.b(ptr @g_i8, i32 0)
651 store <16 x i8> %0, ptr @g_i8x16, align 16
655 @g_i8x32 = dso_local global <32 x i8> zeroinitializer, align 32
657 define void @copy_i8_to_i8x32() {
658 ; LA32-LABEL: copy_i8_to_i8x32:
659 ; LA32: # %bb.0: # %entry
660 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i8)
661 ; LA32-NEXT: xvldrepl.b $xr0, $a0, %pc_lo12(g_i8)
662 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_i8x32)
663 ; LA32-NEXT: xvst $xr0, $a0, %pc_lo12(g_i8x32)
666 ; LA64-LABEL: copy_i8_to_i8x32:
667 ; LA64: # %bb.0: # %entry
668 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i8)
669 ; LA64-NEXT: xvldrepl.b $xr0, $a0, %pc_lo12(g_i8)
670 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_i8x32)
671 ; LA64-NEXT: xvst $xr0, $a0, %pc_lo12(g_i8x32)
674 ; LA64-LARGE-LABEL: copy_i8_to_i8x32:
675 ; LA64-LARGE: # %bb.0: # %entry
676 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i8)
677 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i8)
678 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i8)
679 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i8)
680 ; LA64-LARGE-NEXT: add.d $a0, $a1, $a0
681 ; LA64-LARGE-NEXT: xvldrepl.b $xr0, $a0, 0
682 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_i8x32)
683 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_i8x32)
684 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_i8x32)
685 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_i8x32)
686 ; LA64-LARGE-NEXT: xvstx $xr0, $a1, $a0
687 ; LA64-LARGE-NEXT: ret
689 %0 = call <32 x i8> @llvm.loongarch.lasx.xvldrepl.b(ptr @g_i8, i32 0)
690 store <32 x i8> %0, ptr @g_i8x32, align 32
694 @g_rmw = dso_local global i64 0
696 define dso_local void @rmw() nounwind {
698 ; LA32: # %bb.0: # %entry
699 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_rmw)
700 ; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_rmw)
701 ; LA32-NEXT: ld.w $a1, $a0, 0
702 ; LA32-NEXT: ld.w $a2, $a0, 4
703 ; LA32-NEXT: addi.w $a1, $a1, 1
704 ; LA32-NEXT: sltui $a3, $a1, 1
705 ; LA32-NEXT: add.w $a2, $a2, $a3
706 ; LA32-NEXT: st.w $a1, $a0, 0
707 ; LA32-NEXT: st.w $a2, $a0, 4
711 ; LA64: # %bb.0: # %entry
712 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_rmw)
713 ; LA64-NEXT: ld.d $a1, $a0, %pc_lo12(g_rmw)
714 ; LA64-NEXT: addi.d $a1, $a1, 1
715 ; LA64-NEXT: st.d $a1, $a0, %pc_lo12(g_rmw)
718 ; LA64-LARGE-LABEL: rmw:
719 ; LA64-LARGE: # %bb.0: # %entry
720 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_rmw)
721 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_rmw)
722 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_rmw)
723 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_rmw)
724 ; LA64-LARGE-NEXT: ldx.d $a2, $a1, $a0
725 ; LA64-LARGE-NEXT: addi.d $a2, $a2, 1
726 ; LA64-LARGE-NEXT: stx.d $a2, $a1, $a0
727 ; LA64-LARGE-NEXT: ret
729 %0 = load i64, ptr @g_rmw
731 store i64 %1, ptr @g_rmw
735 @g_a32 = dso_local global [2048 x i32] zeroinitializer, align 4
737 define dso_local void @store_a32() nounwind {
738 ; LA32-LABEL: store_a32:
739 ; LA32: # %bb.0: # %entry
740 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a32+4096)
741 ; LA32-NEXT: ori $a1, $zero, 1
742 ; LA32-NEXT: st.w $a1, $a0, %pc_lo12(g_a32+4096)
745 ; LA64-LABEL: store_a32:
746 ; LA64: # %bb.0: # %entry
747 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a32+4096)
748 ; LA64-NEXT: ori $a1, $zero, 1
749 ; LA64-NEXT: st.w $a1, $a0, %pc_lo12(g_a32+4096)
752 ; LA64-LARGE-LABEL: store_a32:
753 ; LA64-LARGE: # %bb.0: # %entry
754 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a32+4096)
755 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a32+4096)
756 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a32+4096)
757 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a32+4096)
758 ; LA64-LARGE-NEXT: ori $a2, $zero, 1
759 ; LA64-LARGE-NEXT: stx.w $a2, $a1, $a0
760 ; LA64-LARGE-NEXT: ret
762 store i32 1, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1024), align 4
766 define dso_local void @store_a32_2() nounwind {
767 ; LA32-LABEL: store_a32_2:
768 ; LA32: # %bb.0: # %entry
769 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a32)
770 ; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a32)
771 ; LA32-NEXT: lu12i.w $a1, 1
772 ; LA32-NEXT: add.w $a2, $a0, $a1
773 ; LA32-NEXT: ori $a3, $zero, 1
774 ; LA32-NEXT: st.w $a3, $a2, 0
775 ; LA32-NEXT: ori $a1, $a1, 8
776 ; LA32-NEXT: add.w $a0, $a0, $a1
777 ; LA32-NEXT: ori $a1, $zero, 2
778 ; LA32-NEXT: st.w $a1, $a0, 0
781 ; LA64-LABEL: store_a32_2:
782 ; LA64: # %bb.0: # %entry
783 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a32)
784 ; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a32)
785 ; LA64-NEXT: ori $a1, $zero, 1
786 ; LA64-NEXT: stptr.w $a1, $a0, 4096
787 ; LA64-NEXT: ori $a1, $zero, 2
788 ; LA64-NEXT: stptr.w $a1, $a0, 4104
791 ; LA64-LARGE-LABEL: store_a32_2:
792 ; LA64-LARGE: # %bb.0: # %entry
793 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a32)
794 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a32)
795 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a32)
796 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a32)
797 ; LA64-LARGE-NEXT: add.d $a0, $a1, $a0
798 ; LA64-LARGE-NEXT: ori $a1, $zero, 1
799 ; LA64-LARGE-NEXT: stptr.w $a1, $a0, 4096
800 ; LA64-LARGE-NEXT: ori $a1, $zero, 2
801 ; LA64-LARGE-NEXT: stptr.w $a1, $a0, 4104
802 ; LA64-LARGE-NEXT: ret
804 store i32 1, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1024), align 4
805 store i32 2, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1026), align 4
809 define dso_local void @control_flow_with_mem_access() nounwind {
810 ; LA32-LABEL: control_flow_with_mem_access:
811 ; LA32: # %bb.0: # %entry
812 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a32+4)
813 ; LA32-NEXT: ld.w $a1, $a0, %pc_lo12(g_a32+4)
814 ; LA32-NEXT: ori $a2, $zero, 1
815 ; LA32-NEXT: blt $a1, $a2, .LBB25_2
816 ; LA32-NEXT: # %bb.1: # %if.then
817 ; LA32-NEXT: ori $a1, $zero, 10
818 ; LA32-NEXT: st.w $a1, $a0, %pc_lo12(g_a32+4)
819 ; LA32-NEXT: .LBB25_2: # %if.end
822 ; LA64-LABEL: control_flow_with_mem_access:
823 ; LA64: # %bb.0: # %entry
824 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a32+4)
825 ; LA64-NEXT: ld.w $a1, $a0, %pc_lo12(g_a32+4)
826 ; LA64-NEXT: ori $a2, $zero, 1
827 ; LA64-NEXT: blt $a1, $a2, .LBB25_2
828 ; LA64-NEXT: # %bb.1: # %if.then
829 ; LA64-NEXT: ori $a1, $zero, 10
830 ; LA64-NEXT: st.w $a1, $a0, %pc_lo12(g_a32+4)
831 ; LA64-NEXT: .LBB25_2: # %if.end
834 ; LA64-LARGE-LABEL: control_flow_with_mem_access:
835 ; LA64-LARGE: # %bb.0: # %entry
836 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a32+4)
837 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a32+4)
838 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a32+4)
839 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a32+4)
840 ; LA64-LARGE-NEXT: ldx.w $a0, $a1, $a0
841 ; LA64-LARGE-NEXT: ori $a1, $zero, 1
842 ; LA64-LARGE-NEXT: blt $a0, $a1, .LBB25_2
843 ; LA64-LARGE-NEXT: # %bb.1: # %if.then
844 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a32+4)
845 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a32+4)
846 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a32+4)
847 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a32+4)
848 ; LA64-LARGE-NEXT: ori $a2, $zero, 10
849 ; LA64-LARGE-NEXT: stx.w $a2, $a1, $a0
850 ; LA64-LARGE-NEXT: .LBB25_2: # %if.end
851 ; LA64-LARGE-NEXT: ret
853 %0 = load i32, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1), align 4
854 %cmp = icmp sgt i32 %0, 0
855 br i1 %cmp, label %if.then, label %if.end
858 store i32 10, ptr getelementptr inbounds ([1 x i32], ptr @g_a32, i32 1), align 4
865 define dso_local ptr @load_ba_1() nounwind {
866 ; LA32-LABEL: load_ba_1:
867 ; LA32: # %bb.0: # %entry
868 ; LA32-NEXT: .Ltmp0: # Block address taken
869 ; LA32-NEXT: # %bb.1: # %label
870 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(.Ltmp0)
871 ; LA32-NEXT: ld.w $a0, $a0, %pc_lo12(.Ltmp0)
874 ; LA64-LABEL: load_ba_1:
875 ; LA64: # %bb.0: # %entry
876 ; LA64-NEXT: .Ltmp0: # Block address taken
877 ; LA64-NEXT: # %bb.1: # %label
878 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(.Ltmp0)
879 ; LA64-NEXT: ld.d $a0, $a0, %pc_lo12(.Ltmp0)
882 ; LA64-LARGE-LABEL: load_ba_1:
883 ; LA64-LARGE: # %bb.0: # %entry
884 ; LA64-LARGE-NEXT: .Ltmp0: # Block address taken
885 ; LA64-LARGE-NEXT: # %bb.1: # %label
886 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(.Ltmp0)
887 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(.Ltmp0)
888 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(.Ltmp0)
889 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(.Ltmp0)
890 ; LA64-LARGE-NEXT: ldx.d $a0, $a1, $a0
891 ; LA64-LARGE-NEXT: ret
895 %0 = load ptr, ptr blockaddress(@load_ba_1, %label)
899 define dso_local ptr @load_ba_2() nounwind {
900 ; LA32-LABEL: load_ba_2:
901 ; LA32: # %bb.0: # %entry
902 ; LA32-NEXT: .Ltmp1: # Block address taken
903 ; LA32-NEXT: # %bb.1: # %label
904 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(.Ltmp1+8)
905 ; LA32-NEXT: ld.w $a0, $a0, %pc_lo12(.Ltmp1+8)
908 ; LA64-LABEL: load_ba_2:
909 ; LA64: # %bb.0: # %entry
910 ; LA64-NEXT: .Ltmp1: # Block address taken
911 ; LA64-NEXT: # %bb.1: # %label
912 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(.Ltmp1+8)
913 ; LA64-NEXT: ld.d $a0, $a0, %pc_lo12(.Ltmp1+8)
916 ; LA64-LARGE-LABEL: load_ba_2:
917 ; LA64-LARGE: # %bb.0: # %entry
918 ; LA64-LARGE-NEXT: .Ltmp1: # Block address taken
919 ; LA64-LARGE-NEXT: # %bb.1: # %label
920 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(.Ltmp1+8)
921 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(.Ltmp1+8)
922 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(.Ltmp1+8)
923 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(.Ltmp1+8)
924 ; LA64-LARGE-NEXT: ldx.d $a0, $a1, $a0
925 ; LA64-LARGE-NEXT: ret
929 %0 = load ptr, ptr getelementptr inbounds (i8, ptr blockaddress(@load_ba_2, %label), i32 8)
933 @g_a64 = dso_local global [614750729487779976 x i64] zeroinitializer, align 8
935 define dso_local ptr @load_addr_offset_1() nounwind {
936 ; LA32-LABEL: load_addr_offset_1:
937 ; LA32: # %bb.0: # %entry
938 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8)
939 ; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+8)
942 ; LA64-LABEL: load_addr_offset_1:
943 ; LA64: # %bb.0: # %entry
944 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8)
945 ; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64+8)
948 ; LA64-LARGE-LABEL: load_addr_offset_1:
949 ; LA64-LARGE: # %bb.0: # %entry
950 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8)
951 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+8)
952 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+8)
953 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+8)
954 ; LA64-LARGE-NEXT: add.d $a0, $a1, $a0
955 ; LA64-LARGE-NEXT: ret
957 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 1)
960 define dso_local ptr @load_addr_offset_257() nounwind {
961 ; LA32-LABEL: load_addr_offset_257:
962 ; LA32: # %bb.0: # %entry
963 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2056)
964 ; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+2056)
967 ; LA64-LABEL: load_addr_offset_257:
968 ; LA64: # %bb.0: # %entry
969 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2056)
970 ; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64+2056)
973 ; LA64-LARGE-LABEL: load_addr_offset_257:
974 ; LA64-LARGE: # %bb.0: # %entry
975 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2056)
976 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+2056)
977 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+2056)
978 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+2056)
979 ; LA64-LARGE-NEXT: add.d $a0, $a1, $a0
980 ; LA64-LARGE-NEXT: ret
982 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 257)
985 define dso_local ptr @load_addr_offset_1048576() nounwind {
986 ; LA32-LABEL: load_addr_offset_1048576:
987 ; LA32: # %bb.0: # %entry
988 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8388608)
989 ; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+8388608)
992 ; LA64-LABEL: load_addr_offset_1048576:
993 ; LA64: # %bb.0: # %entry
994 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8388608)
995 ; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64+8388608)
998 ; LA64-LARGE-LABEL: load_addr_offset_1048576:
999 ; LA64-LARGE: # %bb.0: # %entry
1000 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8388608)
1001 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+8388608)
1002 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+8388608)
1003 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+8388608)
1004 ; LA64-LARGE-NEXT: add.d $a0, $a1, $a0
1005 ; LA64-LARGE-NEXT: ret
1007 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 1048576)
1010 define dso_local ptr @load_addr_offset_1048577() nounwind {
1011 ; LA32-LABEL: load_addr_offset_1048577:
1012 ; LA32: # %bb.0: # %entry
1013 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8388616)
1014 ; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+8388616)
1017 ; LA64-LABEL: load_addr_offset_1048577:
1018 ; LA64: # %bb.0: # %entry
1019 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8388616)
1020 ; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64+8388616)
1023 ; LA64-LARGE-LABEL: load_addr_offset_1048577:
1024 ; LA64-LARGE: # %bb.0: # %entry
1025 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+8388616)
1026 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+8388616)
1027 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+8388616)
1028 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+8388616)
1029 ; LA64-LARGE-NEXT: add.d $a0, $a1, $a0
1030 ; LA64-LARGE-NEXT: ret
1032 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 1048577)
1035 define dso_local ptr @load_addr_offset_268432896() nounwind {
1036 ; LA32-LABEL: load_addr_offset_268432896:
1037 ; LA32: # %bb.0: # %entry
1038 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2147463168)
1039 ; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+2147463168)
1042 ; LA64-LABEL: load_addr_offset_268432896:
1043 ; LA64: # %bb.0: # %entry
1044 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2147463168)
1045 ; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64+2147463168)
1048 ; LA64-LARGE-LABEL: load_addr_offset_268432896:
1049 ; LA64-LARGE: # %bb.0: # %entry
1050 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2147463168)
1051 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+2147463168)
1052 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+2147463168)
1053 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+2147463168)
1054 ; LA64-LARGE-NEXT: add.d $a0, $a1, $a0
1055 ; LA64-LARGE-NEXT: ret
1057 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 268432896)
1060 define dso_local ptr @load_addr_offset_268432897() nounwind {
1061 ; LA32-LABEL: load_addr_offset_268432897:
1062 ; LA32: # %bb.0: # %entry
1063 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2147463176)
1064 ; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+2147463176)
1067 ; LA64-LABEL: load_addr_offset_268432897:
1068 ; LA64: # %bb.0: # %entry
1069 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2147463176)
1070 ; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64+2147463176)
1073 ; LA64-LARGE-LABEL: load_addr_offset_268432897:
1074 ; LA64-LARGE: # %bb.0: # %entry
1075 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2147463176)
1076 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+2147463176)
1077 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+2147463176)
1078 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+2147463176)
1079 ; LA64-LARGE-NEXT: add.d $a0, $a1, $a0
1080 ; LA64-LARGE-NEXT: ret
1082 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 268432897)
1085 define dso_local ptr @load_addr_offset_281474439839744() nounwind {
1086 ; LA32-LABEL: load_addr_offset_281474439839744:
1087 ; LA32: # %bb.0: # %entry
1088 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64)
1089 ; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64)
1092 ; LA64-LABEL: load_addr_offset_281474439839744:
1093 ; LA64: # %bb.0: # %entry
1094 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64)
1095 ; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64)
1096 ; LA64-NEXT: ori $a1, $zero, 0
1097 ; LA64-NEXT: lu32i.d $a1, 524287
1098 ; LA64-NEXT: add.d $a0, $a0, $a1
1101 ; LA64-LARGE-LABEL: load_addr_offset_281474439839744:
1102 ; LA64-LARGE: # %bb.0: # %entry
1103 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2251795518717952)
1104 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+2251795518717952)
1105 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+2251795518717952)
1106 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+2251795518717952)
1107 ; LA64-LARGE-NEXT: add.d $a0, $a1, $a0
1108 ; LA64-LARGE-NEXT: ret
1110 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 281474439839744)
1113 define dso_local ptr @load_addr_offset_248792680471040() nounwind {
1114 ; LA32-LABEL: load_addr_offset_248792680471040:
1115 ; LA32: # %bb.0: # %entry
1116 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+2059194368)
1117 ; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+2059194368)
1120 ; LA64-LABEL: load_addr_offset_248792680471040:
1121 ; LA64: # %bb.0: # %entry
1122 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64)
1123 ; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64)
1124 ; LA64-NEXT: lu12i.w $a1, 502733
1125 ; LA64-NEXT: lu32i.d $a1, 463412
1126 ; LA64-NEXT: add.d $a0, $a0, $a1
1129 ; LA64-LARGE-LABEL: load_addr_offset_248792680471040:
1130 ; LA64-LARGE: # %bb.0: # %entry
1131 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+1990341443768320)
1132 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+1990341443768320)
1133 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+1990341443768320)
1134 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+1990341443768320)
1135 ; LA64-LARGE-NEXT: add.d $a0, $a1, $a0
1136 ; LA64-LARGE-NEXT: ret
1138 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 248792680471040)
1141 define dso_local ptr @load_addr_offset_9380351707272() nounwind {
1142 ; LA32-LABEL: load_addr_offset_9380351707272:
1143 ; LA32: # %bb.0: # %entry
1144 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+1145062464)
1145 ; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+1145062464)
1148 ; LA64-LABEL: load_addr_offset_9380351707272:
1149 ; LA64: # %bb.0: # %entry
1150 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64)
1151 ; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64)
1152 ; LA64-NEXT: lu12i.w $a1, 279556
1153 ; LA64-NEXT: ori $a1, $a1, 1088
1154 ; LA64-NEXT: lu32i.d $a1, 17472
1155 ; LA64-NEXT: add.d $a0, $a0, $a1
1158 ; LA64-LARGE-LABEL: load_addr_offset_9380351707272:
1159 ; LA64-LARGE: # %bb.0: # %entry
1160 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+75042813658176)
1161 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+75042813658176)
1162 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+75042813658176)
1163 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+75042813658176)
1164 ; LA64-LARGE-NEXT: add.d $a0, $a1, $a0
1165 ; LA64-LARGE-NEXT: ret
1167 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 9380351707272)
1170 define dso_local ptr @load_addr_offset_562949953421312() nounwind {
1171 ; LA32-LABEL: load_addr_offset_562949953421312:
1172 ; LA32: # %bb.0: # %entry
1173 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64)
1174 ; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64)
1177 ; LA64-LABEL: load_addr_offset_562949953421312:
1178 ; LA64: # %bb.0: # %entry
1179 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64)
1180 ; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64)
1181 ; LA64-NEXT: lu52i.d $a1, $zero, 1
1182 ; LA64-NEXT: add.d $a0, $a0, $a1
1185 ; LA64-LARGE-LABEL: load_addr_offset_562949953421312:
1186 ; LA64-LARGE: # %bb.0: # %entry
1187 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+4503599627370496)
1188 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+4503599627370496)
1189 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+4503599627370496)
1190 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+4503599627370496)
1191 ; LA64-LARGE-NEXT: add.d $a0, $a1, $a0
1192 ; LA64-LARGE-NEXT: ret
1194 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 562949953421312)
1197 define dso_local ptr @load_addr_offset_614749556925924693() nounwind {
1198 ; LA32-LABEL: load_addr_offset_614749556925924693:
1199 ; LA32: # %bb.0: # %entry
1200 ; LA32-NEXT: pcalau12i $a0, %pc_hi20(g_a64+858794664)
1201 ; LA32-NEXT: addi.w $a0, $a0, %pc_lo12(g_a64+858794664)
1204 ; LA64-LABEL: load_addr_offset_614749556925924693:
1205 ; LA64: # %bb.0: # %entry
1206 ; LA64-NEXT: pcalau12i $a0, %pc_hi20(g_a64)
1207 ; LA64-NEXT: addi.d $a0, $a0, %pc_lo12(g_a64)
1208 ; LA64-NEXT: lu12i.w $a1, 209666
1209 ; LA64-NEXT: ori $a1, $a1, 2728
1210 ; LA64-NEXT: lu32i.d $a1, 15288
1211 ; LA64-NEXT: lu52i.d $a1, $a1, 1092
1212 ; LA64-NEXT: add.d $a0, $a0, $a1
1215 ; LA64-LARGE-LABEL: load_addr_offset_614749556925924693:
1216 ; LA64-LARGE: # %bb.0: # %entry
1217 ; LA64-LARGE-NEXT: pcalau12i $a0, %pc_hi20(g_a64+4917996455407397544)
1218 ; LA64-LARGE-NEXT: addi.d $a1, $zero, %pc_lo12(g_a64+4917996455407397544)
1219 ; LA64-LARGE-NEXT: lu32i.d $a1, %pc64_lo20(g_a64+4917996455407397544)
1220 ; LA64-LARGE-NEXT: lu52i.d $a1, $a1, %pc64_hi12(g_a64+4917996455407397544)
1221 ; LA64-LARGE-NEXT: add.d $a0, $a1, $a0
1222 ; LA64-LARGE-NEXT: ret
1224 ret ptr getelementptr inbounds ([1 x i64], ptr @g_a64, i64 614749556925924693)