xref: /aosp_15_r20/external/llvm/test/CodeGen/SPARC/atomics.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=sparcv9 -verify-machineinstrs | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_atomic_i8
4*9880d681SAndroid Build Coastguard Worker; CHECK:       ldub [%o0]
5*9880d681SAndroid Build Coastguard Worker; CHECK:       membar
6*9880d681SAndroid Build Coastguard Worker; CHECK:       ldub [%o1]
7*9880d681SAndroid Build Coastguard Worker; CHECK:       membar
8*9880d681SAndroid Build Coastguard Worker; CHECK:       membar
9*9880d681SAndroid Build Coastguard Worker; CHECK:       stb {{.+}}, [%o2]
10*9880d681SAndroid Build Coastguard Workerdefine i8 @test_atomic_i8(i8* %ptr1, i8* %ptr2, i8* %ptr3) {
11*9880d681SAndroid Build Coastguard Workerentry:
12*9880d681SAndroid Build Coastguard Worker  %0 = load atomic i8, i8* %ptr1 acquire, align 1
13*9880d681SAndroid Build Coastguard Worker  %1 = load atomic i8, i8* %ptr2 acquire, align 1
14*9880d681SAndroid Build Coastguard Worker  %2 = add i8 %0, %1
15*9880d681SAndroid Build Coastguard Worker  store atomic i8 %2, i8* %ptr3 release, align 1
16*9880d681SAndroid Build Coastguard Worker  ret i8 %2
17*9880d681SAndroid Build Coastguard Worker}
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_atomic_i16
20*9880d681SAndroid Build Coastguard Worker; CHECK:       lduh [%o0]
21*9880d681SAndroid Build Coastguard Worker; CHECK:       membar
22*9880d681SAndroid Build Coastguard Worker; CHECK:       lduh [%o1]
23*9880d681SAndroid Build Coastguard Worker; CHECK:       membar
24*9880d681SAndroid Build Coastguard Worker; CHECK:       membar
25*9880d681SAndroid Build Coastguard Worker; CHECK:       sth {{.+}}, [%o2]
26*9880d681SAndroid Build Coastguard Workerdefine i16 @test_atomic_i16(i16* %ptr1, i16* %ptr2, i16* %ptr3) {
27*9880d681SAndroid Build Coastguard Workerentry:
28*9880d681SAndroid Build Coastguard Worker  %0 = load atomic i16, i16* %ptr1 acquire, align 2
29*9880d681SAndroid Build Coastguard Worker  %1 = load atomic i16, i16* %ptr2 acquire, align 2
30*9880d681SAndroid Build Coastguard Worker  %2 = add i16 %0, %1
31*9880d681SAndroid Build Coastguard Worker  store atomic i16 %2, i16* %ptr3 release, align 2
32*9880d681SAndroid Build Coastguard Worker  ret i16 %2
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_atomic_i32
36*9880d681SAndroid Build Coastguard Worker; CHECK:       ld [%o0]
37*9880d681SAndroid Build Coastguard Worker; CHECK:       membar
38*9880d681SAndroid Build Coastguard Worker; CHECK:       ld [%o1]
39*9880d681SAndroid Build Coastguard Worker; CHECK:       membar
40*9880d681SAndroid Build Coastguard Worker; CHECK:       membar
41*9880d681SAndroid Build Coastguard Worker; CHECK:       st {{.+}}, [%o2]
42*9880d681SAndroid Build Coastguard Workerdefine i32 @test_atomic_i32(i32* %ptr1, i32* %ptr2, i32* %ptr3) {
43*9880d681SAndroid Build Coastguard Workerentry:
44*9880d681SAndroid Build Coastguard Worker  %0 = load atomic i32, i32* %ptr1 acquire, align 4
45*9880d681SAndroid Build Coastguard Worker  %1 = load atomic i32, i32* %ptr2 acquire, align 4
46*9880d681SAndroid Build Coastguard Worker  %2 = add i32 %0, %1
47*9880d681SAndroid Build Coastguard Worker  store atomic i32 %2, i32* %ptr3 release, align 4
48*9880d681SAndroid Build Coastguard Worker  ret i32 %2
49*9880d681SAndroid Build Coastguard Worker}
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_atomic_i64
52*9880d681SAndroid Build Coastguard Worker; CHECK:       ldx [%o0]
53*9880d681SAndroid Build Coastguard Worker; CHECK:       membar
54*9880d681SAndroid Build Coastguard Worker; CHECK:       ldx [%o1]
55*9880d681SAndroid Build Coastguard Worker; CHECK:       membar
56*9880d681SAndroid Build Coastguard Worker; CHECK:       membar
57*9880d681SAndroid Build Coastguard Worker; CHECK:       stx {{.+}}, [%o2]
58*9880d681SAndroid Build Coastguard Workerdefine i64 @test_atomic_i64(i64* %ptr1, i64* %ptr2, i64* %ptr3) {
59*9880d681SAndroid Build Coastguard Workerentry:
60*9880d681SAndroid Build Coastguard Worker  %0 = load atomic i64, i64* %ptr1 acquire, align 8
61*9880d681SAndroid Build Coastguard Worker  %1 = load atomic i64, i64* %ptr2 acquire, align 8
62*9880d681SAndroid Build Coastguard Worker  %2 = add i64 %0, %1
63*9880d681SAndroid Build Coastguard Worker  store atomic i64 %2, i64* %ptr3 release, align 8
64*9880d681SAndroid Build Coastguard Worker  ret i64 %2
65*9880d681SAndroid Build Coastguard Worker}
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Worker;; TODO: the "move %icc" and related instructions are totally
68*9880d681SAndroid Build Coastguard Worker;; redundant here. There's something weird happening in optimization
69*9880d681SAndroid Build Coastguard Worker;; of the success value of cmpxchg.
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_cmpxchg_i8
72*9880d681SAndroid Build Coastguard Worker; CHECK:       and %o1, -4, %o2
73*9880d681SAndroid Build Coastguard Worker; CHECK:       mov  3, %o3
74*9880d681SAndroid Build Coastguard Worker; CHECK:       andn %o3, %o1, %o1
75*9880d681SAndroid Build Coastguard Worker; CHECK:       sll %o1, 3, %o1
76*9880d681SAndroid Build Coastguard Worker; CHECK:       mov  255, %o3
77*9880d681SAndroid Build Coastguard Worker; CHECK:       sll %o3, %o1, %o5
78*9880d681SAndroid Build Coastguard Worker; CHECK:       xor %o5, -1, %o3
79*9880d681SAndroid Build Coastguard Worker; CHECK:       mov  123, %o4
80*9880d681SAndroid Build Coastguard Worker; CHECK:       ld [%o2], %g2
81*9880d681SAndroid Build Coastguard Worker; CHECK:       sll %o4, %o1, %o4
82*9880d681SAndroid Build Coastguard Worker; CHECK:       and %o0, 255, %o0
83*9880d681SAndroid Build Coastguard Worker; CHECK:       sll %o0, %o1, %o0
84*9880d681SAndroid Build Coastguard Worker; CHECK:       andn %g2, %o5, %g2
85*9880d681SAndroid Build Coastguard Worker; CHECK:       sethi 0, %o5
86*9880d681SAndroid Build Coastguard Worker; CHECK:      [[LABEL1:\.L.*]]:
87*9880d681SAndroid Build Coastguard Worker; CHECK:       or %g2, %o4, %g3
88*9880d681SAndroid Build Coastguard Worker; CHECK:       or %g2, %o0, %g4
89*9880d681SAndroid Build Coastguard Worker; CHECK:       cas [%o2], %g4, %g3
90*9880d681SAndroid Build Coastguard Worker; CHECK:       cmp %g3, %g4
91*9880d681SAndroid Build Coastguard Worker; CHECK:       mov  %o5, %g4
92*9880d681SAndroid Build Coastguard Worker; CHECK:       move %icc, 1, %g4
93*9880d681SAndroid Build Coastguard Worker; CHECK:       cmp %g4, 0
94*9880d681SAndroid Build Coastguard Worker; CHECK:       bne  [[LABEL2:\.L.*]]
95*9880d681SAndroid Build Coastguard Worker; CHECK:       nop
96*9880d681SAndroid Build Coastguard Worker; CHECK:       and %g3, %o3, %g4
97*9880d681SAndroid Build Coastguard Worker; CHECK:       cmp %g2, %g4
98*9880d681SAndroid Build Coastguard Worker; CHECK:       bne  [[LABEL1]]
99*9880d681SAndroid Build Coastguard Worker; CHECK:       mov  %g4, %g2
100*9880d681SAndroid Build Coastguard Worker; CHECK:      [[LABEL2]]:
101*9880d681SAndroid Build Coastguard Worker; CHECK:       retl
102*9880d681SAndroid Build Coastguard Worker; CHECK:       srl %g3, %o1, %o0
103*9880d681SAndroid Build Coastguard Workerdefine i8 @test_cmpxchg_i8(i8 %a, i8* %ptr) {
104*9880d681SAndroid Build Coastguard Workerentry:
105*9880d681SAndroid Build Coastguard Worker  %pair = cmpxchg i8* %ptr, i8 %a, i8 123 monotonic monotonic
106*9880d681SAndroid Build Coastguard Worker  %b = extractvalue { i8, i1 } %pair, 0
107*9880d681SAndroid Build Coastguard Worker  ret i8 %b
108*9880d681SAndroid Build Coastguard Worker}
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_cmpxchg_i16
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Worker; CHECK:       and %o1, -4, %o2
113*9880d681SAndroid Build Coastguard Worker; CHECK:       and %o1, 3, %o1
114*9880d681SAndroid Build Coastguard Worker; CHECK:       xor %o1, 2, %o1
115*9880d681SAndroid Build Coastguard Worker; CHECK:       sll %o1, 3, %o1
116*9880d681SAndroid Build Coastguard Worker; CHECK:       sethi 63, %o3
117*9880d681SAndroid Build Coastguard Worker; CHECK:       or %o3, 1023, %o4
118*9880d681SAndroid Build Coastguard Worker; CHECK:       sll %o4, %o1, %o5
119*9880d681SAndroid Build Coastguard Worker; CHECK:       xor %o5, -1, %o3
120*9880d681SAndroid Build Coastguard Worker; CHECK:       and %o0, %o4, %o4
121*9880d681SAndroid Build Coastguard Worker; CHECK:       ld [%o2], %g2
122*9880d681SAndroid Build Coastguard Worker; CHECK:       mov  123, %o0
123*9880d681SAndroid Build Coastguard Worker; CHECK:       sll %o0, %o1, %o0
124*9880d681SAndroid Build Coastguard Worker; CHECK:       sll %o4, %o1, %o4
125*9880d681SAndroid Build Coastguard Worker; CHECK:       andn %g2, %o5, %g2
126*9880d681SAndroid Build Coastguard Worker; CHECK:       sethi 0, %o5
127*9880d681SAndroid Build Coastguard Worker; CHECK:      [[LABEL1:\.L.*]]:
128*9880d681SAndroid Build Coastguard Worker; CHECK:       or %g2, %o0, %g3
129*9880d681SAndroid Build Coastguard Worker; CHECK:       or %g2, %o4, %g4
130*9880d681SAndroid Build Coastguard Worker; CHECK:       cas [%o2], %g4, %g3
131*9880d681SAndroid Build Coastguard Worker; CHECK:       cmp %g3, %g4
132*9880d681SAndroid Build Coastguard Worker; CHECK:       mov  %o5, %g4
133*9880d681SAndroid Build Coastguard Worker; CHECK:       move %icc, 1, %g4
134*9880d681SAndroid Build Coastguard Worker; CHECK:       cmp %g4, 0
135*9880d681SAndroid Build Coastguard Worker; CHECK:       bne  [[LABEL2:\.L.*]]
136*9880d681SAndroid Build Coastguard Worker; CHECK:       nop
137*9880d681SAndroid Build Coastguard Worker; CHECK:       and %g3, %o3, %g4
138*9880d681SAndroid Build Coastguard Worker; CHECK:       cmp %g2, %g4
139*9880d681SAndroid Build Coastguard Worker; CHECK:       bne  [[LABEL1]]
140*9880d681SAndroid Build Coastguard Worker; CHECK:       mov  %g4, %g2
141*9880d681SAndroid Build Coastguard Worker; CHECK:      [[LABEL2]]:
142*9880d681SAndroid Build Coastguard Worker; CHECK:       retl
143*9880d681SAndroid Build Coastguard Worker; CHECK:       srl %g3, %o1, %o0
144*9880d681SAndroid Build Coastguard Workerdefine i16 @test_cmpxchg_i16(i16 %a, i16* %ptr) {
145*9880d681SAndroid Build Coastguard Workerentry:
146*9880d681SAndroid Build Coastguard Worker  %pair = cmpxchg i16* %ptr, i16 %a, i16 123 monotonic monotonic
147*9880d681SAndroid Build Coastguard Worker  %b = extractvalue { i16, i1 } %pair, 0
148*9880d681SAndroid Build Coastguard Worker  ret i16 %b
149*9880d681SAndroid Build Coastguard Worker}
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_cmpxchg_i32
152*9880d681SAndroid Build Coastguard Worker; CHECK:       mov 123, [[R:%[gilo][0-7]]]
153*9880d681SAndroid Build Coastguard Worker; CHECK:       cas [%o1], %o0, [[R]]
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Workerdefine i32 @test_cmpxchg_i32(i32 %a, i32* %ptr) {
156*9880d681SAndroid Build Coastguard Workerentry:
157*9880d681SAndroid Build Coastguard Worker  %pair = cmpxchg i32* %ptr, i32 %a, i32 123 monotonic monotonic
158*9880d681SAndroid Build Coastguard Worker  %b = extractvalue { i32, i1 } %pair, 0
159*9880d681SAndroid Build Coastguard Worker  ret i32 %b
160*9880d681SAndroid Build Coastguard Worker}
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_cmpxchg_i64
163*9880d681SAndroid Build Coastguard Worker; CHECK:       mov 123, [[R:%[gilo][0-7]]]
164*9880d681SAndroid Build Coastguard Worker; CHECK:       casx [%o1], %o0, [[R]]
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Workerdefine i64 @test_cmpxchg_i64(i64 %a, i64* %ptr) {
167*9880d681SAndroid Build Coastguard Workerentry:
168*9880d681SAndroid Build Coastguard Worker  %pair = cmpxchg i64* %ptr, i64 %a, i64 123 monotonic monotonic
169*9880d681SAndroid Build Coastguard Worker  %b = extractvalue { i64, i1 } %pair, 0
170*9880d681SAndroid Build Coastguard Worker  ret i64 %b
171*9880d681SAndroid Build Coastguard Worker}
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_swap_i8
174*9880d681SAndroid Build Coastguard Worker; CHECK:       mov 42, [[R:%[gilo][0-7]]]
175*9880d681SAndroid Build Coastguard Worker; CHECK:       cas
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Workerdefine i8 @test_swap_i8(i8 %a, i8* %ptr) {
178*9880d681SAndroid Build Coastguard Workerentry:
179*9880d681SAndroid Build Coastguard Worker  %b = atomicrmw xchg i8* %ptr, i8 42 monotonic
180*9880d681SAndroid Build Coastguard Worker  ret i8 %b
181*9880d681SAndroid Build Coastguard Worker}
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_swap_i16
184*9880d681SAndroid Build Coastguard Worker; CHECK:       mov 42, [[R:%[gilo][0-7]]]
185*9880d681SAndroid Build Coastguard Worker; CHECK:       cas
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard Workerdefine i16 @test_swap_i16(i16 %a, i16* %ptr) {
188*9880d681SAndroid Build Coastguard Workerentry:
189*9880d681SAndroid Build Coastguard Worker  %b = atomicrmw xchg i16* %ptr, i16 42 monotonic
190*9880d681SAndroid Build Coastguard Worker  ret i16 %b
191*9880d681SAndroid Build Coastguard Worker}
192*9880d681SAndroid Build Coastguard Worker
193*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_swap_i32
194*9880d681SAndroid Build Coastguard Worker; CHECK:       mov 42, [[R:%[gilo][0-7]]]
195*9880d681SAndroid Build Coastguard Worker; CHECK:       swap [%o1], [[R]]
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Workerdefine i32 @test_swap_i32(i32 %a, i32* %ptr) {
198*9880d681SAndroid Build Coastguard Workerentry:
199*9880d681SAndroid Build Coastguard Worker  %b = atomicrmw xchg i32* %ptr, i32 42 monotonic
200*9880d681SAndroid Build Coastguard Worker  ret i32 %b
201*9880d681SAndroid Build Coastguard Worker}
202*9880d681SAndroid Build Coastguard Worker
203*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_swap_i64
204*9880d681SAndroid Build Coastguard Worker; CHECK:       casx [%o1],
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard Workerdefine i64 @test_swap_i64(i64 %a, i64* %ptr) {
207*9880d681SAndroid Build Coastguard Workerentry:
208*9880d681SAndroid Build Coastguard Worker  %b = atomicrmw xchg i64* %ptr, i64 42 monotonic
209*9880d681SAndroid Build Coastguard Worker  ret i64 %b
210*9880d681SAndroid Build Coastguard Worker}
211*9880d681SAndroid Build Coastguard Worker
212*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load_sub_i8
213*9880d681SAndroid Build Coastguard Worker; CHECK: membar
214*9880d681SAndroid Build Coastguard Worker; CHECK: .L{{.*}}:
215*9880d681SAndroid Build Coastguard Worker; CHECK: sub
216*9880d681SAndroid Build Coastguard Worker; CHECK: cas [{{%[gilo][0-7]}}]
217*9880d681SAndroid Build Coastguard Worker; CHECK: membar
218*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @test_load_sub_i8(i8* %p, i8 zeroext %v) {
219*9880d681SAndroid Build Coastguard Workerentry:
220*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw sub i8* %p, i8 %v seq_cst
221*9880d681SAndroid Build Coastguard Worker  ret i8 %0
222*9880d681SAndroid Build Coastguard Worker}
223*9880d681SAndroid Build Coastguard Worker
224*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load_sub_i16
225*9880d681SAndroid Build Coastguard Worker; CHECK: membar
226*9880d681SAndroid Build Coastguard Worker; CHECK: .L{{.*}}:
227*9880d681SAndroid Build Coastguard Worker; CHECK: sub
228*9880d681SAndroid Build Coastguard Worker; CHECK: cas [{{%[gilo][0-7]}}]
229*9880d681SAndroid Build Coastguard Worker; CHECK: membar
230*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @test_load_sub_i16(i16* %p, i16 zeroext %v) {
231*9880d681SAndroid Build Coastguard Workerentry:
232*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw sub i16* %p, i16 %v seq_cst
233*9880d681SAndroid Build Coastguard Worker  ret i16 %0
234*9880d681SAndroid Build Coastguard Worker}
235*9880d681SAndroid Build Coastguard Worker
236*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load_add_i32
237*9880d681SAndroid Build Coastguard Worker; CHECK: membar
238*9880d681SAndroid Build Coastguard Worker; CHECK: add [[V:%[gilo][0-7]]], %o1, [[U:%[gilo][0-7]]]
239*9880d681SAndroid Build Coastguard Worker; CHECK: cas [%o0], [[V]], [[U]]
240*9880d681SAndroid Build Coastguard Worker; CHECK: membar
241*9880d681SAndroid Build Coastguard Workerdefine zeroext i32 @test_load_add_i32(i32* %p, i32 zeroext %v) {
242*9880d681SAndroid Build Coastguard Workerentry:
243*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw add i32* %p, i32 %v seq_cst
244*9880d681SAndroid Build Coastguard Worker  ret i32 %0
245*9880d681SAndroid Build Coastguard Worker}
246*9880d681SAndroid Build Coastguard Worker
247*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load_sub_64
248*9880d681SAndroid Build Coastguard Worker; CHECK: membar
249*9880d681SAndroid Build Coastguard Worker; CHECK: sub
250*9880d681SAndroid Build Coastguard Worker; CHECK: casx [%o0]
251*9880d681SAndroid Build Coastguard Worker; CHECK: membar
252*9880d681SAndroid Build Coastguard Workerdefine zeroext i64 @test_load_sub_64(i64* %p, i64 zeroext %v) {
253*9880d681SAndroid Build Coastguard Workerentry:
254*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw sub i64* %p, i64 %v seq_cst
255*9880d681SAndroid Build Coastguard Worker  ret i64 %0
256*9880d681SAndroid Build Coastguard Worker}
257*9880d681SAndroid Build Coastguard Worker
258*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load_xor_32
259*9880d681SAndroid Build Coastguard Worker; CHECK: membar
260*9880d681SAndroid Build Coastguard Worker; CHECK: xor
261*9880d681SAndroid Build Coastguard Worker; CHECK: cas [%o0]
262*9880d681SAndroid Build Coastguard Worker; CHECK: membar
263*9880d681SAndroid Build Coastguard Workerdefine zeroext i32 @test_load_xor_32(i32* %p, i32 zeroext %v) {
264*9880d681SAndroid Build Coastguard Workerentry:
265*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw xor i32* %p, i32 %v seq_cst
266*9880d681SAndroid Build Coastguard Worker  ret i32 %0
267*9880d681SAndroid Build Coastguard Worker}
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load_and_32
270*9880d681SAndroid Build Coastguard Worker; CHECK: membar
271*9880d681SAndroid Build Coastguard Worker; CHECK: and
272*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: xor
273*9880d681SAndroid Build Coastguard Worker; CHECK: cas [%o0]
274*9880d681SAndroid Build Coastguard Worker; CHECK: membar
275*9880d681SAndroid Build Coastguard Workerdefine zeroext i32 @test_load_and_32(i32* %p, i32 zeroext %v) {
276*9880d681SAndroid Build Coastguard Workerentry:
277*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw and i32* %p, i32 %v seq_cst
278*9880d681SAndroid Build Coastguard Worker  ret i32 %0
279*9880d681SAndroid Build Coastguard Worker}
280*9880d681SAndroid Build Coastguard Worker
281*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load_nand_32
282*9880d681SAndroid Build Coastguard Worker; CHECK: membar
283*9880d681SAndroid Build Coastguard Worker; CHECK: and
284*9880d681SAndroid Build Coastguard Worker; CHECK: xor
285*9880d681SAndroid Build Coastguard Worker; CHECK: cas [%o0]
286*9880d681SAndroid Build Coastguard Worker; CHECK: membar
287*9880d681SAndroid Build Coastguard Workerdefine zeroext i32 @test_load_nand_32(i32* %p, i32 zeroext %v) {
288*9880d681SAndroid Build Coastguard Workerentry:
289*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw nand i32* %p, i32 %v seq_cst
290*9880d681SAndroid Build Coastguard Worker  ret i32 %0
291*9880d681SAndroid Build Coastguard Worker}
292*9880d681SAndroid Build Coastguard Worker
293*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load_max_64
294*9880d681SAndroid Build Coastguard Worker; CHECK: membar
295*9880d681SAndroid Build Coastguard Worker; CHECK: cmp
296*9880d681SAndroid Build Coastguard Worker; CHECK: movg %xcc
297*9880d681SAndroid Build Coastguard Worker; CHECK: casx [%o0]
298*9880d681SAndroid Build Coastguard Worker; CHECK: membar
299*9880d681SAndroid Build Coastguard Workerdefine zeroext i64 @test_load_max_64(i64* %p, i64 zeroext %v) {
300*9880d681SAndroid Build Coastguard Workerentry:
301*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw max i64* %p, i64 %v seq_cst
302*9880d681SAndroid Build Coastguard Worker  ret i64 %0
303*9880d681SAndroid Build Coastguard Worker}
304*9880d681SAndroid Build Coastguard Worker
305*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_load_umin_32
306*9880d681SAndroid Build Coastguard Worker; CHECK: membar
307*9880d681SAndroid Build Coastguard Worker; CHECK: cmp
308*9880d681SAndroid Build Coastguard Worker; CHECK: movleu %icc
309*9880d681SAndroid Build Coastguard Worker; CHECK: cas [%o0]
310*9880d681SAndroid Build Coastguard Worker; CHECK: membar
311*9880d681SAndroid Build Coastguard Workerdefine zeroext i32 @test_load_umin_32(i32* %p, i32 zeroext %v) {
312*9880d681SAndroid Build Coastguard Workerentry:
313*9880d681SAndroid Build Coastguard Worker  %0 = atomicrmw umin i32* %p, i32 %v seq_cst
314*9880d681SAndroid Build Coastguard Worker  ret i32 %0
315*9880d681SAndroid Build Coastguard Worker}
316