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