comparison test/CodeGen/X86/atomic32.ll @ 95:afa8332a0e37 LLVM3.8

LLVM 3.8
author Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
date Tue, 13 Oct 2015 17:48:58 +0900
parents 54457678186b
children 803732b1fca8
comparison
equal deleted inserted replaced
84:f3e34b893a5f 95:afa8332a0e37
1 ; RUN: llc < %s -O0 -march=x86-64 -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X64 1 ; RUN: llc < %s -O0 -march=x86-64 -mcpu=corei7 -verify-machineinstrs | FileCheck %s -check-prefix=WITH-CMOV
2 ; RUN: llc < %s -O0 -march=x86 -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X32 2 ; RUN: llc < %s -O0 -march=x86 -mcpu=corei7 -verify-machineinstrs | FileCheck %s -check-prefix=WITH-CMOV
3 ; RUN: llc < %s -O0 -march=x86 -mcpu=corei7 -mattr=-cmov -verify-machineinstrs | FileCheck %s --check-prefix NOCMOV 3 ; RUN: llc < %s -O0 -march=x86 -mcpu=corei7 -mattr=-cmov -verify-machineinstrs | FileCheck %s --check-prefix NOCMOV
4 4
5 @sc32 = external global i32 5 @sc32 = external global i32
6 6
7 define void @atomic_fetch_add32() nounwind { 7 define void @atomic_fetch_add32() nounwind {
8 ; X64-LABEL: atomic_fetch_add32: 8 ; WITH-CMOV-LABEL: atomic_fetch_add32:
9 ; X32-LABEL: atomic_fetch_add32:
10 entry: 9 entry:
11 ; 32-bit 10 ; 32-bit
12 %t1 = atomicrmw add i32* @sc32, i32 1 acquire 11 %t1 = atomicrmw add i32* @sc32, i32 1 acquire
13 ; X64: lock 12 ; WITH-CMOV: lock
14 ; X64: incl 13 ; WITH-CMOV: incl
15 ; X32: lock
16 ; X32: incl
17 %t2 = atomicrmw add i32* @sc32, i32 3 acquire 14 %t2 = atomicrmw add i32* @sc32, i32 3 acquire
18 ; X64: lock 15 ; WITH-CMOV: lock
19 ; X64: addl $3 16 ; WITH-CMOV: addl $3
20 ; X32: lock
21 ; X32: addl $3
22 %t3 = atomicrmw add i32* @sc32, i32 5 acquire 17 %t3 = atomicrmw add i32* @sc32, i32 5 acquire
23 ; X64: lock 18 ; WITH-CMOV: lock
24 ; X64: xaddl 19 ; WITH-CMOV: xaddl
25 ; X32: lock
26 ; X32: xaddl
27 %t4 = atomicrmw add i32* @sc32, i32 %t3 acquire 20 %t4 = atomicrmw add i32* @sc32, i32 %t3 acquire
28 ; X64: lock 21 ; WITH-CMOV: lock
29 ; X64: addl 22 ; WITH-CMOV: addl
30 ; X32: lock 23 ret void
31 ; X32: addl 24 ; WITH-CMOV: ret
32 ret void
33 ; X64: ret
34 ; X32: ret
35 } 25 }
36 26
37 define void @atomic_fetch_sub32() nounwind { 27 define void @atomic_fetch_sub32() nounwind {
38 ; X64-LABEL: atomic_fetch_sub32: 28 ; WITH-CMOV-LABEL: atomic_fetch_sub32:
39 ; X32-LABEL: atomic_fetch_sub32:
40 %t1 = atomicrmw sub i32* @sc32, i32 1 acquire 29 %t1 = atomicrmw sub i32* @sc32, i32 1 acquire
41 ; X64: lock 30 ; WITH-CMOV: lock
42 ; X64: decl 31 ; WITH-CMOV: decl
43 ; X32: lock
44 ; X32: decl
45 %t2 = atomicrmw sub i32* @sc32, i32 3 acquire 32 %t2 = atomicrmw sub i32* @sc32, i32 3 acquire
46 ; X64: lock 33 ; WITH-CMOV: lock
47 ; X64: subl $3 34 ; WITH-CMOV: subl $3
48 ; X32: lock
49 ; X32: subl $3
50 %t3 = atomicrmw sub i32* @sc32, i32 5 acquire 35 %t3 = atomicrmw sub i32* @sc32, i32 5 acquire
51 ; X64: lock 36 ; WITH-CMOV: lock
52 ; X64: xaddl 37 ; WITH-CMOV: xaddl
53 ; X32: lock
54 ; X32: xaddl
55 %t4 = atomicrmw sub i32* @sc32, i32 %t3 acquire 38 %t4 = atomicrmw sub i32* @sc32, i32 %t3 acquire
56 ; X64: lock 39 ; WITH-CMOV: lock
57 ; X64: subl 40 ; WITH-CMOV: subl
58 ; X32: lock 41 ret void
59 ; X32: subl 42 ; WITH-CMOV: ret
60 ret void
61 ; X64: ret
62 ; X32: ret
63 } 43 }
64 44
65 define void @atomic_fetch_and32() nounwind { 45 define void @atomic_fetch_and32() nounwind {
66 ; X64-LABEL: atomic_fetch_and32: 46 ; WITH-CMOV-LABEL: atomic_fetch_and32:
67 ; X32-LABEL: atomic_fetch_and32:
68 %t1 = atomicrmw and i32* @sc32, i32 3 acquire 47 %t1 = atomicrmw and i32* @sc32, i32 3 acquire
69 ; X64: lock 48 ; WITH-CMOV: lock
70 ; X64: andl $3 49 ; WITH-CMOV: andl $3
71 ; X32: lock
72 ; X32: andl $3
73 %t2 = atomicrmw and i32* @sc32, i32 5 acquire 50 %t2 = atomicrmw and i32* @sc32, i32 5 acquire
74 ; X64: andl 51 ; WITH-CMOV: andl
75 ; X64: lock 52 ; WITH-CMOV: lock
76 ; X64: cmpxchgl 53 ; WITH-CMOV: cmpxchgl
77 ; X32: andl
78 ; X32: lock
79 ; X32: cmpxchgl
80 %t3 = atomicrmw and i32* @sc32, i32 %t2 acquire 54 %t3 = atomicrmw and i32* @sc32, i32 %t2 acquire
81 ; X64: lock 55 ; WITH-CMOV: lock
82 ; X64: andl 56 ; WITH-CMOV: andl
83 ; X32: lock 57 ret void
84 ; X32: andl 58 ; WITH-CMOV: ret
85 ret void
86 ; X64: ret
87 ; X32: ret
88 } 59 }
89 60
90 define void @atomic_fetch_or32() nounwind { 61 define void @atomic_fetch_or32() nounwind {
91 ; X64-LABEL: atomic_fetch_or32: 62 ; WITH-CMOV-LABEL: atomic_fetch_or32:
92 ; X32-LABEL: atomic_fetch_or32:
93 %t1 = atomicrmw or i32* @sc32, i32 3 acquire 63 %t1 = atomicrmw or i32* @sc32, i32 3 acquire
94 ; X64: lock 64 ; WITH-CMOV: lock
95 ; X64: orl $3 65 ; WITH-CMOV: orl $3
96 ; X32: lock
97 ; X32: orl $3
98 %t2 = atomicrmw or i32* @sc32, i32 5 acquire 66 %t2 = atomicrmw or i32* @sc32, i32 5 acquire
99 ; X64: orl 67 ; WITH-CMOV: orl
100 ; X64: lock 68 ; WITH-CMOV: lock
101 ; X64: cmpxchgl 69 ; WITH-CMOV: cmpxchgl
102 ; X32: orl
103 ; X32: lock
104 ; X32: cmpxchgl
105 %t3 = atomicrmw or i32* @sc32, i32 %t2 acquire 70 %t3 = atomicrmw or i32* @sc32, i32 %t2 acquire
106 ; X64: lock 71 ; WITH-CMOV: lock
107 ; X64: orl 72 ; WITH-CMOV: orl
108 ; X32: lock 73 ret void
109 ; X32: orl 74 ; WITH-CMOV: ret
110 ret void
111 ; X64: ret
112 ; X32: ret
113 } 75 }
114 76
115 define void @atomic_fetch_xor32() nounwind { 77 define void @atomic_fetch_xor32() nounwind {
116 ; X64-LABEL: atomic_fetch_xor32: 78 ; WITH-CMOV-LABEL: atomic_fetch_xor32:
117 ; X32-LABEL: atomic_fetch_xor32:
118 %t1 = atomicrmw xor i32* @sc32, i32 3 acquire 79 %t1 = atomicrmw xor i32* @sc32, i32 3 acquire
119 ; X64: lock 80 ; WITH-CMOV: lock
120 ; X64: xorl $3 81 ; WITH-CMOV: xorl $3
121 ; X32: lock
122 ; X32: xorl $3
123 %t2 = atomicrmw xor i32* @sc32, i32 5 acquire 82 %t2 = atomicrmw xor i32* @sc32, i32 5 acquire
124 ; X64: xorl 83 ; WITH-CMOV: xorl
125 ; X64: lock 84 ; WITH-CMOV: lock
126 ; X64: cmpxchgl 85 ; WITH-CMOV: cmpxchgl
127 ; X32: xorl
128 ; X32: lock
129 ; X32: cmpxchgl
130 %t3 = atomicrmw xor i32* @sc32, i32 %t2 acquire 86 %t3 = atomicrmw xor i32* @sc32, i32 %t2 acquire
131 ; X64: lock 87 ; WITH-CMOV: lock
132 ; X64: xorl 88 ; WITH-CMOV: xorl
133 ; X32: lock 89 ret void
134 ; X32: xorl 90 ; WITH-CMOV: ret
135 ret void
136 ; X64: ret
137 ; X32: ret
138 } 91 }
139 92
140 define void @atomic_fetch_nand32(i32 %x) nounwind { 93 define void @atomic_fetch_nand32(i32 %x) nounwind {
141 ; X64-LABEL: atomic_fetch_nand32: 94 ; WITH-CMOV-LABEL: atomic_fetch_nand32:
142 ; X32-LABEL: atomic_fetch_nand32:
143 %t1 = atomicrmw nand i32* @sc32, i32 %x acquire 95 %t1 = atomicrmw nand i32* @sc32, i32 %x acquire
144 ; X64: andl 96 ; WITH-CMOV: andl
145 ; X64: notl 97 ; WITH-CMOV: notl
146 ; X64: lock 98 ; WITH-CMOV: lock
147 ; X64: cmpxchgl 99 ; WITH-CMOV: cmpxchgl
148 ; X32: andl 100 ret void
149 ; X32: notl 101 ; WITH-CMOV: ret
150 ; X32: lock
151 ; X32: cmpxchgl
152 ret void
153 ; X64: ret
154 ; X32: ret
155 } 102 }
156 103
157 define void @atomic_fetch_max32(i32 %x) nounwind { 104 define void @atomic_fetch_max32(i32 %x) nounwind {
158 ; X64-LABEL: atomic_fetch_max32: 105 ; WITH-CMOV-LABEL: atomic_fetch_max32:
159 ; X32-LABEL: atomic_fetch_max32:
160 106
161 %t1 = atomicrmw max i32* @sc32, i32 %x acquire 107 %t1 = atomicrmw max i32* @sc32, i32 %x acquire
162 ; X64: subl 108 ; WITH-CMOV: subl
163 ; X64: cmov 109 ; WITH-CMOV: cmov
164 ; X64: lock 110 ; WITH-CMOV: lock
165 ; X64: cmpxchgl 111 ; WITH-CMOV: cmpxchgl
166
167 ; X32: subl
168 ; X32: cmov
169 ; X32: lock
170 ; X32: cmpxchgl
171 112
172 ; NOCMOV: subl 113 ; NOCMOV: subl
173 ; NOCMOV: jge 114 ; NOCMOV: jge
174 ; NOCMOV: lock 115 ; NOCMOV: lock
175 ; NOCMOV: cmpxchgl 116 ; NOCMOV: cmpxchgl
176 ret void 117 ret void
177 ; X64: ret 118 ; WITH-CMOV: ret
178 ; X32: ret
179 ; NOCMOV: ret 119 ; NOCMOV: ret
180 } 120 }
181 121
182 define void @atomic_fetch_min32(i32 %x) nounwind { 122 define void @atomic_fetch_min32(i32 %x) nounwind {
183 ; X64-LABEL: atomic_fetch_min32: 123 ; WITH-CMOV-LABEL: atomic_fetch_min32:
184 ; X32-LABEL: atomic_fetch_min32:
185 ; NOCMOV-LABEL: atomic_fetch_min32: 124 ; NOCMOV-LABEL: atomic_fetch_min32:
186 125
187 %t1 = atomicrmw min i32* @sc32, i32 %x acquire 126 %t1 = atomicrmw min i32* @sc32, i32 %x acquire
188 ; X64: subl 127 ; WITH-CMOV: subl
189 ; X64: cmov 128 ; WITH-CMOV: cmov
190 ; X64: lock 129 ; WITH-CMOV: lock
191 ; X64: cmpxchgl 130 ; WITH-CMOV: cmpxchgl
192
193 ; X32: subl
194 ; X32: cmov
195 ; X32: lock
196 ; X32: cmpxchgl
197 131
198 ; NOCMOV: subl 132 ; NOCMOV: subl
199 ; NOCMOV: jle 133 ; NOCMOV: jle
200 ; NOCMOV: lock 134 ; NOCMOV: lock
201 ; NOCMOV: cmpxchgl 135 ; NOCMOV: cmpxchgl
202 ret void 136 ret void
203 ; X64: ret 137 ; WITH-CMOV: ret
204 ; X32: ret
205 ; NOCMOV: ret 138 ; NOCMOV: ret
206 } 139 }
207 140
208 define void @atomic_fetch_umax32(i32 %x) nounwind { 141 define void @atomic_fetch_umax32(i32 %x) nounwind {
209 ; X64-LABEL: atomic_fetch_umax32: 142 ; WITH-CMOV-LABEL: atomic_fetch_umax32:
210 ; X32-LABEL: atomic_fetch_umax32:
211 ; NOCMOV-LABEL: atomic_fetch_umax32: 143 ; NOCMOV-LABEL: atomic_fetch_umax32:
212 144
213 %t1 = atomicrmw umax i32* @sc32, i32 %x acquire 145 %t1 = atomicrmw umax i32* @sc32, i32 %x acquire
214 ; X64: subl 146 ; WITH-CMOV: subl
215 ; X64: cmov 147 ; WITH-CMOV: cmov
216 ; X64: lock 148 ; WITH-CMOV: lock
217 ; X64: cmpxchgl 149 ; WITH-CMOV: cmpxchgl
218
219 ; X32: subl
220 ; X32: cmov
221 ; X32: lock
222 ; X32: cmpxchgl
223 150
224 ; NOCMOV: subl 151 ; NOCMOV: subl
225 ; NOCMOV: ja 152 ; NOCMOV: ja
226 ; NOCMOV: lock 153 ; NOCMOV: lock
227 ; NOCMOV: cmpxchgl 154 ; NOCMOV: cmpxchgl
228 ret void 155 ret void
229 ; X64: ret 156 ; WITH-CMOV: ret
230 ; X32: ret
231 ; NOCMOV: ret 157 ; NOCMOV: ret
232 } 158 }
233 159
234 define void @atomic_fetch_umin32(i32 %x) nounwind { 160 define void @atomic_fetch_umin32(i32 %x) nounwind {
235 ; X64-LABEL: atomic_fetch_umin32: 161 ; WITH-CMOV-LABEL: atomic_fetch_umin32:
236 ; X32-LABEL: atomic_fetch_umin32:
237 ; NOCMOV-LABEL: atomic_fetch_umin32: 162 ; NOCMOV-LABEL: atomic_fetch_umin32:
238 163
239 %t1 = atomicrmw umin i32* @sc32, i32 %x acquire 164 %t1 = atomicrmw umin i32* @sc32, i32 %x acquire
240 ; X64: subl 165 ; WITH-CMOV: subl
241 ; X64: cmov 166 ; WITH-CMOV: cmov
242 ; X64: lock 167 ; WITH-CMOV: lock
243 ; X64: cmpxchgl 168 ; WITH-CMOV: cmpxchgl
244
245 ; X32: subl
246 ; X32: cmov
247 ; X32: lock
248 ; X32: cmpxchgl
249 169
250 ; NOCMOV: subl 170 ; NOCMOV: subl
251 ; NOCMOV: jb 171 ; NOCMOV: jb
252 ; NOCMOV: lock 172 ; NOCMOV: lock
253 ; NOCMOV: cmpxchgl 173 ; NOCMOV: cmpxchgl
254 ret void 174 ret void
255 ; X64: ret 175 ; WITH-CMOV: ret
256 ; X32: ret
257 ; NOCMOV: ret 176 ; NOCMOV: ret
258 } 177 }
259 178
260 define void @atomic_fetch_cmpxchg32() nounwind { 179 define void @atomic_fetch_cmpxchg32() nounwind {
261 ; X64-LABEL: atomic_fetch_cmpxchg32: 180 ; WITH-CMOV-LABEL: atomic_fetch_cmpxchg32:
262 ; X32-LABEL: atomic_fetch_cmpxchg32:
263 181
264 %t1 = cmpxchg i32* @sc32, i32 0, i32 1 acquire acquire 182 %t1 = cmpxchg i32* @sc32, i32 0, i32 1 acquire acquire
265 ; X64: lock 183 ; WITH-CMOV: lock
266 ; X64: cmpxchgl 184 ; WITH-CMOV: cmpxchgl
267 ; X32: lock 185 ret void
268 ; X32: cmpxchgl 186 ; WITH-CMOV: ret
269 ret void
270 ; X64: ret
271 ; X32: ret
272 } 187 }
273 188
274 define void @atomic_fetch_store32(i32 %x) nounwind { 189 define void @atomic_fetch_store32(i32 %x) nounwind {
275 ; X64-LABEL: atomic_fetch_store32: 190 ; WITH-CMOV-LABEL: atomic_fetch_store32:
276 ; X32-LABEL: atomic_fetch_store32:
277 191
278 store atomic i32 %x, i32* @sc32 release, align 4 192 store atomic i32 %x, i32* @sc32 release, align 4
279 ; X64-NOT: lock 193 ; WITH-CMOV-NOT: lock
280 ; X64: movl 194 ; WITH-CMOV: movl
281 ; X32-NOT: lock 195 ret void
282 ; X32: movl 196 ; WITH-CMOV: ret
283 ret void
284 ; X64: ret
285 ; X32: ret
286 } 197 }
287 198
288 define void @atomic_fetch_swap32(i32 %x) nounwind { 199 define void @atomic_fetch_swap32(i32 %x) nounwind {
289 ; X64-LABEL: atomic_fetch_swap32: 200 ; WITH-CMOV-LABEL: atomic_fetch_swap32:
290 ; X32-LABEL: atomic_fetch_swap32:
291 201
292 %t1 = atomicrmw xchg i32* @sc32, i32 %x acquire 202 %t1 = atomicrmw xchg i32* @sc32, i32 %x acquire
293 ; X64-NOT: lock 203 ; WITH-CMOV-NOT: lock
294 ; X64: xchgl 204 ; WITH-CMOV: xchgl
295 ; X32-NOT: lock 205 ret void
296 ; X32: xchgl 206 ; WITH-CMOV: ret
297 ret void 207 }
298 ; X64: ret
299 ; X32: ret
300 }