Mercurial > hg > CbC > CbC_llvm
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 } |