1c4b0f43bf76e8af94029b562c5b6ce002fb2e4e
[oota-llvm.git] / test / CodeGen / X86 / atomic6432.ll
1 ; RUN: llc < %s -O0 -march=x86 -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X32
2
3 @sc64 = external global i64
4
5 define void @atomic_fetch_add64() nounwind {
6 ; X64-LABEL:   atomic_fetch_add64:
7 ; X32-LABEL:   atomic_fetch_add64:
8 entry:
9   %t1 = atomicrmw add  i64* @sc64, i64 1 acquire
10 ; X32:       addl
11 ; X32:       adcl
12 ; X32:       lock
13 ; X32:       cmpxchg8b
14   %t2 = atomicrmw add  i64* @sc64, i64 3 acquire
15 ; X32:       addl
16 ; X32:       adcl
17 ; X32:       lock
18 ; X32:       cmpxchg8b
19   %t3 = atomicrmw add  i64* @sc64, i64 5 acquire
20 ; X32:       addl
21 ; X32:       adcl
22 ; X32:       lock
23 ; X32:       cmpxchg8b
24   %t4 = atomicrmw add  i64* @sc64, i64 %t3 acquire
25 ; X32:       addl
26 ; X32:       adcl
27 ; X32:       lock
28 ; X32:       cmpxchg8b
29   ret void
30 ; X32:       ret
31 }
32
33 define void @atomic_fetch_sub64() nounwind {
34 ; X64-LABEL:   atomic_fetch_sub64:
35 ; X32-LABEL:   atomic_fetch_sub64:
36   %t1 = atomicrmw sub  i64* @sc64, i64 1 acquire
37 ; X32:       addl $-1
38 ; X32:       adcl $-1
39 ; X32:       lock
40 ; X32:       cmpxchg8b
41   %t2 = atomicrmw sub  i64* @sc64, i64 3 acquire
42 ; X32:       addl $-3
43 ; X32:       adcl $-1
44 ; X32:       lock
45 ; X32:       cmpxchg8b
46   %t3 = atomicrmw sub  i64* @sc64, i64 5 acquire
47 ; X32:       addl $-5
48 ; X32:       adcl $-1
49 ; X32:       lock
50 ; X32:       cmpxchg8b
51   %t4 = atomicrmw sub  i64* @sc64, i64 %t3 acquire
52 ; X32:       subl
53 ; X32:       sbbl
54 ; X32:       lock
55 ; X32:       cmpxchg8b
56   ret void
57 ; X32:       ret
58 }
59
60 define void @atomic_fetch_and64() nounwind {
61 ; X64-LABEL:   atomic_fetch_and:64
62 ; X32-LABEL:   atomic_fetch_and64:
63   %t1 = atomicrmw and  i64* @sc64, i64 3 acquire
64 ; X32:       andl $3
65 ; X32-NOT:       andl
66 ; X32:       lock
67 ; X32:       cmpxchg8b
68   %t2 = atomicrmw and  i64* @sc64, i64 4294967297 acquire
69 ; X32:       andl $1
70 ; X32:       andl $1
71 ; X32:       lock
72 ; X32:       cmpxchg8b
73   %t3 = atomicrmw and  i64* @sc64, i64 %t2 acquire
74 ; X32:       andl
75 ; X32:       andl
76 ; X32:       lock
77 ; X32:       cmpxchg8b
78   ret void
79 ; X32:       ret
80 }
81
82 define void @atomic_fetch_or64() nounwind {
83 ; X64-LABEL:   atomic_fetch_or64:
84 ; X32-LABEL:   atomic_fetch_or64:
85   %t1 = atomicrmw or   i64* @sc64, i64 3 acquire
86 ; X32:       orl $3
87 ; X32-NOT:       orl
88 ; X32:       lock
89 ; X32:       cmpxchg8b
90   %t2 = atomicrmw or   i64* @sc64, i64 4294967297 acquire
91 ; X32:       orl $1
92 ; X32:       orl $1
93 ; X32:       lock
94 ; X32:       cmpxchg8b
95   %t3 = atomicrmw or   i64* @sc64, i64 %t2 acquire
96 ; X32:       orl
97 ; X32:       orl
98 ; X32:       lock
99 ; X32:       cmpxchg8b
100   ret void
101 ; X32:       ret
102 }
103
104 define void @atomic_fetch_xor64() nounwind {
105 ; X64-LABEL:   atomic_fetch_xor:64
106 ; X32-LABEL:   atomic_fetch_xor64:
107   %t1 = atomicrmw xor  i64* @sc64, i64 3 acquire
108 ; X32:       xorl
109 ; X32-NOT:       xorl
110 ; X32:       lock
111 ; X32:       cmpxchg8b
112   %t2 = atomicrmw xor  i64* @sc64, i64 4294967297 acquire
113 ; X32:       xorl $1
114 ; X32:       xorl $1
115 ; X32:       lock
116 ; X32:       cmpxchg8b
117   %t3 = atomicrmw xor  i64* @sc64, i64 %t2 acquire
118 ; X32:       xorl
119 ; X32:       xorl
120 ; X32:       lock
121 ; X32:       cmpxchg8b
122   ret void
123 ; X32:       ret
124 }
125
126 define void @atomic_fetch_nand64(i64 %x) nounwind {
127 ; X64-LABEL:   atomic_fetch_nand64:
128 ; X32-LABEL:   atomic_fetch_nand64:
129   %t1 = atomicrmw nand i64* @sc64, i64 %x acquire
130 ; X32:       andl
131 ; X32:       andl
132 ; X32:       notl
133 ; X32:       notl
134 ; X32:       lock
135 ; X32:       cmpxchg8b
136   ret void
137 ; X32:       ret
138 }
139
140 define void @atomic_fetch_max64(i64 %x) nounwind {
141 ; X64-LABEL:   atomic_fetch_max:64
142 ; X32-LABEL:   atomic_fetch_max64:
143   %t1 = atomicrmw max  i64* @sc64, i64 %x acquire
144 ; X32:       subl
145 ; X32:       subl
146 ; X32:       cmov
147 ; X32:       cmov
148 ; X32:       lock
149 ; X32:       cmpxchg8b
150   ret void
151 ; X32:       ret
152 }
153
154 define void @atomic_fetch_min64(i64 %x) nounwind {
155 ; X64-LABEL:   atomic_fetch_min64:
156 ; X32-LABEL:   atomic_fetch_min64:
157   %t1 = atomicrmw min  i64* @sc64, i64 %x acquire
158 ; X32:       subl
159 ; X32:       subl
160 ; X32:       cmov
161 ; X32:       cmov
162 ; X32:       lock
163 ; X32:       cmpxchg8b
164   ret void
165 ; X32:       ret
166 }
167
168 define void @atomic_fetch_umax64(i64 %x) nounwind {
169 ; X64-LABEL:   atomic_fetch_umax:64
170 ; X32-LABEL:   atomic_fetch_umax64:
171   %t1 = atomicrmw umax i64* @sc64, i64 %x acquire
172 ; X32:       subl
173 ; X32:       subl
174 ; X32:       cmov
175 ; X32:       cmov
176 ; X32:       lock
177 ; X32:       cmpxchg8b
178   ret void
179 ; X32:       ret
180 }
181
182 define void @atomic_fetch_umin64(i64 %x) nounwind {
183 ; X64-LABEL:   atomic_fetch_umin64:
184 ; X32-LABEL:   atomic_fetch_umin64:
185   %t1 = atomicrmw umin i64* @sc64, i64 %x acquire
186 ; X32:       subl
187 ; X32:       subl
188 ; X32:       cmov
189 ; X32:       cmov
190 ; X32:       lock
191 ; X32:       cmpxchg8b
192   ret void
193 ; X32:       ret
194 }
195
196 define void @atomic_fetch_cmpxchg64() nounwind {
197 ; X64-LABEL:   atomic_fetch_cmpxchg:64
198 ; X32-LABEL:   atomic_fetch_cmpxchg64:
199   %t1 = cmpxchg i64* @sc64, i64 0, i64 1 acquire acquire
200 ; X32:       lock
201 ; X32:       cmpxchg8b
202   ret void
203 ; X32:       ret
204 }
205
206 define void @atomic_fetch_store64(i64 %x) nounwind {
207 ; X64-LABEL:   atomic_fetch_store64:
208 ; X32-LABEL:   atomic_fetch_store64:
209   store atomic i64 %x, i64* @sc64 release, align 8
210 ; X32:       lock
211 ; X32:       cmpxchg8b
212   ret void
213 ; X32:       ret
214 }
215
216 define void @atomic_fetch_swap64(i64 %x) nounwind {
217 ; X64-LABEL:   atomic_fetch_swap64:
218 ; X32-LABEL:   atomic_fetch_swap64:
219   %t1 = atomicrmw xchg i64* @sc64, i64 %x acquire
220 ; X32:       lock
221 ; X32:       xchg8b
222   ret void
223 ; X32:       ret
224 }