1*67e74705SXin Li // Test frontend handling of __sync builtins.
2*67e74705SXin Li // Modified from a gcc testcase.
3*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm %s -o - | FileCheck %s
4*67e74705SXin Li
5*67e74705SXin Li signed char sc;
6*67e74705SXin Li unsigned char uc;
7*67e74705SXin Li signed short ss;
8*67e74705SXin Li unsigned short us;
9*67e74705SXin Li signed int si;
10*67e74705SXin Li unsigned int ui;
11*67e74705SXin Li signed long long sll;
12*67e74705SXin Li unsigned long long ull;
13*67e74705SXin Li
test_op_ignore(void)14*67e74705SXin Li void test_op_ignore (void) // CHECK-LABEL: define void @test_op_ignore
15*67e74705SXin Li {
16*67e74705SXin Li (void) __sync_fetch_and_add (&sc, 1); // CHECK: atomicrmw add i8
17*67e74705SXin Li (void) __sync_fetch_and_add (&uc, 1); // CHECK: atomicrmw add i8
18*67e74705SXin Li (void) __sync_fetch_and_add (&ss, 1); // CHECK: atomicrmw add i16
19*67e74705SXin Li (void) __sync_fetch_and_add (&us, 1); // CHECK: atomicrmw add i16
20*67e74705SXin Li (void) __sync_fetch_and_add (&si, 1); // CHECK: atomicrmw add i32
21*67e74705SXin Li (void) __sync_fetch_and_add (&ui, 1); // CHECK: atomicrmw add i32
22*67e74705SXin Li (void) __sync_fetch_and_add (&sll, 1); // CHECK: atomicrmw add i64
23*67e74705SXin Li (void) __sync_fetch_and_add (&ull, 1); // CHECK: atomicrmw add i64
24*67e74705SXin Li
25*67e74705SXin Li (void) __sync_fetch_and_sub (&sc, 1); // CHECK: atomicrmw sub i8
26*67e74705SXin Li (void) __sync_fetch_and_sub (&uc, 1); // CHECK: atomicrmw sub i8
27*67e74705SXin Li (void) __sync_fetch_and_sub (&ss, 1); // CHECK: atomicrmw sub i16
28*67e74705SXin Li (void) __sync_fetch_and_sub (&us, 1); // CHECK: atomicrmw sub i16
29*67e74705SXin Li (void) __sync_fetch_and_sub (&si, 1); // CHECK: atomicrmw sub i32
30*67e74705SXin Li (void) __sync_fetch_and_sub (&ui, 1); // CHECK: atomicrmw sub i32
31*67e74705SXin Li (void) __sync_fetch_and_sub (&sll, 1); // CHECK: atomicrmw sub i64
32*67e74705SXin Li (void) __sync_fetch_and_sub (&ull, 1); // CHECK: atomicrmw sub i64
33*67e74705SXin Li
34*67e74705SXin Li (void) __sync_fetch_and_or (&sc, 1); // CHECK: atomicrmw or i8
35*67e74705SXin Li (void) __sync_fetch_and_or (&uc, 1); // CHECK: atomicrmw or i8
36*67e74705SXin Li (void) __sync_fetch_and_or (&ss, 1); // CHECK: atomicrmw or i16
37*67e74705SXin Li (void) __sync_fetch_and_or (&us, 1); // CHECK: atomicrmw or i16
38*67e74705SXin Li (void) __sync_fetch_and_or (&si, 1); // CHECK: atomicrmw or i32
39*67e74705SXin Li (void) __sync_fetch_and_or (&ui, 1); // CHECK: atomicrmw or i32
40*67e74705SXin Li (void) __sync_fetch_and_or (&sll, 1); // CHECK: atomicrmw or i64
41*67e74705SXin Li (void) __sync_fetch_and_or (&ull, 1); // CHECK: atomicrmw or i64
42*67e74705SXin Li
43*67e74705SXin Li (void) __sync_fetch_and_xor (&sc, 1); // CHECK: atomicrmw xor i8
44*67e74705SXin Li (void) __sync_fetch_and_xor (&uc, 1); // CHECK: atomicrmw xor i8
45*67e74705SXin Li (void) __sync_fetch_and_xor (&ss, 1); // CHECK: atomicrmw xor i16
46*67e74705SXin Li (void) __sync_fetch_and_xor (&us, 1); // CHECK: atomicrmw xor i16
47*67e74705SXin Li (void) __sync_fetch_and_xor (&si, 1); // CHECK: atomicrmw xor i32
48*67e74705SXin Li (void) __sync_fetch_and_xor (&ui, 1); // CHECK: atomicrmw xor i32
49*67e74705SXin Li (void) __sync_fetch_and_xor (&sll, 1); // CHECK: atomicrmw xor i64
50*67e74705SXin Li (void) __sync_fetch_and_xor (&ull, 1); // CHECK: atomicrmw xor i64
51*67e74705SXin Li
52*67e74705SXin Li (void) __sync_fetch_and_nand (&sc, 1); // CHECK: atomicrmw nand i8
53*67e74705SXin Li (void) __sync_fetch_and_nand (&uc, 1); // CHECK: atomicrmw nand i8
54*67e74705SXin Li (void) __sync_fetch_and_nand (&ss, 1); // CHECK: atomicrmw nand i16
55*67e74705SXin Li (void) __sync_fetch_and_nand (&us, 1); // CHECK: atomicrmw nand i16
56*67e74705SXin Li (void) __sync_fetch_and_nand (&si, 1); // CHECK: atomicrmw nand i32
57*67e74705SXin Li (void) __sync_fetch_and_nand (&ui, 1); // CHECK: atomicrmw nand i32
58*67e74705SXin Li (void) __sync_fetch_and_nand (&sll, 1); // CHECK: atomicrmw nand i64
59*67e74705SXin Li (void) __sync_fetch_and_nand (&ull, 1); // CHECK: atomicrmw nand i64
60*67e74705SXin Li
61*67e74705SXin Li (void) __sync_fetch_and_and (&sc, 1); // CHECK: atomicrmw and i8
62*67e74705SXin Li (void) __sync_fetch_and_and (&uc, 1); // CHECK: atomicrmw and i8
63*67e74705SXin Li (void) __sync_fetch_and_and (&ss, 1); // CHECK: atomicrmw and i16
64*67e74705SXin Li (void) __sync_fetch_and_and (&us, 1); // CHECK: atomicrmw and i16
65*67e74705SXin Li (void) __sync_fetch_and_and (&si, 1); // CHECK: atomicrmw and i32
66*67e74705SXin Li (void) __sync_fetch_and_and (&ui, 1); // CHECK: atomicrmw and i32
67*67e74705SXin Li (void) __sync_fetch_and_and (&sll, 1); // CHECK: atomicrmw and i64
68*67e74705SXin Li (void) __sync_fetch_and_and (&ull, 1); // CHECK: atomicrmw and i64
69*67e74705SXin Li
70*67e74705SXin Li }
71*67e74705SXin Li
test_fetch_and_op(void)72*67e74705SXin Li void test_fetch_and_op (void) // CHECK-LABEL: define void @test_fetch_and_op
73*67e74705SXin Li {
74*67e74705SXin Li sc = __sync_fetch_and_add (&sc, 11); // CHECK: atomicrmw add
75*67e74705SXin Li uc = __sync_fetch_and_add (&uc, 11); // CHECK: atomicrmw add
76*67e74705SXin Li ss = __sync_fetch_and_add (&ss, 11); // CHECK: atomicrmw add
77*67e74705SXin Li us = __sync_fetch_and_add (&us, 11); // CHECK: atomicrmw add
78*67e74705SXin Li si = __sync_fetch_and_add (&si, 11); // CHECK: atomicrmw add
79*67e74705SXin Li ui = __sync_fetch_and_add (&ui, 11); // CHECK: atomicrmw add
80*67e74705SXin Li sll = __sync_fetch_and_add (&sll, 11); // CHECK: atomicrmw add
81*67e74705SXin Li ull = __sync_fetch_and_add (&ull, 11); // CHECK: atomicrmw add
82*67e74705SXin Li
83*67e74705SXin Li sc = __sync_fetch_and_sub (&sc, 11); // CHECK: atomicrmw sub
84*67e74705SXin Li uc = __sync_fetch_and_sub (&uc, 11); // CHECK: atomicrmw sub
85*67e74705SXin Li ss = __sync_fetch_and_sub (&ss, 11); // CHECK: atomicrmw sub
86*67e74705SXin Li us = __sync_fetch_and_sub (&us, 11); // CHECK: atomicrmw sub
87*67e74705SXin Li si = __sync_fetch_and_sub (&si, 11); // CHECK: atomicrmw sub
88*67e74705SXin Li ui = __sync_fetch_and_sub (&ui, 11); // CHECK: atomicrmw sub
89*67e74705SXin Li sll = __sync_fetch_and_sub (&sll, 11); // CHECK: atomicrmw sub
90*67e74705SXin Li ull = __sync_fetch_and_sub (&ull, 11); // CHECK: atomicrmw sub
91*67e74705SXin Li
92*67e74705SXin Li sc = __sync_fetch_and_or (&sc, 11); // CHECK: atomicrmw or
93*67e74705SXin Li uc = __sync_fetch_and_or (&uc, 11); // CHECK: atomicrmw or
94*67e74705SXin Li ss = __sync_fetch_and_or (&ss, 11); // CHECK: atomicrmw or
95*67e74705SXin Li us = __sync_fetch_and_or (&us, 11); // CHECK: atomicrmw or
96*67e74705SXin Li si = __sync_fetch_and_or (&si, 11); // CHECK: atomicrmw or
97*67e74705SXin Li ui = __sync_fetch_and_or (&ui, 11); // CHECK: atomicrmw or
98*67e74705SXin Li sll = __sync_fetch_and_or (&sll, 11); // CHECK: atomicrmw or
99*67e74705SXin Li ull = __sync_fetch_and_or (&ull, 11); // CHECK: atomicrmw or
100*67e74705SXin Li
101*67e74705SXin Li sc = __sync_fetch_and_xor (&sc, 11); // CHECK: atomicrmw xor
102*67e74705SXin Li uc = __sync_fetch_and_xor (&uc, 11); // CHECK: atomicrmw xor
103*67e74705SXin Li ss = __sync_fetch_and_xor (&ss, 11); // CHECK: atomicrmw xor
104*67e74705SXin Li us = __sync_fetch_and_xor (&us, 11); // CHECK: atomicrmw xor
105*67e74705SXin Li si = __sync_fetch_and_xor (&si, 11); // CHECK: atomicrmw xor
106*67e74705SXin Li ui = __sync_fetch_and_xor (&ui, 11); // CHECK: atomicrmw xor
107*67e74705SXin Li sll = __sync_fetch_and_xor (&sll, 11); // CHECK: atomicrmw xor
108*67e74705SXin Li ull = __sync_fetch_and_xor (&ull, 11); // CHECK: atomicrmw xor
109*67e74705SXin Li
110*67e74705SXin Li sc = __sync_fetch_and_nand (&sc, 11); // CHECK: atomicrmw nand
111*67e74705SXin Li uc = __sync_fetch_and_nand (&uc, 11); // CHECK: atomicrmw nand
112*67e74705SXin Li ss = __sync_fetch_and_nand (&ss, 11); // CHECK: atomicrmw nand
113*67e74705SXin Li us = __sync_fetch_and_nand (&us, 11); // CHECK: atomicrmw nand
114*67e74705SXin Li si = __sync_fetch_and_nand (&si, 11); // CHECK: atomicrmw nand
115*67e74705SXin Li ui = __sync_fetch_and_nand (&ui, 11); // CHECK: atomicrmw nand
116*67e74705SXin Li sll = __sync_fetch_and_nand (&sll, 11); // CHECK: atomicrmw nand
117*67e74705SXin Li ull = __sync_fetch_and_nand (&ull, 11); // CHECK: atomicrmw nand
118*67e74705SXin Li
119*67e74705SXin Li sc = __sync_fetch_and_and (&sc, 11); // CHECK: atomicrmw and
120*67e74705SXin Li uc = __sync_fetch_and_and (&uc, 11); // CHECK: atomicrmw and
121*67e74705SXin Li ss = __sync_fetch_and_and (&ss, 11); // CHECK: atomicrmw and
122*67e74705SXin Li us = __sync_fetch_and_and (&us, 11); // CHECK: atomicrmw and
123*67e74705SXin Li si = __sync_fetch_and_and (&si, 11); // CHECK: atomicrmw and
124*67e74705SXin Li ui = __sync_fetch_and_and (&ui, 11); // CHECK: atomicrmw and
125*67e74705SXin Li sll = __sync_fetch_and_and (&sll, 11); // CHECK: atomicrmw and
126*67e74705SXin Li ull = __sync_fetch_and_and (&ull, 11); // CHECK: atomicrmw and
127*67e74705SXin Li
128*67e74705SXin Li }
129*67e74705SXin Li
test_op_and_fetch(void)130*67e74705SXin Li void test_op_and_fetch (void)
131*67e74705SXin Li {
132*67e74705SXin Li sc = __sync_add_and_fetch (&sc, uc); // CHECK: atomicrmw add
133*67e74705SXin Li uc = __sync_add_and_fetch (&uc, uc); // CHECK: atomicrmw add
134*67e74705SXin Li ss = __sync_add_and_fetch (&ss, uc); // CHECK: atomicrmw add
135*67e74705SXin Li us = __sync_add_and_fetch (&us, uc); // CHECK: atomicrmw add
136*67e74705SXin Li si = __sync_add_and_fetch (&si, uc); // CHECK: atomicrmw add
137*67e74705SXin Li ui = __sync_add_and_fetch (&ui, uc); // CHECK: atomicrmw add
138*67e74705SXin Li sll = __sync_add_and_fetch (&sll, uc); // CHECK: atomicrmw add
139*67e74705SXin Li ull = __sync_add_and_fetch (&ull, uc); // CHECK: atomicrmw add
140*67e74705SXin Li
141*67e74705SXin Li sc = __sync_sub_and_fetch (&sc, uc); // CHECK: atomicrmw sub
142*67e74705SXin Li uc = __sync_sub_and_fetch (&uc, uc); // CHECK: atomicrmw sub
143*67e74705SXin Li ss = __sync_sub_and_fetch (&ss, uc); // CHECK: atomicrmw sub
144*67e74705SXin Li us = __sync_sub_and_fetch (&us, uc); // CHECK: atomicrmw sub
145*67e74705SXin Li si = __sync_sub_and_fetch (&si, uc); // CHECK: atomicrmw sub
146*67e74705SXin Li ui = __sync_sub_and_fetch (&ui, uc); // CHECK: atomicrmw sub
147*67e74705SXin Li sll = __sync_sub_and_fetch (&sll, uc); // CHECK: atomicrmw sub
148*67e74705SXin Li ull = __sync_sub_and_fetch (&ull, uc); // CHECK: atomicrmw sub
149*67e74705SXin Li
150*67e74705SXin Li sc = __sync_or_and_fetch (&sc, uc); // CHECK: atomicrmw or
151*67e74705SXin Li uc = __sync_or_and_fetch (&uc, uc); // CHECK: atomicrmw or
152*67e74705SXin Li ss = __sync_or_and_fetch (&ss, uc); // CHECK: atomicrmw or
153*67e74705SXin Li us = __sync_or_and_fetch (&us, uc); // CHECK: atomicrmw or
154*67e74705SXin Li si = __sync_or_and_fetch (&si, uc); // CHECK: atomicrmw or
155*67e74705SXin Li ui = __sync_or_and_fetch (&ui, uc); // CHECK: atomicrmw or
156*67e74705SXin Li sll = __sync_or_and_fetch (&sll, uc); // CHECK: atomicrmw or
157*67e74705SXin Li ull = __sync_or_and_fetch (&ull, uc); // CHECK: atomicrmw or
158*67e74705SXin Li
159*67e74705SXin Li sc = __sync_xor_and_fetch (&sc, uc); // CHECK: atomicrmw xor
160*67e74705SXin Li uc = __sync_xor_and_fetch (&uc, uc); // CHECK: atomicrmw xor
161*67e74705SXin Li ss = __sync_xor_and_fetch (&ss, uc); // CHECK: atomicrmw xor
162*67e74705SXin Li us = __sync_xor_and_fetch (&us, uc); // CHECK: atomicrmw xor
163*67e74705SXin Li si = __sync_xor_and_fetch (&si, uc); // CHECK: atomicrmw xor
164*67e74705SXin Li ui = __sync_xor_and_fetch (&ui, uc); // CHECK: atomicrmw xor
165*67e74705SXin Li sll = __sync_xor_and_fetch (&sll, uc); // CHECK: atomicrmw xor
166*67e74705SXin Li ull = __sync_xor_and_fetch (&ull, uc); // CHECK: atomicrmw xor
167*67e74705SXin Li
168*67e74705SXin Li sc = __sync_nand_and_fetch (&sc, uc); // CHECK: atomicrmw nand
169*67e74705SXin Li // CHECK: and
170*67e74705SXin Li // CHECK: xor
171*67e74705SXin Li uc = __sync_nand_and_fetch (&uc, uc); // CHECK: atomicrmw nand
172*67e74705SXin Li // CHECK: and
173*67e74705SXin Li // CHECK: xor
174*67e74705SXin Li ss = __sync_nand_and_fetch (&ss, uc); // CHECK: atomicrmw nand
175*67e74705SXin Li // CHECK: and
176*67e74705SXin Li // CHECK: xor
177*67e74705SXin Li us = __sync_nand_and_fetch (&us, uc); // CHECK: atomicrmw nand
178*67e74705SXin Li // CHECK: and
179*67e74705SXin Li // CHECK: xor
180*67e74705SXin Li si = __sync_nand_and_fetch (&si, uc); // CHECK: atomicrmw nand
181*67e74705SXin Li // CHECK: and
182*67e74705SXin Li // CHECK: xor
183*67e74705SXin Li ui = __sync_nand_and_fetch (&ui, uc); // CHECK: atomicrmw nand
184*67e74705SXin Li // CHECK: and
185*67e74705SXin Li // CHECK: xor
186*67e74705SXin Li sll = __sync_nand_and_fetch (&sll, uc); // CHECK: atomicrmw nand
187*67e74705SXin Li // CHECK: and
188*67e74705SXin Li // CHECK: xor
189*67e74705SXin Li ull = __sync_nand_and_fetch (&ull, uc); // CHECK: atomicrmw nand
190*67e74705SXin Li // CHECK: and
191*67e74705SXin Li // CHECK: xor
192*67e74705SXin Li
193*67e74705SXin Li sc = __sync_and_and_fetch (&sc, uc); // CHECK: atomicrmw and
194*67e74705SXin Li uc = __sync_and_and_fetch (&uc, uc); // CHECK: atomicrmw and
195*67e74705SXin Li ss = __sync_and_and_fetch (&ss, uc); // CHECK: atomicrmw and
196*67e74705SXin Li us = __sync_and_and_fetch (&us, uc); // CHECK: atomicrmw and
197*67e74705SXin Li si = __sync_and_and_fetch (&si, uc); // CHECK: atomicrmw and
198*67e74705SXin Li ui = __sync_and_and_fetch (&ui, uc); // CHECK: atomicrmw and
199*67e74705SXin Li sll = __sync_and_and_fetch (&sll, uc); // CHECK: atomicrmw and
200*67e74705SXin Li ull = __sync_and_and_fetch (&ull, uc); // CHECK: atomicrmw and
201*67e74705SXin Li
202*67e74705SXin Li }
203*67e74705SXin Li
test_compare_and_swap(void)204*67e74705SXin Li void test_compare_and_swap (void)
205*67e74705SXin Li {
206*67e74705SXin Li sc = __sync_val_compare_and_swap (&sc, uc, sc);
207*67e74705SXin Li // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i8
208*67e74705SXin Li // CHECK: extractvalue { i8, i1 } [[PAIR]], 0
209*67e74705SXin Li
210*67e74705SXin Li uc = __sync_val_compare_and_swap (&uc, uc, sc);
211*67e74705SXin Li // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i8
212*67e74705SXin Li // CHECK: extractvalue { i8, i1 } [[PAIR]], 0
213*67e74705SXin Li
214*67e74705SXin Li ss = __sync_val_compare_and_swap (&ss, uc, sc);
215*67e74705SXin Li // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i16
216*67e74705SXin Li // CHECK: extractvalue { i16, i1 } [[PAIR]], 0
217*67e74705SXin Li
218*67e74705SXin Li us = __sync_val_compare_and_swap (&us, uc, sc);
219*67e74705SXin Li // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i16
220*67e74705SXin Li // CHECK: extractvalue { i16, i1 } [[PAIR]], 0
221*67e74705SXin Li
222*67e74705SXin Li si = __sync_val_compare_and_swap (&si, uc, sc);
223*67e74705SXin Li // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i32
224*67e74705SXin Li // CHECK: extractvalue { i32, i1 } [[PAIR]], 0
225*67e74705SXin Li
226*67e74705SXin Li ui = __sync_val_compare_and_swap (&ui, uc, sc);
227*67e74705SXin Li // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i32
228*67e74705SXin Li // CHECK: extractvalue { i32, i1 } [[PAIR]], 0
229*67e74705SXin Li
230*67e74705SXin Li sll = __sync_val_compare_and_swap (&sll, uc, sc);
231*67e74705SXin Li // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i64
232*67e74705SXin Li // CHECK: extractvalue { i64, i1 } [[PAIR]], 0
233*67e74705SXin Li
234*67e74705SXin Li ull = __sync_val_compare_and_swap (&ull, uc, sc);
235*67e74705SXin Li // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i64
236*67e74705SXin Li // CHECK: extractvalue { i64, i1 } [[PAIR]], 0
237*67e74705SXin Li
238*67e74705SXin Li
239*67e74705SXin Li ui = __sync_bool_compare_and_swap (&sc, uc, sc);
240*67e74705SXin Li // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i8
241*67e74705SXin Li // CHECK: extractvalue { i8, i1 } [[PAIR]], 1
242*67e74705SXin Li
243*67e74705SXin Li ui = __sync_bool_compare_and_swap (&uc, uc, sc);
244*67e74705SXin Li // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i8
245*67e74705SXin Li // CHECK: extractvalue { i8, i1 } [[PAIR]], 1
246*67e74705SXin Li
247*67e74705SXin Li ui = __sync_bool_compare_and_swap (&ss, uc, sc);
248*67e74705SXin Li // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i16
249*67e74705SXin Li // CHECK: extractvalue { i16, i1 } [[PAIR]], 1
250*67e74705SXin Li
251*67e74705SXin Li ui = __sync_bool_compare_and_swap (&us, uc, sc);
252*67e74705SXin Li // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i16
253*67e74705SXin Li // CHECK: extractvalue { i16, i1 } [[PAIR]], 1
254*67e74705SXin Li
255*67e74705SXin Li ui = __sync_bool_compare_and_swap (&si, uc, sc);
256*67e74705SXin Li // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i32
257*67e74705SXin Li // CHECK: extractvalue { i32, i1 } [[PAIR]], 1
258*67e74705SXin Li
259*67e74705SXin Li ui = __sync_bool_compare_and_swap (&ui, uc, sc);
260*67e74705SXin Li // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i32
261*67e74705SXin Li // CHECK: extractvalue { i32, i1 } [[PAIR]], 1
262*67e74705SXin Li
263*67e74705SXin Li ui = __sync_bool_compare_and_swap (&sll, uc, sc);
264*67e74705SXin Li // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i64
265*67e74705SXin Li // CHECK: extractvalue { i64, i1 } [[PAIR]], 1
266*67e74705SXin Li
267*67e74705SXin Li ui = __sync_bool_compare_and_swap (&ull, uc, sc);
268*67e74705SXin Li // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i64
269*67e74705SXin Li // CHECK: extractvalue { i64, i1 } [[PAIR]], 1
270*67e74705SXin Li }
271*67e74705SXin Li
test_lock(void)272*67e74705SXin Li void test_lock (void)
273*67e74705SXin Li {
274*67e74705SXin Li sc = __sync_lock_test_and_set (&sc, 1); // CHECK: atomicrmw xchg i8
275*67e74705SXin Li uc = __sync_lock_test_and_set (&uc, 1); // CHECK: atomicrmw xchg i8
276*67e74705SXin Li ss = __sync_lock_test_and_set (&ss, 1); // CHECK: atomicrmw xchg i16
277*67e74705SXin Li us = __sync_lock_test_and_set (&us, 1); // CHECK: atomicrmw xchg i16
278*67e74705SXin Li si = __sync_lock_test_and_set (&si, 1); // CHECK: atomicrmw xchg i32
279*67e74705SXin Li ui = __sync_lock_test_and_set (&ui, 1); // CHECK: atomicrmw xchg i32
280*67e74705SXin Li sll = __sync_lock_test_and_set (&sll, 1); // CHECK: atomicrmw xchg i64
281*67e74705SXin Li ull = __sync_lock_test_and_set (&ull, 1); // CHECK: atomicrmw xchg i64
282*67e74705SXin Li
283*67e74705SXin Li __sync_synchronize (); // CHECK: fence seq_cst
284*67e74705SXin Li
285*67e74705SXin Li __sync_lock_release (&sc); // CHECK: store atomic {{.*}} release, align 1
286*67e74705SXin Li __sync_lock_release (&uc); // CHECK: store atomic {{.*}} release, align 1
287*67e74705SXin Li __sync_lock_release (&ss); // CHECK: store atomic {{.*}} release, align 2
288*67e74705SXin Li __sync_lock_release (&us); /// CHECK: store atomic {{.*}} release, align 2
289*67e74705SXin Li __sync_lock_release (&si); // CHECK: store atomic {{.*}} release, align 4
290*67e74705SXin Li __sync_lock_release (&ui); // CHECK: store atomic {{.*}} release, align 4
291*67e74705SXin Li __sync_lock_release (&sll); // CHECK: store atomic {{.*}} release, align 8
292*67e74705SXin Li __sync_lock_release (&ull); // CHECK: store atomic {{.*}} release, align 8
293*67e74705SXin Li }
294