13883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher// Test frontend handling of __sync builtins.
23883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher// Modified from a gcc testcase.
3060ddb0173ba91cd400f073ed0bd1f9b9c3a4d50Nuno Lopes// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm %s -o - | FileCheck %s
43883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
53883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christophersigned char sc;
63883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopherunsigned char uc;
73883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christophersigned short ss;
83883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopherunsigned short us;
93883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christophersigned int si;
103883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopherunsigned int ui;
113883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christophersigned long long sll;
123883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopherunsigned long long ull;
133883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
1493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Linvoid test_op_ignore (void) // CHECK-LABEL: define void @test_op_ignore
153883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher{
16c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_add (&sc, 1); // CHECK: atomicrmw add i8
17c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_add (&uc, 1); // CHECK: atomicrmw add i8
18c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_add (&ss, 1); // CHECK: atomicrmw add i16
19c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_add (&us, 1); // CHECK: atomicrmw add i16
20c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_add (&si, 1); // CHECK: atomicrmw add i32
21c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_add (&ui, 1); // CHECK: atomicrmw add i32
22c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_add (&sll, 1); // CHECK: atomicrmw add i64
23c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_add (&ull, 1); // CHECK: atomicrmw add i64
24c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman
25c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_sub (&sc, 1); // CHECK: atomicrmw sub i8
26c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_sub (&uc, 1); // CHECK: atomicrmw sub i8
27c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_sub (&ss, 1); // CHECK: atomicrmw sub i16
28c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_sub (&us, 1); // CHECK: atomicrmw sub i16
29c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_sub (&si, 1); // CHECK: atomicrmw sub i32
30c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_sub (&ui, 1); // CHECK: atomicrmw sub i32
31c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_sub (&sll, 1); // CHECK: atomicrmw sub i64
32c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_sub (&ull, 1); // CHECK: atomicrmw sub i64
33c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman
34c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_or (&sc, 1); // CHECK: atomicrmw or i8
35c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_or (&uc, 1); // CHECK: atomicrmw or i8
36c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_or (&ss, 1); // CHECK: atomicrmw or i16
37c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_or (&us, 1); // CHECK: atomicrmw or i16
38c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_or (&si, 1); // CHECK: atomicrmw or i32
39c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_or (&ui, 1); // CHECK: atomicrmw or i32
40c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_or (&sll, 1); // CHECK: atomicrmw or i64
41c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_or (&ull, 1); // CHECK: atomicrmw or i64
42c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman
43c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_xor (&sc, 1); // CHECK: atomicrmw xor i8
44c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_xor (&uc, 1); // CHECK: atomicrmw xor i8
45c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_xor (&ss, 1); // CHECK: atomicrmw xor i16
46c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_xor (&us, 1); // CHECK: atomicrmw xor i16
47c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_xor (&si, 1); // CHECK: atomicrmw xor i32
48c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_xor (&ui, 1); // CHECK: atomicrmw xor i32
49c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_xor (&sll, 1); // CHECK: atomicrmw xor i64
50c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_xor (&ull, 1); // CHECK: atomicrmw xor i64
51c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman
52c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_and (&sc, 1); // CHECK: atomicrmw and i8
53c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_and (&uc, 1); // CHECK: atomicrmw and i8
54c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_and (&ss, 1); // CHECK: atomicrmw and i16
55c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_and (&us, 1); // CHECK: atomicrmw and i16
56c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_and (&si, 1); // CHECK: atomicrmw and i32
57c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_and (&ui, 1); // CHECK: atomicrmw and i32
58c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_and (&sll, 1); // CHECK: atomicrmw and i64
59c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  (void) __sync_fetch_and_and (&ull, 1); // CHECK: atomicrmw and i64
603883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
613883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher}
623883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
6393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Linvoid test_fetch_and_op (void) // CHECK-LABEL: define void @test_fetch_and_op
643883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher{
65c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  sc = __sync_fetch_and_add (&sc, 11); // CHECK: atomicrmw add
66c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  uc = __sync_fetch_and_add (&uc, 11); // CHECK: atomicrmw add
67c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ss = __sync_fetch_and_add (&ss, 11); // CHECK: atomicrmw add
68c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  us = __sync_fetch_and_add (&us, 11); // CHECK: atomicrmw add
69c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  si = __sync_fetch_and_add (&si, 11); // CHECK: atomicrmw add
70c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ui = __sync_fetch_and_add (&ui, 11); // CHECK: atomicrmw add
71c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  sll = __sync_fetch_and_add (&sll, 11); // CHECK: atomicrmw add
72c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ull = __sync_fetch_and_add (&ull, 11); // CHECK: atomicrmw add
73c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman
74c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  sc = __sync_fetch_and_sub (&sc, 11); // CHECK: atomicrmw sub
75c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  uc = __sync_fetch_and_sub (&uc, 11); // CHECK: atomicrmw sub
76c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ss = __sync_fetch_and_sub (&ss, 11); // CHECK: atomicrmw sub
77c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  us = __sync_fetch_and_sub (&us, 11); // CHECK: atomicrmw sub
78c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  si = __sync_fetch_and_sub (&si, 11); // CHECK: atomicrmw sub
79c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ui = __sync_fetch_and_sub (&ui, 11); // CHECK: atomicrmw sub
80c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  sll = __sync_fetch_and_sub (&sll, 11); // CHECK: atomicrmw sub
81c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ull = __sync_fetch_and_sub (&ull, 11); // CHECK: atomicrmw sub
82c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman
83c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  sc = __sync_fetch_and_or (&sc, 11); // CHECK: atomicrmw or
84c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  uc = __sync_fetch_and_or (&uc, 11); // CHECK: atomicrmw or
85c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ss = __sync_fetch_and_or (&ss, 11); // CHECK: atomicrmw or
86c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  us = __sync_fetch_and_or (&us, 11); // CHECK: atomicrmw or
87c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  si = __sync_fetch_and_or (&si, 11); // CHECK: atomicrmw or
88c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ui = __sync_fetch_and_or (&ui, 11); // CHECK: atomicrmw or
89c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  sll = __sync_fetch_and_or (&sll, 11); // CHECK: atomicrmw or
90c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ull = __sync_fetch_and_or (&ull, 11); // CHECK: atomicrmw or
91c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman
92c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  sc = __sync_fetch_and_xor (&sc, 11); // CHECK: atomicrmw xor
93c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  uc = __sync_fetch_and_xor (&uc, 11); // CHECK: atomicrmw xor
94c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ss = __sync_fetch_and_xor (&ss, 11); // CHECK: atomicrmw xor
95c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  us = __sync_fetch_and_xor (&us, 11); // CHECK: atomicrmw xor
96c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  si = __sync_fetch_and_xor (&si, 11); // CHECK: atomicrmw xor
97c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ui = __sync_fetch_and_xor (&ui, 11); // CHECK: atomicrmw xor
98c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  sll = __sync_fetch_and_xor (&sll, 11); // CHECK: atomicrmw xor
99c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ull = __sync_fetch_and_xor (&ull, 11); // CHECK: atomicrmw xor
100c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman
101c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  sc = __sync_fetch_and_and (&sc, 11); // CHECK: atomicrmw and
102c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  uc = __sync_fetch_and_and (&uc, 11); // CHECK: atomicrmw and
103c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ss = __sync_fetch_and_and (&ss, 11); // CHECK: atomicrmw and
104c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  us = __sync_fetch_and_and (&us, 11); // CHECK: atomicrmw and
105c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  si = __sync_fetch_and_and (&si, 11); // CHECK: atomicrmw and
106c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ui = __sync_fetch_and_and (&ui, 11); // CHECK: atomicrmw and
107c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  sll = __sync_fetch_and_and (&sll, 11); // CHECK: atomicrmw and
108c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ull = __sync_fetch_and_and (&ull, 11); // CHECK: atomicrmw and
1093883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
1103883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher}
1113883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
1123883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christophervoid test_op_and_fetch (void)
1133883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher{
114c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  sc = __sync_add_and_fetch (&sc, uc); // CHECK: atomicrmw add
115c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  uc = __sync_add_and_fetch (&uc, uc); // CHECK: atomicrmw add
116c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ss = __sync_add_and_fetch (&ss, uc); // CHECK: atomicrmw add
117c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  us = __sync_add_and_fetch (&us, uc); // CHECK: atomicrmw add
118c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  si = __sync_add_and_fetch (&si, uc); // CHECK: atomicrmw add
119c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ui = __sync_add_and_fetch (&ui, uc); // CHECK: atomicrmw add
120c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  sll = __sync_add_and_fetch (&sll, uc); // CHECK: atomicrmw add
121c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ull = __sync_add_and_fetch (&ull, uc); // CHECK: atomicrmw add
122c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman
123c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  sc = __sync_sub_and_fetch (&sc, uc); // CHECK: atomicrmw sub
124c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  uc = __sync_sub_and_fetch (&uc, uc); // CHECK: atomicrmw sub
125c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ss = __sync_sub_and_fetch (&ss, uc); // CHECK: atomicrmw sub
126c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  us = __sync_sub_and_fetch (&us, uc); // CHECK: atomicrmw sub
127c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  si = __sync_sub_and_fetch (&si, uc); // CHECK: atomicrmw sub
128c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ui = __sync_sub_and_fetch (&ui, uc); // CHECK: atomicrmw sub
129c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  sll = __sync_sub_and_fetch (&sll, uc); // CHECK: atomicrmw sub
130c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ull = __sync_sub_and_fetch (&ull, uc); // CHECK: atomicrmw sub
131c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman
132c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  sc = __sync_or_and_fetch (&sc, uc); // CHECK: atomicrmw or
133c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  uc = __sync_or_and_fetch (&uc, uc); // CHECK: atomicrmw or
134c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ss = __sync_or_and_fetch (&ss, uc); // CHECK: atomicrmw or
135c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  us = __sync_or_and_fetch (&us, uc); // CHECK: atomicrmw or
136c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  si = __sync_or_and_fetch (&si, uc); // CHECK: atomicrmw or
137c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ui = __sync_or_and_fetch (&ui, uc); // CHECK: atomicrmw or
138c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  sll = __sync_or_and_fetch (&sll, uc); // CHECK: atomicrmw or
139c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ull = __sync_or_and_fetch (&ull, uc); // CHECK: atomicrmw or
140c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman
141c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  sc = __sync_xor_and_fetch (&sc, uc); // CHECK: atomicrmw xor
142c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  uc = __sync_xor_and_fetch (&uc, uc); // CHECK: atomicrmw xor
143c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ss = __sync_xor_and_fetch (&ss, uc); // CHECK: atomicrmw xor
144c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  us = __sync_xor_and_fetch (&us, uc); // CHECK: atomicrmw xor
145c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  si = __sync_xor_and_fetch (&si, uc); // CHECK: atomicrmw xor
146c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ui = __sync_xor_and_fetch (&ui, uc); // CHECK: atomicrmw xor
147c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  sll = __sync_xor_and_fetch (&sll, uc); // CHECK: atomicrmw xor
148c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ull = __sync_xor_and_fetch (&ull, uc); // CHECK: atomicrmw xor
149c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman
150c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  sc = __sync_and_and_fetch (&sc, uc); // CHECK: atomicrmw and
151c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  uc = __sync_and_and_fetch (&uc, uc); // CHECK: atomicrmw and
152c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ss = __sync_and_and_fetch (&ss, uc); // CHECK: atomicrmw and
153c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  us = __sync_and_and_fetch (&us, uc); // CHECK: atomicrmw and
154c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  si = __sync_and_and_fetch (&si, uc); // CHECK: atomicrmw and
155c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ui = __sync_and_and_fetch (&ui, uc); // CHECK: atomicrmw and
156c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  sll = __sync_and_and_fetch (&sll, uc); // CHECK: atomicrmw and
157c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ull = __sync_and_and_fetch (&ull, uc); // CHECK: atomicrmw and
1583883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
1593883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher}
1603883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
1613883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christophervoid test_compare_and_swap (void)
1623883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher{
163ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  sc = __sync_val_compare_and_swap (&sc, uc, sc);
164ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i8
165ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: extractvalue { i8, i1 } [[PAIR]], 0
166ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
167ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  uc = __sync_val_compare_and_swap (&uc, uc, sc);
168ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i8
169ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: extractvalue { i8, i1 } [[PAIR]], 0
170ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
171ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  ss = __sync_val_compare_and_swap (&ss, uc, sc);
172ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i16
173ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: extractvalue { i16, i1 } [[PAIR]], 0
174ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
175ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  us = __sync_val_compare_and_swap (&us, uc, sc);
176ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i16
177ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: extractvalue { i16, i1 } [[PAIR]], 0
178ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
179ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  si = __sync_val_compare_and_swap (&si, uc, sc);
180ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i32
181ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: extractvalue { i32, i1 } [[PAIR]], 0
182ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
183ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  ui = __sync_val_compare_and_swap (&ui, uc, sc);
184ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i32
185ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: extractvalue { i32, i1 } [[PAIR]], 0
186ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
187ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  sll = __sync_val_compare_and_swap (&sll, uc, sc);
188ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i64
189ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: extractvalue { i64, i1 } [[PAIR]], 0
190ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
191ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  ull = __sync_val_compare_and_swap (&ull, uc, sc);
192ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i64
193ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: extractvalue { i64, i1 } [[PAIR]], 0
194ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
195ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
196ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  ui = __sync_bool_compare_and_swap (&sc, uc, sc);
197ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i8
198ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: extractvalue { i8, i1 } [[PAIR]], 1
199ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
200ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  ui = __sync_bool_compare_and_swap (&uc, uc, sc);
201ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i8
202ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: extractvalue { i8, i1 } [[PAIR]], 1
203ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
204ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  ui = __sync_bool_compare_and_swap (&ss, uc, sc);
205ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i16
206ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: extractvalue { i16, i1 } [[PAIR]], 1
207ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
208ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  ui = __sync_bool_compare_and_swap (&us, uc, sc);
209ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i16
210ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: extractvalue { i16, i1 } [[PAIR]], 1
211ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
212ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  ui = __sync_bool_compare_and_swap (&si, uc, sc);
213ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i32
214ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: extractvalue { i32, i1 } [[PAIR]], 1
215ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
216ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  ui = __sync_bool_compare_and_swap (&ui, uc, sc);
217ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i32
218ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: extractvalue { i32, i1 } [[PAIR]], 1
219ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
220ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  ui = __sync_bool_compare_and_swap (&sll, uc, sc);
221ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i64
222ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: extractvalue { i64, i1 } [[PAIR]], 1
223ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
224ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  ui = __sync_bool_compare_and_swap (&ull, uc, sc);
225ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: [[PAIR:%[a-z0-9._]+]] = cmpxchg i64
226ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: extractvalue { i64, i1 } [[PAIR]], 1
2273883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher}
2283883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher
2293883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christophervoid test_lock (void)
2303883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher{
231c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  sc = __sync_lock_test_and_set (&sc, 1); // CHECK: atomicrmw xchg i8
232c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  uc = __sync_lock_test_and_set (&uc, 1); // CHECK: atomicrmw xchg i8
233c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ss = __sync_lock_test_and_set (&ss, 1); // CHECK: atomicrmw xchg i16
234c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  us = __sync_lock_test_and_set (&us, 1); // CHECK: atomicrmw xchg i16
235c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  si = __sync_lock_test_and_set (&si, 1); // CHECK: atomicrmw xchg i32
236c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ui = __sync_lock_test_and_set (&ui, 1); // CHECK: atomicrmw xchg i32
237c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  sll = __sync_lock_test_and_set (&sll, 1); // CHECK: atomicrmw xchg i64
238c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  ull = __sync_lock_test_and_set (&ull, 1); // CHECK: atomicrmw xchg i64
239c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman
240c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman  __sync_synchronize (); // CHECK: fence seq_cst
241c83b975f1fb9d11e10b5aa25029ae9bb5fa80e07Eli Friedman
242eb43f4a8f133c2bc510ae136a556e92b68a6ff44Eli Friedman  __sync_lock_release (&sc); // CHECK: store atomic {{.*}} release, align 1
243eb43f4a8f133c2bc510ae136a556e92b68a6ff44Eli Friedman  __sync_lock_release (&uc); // CHECK: store atomic {{.*}} release, align 1
244eb43f4a8f133c2bc510ae136a556e92b68a6ff44Eli Friedman  __sync_lock_release (&ss); // CHECK: store atomic {{.*}} release, align 2
245eb43f4a8f133c2bc510ae136a556e92b68a6ff44Eli Friedman  __sync_lock_release (&us); /// CHECK: store atomic {{.*}} release, align 2
246eb43f4a8f133c2bc510ae136a556e92b68a6ff44Eli Friedman  __sync_lock_release (&si); // CHECK: store atomic {{.*}} release, align 4
247eb43f4a8f133c2bc510ae136a556e92b68a6ff44Eli Friedman  __sync_lock_release (&ui); // CHECK: store atomic {{.*}} release, align 4
248eb43f4a8f133c2bc510ae136a556e92b68a6ff44Eli Friedman  __sync_lock_release (&sll); // CHECK: store atomic {{.*}} release, align 8
249eb43f4a8f133c2bc510ae136a556e92b68a6ff44Eli Friedman  __sync_lock_release (&ull); // CHECK: store atomic {{.*}} release, align 8
2503883e66cfd55de70d89831cf26f9ae53931d11d3Eric Christopher}
251