Enhance test case of atomic16 to verify inst encoding fixed in r164453.
[oota-llvm.git] / test / CodeGen / X86 / atomic16.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 ; RUN: llc < %s -O0 -mtriple=x86_64-linux-unknonw-unknown -mcpu=corei7 -show-mc-encoding | grep xaddw | grep 0x66
4 ; RUN: llc < %s -O0 -mtriple=x86_64-linux-unknonw-unknown -mcpu=corei7 -show-mc-encoding | grep addw | grep 0x66
5 ; RUN: llc < %s -O0 -mtriple=x86_64-linux-unknonw-unknown -mcpu=corei7 -show-mc-encoding | grep subw | grep 0x66
6 ; RUN: llc < %s -O0 -mtriple=x86_64-linux-unknonw-unknown -mcpu=corei7 -show-mc-encoding | grep xorw | grep 0x66
7 ; RUN: llc < %s -O0 -mtriple=x86_64-linux-unknonw-unknown -mcpu=corei7 -show-mc-encoding | grep orw | grep 0x66
8 ; RUN: llc < %s -O0 -mtriple=x86_64-linux-unknonw-unknown -mcpu=corei7 -show-mc-encoding | grep andw | grep 0x66
9
10 @sc16 = external global i16
11
12 define void @atomic_fetch_add16() nounwind {
13 ; X64:   atomic_fetch_add16
14 ; X32:   atomic_fetch_add16
15 entry:
16 ; 32-bit
17   %t1 = atomicrmw add  i16* @sc16, i16 1 acquire
18 ; X64:       lock
19 ; X64:       incw
20 ; X32:       lock
21 ; X32:       incw
22   %t2 = atomicrmw add  i16* @sc16, i16 3 acquire
23 ; X64:       lock
24 ; X64:       addw $3
25 ; X32:       lock
26 ; X32:       addw $3
27   %t3 = atomicrmw add  i16* @sc16, i16 5 acquire
28 ; X64:       lock
29 ; X64:       xaddw
30 ; X32:       lock
31 ; X32:       xaddw
32   %t4 = atomicrmw add  i16* @sc16, i16 %t3 acquire
33 ; X64:       lock
34 ; X64:       addw
35 ; X32:       lock
36 ; X32:       addw
37   ret void
38 ; X64:       ret
39 ; X32:       ret
40 }
41
42 define void @atomic_fetch_sub16() nounwind {
43 ; X64:   atomic_fetch_sub16
44 ; X32:   atomic_fetch_sub16
45   %t1 = atomicrmw sub  i16* @sc16, i16 1 acquire
46 ; X64:       lock
47 ; X64:       decw
48 ; X32:       lock
49 ; X32:       decw
50   %t2 = atomicrmw sub  i16* @sc16, i16 3 acquire
51 ; X64:       lock
52 ; X64:       subw $3
53 ; X32:       lock
54 ; X32:       subw $3
55   %t3 = atomicrmw sub  i16* @sc16, i16 5 acquire
56 ; X64:       lock
57 ; X64:       xaddw
58 ; X32:       lock
59 ; X32:       xaddw
60   %t4 = atomicrmw sub  i16* @sc16, i16 %t3 acquire
61 ; X64:       lock
62 ; X64:       subw
63 ; X32:       lock
64 ; X32:       subw
65   ret void
66 ; X64:       ret
67 ; X32:       ret
68 }
69
70 define void @atomic_fetch_and16() nounwind {
71 ; X64:   atomic_fetch_and16
72 ; X32:   atomic_fetch_and16
73   %t1 = atomicrmw and  i16* @sc16, i16 3 acquire
74 ; X64:       lock
75 ; X64:       andw $3
76 ; X32:       lock
77 ; X32:       andw $3
78   %t2 = atomicrmw and  i16* @sc16, i16 5 acquire
79 ; X64:       andw
80 ; X64:       lock
81 ; X64:       cmpxchgw
82 ; X32:       andw
83 ; X32:       lock
84 ; X32:       cmpxchgw
85   %t3 = atomicrmw and  i16* @sc16, i16 %t2 acquire
86 ; X64:       lock
87 ; X64:       andw
88 ; X32:       lock
89 ; X32:       andw
90   ret void
91 ; X64:       ret
92 ; X32:       ret
93 }
94
95 define void @atomic_fetch_or16() nounwind {
96 ; X64:   atomic_fetch_or16
97 ; X32:   atomic_fetch_or16
98   %t1 = atomicrmw or   i16* @sc16, i16 3 acquire
99 ; X64:       lock
100 ; X64:       orw $3
101 ; X32:       lock
102 ; X32:       orw $3
103   %t2 = atomicrmw or   i16* @sc16, i16 5 acquire
104 ; X64:       orw
105 ; X64:       lock
106 ; X64:       cmpxchgw
107 ; X32:       orw
108 ; X32:       lock
109 ; X32:       cmpxchgw
110   %t3 = atomicrmw or   i16* @sc16, i16 %t2 acquire
111 ; X64:       lock
112 ; X64:       orw
113 ; X32:       lock
114 ; X32:       orw
115   ret void
116 ; X64:       ret
117 ; X32:       ret
118 }
119
120 define void @atomic_fetch_xor16() nounwind {
121 ; X64:   atomic_fetch_xor16
122 ; X32:   atomic_fetch_xor16
123   %t1 = atomicrmw xor  i16* @sc16, i16 3 acquire
124 ; X64:       lock
125 ; X64:       xorw $3
126 ; X32:       lock
127 ; X32:       xorw $3
128   %t2 = atomicrmw xor  i16* @sc16, i16 5 acquire
129 ; X64:       xorw
130 ; X64:       lock
131 ; X64:       cmpxchgw
132 ; X32:       xorw
133 ; X32:       lock
134 ; X32:       cmpxchgw
135   %t3 = atomicrmw xor  i16* @sc16, i16 %t2 acquire
136 ; X64:       lock
137 ; X64:       xorw
138 ; X32:       lock
139 ; X32:       xorw
140   ret void
141 ; X64:       ret
142 ; X32:       ret
143 }
144
145 define void @atomic_fetch_nand16(i16 %x) nounwind {
146 ; X64:   atomic_fetch_nand16
147 ; X32:   atomic_fetch_nand16
148   %t1 = atomicrmw nand i16* @sc16, i16 %x acquire
149 ; X64:       andw
150 ; X64:       notw
151 ; X64:       lock
152 ; X64:       cmpxchgw
153 ; X32:       andw
154 ; X32:       notw
155 ; X32:       lock
156 ; X32:       cmpxchgw
157   ret void
158 ; X64:       ret
159 ; X32:       ret
160 }
161
162 define void @atomic_fetch_max16(i16 %x) nounwind {
163   %t1 = atomicrmw max  i16* @sc16, i16 %x acquire
164 ; X64:       cmpw
165 ; X64:       cmov
166 ; X64:       lock
167 ; X64:       cmpxchgw
168
169 ; X32:       cmpw
170 ; X32:       cmov
171 ; X32:       lock
172 ; X32:       cmpxchgw
173   ret void
174 ; X64:       ret
175 ; X32:       ret
176 }
177
178 define void @atomic_fetch_min16(i16 %x) nounwind {
179   %t1 = atomicrmw min  i16* @sc16, i16 %x acquire
180 ; X64:       cmpw
181 ; X64:       cmov
182 ; X64:       lock
183 ; X64:       cmpxchgw
184
185 ; X32:       cmpw
186 ; X32:       cmov
187 ; X32:       lock
188 ; X32:       cmpxchgw
189   ret void
190 ; X64:       ret
191 ; X32:       ret
192 }
193
194 define void @atomic_fetch_umax16(i16 %x) nounwind {
195   %t1 = atomicrmw umax i16* @sc16, i16 %x acquire
196 ; X64:       cmpw
197 ; X64:       cmov
198 ; X64:       lock
199 ; X64:       cmpxchgw
200
201 ; X32:       cmpw
202 ; X32:       cmov
203 ; X32:       lock
204 ; X32:       cmpxchgw
205   ret void
206 ; X64:       ret
207 ; X32:       ret
208 }
209
210 define void @atomic_fetch_umin16(i16 %x) nounwind {
211   %t1 = atomicrmw umin i16* @sc16, i16 %x acquire
212 ; X64:       cmpw
213 ; X64:       cmov
214 ; X64:       lock
215 ; X64:       cmpxchgw
216 ; X32:       cmpw
217 ; X32:       cmov
218 ; X32:       lock
219 ; X32:       cmpxchgw
220   ret void
221 ; X64:       ret
222 ; X32:       ret
223 }
224
225 define void @atomic_fetch_cmpxchg16() nounwind {
226   %t1 = cmpxchg i16* @sc16, i16 0, i16 1 acquire
227 ; X64:       lock
228 ; X64:       cmpxchgw
229 ; X32:       lock
230 ; X32:       cmpxchgw
231   ret void
232 ; X64:       ret
233 ; X32:       ret
234 }
235
236 define void @atomic_fetch_store16(i16 %x) nounwind {
237   store atomic i16 %x, i16* @sc16 release, align 4
238 ; X64-NOT:   lock
239 ; X64:       movw
240 ; X32-NOT:   lock
241 ; X32:       movw
242   ret void
243 ; X64:       ret
244 ; X32:       ret
245 }
246
247 define void @atomic_fetch_swap16(i16 %x) nounwind {
248   %t1 = atomicrmw xchg i16* @sc16, i16 %x acquire
249 ; X64-NOT:   lock
250 ; X64:       xchgw
251 ; X32-NOT:   lock
252 ; X32:       xchgw
253   ret void
254 ; X64:       ret
255 ; X32:       ret
256 }