[ELF] Reorder SectionBase/InputSectionBase members
[llvm-project.git] / llvm / test / CodeGen / LoongArch / ir-instruction / load-store-atomic.ll
blob9ef74e4960ce7cb4f65d3cefba625d18f79f3f60
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA32
3 ; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA64
5 define i8 @load_acquire_i8(ptr %ptr) {
6 ; LA32-LABEL: load_acquire_i8:
7 ; LA32:       # %bb.0:
8 ; LA32-NEXT:    ld.b $a0, $a0, 0
9 ; LA32-NEXT:    dbar 20
10 ; LA32-NEXT:    ret
12 ; LA64-LABEL: load_acquire_i8:
13 ; LA64:       # %bb.0:
14 ; LA64-NEXT:    ld.b $a0, $a0, 0
15 ; LA64-NEXT:    dbar 20
16 ; LA64-NEXT:    ret
17   %val = load atomic i8, ptr %ptr acquire, align 1
18   ret i8 %val
21 define i16 @load_acquire_i16(ptr %ptr) {
22 ; LA32-LABEL: load_acquire_i16:
23 ; LA32:       # %bb.0:
24 ; LA32-NEXT:    ld.h $a0, $a0, 0
25 ; LA32-NEXT:    dbar 20
26 ; LA32-NEXT:    ret
28 ; LA64-LABEL: load_acquire_i16:
29 ; LA64:       # %bb.0:
30 ; LA64-NEXT:    ld.h $a0, $a0, 0
31 ; LA64-NEXT:    dbar 20
32 ; LA64-NEXT:    ret
33   %val = load atomic i16, ptr %ptr acquire, align 2
34   ret i16 %val
37 define i32 @load_acquire_i32(ptr %ptr) {
38 ; LA32-LABEL: load_acquire_i32:
39 ; LA32:       # %bb.0:
40 ; LA32-NEXT:    ld.w $a0, $a0, 0
41 ; LA32-NEXT:    dbar 20
42 ; LA32-NEXT:    ret
44 ; LA64-LABEL: load_acquire_i32:
45 ; LA64:       # %bb.0:
46 ; LA64-NEXT:    ld.w $a0, $a0, 0
47 ; LA64-NEXT:    dbar 20
48 ; LA64-NEXT:    ret
49   %val = load atomic i32, ptr %ptr acquire, align 4
50   ret i32 %val
53 define i64 @load_acquire_i64(ptr %ptr) {
54 ; LA32-LABEL: load_acquire_i64:
55 ; LA32:       # %bb.0:
56 ; LA32-NEXT:    addi.w $sp, $sp, -16
57 ; LA32-NEXT:    .cfi_def_cfa_offset 16
58 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
59 ; LA32-NEXT:    .cfi_offset 1, -4
60 ; LA32-NEXT:    ori $a1, $zero, 2
61 ; LA32-NEXT:    bl %plt(__atomic_load_8)
62 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
63 ; LA32-NEXT:    addi.w $sp, $sp, 16
64 ; LA32-NEXT:    ret
66 ; LA64-LABEL: load_acquire_i64:
67 ; LA64:       # %bb.0:
68 ; LA64-NEXT:    ld.d $a0, $a0, 0
69 ; LA64-NEXT:    dbar 20
70 ; LA64-NEXT:    ret
71   %val = load atomic i64, ptr %ptr acquire, align 8
72   ret i64 %val
75 define ptr @load_acquire_ptr(ptr %ptr) {
76 ; LA32-LABEL: load_acquire_ptr:
77 ; LA32:       # %bb.0:
78 ; LA32-NEXT:    ld.w $a0, $a0, 0
79 ; LA32-NEXT:    dbar 20
80 ; LA32-NEXT:    ret
82 ; LA64-LABEL: load_acquire_ptr:
83 ; LA64:       # %bb.0:
84 ; LA64-NEXT:    ld.d $a0, $a0, 0
85 ; LA64-NEXT:    dbar 20
86 ; LA64-NEXT:    ret
87   %val = load atomic ptr, ptr %ptr acquire, align 8
88   ret ptr %val
91 define float @load_acquire_float(ptr %ptr) {
92 ; LA32-LABEL: load_acquire_float:
93 ; LA32:       # %bb.0:
94 ; LA32-NEXT:    ld.w $a0, $a0, 0
95 ; LA32-NEXT:    movgr2fr.w $fa0, $a0
96 ; LA32-NEXT:    dbar 20
97 ; LA32-NEXT:    ret
99 ; LA64-LABEL: load_acquire_float:
100 ; LA64:       # %bb.0:
101 ; LA64-NEXT:    ld.w $a0, $a0, 0
102 ; LA64-NEXT:    movgr2fr.w $fa0, $a0
103 ; LA64-NEXT:    dbar 20
104 ; LA64-NEXT:    ret
105   %val = load atomic float, ptr %ptr acquire, align 8
106   ret float %val
109 define double @load_acquire_double(ptr %ptr) {
110 ; LA32-LABEL: load_acquire_double:
111 ; LA32:       # %bb.0:
112 ; LA32-NEXT:    addi.w $sp, $sp, -16
113 ; LA32-NEXT:    .cfi_def_cfa_offset 16
114 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
115 ; LA32-NEXT:    .cfi_offset 1, -4
116 ; LA32-NEXT:    ori $a1, $zero, 2
117 ; LA32-NEXT:    bl %plt(__atomic_load_8)
118 ; LA32-NEXT:    st.w $a1, $sp, 4
119 ; LA32-NEXT:    st.w $a0, $sp, 0
120 ; LA32-NEXT:    fld.d $fa0, $sp, 0
121 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
122 ; LA32-NEXT:    addi.w $sp, $sp, 16
123 ; LA32-NEXT:    ret
125 ; LA64-LABEL: load_acquire_double:
126 ; LA64:       # %bb.0:
127 ; LA64-NEXT:    ld.d $a0, $a0, 0
128 ; LA64-NEXT:    movgr2fr.d $fa0, $a0
129 ; LA64-NEXT:    dbar 20
130 ; LA64-NEXT:    ret
131   %val = load atomic double, ptr %ptr acquire, align 8
132   ret double %val
135 define i8 @load_unordered_i8(ptr %ptr) {
136 ; LA32-LABEL: load_unordered_i8:
137 ; LA32:       # %bb.0:
138 ; LA32-NEXT:    ld.b $a0, $a0, 0
139 ; LA32-NEXT:    ret
141 ; LA64-LABEL: load_unordered_i8:
142 ; LA64:       # %bb.0:
143 ; LA64-NEXT:    ld.b $a0, $a0, 0
144 ; LA64-NEXT:    ret
145   %val = load atomic i8, ptr %ptr unordered, align 1
146   ret i8 %val
149 define i16 @load_unordered_i16(ptr %ptr) {
150 ; LA32-LABEL: load_unordered_i16:
151 ; LA32:       # %bb.0:
152 ; LA32-NEXT:    ld.h $a0, $a0, 0
153 ; LA32-NEXT:    ret
155 ; LA64-LABEL: load_unordered_i16:
156 ; LA64:       # %bb.0:
157 ; LA64-NEXT:    ld.h $a0, $a0, 0
158 ; LA64-NEXT:    ret
159   %val = load atomic i16, ptr %ptr unordered, align 2
160   ret i16 %val
163 define i32 @load_unordered_i32(ptr %ptr) {
164 ; LA32-LABEL: load_unordered_i32:
165 ; LA32:       # %bb.0:
166 ; LA32-NEXT:    ld.w $a0, $a0, 0
167 ; LA32-NEXT:    ret
169 ; LA64-LABEL: load_unordered_i32:
170 ; LA64:       # %bb.0:
171 ; LA64-NEXT:    ld.w $a0, $a0, 0
172 ; LA64-NEXT:    ret
173   %val = load atomic i32, ptr %ptr unordered, align 4
174   ret i32 %val
177 define i64 @load_unordered_i64(ptr %ptr) {
178 ; LA32-LABEL: load_unordered_i64:
179 ; LA32:       # %bb.0:
180 ; LA32-NEXT:    addi.w $sp, $sp, -16
181 ; LA32-NEXT:    .cfi_def_cfa_offset 16
182 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
183 ; LA32-NEXT:    .cfi_offset 1, -4
184 ; LA32-NEXT:    move $a1, $zero
185 ; LA32-NEXT:    bl %plt(__atomic_load_8)
186 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
187 ; LA32-NEXT:    addi.w $sp, $sp, 16
188 ; LA32-NEXT:    ret
190 ; LA64-LABEL: load_unordered_i64:
191 ; LA64:       # %bb.0:
192 ; LA64-NEXT:    ld.d $a0, $a0, 0
193 ; LA64-NEXT:    ret
194   %val = load atomic i64, ptr %ptr unordered, align 8
195   ret i64 %val
198 define ptr @load_unordered_ptr(ptr %ptr) {
199 ; LA32-LABEL: load_unordered_ptr:
200 ; LA32:       # %bb.0:
201 ; LA32-NEXT:    ld.w $a0, $a0, 0
202 ; LA32-NEXT:    ret
204 ; LA64-LABEL: load_unordered_ptr:
205 ; LA64:       # %bb.0:
206 ; LA64-NEXT:    ld.d $a0, $a0, 0
207 ; LA64-NEXT:    ret
208   %val = load atomic ptr, ptr %ptr unordered, align 8
209   ret ptr %val
212 define float @load_unordered_float(ptr %ptr) {
213 ; LA32-LABEL: load_unordered_float:
214 ; LA32:       # %bb.0:
215 ; LA32-NEXT:    ld.w $a0, $a0, 0
216 ; LA32-NEXT:    movgr2fr.w $fa0, $a0
217 ; LA32-NEXT:    ret
219 ; LA64-LABEL: load_unordered_float:
220 ; LA64:       # %bb.0:
221 ; LA64-NEXT:    ld.w $a0, $a0, 0
222 ; LA64-NEXT:    movgr2fr.w $fa0, $a0
223 ; LA64-NEXT:    ret
224   %val = load atomic float, ptr %ptr unordered, align 8
225   ret float %val
228 define double @load_unordered_double(ptr %ptr) {
229 ; LA32-LABEL: load_unordered_double:
230 ; LA32:       # %bb.0:
231 ; LA32-NEXT:    addi.w $sp, $sp, -16
232 ; LA32-NEXT:    .cfi_def_cfa_offset 16
233 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
234 ; LA32-NEXT:    .cfi_offset 1, -4
235 ; LA32-NEXT:    move $a1, $zero
236 ; LA32-NEXT:    bl %plt(__atomic_load_8)
237 ; LA32-NEXT:    st.w $a1, $sp, 4
238 ; LA32-NEXT:    st.w $a0, $sp, 0
239 ; LA32-NEXT:    fld.d $fa0, $sp, 0
240 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
241 ; LA32-NEXT:    addi.w $sp, $sp, 16
242 ; LA32-NEXT:    ret
244 ; LA64-LABEL: load_unordered_double:
245 ; LA64:       # %bb.0:
246 ; LA64-NEXT:    ld.d $a0, $a0, 0
247 ; LA64-NEXT:    movgr2fr.d $fa0, $a0
248 ; LA64-NEXT:    ret
249   %val = load atomic double, ptr %ptr unordered, align 8
250   ret double %val
253 define i8 @load_monotonic_i8(ptr %ptr) {
254 ; LA32-LABEL: load_monotonic_i8:
255 ; LA32:       # %bb.0:
256 ; LA32-NEXT:    ld.b $a0, $a0, 0
257 ; LA32-NEXT:    ret
259 ; LA64-LABEL: load_monotonic_i8:
260 ; LA64:       # %bb.0:
261 ; LA64-NEXT:    ld.b $a0, $a0, 0
262 ; LA64-NEXT:    ret
263   %val = load atomic i8, ptr %ptr monotonic, align 1
264   ret i8 %val
267 define i16 @load_monotonic_i16(ptr %ptr) {
268 ; LA32-LABEL: load_monotonic_i16:
269 ; LA32:       # %bb.0:
270 ; LA32-NEXT:    ld.h $a0, $a0, 0
271 ; LA32-NEXT:    ret
273 ; LA64-LABEL: load_monotonic_i16:
274 ; LA64:       # %bb.0:
275 ; LA64-NEXT:    ld.h $a0, $a0, 0
276 ; LA64-NEXT:    ret
277   %val = load atomic i16, ptr %ptr monotonic, align 2
278   ret i16 %val
281 define i32 @load_monotonic_i32(ptr %ptr) {
282 ; LA32-LABEL: load_monotonic_i32:
283 ; LA32:       # %bb.0:
284 ; LA32-NEXT:    ld.w $a0, $a0, 0
285 ; LA32-NEXT:    ret
287 ; LA64-LABEL: load_monotonic_i32:
288 ; LA64:       # %bb.0:
289 ; LA64-NEXT:    ld.w $a0, $a0, 0
290 ; LA64-NEXT:    ret
291   %val = load atomic i32, ptr %ptr monotonic, align 4
292   ret i32 %val
295 define i64 @load_monotonic_i64(ptr %ptr) {
296 ; LA32-LABEL: load_monotonic_i64:
297 ; LA32:       # %bb.0:
298 ; LA32-NEXT:    addi.w $sp, $sp, -16
299 ; LA32-NEXT:    .cfi_def_cfa_offset 16
300 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
301 ; LA32-NEXT:    .cfi_offset 1, -4
302 ; LA32-NEXT:    move $a1, $zero
303 ; LA32-NEXT:    bl %plt(__atomic_load_8)
304 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
305 ; LA32-NEXT:    addi.w $sp, $sp, 16
306 ; LA32-NEXT:    ret
308 ; LA64-LABEL: load_monotonic_i64:
309 ; LA64:       # %bb.0:
310 ; LA64-NEXT:    ld.d $a0, $a0, 0
311 ; LA64-NEXT:    ret
312   %val = load atomic i64, ptr %ptr monotonic, align 8
313   ret i64 %val
316 define ptr @load_monotonic_ptr(ptr %ptr) {
317 ; LA32-LABEL: load_monotonic_ptr:
318 ; LA32:       # %bb.0:
319 ; LA32-NEXT:    ld.w $a0, $a0, 0
320 ; LA32-NEXT:    ret
322 ; LA64-LABEL: load_monotonic_ptr:
323 ; LA64:       # %bb.0:
324 ; LA64-NEXT:    ld.d $a0, $a0, 0
325 ; LA64-NEXT:    ret
326   %val = load atomic ptr, ptr %ptr monotonic, align 8
327   ret ptr %val
330 define float @load_monotonic_float(ptr %ptr) {
331 ; LA32-LABEL: load_monotonic_float:
332 ; LA32:       # %bb.0:
333 ; LA32-NEXT:    ld.w $a0, $a0, 0
334 ; LA32-NEXT:    movgr2fr.w $fa0, $a0
335 ; LA32-NEXT:    ret
337 ; LA64-LABEL: load_monotonic_float:
338 ; LA64:       # %bb.0:
339 ; LA64-NEXT:    ld.w $a0, $a0, 0
340 ; LA64-NEXT:    movgr2fr.w $fa0, $a0
341 ; LA64-NEXT:    ret
342   %val = load atomic float, ptr %ptr monotonic, align 8
343   ret float %val
346 define double @load_monotonic_double(ptr %ptr) {
347 ; LA32-LABEL: load_monotonic_double:
348 ; LA32:       # %bb.0:
349 ; LA32-NEXT:    addi.w $sp, $sp, -16
350 ; LA32-NEXT:    .cfi_def_cfa_offset 16
351 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
352 ; LA32-NEXT:    .cfi_offset 1, -4
353 ; LA32-NEXT:    move $a1, $zero
354 ; LA32-NEXT:    bl %plt(__atomic_load_8)
355 ; LA32-NEXT:    st.w $a1, $sp, 4
356 ; LA32-NEXT:    st.w $a0, $sp, 0
357 ; LA32-NEXT:    fld.d $fa0, $sp, 0
358 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
359 ; LA32-NEXT:    addi.w $sp, $sp, 16
360 ; LA32-NEXT:    ret
362 ; LA64-LABEL: load_monotonic_double:
363 ; LA64:       # %bb.0:
364 ; LA64-NEXT:    ld.d $a0, $a0, 0
365 ; LA64-NEXT:    movgr2fr.d $fa0, $a0
366 ; LA64-NEXT:    ret
367   %val = load atomic double, ptr %ptr monotonic, align 8
368   ret double %val
371 define i8 @load_seq_cst_i8(ptr %ptr) {
372 ; LA32-LABEL: load_seq_cst_i8:
373 ; LA32:       # %bb.0:
374 ; LA32-NEXT:    ld.b $a0, $a0, 0
375 ; LA32-NEXT:    dbar 16
376 ; LA32-NEXT:    ret
378 ; LA64-LABEL: load_seq_cst_i8:
379 ; LA64:       # %bb.0:
380 ; LA64-NEXT:    ld.b $a0, $a0, 0
381 ; LA64-NEXT:    dbar 16
382 ; LA64-NEXT:    ret
383   %val = load atomic i8, ptr %ptr seq_cst, align 1
384   ret i8 %val
387 define i16 @load_seq_cst_i16(ptr %ptr) {
388 ; LA32-LABEL: load_seq_cst_i16:
389 ; LA32:       # %bb.0:
390 ; LA32-NEXT:    ld.h $a0, $a0, 0
391 ; LA32-NEXT:    dbar 16
392 ; LA32-NEXT:    ret
394 ; LA64-LABEL: load_seq_cst_i16:
395 ; LA64:       # %bb.0:
396 ; LA64-NEXT:    ld.h $a0, $a0, 0
397 ; LA64-NEXT:    dbar 16
398 ; LA64-NEXT:    ret
399   %val = load atomic i16, ptr %ptr seq_cst, align 2
400   ret i16 %val
403 define i32 @load_seq_cst_i32(ptr %ptr) {
404 ; LA32-LABEL: load_seq_cst_i32:
405 ; LA32:       # %bb.0:
406 ; LA32-NEXT:    ld.w $a0, $a0, 0
407 ; LA32-NEXT:    dbar 16
408 ; LA32-NEXT:    ret
410 ; LA64-LABEL: load_seq_cst_i32:
411 ; LA64:       # %bb.0:
412 ; LA64-NEXT:    ld.w $a0, $a0, 0
413 ; LA64-NEXT:    dbar 16
414 ; LA64-NEXT:    ret
415   %val = load atomic i32, ptr %ptr seq_cst, align 4
416   ret i32 %val
419 define i64 @load_seq_cst_i64(ptr %ptr) {
420 ; LA32-LABEL: load_seq_cst_i64:
421 ; LA32:       # %bb.0:
422 ; LA32-NEXT:    addi.w $sp, $sp, -16
423 ; LA32-NEXT:    .cfi_def_cfa_offset 16
424 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
425 ; LA32-NEXT:    .cfi_offset 1, -4
426 ; LA32-NEXT:    ori $a1, $zero, 5
427 ; LA32-NEXT:    bl %plt(__atomic_load_8)
428 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
429 ; LA32-NEXT:    addi.w $sp, $sp, 16
430 ; LA32-NEXT:    ret
432 ; LA64-LABEL: load_seq_cst_i64:
433 ; LA64:       # %bb.0:
434 ; LA64-NEXT:    ld.d $a0, $a0, 0
435 ; LA64-NEXT:    dbar 16
436 ; LA64-NEXT:    ret
437   %val = load atomic i64, ptr %ptr seq_cst, align 8
438   ret i64 %val
441 define ptr @load_seq_cst_ptr(ptr %ptr) {
442 ; LA32-LABEL: load_seq_cst_ptr:
443 ; LA32:       # %bb.0:
444 ; LA32-NEXT:    ld.w $a0, $a0, 0
445 ; LA32-NEXT:    dbar 16
446 ; LA32-NEXT:    ret
448 ; LA64-LABEL: load_seq_cst_ptr:
449 ; LA64:       # %bb.0:
450 ; LA64-NEXT:    ld.d $a0, $a0, 0
451 ; LA64-NEXT:    dbar 16
452 ; LA64-NEXT:    ret
453   %val = load atomic ptr, ptr %ptr seq_cst, align 8
454   ret ptr %val
457 define float @load_seq_cst_float(ptr %ptr) {
458 ; LA32-LABEL: load_seq_cst_float:
459 ; LA32:       # %bb.0:
460 ; LA32-NEXT:    ld.w $a0, $a0, 0
461 ; LA32-NEXT:    movgr2fr.w $fa0, $a0
462 ; LA32-NEXT:    dbar 16
463 ; LA32-NEXT:    ret
465 ; LA64-LABEL: load_seq_cst_float:
466 ; LA64:       # %bb.0:
467 ; LA64-NEXT:    ld.w $a0, $a0, 0
468 ; LA64-NEXT:    movgr2fr.w $fa0, $a0
469 ; LA64-NEXT:    dbar 16
470 ; LA64-NEXT:    ret
471   %val = load atomic float, ptr %ptr seq_cst, align 8
472   ret float %val
475 define double @load_seq_cst_double(ptr %ptr) {
476 ; LA32-LABEL: load_seq_cst_double:
477 ; LA32:       # %bb.0:
478 ; LA32-NEXT:    addi.w $sp, $sp, -16
479 ; LA32-NEXT:    .cfi_def_cfa_offset 16
480 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
481 ; LA32-NEXT:    .cfi_offset 1, -4
482 ; LA32-NEXT:    ori $a1, $zero, 5
483 ; LA32-NEXT:    bl %plt(__atomic_load_8)
484 ; LA32-NEXT:    st.w $a1, $sp, 4
485 ; LA32-NEXT:    st.w $a0, $sp, 0
486 ; LA32-NEXT:    fld.d $fa0, $sp, 0
487 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
488 ; LA32-NEXT:    addi.w $sp, $sp, 16
489 ; LA32-NEXT:    ret
491 ; LA64-LABEL: load_seq_cst_double:
492 ; LA64:       # %bb.0:
493 ; LA64-NEXT:    ld.d $a0, $a0, 0
494 ; LA64-NEXT:    movgr2fr.d $fa0, $a0
495 ; LA64-NEXT:    dbar 16
496 ; LA64-NEXT:    ret
497   %val = load atomic double, ptr %ptr seq_cst, align 8
498   ret double %val
501 define void @store_release_i8(ptr %ptr, i8 signext %v) {
502 ; LA32-LABEL: store_release_i8:
503 ; LA32:       # %bb.0:
504 ; LA32-NEXT:    dbar 18
505 ; LA32-NEXT:    st.b $a1, $a0, 0
506 ; LA32-NEXT:    ret
508 ; LA64-LABEL: store_release_i8:
509 ; LA64:       # %bb.0:
510 ; LA64-NEXT:    dbar 18
511 ; LA64-NEXT:    st.b $a1, $a0, 0
512 ; LA64-NEXT:    ret
513   store atomic i8 %v, ptr %ptr release, align 1
514   ret void
517 define void @store_release_i16(ptr %ptr, i16 signext %v) {
518 ; LA32-LABEL: store_release_i16:
519 ; LA32:       # %bb.0:
520 ; LA32-NEXT:    dbar 18
521 ; LA32-NEXT:    st.h $a1, $a0, 0
522 ; LA32-NEXT:    ret
524 ; LA64-LABEL: store_release_i16:
525 ; LA64:       # %bb.0:
526 ; LA64-NEXT:    dbar 18
527 ; LA64-NEXT:    st.h $a1, $a0, 0
528 ; LA64-NEXT:    ret
529   store atomic i16 %v, ptr %ptr release, align 2
530   ret void
533 define void @store_release_i32(ptr %ptr, i32 signext %v) {
534 ; LA32-LABEL: store_release_i32:
535 ; LA32:       # %bb.0:
536 ; LA32-NEXT:    dbar 18
537 ; LA32-NEXT:    st.w $a1, $a0, 0
538 ; LA32-NEXT:    ret
540 ; LA64-LABEL: store_release_i32:
541 ; LA64:       # %bb.0:
542 ; LA64-NEXT:    amswap_db.w $zero, $a1, $a0
543 ; LA64-NEXT:    ret
544   store atomic i32 %v, ptr %ptr release, align 4
545   ret void
548 define void @store_release_i64(ptr %ptr, i64 %v) {
549 ; LA32-LABEL: store_release_i64:
550 ; LA32:       # %bb.0:
551 ; LA32-NEXT:    addi.w $sp, $sp, -16
552 ; LA32-NEXT:    .cfi_def_cfa_offset 16
553 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
554 ; LA32-NEXT:    .cfi_offset 1, -4
555 ; LA32-NEXT:    ori $a3, $zero, 3
556 ; LA32-NEXT:    bl %plt(__atomic_store_8)
557 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
558 ; LA32-NEXT:    addi.w $sp, $sp, 16
559 ; LA32-NEXT:    ret
561 ; LA64-LABEL: store_release_i64:
562 ; LA64:       # %bb.0:
563 ; LA64-NEXT:    amswap_db.d $zero, $a1, $a0
564 ; LA64-NEXT:    ret
565   store atomic i64 %v, ptr %ptr release, align 8
566   ret void
569 define void @store_release_ptr(ptr %ptr, ptr %v) {
570 ; LA32-LABEL: store_release_ptr:
571 ; LA32:       # %bb.0:
572 ; LA32-NEXT:    dbar 18
573 ; LA32-NEXT:    st.w $a1, $a0, 0
574 ; LA32-NEXT:    ret
576 ; LA64-LABEL: store_release_ptr:
577 ; LA64:       # %bb.0:
578 ; LA64-NEXT:    amswap_db.d $zero, $a1, $a0
579 ; LA64-NEXT:    ret
580   store atomic ptr %v, ptr %ptr release, align 8
581   ret void
584 define void @store_release_float(ptr %ptr, float %v) {
585 ; LA32-LABEL: store_release_float:
586 ; LA32:       # %bb.0:
587 ; LA32-NEXT:    movfr2gr.s $a1, $fa0
588 ; LA32-NEXT:    dbar 18
589 ; LA32-NEXT:    st.w $a1, $a0, 0
590 ; LA32-NEXT:    ret
592 ; LA64-LABEL: store_release_float:
593 ; LA64:       # %bb.0:
594 ; LA64-NEXT:    movfr2gr.s $a1, $fa0
595 ; LA64-NEXT:    amswap_db.w $zero, $a1, $a0
596 ; LA64-NEXT:    ret
597   store atomic float %v, ptr %ptr release, align 8
598   ret void
601 define void @store_release_double(ptr %ptr, double %v) {
602 ; LA32-LABEL: store_release_double:
603 ; LA32:       # %bb.0:
604 ; LA32-NEXT:    addi.w $sp, $sp, -16
605 ; LA32-NEXT:    .cfi_def_cfa_offset 16
606 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
607 ; LA32-NEXT:    .cfi_offset 1, -4
608 ; LA32-NEXT:    fst.d $fa0, $sp, 0
609 ; LA32-NEXT:    ld.w $a1, $sp, 0
610 ; LA32-NEXT:    ld.w $a2, $sp, 4
611 ; LA32-NEXT:    ori $a3, $zero, 3
612 ; LA32-NEXT:    bl %plt(__atomic_store_8)
613 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
614 ; LA32-NEXT:    addi.w $sp, $sp, 16
615 ; LA32-NEXT:    ret
617 ; LA64-LABEL: store_release_double:
618 ; LA64:       # %bb.0:
619 ; LA64-NEXT:    movfr2gr.d $a1, $fa0
620 ; LA64-NEXT:    amswap_db.d $zero, $a1, $a0
621 ; LA64-NEXT:    ret
622   store atomic double %v, ptr %ptr release, align 8
623   ret void
626 define void @store_unordered_i8(ptr %ptr, i8 signext %v) {
627 ; LA32-LABEL: store_unordered_i8:
628 ; LA32:       # %bb.0:
629 ; LA32-NEXT:    st.b $a1, $a0, 0
630 ; LA32-NEXT:    ret
632 ; LA64-LABEL: store_unordered_i8:
633 ; LA64:       # %bb.0:
634 ; LA64-NEXT:    st.b $a1, $a0, 0
635 ; LA64-NEXT:    ret
636   store atomic i8 %v, ptr %ptr unordered, align 1
637   ret void
640 define void @store_unordered_i16(ptr %ptr, i16 signext %v) {
641 ; LA32-LABEL: store_unordered_i16:
642 ; LA32:       # %bb.0:
643 ; LA32-NEXT:    st.h $a1, $a0, 0
644 ; LA32-NEXT:    ret
646 ; LA64-LABEL: store_unordered_i16:
647 ; LA64:       # %bb.0:
648 ; LA64-NEXT:    st.h $a1, $a0, 0
649 ; LA64-NEXT:    ret
650   store atomic i16 %v, ptr %ptr unordered, align 2
651   ret void
654 define void @store_unordered_i32(ptr %ptr, i32 signext %v) {
655 ; LA32-LABEL: store_unordered_i32:
656 ; LA32:       # %bb.0:
657 ; LA32-NEXT:    st.w $a1, $a0, 0
658 ; LA32-NEXT:    ret
660 ; LA64-LABEL: store_unordered_i32:
661 ; LA64:       # %bb.0:
662 ; LA64-NEXT:    st.w $a1, $a0, 0
663 ; LA64-NEXT:    ret
664   store atomic i32 %v, ptr %ptr unordered, align 4
665   ret void
668 define void @store_unordered_i64(ptr %ptr, i64 %v) {
669 ; LA32-LABEL: store_unordered_i64:
670 ; LA32:       # %bb.0:
671 ; LA32-NEXT:    addi.w $sp, $sp, -16
672 ; LA32-NEXT:    .cfi_def_cfa_offset 16
673 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
674 ; LA32-NEXT:    .cfi_offset 1, -4
675 ; LA32-NEXT:    move $a3, $zero
676 ; LA32-NEXT:    bl %plt(__atomic_store_8)
677 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
678 ; LA32-NEXT:    addi.w $sp, $sp, 16
679 ; LA32-NEXT:    ret
681 ; LA64-LABEL: store_unordered_i64:
682 ; LA64:       # %bb.0:
683 ; LA64-NEXT:    st.d $a1, $a0, 0
684 ; LA64-NEXT:    ret
685   store atomic i64 %v, ptr %ptr unordered, align 8
686   ret void
689 define void @store_unordered_ptr(ptr %ptr, ptr %v) {
690 ; LA32-LABEL: store_unordered_ptr:
691 ; LA32:       # %bb.0:
692 ; LA32-NEXT:    st.w $a1, $a0, 0
693 ; LA32-NEXT:    ret
695 ; LA64-LABEL: store_unordered_ptr:
696 ; LA64:       # %bb.0:
697 ; LA64-NEXT:    st.d $a1, $a0, 0
698 ; LA64-NEXT:    ret
699   store atomic ptr %v, ptr %ptr unordered, align 8
700   ret void
703 define void @store_unordered_float(ptr %ptr, float %v) {
704 ; LA32-LABEL: store_unordered_float:
705 ; LA32:       # %bb.0:
706 ; LA32-NEXT:    movfr2gr.s $a1, $fa0
707 ; LA32-NEXT:    st.w $a1, $a0, 0
708 ; LA32-NEXT:    ret
710 ; LA64-LABEL: store_unordered_float:
711 ; LA64:       # %bb.0:
712 ; LA64-NEXT:    movfr2gr.s $a1, $fa0
713 ; LA64-NEXT:    st.w $a1, $a0, 0
714 ; LA64-NEXT:    ret
715   store atomic float %v, ptr %ptr unordered, align 8
716   ret void
719 define void @store_unordered_double(ptr %ptr, double %v) {
720 ; LA32-LABEL: store_unordered_double:
721 ; LA32:       # %bb.0:
722 ; LA32-NEXT:    addi.w $sp, $sp, -16
723 ; LA32-NEXT:    .cfi_def_cfa_offset 16
724 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
725 ; LA32-NEXT:    .cfi_offset 1, -4
726 ; LA32-NEXT:    fst.d $fa0, $sp, 0
727 ; LA32-NEXT:    ld.w $a1, $sp, 0
728 ; LA32-NEXT:    ld.w $a2, $sp, 4
729 ; LA32-NEXT:    move $a3, $zero
730 ; LA32-NEXT:    bl %plt(__atomic_store_8)
731 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
732 ; LA32-NEXT:    addi.w $sp, $sp, 16
733 ; LA32-NEXT:    ret
735 ; LA64-LABEL: store_unordered_double:
736 ; LA64:       # %bb.0:
737 ; LA64-NEXT:    movfr2gr.d $a1, $fa0
738 ; LA64-NEXT:    st.d $a1, $a0, 0
739 ; LA64-NEXT:    ret
740   store atomic double %v, ptr %ptr unordered, align 8
741   ret void
744 define void @store_monotonic_i8(ptr %ptr, i8 signext %v) {
745 ; LA32-LABEL: store_monotonic_i8:
746 ; LA32:       # %bb.0:
747 ; LA32-NEXT:    st.b $a1, $a0, 0
748 ; LA32-NEXT:    ret
750 ; LA64-LABEL: store_monotonic_i8:
751 ; LA64:       # %bb.0:
752 ; LA64-NEXT:    st.b $a1, $a0, 0
753 ; LA64-NEXT:    ret
754   store atomic i8 %v, ptr %ptr monotonic, align 1
755   ret void
758 define void @store_monotonic_i16(ptr %ptr, i16 signext %v) {
759 ; LA32-LABEL: store_monotonic_i16:
760 ; LA32:       # %bb.0:
761 ; LA32-NEXT:    st.h $a1, $a0, 0
762 ; LA32-NEXT:    ret
764 ; LA64-LABEL: store_monotonic_i16:
765 ; LA64:       # %bb.0:
766 ; LA64-NEXT:    st.h $a1, $a0, 0
767 ; LA64-NEXT:    ret
768   store atomic i16 %v, ptr %ptr monotonic, align 2
769   ret void
772 define void @store_monotonic_i32(ptr %ptr, i32 signext %v) {
773 ; LA32-LABEL: store_monotonic_i32:
774 ; LA32:       # %bb.0:
775 ; LA32-NEXT:    st.w $a1, $a0, 0
776 ; LA32-NEXT:    ret
778 ; LA64-LABEL: store_monotonic_i32:
779 ; LA64:       # %bb.0:
780 ; LA64-NEXT:    st.w $a1, $a0, 0
781 ; LA64-NEXT:    ret
782   store atomic i32 %v, ptr %ptr monotonic, align 4
783   ret void
786 define void @store_monotonic_i64(ptr %ptr, i64 %v) {
787 ; LA32-LABEL: store_monotonic_i64:
788 ; LA32:       # %bb.0:
789 ; LA32-NEXT:    addi.w $sp, $sp, -16
790 ; LA32-NEXT:    .cfi_def_cfa_offset 16
791 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
792 ; LA32-NEXT:    .cfi_offset 1, -4
793 ; LA32-NEXT:    move $a3, $zero
794 ; LA32-NEXT:    bl %plt(__atomic_store_8)
795 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
796 ; LA32-NEXT:    addi.w $sp, $sp, 16
797 ; LA32-NEXT:    ret
799 ; LA64-LABEL: store_monotonic_i64:
800 ; LA64:       # %bb.0:
801 ; LA64-NEXT:    st.d $a1, $a0, 0
802 ; LA64-NEXT:    ret
803   store atomic i64 %v, ptr %ptr monotonic, align 8
804   ret void
807 define void @store_monotonic_ptr(ptr %ptr, ptr %v) {
808 ; LA32-LABEL: store_monotonic_ptr:
809 ; LA32:       # %bb.0:
810 ; LA32-NEXT:    st.w $a1, $a0, 0
811 ; LA32-NEXT:    ret
813 ; LA64-LABEL: store_monotonic_ptr:
814 ; LA64:       # %bb.0:
815 ; LA64-NEXT:    st.d $a1, $a0, 0
816 ; LA64-NEXT:    ret
817   store atomic ptr %v, ptr %ptr monotonic, align 8
818   ret void
821 define void @store_monotonic_float(ptr %ptr, float %v) {
822 ; LA32-LABEL: store_monotonic_float:
823 ; LA32:       # %bb.0:
824 ; LA32-NEXT:    movfr2gr.s $a1, $fa0
825 ; LA32-NEXT:    st.w $a1, $a0, 0
826 ; LA32-NEXT:    ret
828 ; LA64-LABEL: store_monotonic_float:
829 ; LA64:       # %bb.0:
830 ; LA64-NEXT:    movfr2gr.s $a1, $fa0
831 ; LA64-NEXT:    st.w $a1, $a0, 0
832 ; LA64-NEXT:    ret
833   store atomic float %v, ptr %ptr monotonic, align 8
834   ret void
837 define void @store_monotonic_double(ptr %ptr, double %v) {
838 ; LA32-LABEL: store_monotonic_double:
839 ; LA32:       # %bb.0:
840 ; LA32-NEXT:    addi.w $sp, $sp, -16
841 ; LA32-NEXT:    .cfi_def_cfa_offset 16
842 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
843 ; LA32-NEXT:    .cfi_offset 1, -4
844 ; LA32-NEXT:    fst.d $fa0, $sp, 0
845 ; LA32-NEXT:    ld.w $a1, $sp, 0
846 ; LA32-NEXT:    ld.w $a2, $sp, 4
847 ; LA32-NEXT:    move $a3, $zero
848 ; LA32-NEXT:    bl %plt(__atomic_store_8)
849 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
850 ; LA32-NEXT:    addi.w $sp, $sp, 16
851 ; LA32-NEXT:    ret
853 ; LA64-LABEL: store_monotonic_double:
854 ; LA64:       # %bb.0:
855 ; LA64-NEXT:    movfr2gr.d $a1, $fa0
856 ; LA64-NEXT:    st.d $a1, $a0, 0
857 ; LA64-NEXT:    ret
858   store atomic double %v, ptr %ptr monotonic, align 8
859   ret void
862 define void @store_seq_cst_i8(ptr %ptr, i8 signext %v) {
863 ; LA32-LABEL: store_seq_cst_i8:
864 ; LA32:       # %bb.0:
865 ; LA32-NEXT:    dbar 16
866 ; LA32-NEXT:    st.b $a1, $a0, 0
867 ; LA32-NEXT:    dbar 16
868 ; LA32-NEXT:    ret
870 ; LA64-LABEL: store_seq_cst_i8:
871 ; LA64:       # %bb.0:
872 ; LA64-NEXT:    dbar 16
873 ; LA64-NEXT:    st.b $a1, $a0, 0
874 ; LA64-NEXT:    dbar 16
875 ; LA64-NEXT:    ret
876   store atomic i8 %v, ptr %ptr seq_cst, align 1
877   ret void
880 define void @store_seq_cst_i16(ptr %ptr, i16 signext %v) {
881 ; LA32-LABEL: store_seq_cst_i16:
882 ; LA32:       # %bb.0:
883 ; LA32-NEXT:    dbar 16
884 ; LA32-NEXT:    st.h $a1, $a0, 0
885 ; LA32-NEXT:    dbar 16
886 ; LA32-NEXT:    ret
888 ; LA64-LABEL: store_seq_cst_i16:
889 ; LA64:       # %bb.0:
890 ; LA64-NEXT:    dbar 16
891 ; LA64-NEXT:    st.h $a1, $a0, 0
892 ; LA64-NEXT:    dbar 16
893 ; LA64-NEXT:    ret
894   store atomic i16 %v, ptr %ptr seq_cst, align 2
895   ret void
898 define void @store_seq_cst_i32(ptr %ptr, i32 signext %v) {
899 ; LA32-LABEL: store_seq_cst_i32:
900 ; LA32:       # %bb.0:
901 ; LA32-NEXT:    dbar 16
902 ; LA32-NEXT:    st.w $a1, $a0, 0
903 ; LA32-NEXT:    dbar 16
904 ; LA32-NEXT:    ret
906 ; LA64-LABEL: store_seq_cst_i32:
907 ; LA64:       # %bb.0:
908 ; LA64-NEXT:    amswap_db.w $zero, $a1, $a0
909 ; LA64-NEXT:    ret
910   store atomic i32 %v, ptr %ptr seq_cst, align 4
911   ret void
914 define void @store_seq_cst_i64(ptr %ptr, i64 %v) {
915 ; LA32-LABEL: store_seq_cst_i64:
916 ; LA32:       # %bb.0:
917 ; LA32-NEXT:    addi.w $sp, $sp, -16
918 ; LA32-NEXT:    .cfi_def_cfa_offset 16
919 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
920 ; LA32-NEXT:    .cfi_offset 1, -4
921 ; LA32-NEXT:    ori $a3, $zero, 5
922 ; LA32-NEXT:    bl %plt(__atomic_store_8)
923 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
924 ; LA32-NEXT:    addi.w $sp, $sp, 16
925 ; LA32-NEXT:    ret
927 ; LA64-LABEL: store_seq_cst_i64:
928 ; LA64:       # %bb.0:
929 ; LA64-NEXT:    amswap_db.d $zero, $a1, $a0
930 ; LA64-NEXT:    ret
931   store atomic i64 %v, ptr %ptr seq_cst, align 8
932   ret void
935 define void @store_seq_cst_ptr(ptr %ptr, ptr %v) {
936 ; LA32-LABEL: store_seq_cst_ptr:
937 ; LA32:       # %bb.0:
938 ; LA32-NEXT:    dbar 16
939 ; LA32-NEXT:    st.w $a1, $a0, 0
940 ; LA32-NEXT:    dbar 16
941 ; LA32-NEXT:    ret
943 ; LA64-LABEL: store_seq_cst_ptr:
944 ; LA64:       # %bb.0:
945 ; LA64-NEXT:    amswap_db.d $zero, $a1, $a0
946 ; LA64-NEXT:    ret
947   store atomic ptr %v, ptr %ptr seq_cst, align 8
948   ret void
951 define void @store_seq_cst_float(ptr %ptr, float %v) {
952 ; LA32-LABEL: store_seq_cst_float:
953 ; LA32:       # %bb.0:
954 ; LA32-NEXT:    movfr2gr.s $a1, $fa0
955 ; LA32-NEXT:    dbar 16
956 ; LA32-NEXT:    st.w $a1, $a0, 0
957 ; LA32-NEXT:    dbar 16
958 ; LA32-NEXT:    ret
960 ; LA64-LABEL: store_seq_cst_float:
961 ; LA64:       # %bb.0:
962 ; LA64-NEXT:    movfr2gr.s $a1, $fa0
963 ; LA64-NEXT:    amswap_db.w $zero, $a1, $a0
964 ; LA64-NEXT:    ret
965   store atomic float %v, ptr %ptr seq_cst, align 8
966   ret void
969 define void @store_seq_cst_double(ptr %ptr, double %v) {
970 ; LA32-LABEL: store_seq_cst_double:
971 ; LA32:       # %bb.0:
972 ; LA32-NEXT:    addi.w $sp, $sp, -16
973 ; LA32-NEXT:    .cfi_def_cfa_offset 16
974 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
975 ; LA32-NEXT:    .cfi_offset 1, -4
976 ; LA32-NEXT:    fst.d $fa0, $sp, 0
977 ; LA32-NEXT:    ld.w $a1, $sp, 0
978 ; LA32-NEXT:    ld.w $a2, $sp, 4
979 ; LA32-NEXT:    ori $a3, $zero, 5
980 ; LA32-NEXT:    bl %plt(__atomic_store_8)
981 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
982 ; LA32-NEXT:    addi.w $sp, $sp, 16
983 ; LA32-NEXT:    ret
985 ; LA64-LABEL: store_seq_cst_double:
986 ; LA64:       # %bb.0:
987 ; LA64-NEXT:    movfr2gr.d $a1, $fa0
988 ; LA64-NEXT:    amswap_db.d $zero, $a1, $a0
989 ; LA64-NEXT:    ret
990   store atomic double %v, ptr %ptr seq_cst, align 8
991   ret void