Re-work X86 code generation of atomic ops with spin-loop
[oota-llvm.git] / test / CodeGen / X86 / atomic8.ll
1 ; RUN: llc < %s -O0 -march=x86-64 -mcpu=corei7 | FileCheck %s --check-prefix X64
2 ; RUN: llc < %s -O0 -march=x86 -mcpu=corei7 | FileCheck %s --check-prefix X32
3 ; XFAIL: *
4
5 @sc8 = external global i8
6
7 define void @atomic_fetch_add8() nounwind {
8 ; X64:   atomic_fetch_add8
9 ; X32:   atomic_fetch_add8
10 entry:
11 ; 32-bit
12   %t1 = atomicrmw add  i8* @sc8, i8 1 acquire
13 ; X64:       lock
14 ; X64:       incb
15 ; X32:       lock
16 ; X32:       incb
17   %t2 = atomicrmw add  i8* @sc8, i8 3 acquire
18 ; X64:       lock
19 ; X64:       addb $3
20 ; X32:       lock
21 ; X32:       addb $3
22   %t3 = atomicrmw add  i8* @sc8, i8 5 acquire
23 ; X64:       lock
24 ; X64:       xaddb
25 ; X32:       lock
26 ; X32:       xaddb
27   %t4 = atomicrmw add  i8* @sc8, i8 %t3 acquire
28 ; X64:       lock
29 ; X64:       addb
30 ; X32:       lock
31 ; X32:       addb
32   ret void
33 ; X64:       ret
34 ; X32:       ret
35 }
36
37 define void @atomic_fetch_sub8() nounwind {
38 ; X64:   atomic_fetch_sub8
39 ; X32:   atomic_fetch_sub8
40   %t1 = atomicrmw sub  i8* @sc8, i8 1 acquire
41 ; X64:       lock
42 ; X64:       decb
43 ; X32:       lock
44 ; X32:       decb
45   %t2 = atomicrmw sub  i8* @sc8, i8 3 acquire
46 ; X64:       lock
47 ; X64:       subb $3
48 ; X32:       lock
49 ; X32:       subb $3
50   %t3 = atomicrmw sub  i8* @sc8, i8 5 acquire
51 ; X64:       lock
52 ; X64:       xaddb
53 ; X32:       lock
54 ; X32:       xaddb
55   %t4 = atomicrmw sub  i8* @sc8, i8 %t3 acquire
56 ; X64:       lock
57 ; X64:       subb
58 ; X32:       lock
59 ; X32:       subb
60   ret void
61 ; X64:       ret
62 ; X32:       ret
63 }
64
65 define void @atomic_fetch_and8() nounwind {
66 ; X64:   atomic_fetch_and8
67 ; X32:   atomic_fetch_and8
68   %t1 = atomicrmw and  i8* @sc8, i8 3 acquire
69 ; X64:       lock
70 ; X64:       andb $3
71 ; X32:       lock
72 ; X32:       andb $3
73   %t2 = atomicrmw and  i8* @sc8, i8 5 acquire
74 ; X64:       andb
75 ; X64:       lock
76 ; X64:       cmpxchgb
77 ; X32:       andb
78 ; X32:       lock
79 ; X32:       cmpxchgb
80   %t3 = atomicrmw and  i8* @sc8, i8 %t2 acquire
81 ; X64:       lock
82 ; X64:       andb
83 ; X32:       lock
84 ; X32:       andb
85   ret void
86 ; X64:       ret
87 ; X32:       ret
88 }
89
90 define void @atomic_fetch_or8() nounwind {
91 ; X64:   atomic_fetch_or8
92 ; X32:   atomic_fetch_or8
93   %t1 = atomicrmw or   i8* @sc8, i8 3 acquire
94 ; X64:       lock
95 ; X64:       orb $3
96 ; X32:       lock
97 ; X32:       orb $3
98   %t2 = atomicrmw or   i8* @sc8, i8 5 acquire
99 ; X64:       orb
100 ; X64:       lock
101 ; X64:       cmpxchgb
102 ; X32:       orb
103 ; X32:       lock
104 ; X32:       cmpxchgb
105   %t3 = atomicrmw or   i8* @sc8, i8 %t2 acquire
106 ; X64:       lock
107 ; X64:       orb
108 ; X32:       lock
109 ; X32:       orb
110   ret void
111 ; X64:       ret
112 ; X32:       ret
113 }
114
115 define void @atomic_fetch_xor8() nounwind {
116 ; X64:   atomic_fetch_xor8
117 ; X32:   atomic_fetch_xor8
118   %t1 = atomicrmw xor  i8* @sc8, i8 3 acquire
119 ; X64:       lock
120 ; X64:       xorb $3
121 ; X32:       lock
122 ; X32:       xorb $3
123   %t2 = atomicrmw xor  i8* @sc8, i8 5 acquire
124 ; X64:       xorb
125 ; X64:       lock
126 ; X64:       cmpxchgb
127 ; X32:       xorb
128 ; X32:       lock
129 ; X32:       cmpxchgb
130   %t3 = atomicrmw xor  i8* @sc8, i8 %t2 acquire
131 ; X64:       lock
132 ; X64:       xorb
133 ; X32:       lock
134 ; X32:       xorb
135   ret void
136 ; X64:       ret
137 ; X32:       ret
138 }
139
140 define void @atomic_fetch_nand8(i8 %x) nounwind {
141 ; X64:   atomic_fetch_nand8
142 ; X32:   atomic_fetch_nand8
143   %t1 = atomicrmw nand i8* @sc8, i8 %x acquire
144 ; X64:       andb
145 ; X64:       notb
146 ; X64:       lock
147 ; X64:       cmpxchgb
148 ; X32:       andb
149 ; X32:       notb
150 ; X32:       lock
151 ; X32:       cmpxchgb
152   ret void
153 ; X64:       ret
154 ; X32:       ret
155 }
156
157 define void @atomic_fetch_max8(i8 %x) nounwind {
158   %t1 = atomicrmw max  i8* @sc8, i8 %x acquire
159 ; X64:       cmpb
160 ; X64:       cmov
161 ; X64:       lock
162 ; X64:       cmpxchgb
163
164 ; X32:       cmpb
165 ; X32:       cmov
166 ; X32:       lock
167 ; X32:       cmpxchgb
168   ret void
169 ; X64:       ret
170 ; X32:       ret
171 }
172
173 define void @atomic_fetch_min8(i8 %x) nounwind {
174   %t1 = atomicrmw min  i8* @sc8, i8 %x acquire
175 ; X64:       cmpb
176 ; X64:       cmov
177 ; X64:       lock
178 ; X64:       cmpxchgb
179
180 ; X32:       cmpb
181 ; X32:       cmov
182 ; X32:       lock
183 ; X32:       cmpxchgb
184   ret void
185 ; X64:       ret
186 ; X32:       ret
187 }
188
189 define void @atomic_fetch_umax8(i8 %x) nounwind {
190   %t1 = atomicrmw umax i8* @sc8, i8 %x acquire
191 ; X64:       cmpb
192 ; X64:       cmov
193 ; X64:       lock
194 ; X64:       cmpxchgb
195
196 ; X32:       cmpb
197 ; X32:       cmov
198 ; X32:       lock
199 ; X32:       cmpxchgb
200   ret void
201 ; X64:       ret
202 ; X32:       ret
203 }
204
205 define void @atomic_fetch_umin8(i8 %x) nounwind {
206   %t1 = atomicrmw umin i8* @sc8, i8 %x acquire
207 ; X64:       cmpb
208 ; X64:       cmov
209 ; X64:       lock
210 ; X64:       cmpxchgb
211 ; X32:       cmpb
212 ; X32:       cmov
213 ; X32:       lock
214 ; X32:       cmpxchgb
215   ret void
216 ; X64:       ret
217 ; X32:       ret
218 }
219
220 define void @atomic_fetch_cmpxchg8() nounwind {
221   %t1 = cmpxchg i8* @sc8, i8 0, i8 1 acquire
222 ; X64:       lock
223 ; X64:       cmpxchgb
224 ; X32:       lock
225 ; X32:       cmpxchgb
226   ret void
227 ; X64:       ret
228 ; X32:       ret
229 }
230
231 define void @atomic_fetch_store8(i8 %x) nounwind {
232   store atomic i8 %x, i8* @sc8 release, align 4
233 ; X64-NOT:   lock
234 ; X64:       movb
235 ; X32-NOT:   lock
236 ; X32:       movb
237   ret void
238 ; X64:       ret
239 ; X32:       ret
240 }
241
242 define void @atomic_fetch_swap8(i8 %x) nounwind {
243   %t1 = atomicrmw xchg i8* @sc8, i8 %x acquire
244 ; X64-NOT:   lock
245 ; X64:       xchgb
246 ; X32-NOT:   lock
247 ; X32:       xchgb
248   ret void
249 ; X64:       ret
250 ; X32:       ret
251 }