1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=loongarch32 < %s | FileCheck %s --check-prefix=LA32
3; RUN: llc --mtriple=loongarch64 < %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 0
10; LA32-NEXT:    jirl $zero, $ra, 0
11;
12; LA64-LABEL: load_acquire_i8:
13; LA64:       # %bb.0:
14; LA64-NEXT:    ld.b $a0, $a0, 0
15; LA64-NEXT:    dbar 0
16; LA64-NEXT:    jirl $zero, $ra, 0
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 0
26; LA32-NEXT:    jirl $zero, $ra, 0
27;
28; LA64-LABEL: load_acquire_i16:
29; LA64:       # %bb.0:
30; LA64-NEXT:    ld.h $a0, $a0, 0
31; LA64-NEXT:    dbar 0
32; LA64-NEXT:    jirl $zero, $ra, 0
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 0
42; LA32-NEXT:    jirl $zero, $ra, 0
43;
44; LA64-LABEL: load_acquire_i32:
45; LA64:       # %bb.0:
46; LA64-NEXT:    ld.w $a0, $a0, 0
47; LA64-NEXT:    dbar 0
48; LA64-NEXT:    jirl $zero, $ra, 0
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 __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:    jirl $zero, $ra, 0
65;
66; LA64-LABEL: load_acquire_i64:
67; LA64:       # %bb.0:
68; LA64-NEXT:    ld.d $a0, $a0, 0
69; LA64-NEXT:    dbar 0
70; LA64-NEXT:    jirl $zero, $ra, 0
71  %val = load atomic i64, ptr %ptr acquire, align 8
72  ret i64 %val
73}
74
75define void @store_release_i8(ptr %ptr, i8 signext %v) {
76; LA32-LABEL: store_release_i8:
77; LA32:       # %bb.0:
78; LA32-NEXT:    dbar 0
79; LA32-NEXT:    st.b $a0, $a1, 0
80; LA32-NEXT:    jirl $zero, $ra, 0
81;
82; LA64-LABEL: store_release_i8:
83; LA64:       # %bb.0:
84; LA64-NEXT:    dbar 0
85; LA64-NEXT:    st.b $a0, $a1, 0
86; LA64-NEXT:    jirl $zero, $ra, 0
87  store atomic i8 %v, ptr %ptr release, align 1
88  ret void
89}
90
91define void @store_release_i16(ptr %ptr, i16 signext %v) {
92; LA32-LABEL: store_release_i16:
93; LA32:       # %bb.0:
94; LA32-NEXT:    dbar 0
95; LA32-NEXT:    st.h $a0, $a1, 0
96; LA32-NEXT:    jirl $zero, $ra, 0
97;
98; LA64-LABEL: store_release_i16:
99; LA64:       # %bb.0:
100; LA64-NEXT:    dbar 0
101; LA64-NEXT:    st.h $a0, $a1, 0
102; LA64-NEXT:    jirl $zero, $ra, 0
103  store atomic i16 %v, ptr %ptr release, align 2
104  ret void
105}
106
107define void @store_release_i32(ptr %ptr, i32 signext %v) {
108; LA32-LABEL: store_release_i32:
109; LA32:       # %bb.0:
110; LA32-NEXT:    dbar 0
111; LA32-NEXT:    st.w $a0, $a1, 0
112; LA32-NEXT:    jirl $zero, $ra, 0
113;
114; LA64-LABEL: store_release_i32:
115; LA64:       # %bb.0:
116; LA64-NEXT:    dbar 0
117; LA64-NEXT:    st.w $a0, $a1, 0
118; LA64-NEXT:    jirl $zero, $ra, 0
119  store atomic i32 %v, ptr %ptr release, align 4
120  ret void
121}
122
123define void @store_release_i64(ptr %ptr, i64 %v) {
124; LA32-LABEL: store_release_i64:
125; LA32:       # %bb.0:
126; LA32-NEXT:    addi.w $sp, $sp, -16
127; LA32-NEXT:    .cfi_def_cfa_offset 16
128; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
129; LA32-NEXT:    .cfi_offset 1, -4
130; LA32-NEXT:    ori $a3, $zero, 3
131; LA32-NEXT:    bl __atomic_store_8
132; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
133; LA32-NEXT:    addi.w $sp, $sp, 16
134; LA32-NEXT:    jirl $zero, $ra, 0
135;
136; LA64-LABEL: store_release_i64:
137; LA64:       # %bb.0:
138; LA64-NEXT:    dbar 0
139; LA64-NEXT:    st.d $a0, $a1, 0
140; LA64-NEXT:    jirl $zero, $ra, 0
141  store atomic i64 %v, ptr %ptr release, align 8
142  ret void
143}
144