xref: /llvm-project/llvm/test/CodeGen/LoongArch/ir-instruction/load-store-atomic.ll (revision 8e3cde04cbf13d2aa2251acdd8adbae8d3edd43d)
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
4
5define 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
11;
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
19}
20
21define 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
27;
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
35}
36
37define 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
43;
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
51}
52
53define 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
65;
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
73}
74
75define 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
81;
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
89}
90
91define 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
98;
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
107}
108
109define 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
124;
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
133}
134
135define 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
140;
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
147}
148
149define 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
154;
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
161}
162
163define 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
168;
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
175}
176
177define 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
189;
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
196}
197
198define 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
203;
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
210}
211
212define 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
218;
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
226}
227
228define 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
243;
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
251}
252
253define 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
258;
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
265}
266
267define 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
272;
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
279}
280
281define 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
286;
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
293}
294
295define 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
307;
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
314}
315
316define 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
321;
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
328}
329
330define 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
336;
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
344}
345
346define 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
361;
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
369}
370
371define 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
377;
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
385}
386
387define 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
393;
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
401}
402
403define 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
409;
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
417}
418
419define 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
431;
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
439}
440
441define 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
447;
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
455}
456
457define 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
464;
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
473}
474
475define 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
490;
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
499}
500
501define 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
507;
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
515}
516
517define 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
523;
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
531}
532
533define 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
539;
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
546}
547
548define 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
560;
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
567}
568
569define 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
575;
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
582}
583
584define 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
591;
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
599}
600
601define 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
616;
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
624}
625
626define 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
631;
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
638}
639
640define 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
645;
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
652}
653
654define 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
659;
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
666}
667
668define 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
680;
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
687}
688
689define 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
694;
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
701}
702
703define 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
709;
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
717}
718
719define 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
734;
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
742}
743
744define 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
749;
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
756}
757
758define 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
763;
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
770}
771
772define 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
777;
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
784}
785
786define 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
798;
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
805}
806
807define 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
812;
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
819}
820
821define 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
827;
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
835}
836
837define 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
852;
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
860}
861
862define 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
869;
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
878}
879
880define 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
887;
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
896}
897
898define 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
905;
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
912}
913
914define 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
926;
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
933}
934
935define 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
942;
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
949}
950
951define 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
959;
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
967}
968
969define 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
984;
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
992}
993