OLD | NEW |
1 ; RUIN: %llvm2ice --verbose none %s | FileCheck %s | 1 ; This tries to be a comprehensive test of i64 operations, in |
2 ; RUIN: %llvm2ice --verbose none %s | FileCheck --check-prefix=ERRORS %s | 2 ; particular the patterns for lowering i64 operations into constituent |
| 3 ; i32 operations on x86-32. |
| 4 |
| 5 ; RUIN: %llvm2ice -O2 --verbose none %s | FileCheck %s |
| 6 ; RUN: %llvm2ice -Om1 --verbose none %s | FileCheck --check-prefix=OPTM1 %s |
| 7 ; RUN: %llvm2ice --verbose none %s | FileCheck --check-prefix=ERRORS %s |
3 ; RUN: %szdiff --llvm2ice=%llvm2ice %s | FileCheck --check-prefix=DUMP %s | 8 ; RUN: %szdiff --llvm2ice=%llvm2ice %s | FileCheck --check-prefix=DUMP %s |
4 | 9 |
5 @__init_array_start = internal constant [0 x i8] zeroinitializer, align 4 | 10 @__init_array_start = internal constant [0 x i8] zeroinitializer, align 4 |
6 @__fini_array_start = internal constant [0 x i8] zeroinitializer, align 4 | 11 @__fini_array_start = internal constant [0 x i8] zeroinitializer, align 4 |
7 @__tls_template_start = internal constant [0 x i8] zeroinitializer, align 8 | 12 @__tls_template_start = internal constant [0 x i8] zeroinitializer, align 8 |
8 @__tls_template_alignment = internal constant [4 x i8] c"\01\00\00\00", align 4 | 13 @__tls_template_alignment = internal constant [4 x i8] c"\01\00\00\00", align 4 |
9 | 14 |
10 define internal i32 @ignore64BitArg(i64 %a, i32 %b, i64 %c) { | 15 define internal i32 @ignore64BitArg(i64 %a, i32 %b, i64 %c) { |
11 entry: | 16 entry: |
12 ret i32 %b | 17 ret i32 %b |
(...skipping 18 matching lines...) Expand all Loading... |
31 ; CHECK-NEXT: push 123 | 36 ; CHECK-NEXT: push 123 |
32 ; CHECK-NEXT: push | 37 ; CHECK-NEXT: push |
33 ; CHECK-NEXT: push | 38 ; CHECK-NEXT: push |
34 ; CHECK-NEXT: call ignore64BitArgNoInline | 39 ; CHECK-NEXT: call ignore64BitArgNoInline |
35 ; CHECK: push | 40 ; CHECK: push |
36 ; CHECK-NEXT: push | 41 ; CHECK-NEXT: push |
37 ; CHECK-NEXT: push 123 | 42 ; CHECK-NEXT: push 123 |
38 ; CHECK-NEXT: push | 43 ; CHECK-NEXT: push |
39 ; CHECK-NEXT: push | 44 ; CHECK-NEXT: push |
40 ; CHECK-NEXT: call ignore64BitArgNoInline | 45 ; CHECK-NEXT: call ignore64BitArgNoInline |
| 46 ; |
| 47 ; OPTM1: pass64BitArg: |
| 48 ; OPTM1: push 123 |
| 49 ; OPTM1-NEXT: push |
| 50 ; OPTM1-NEXT: push |
| 51 ; OPTM1-NEXT: call ignore64BitArgNoInline |
| 52 ; OPTM1: push |
| 53 ; OPTM1-NEXT: push |
| 54 ; OPTM1-NEXT: push 123 |
| 55 ; OPTM1-NEXT: push |
| 56 ; OPTM1-NEXT: push |
| 57 ; OPTM1-NEXT: call ignore64BitArgNoInline |
| 58 ; OPTM1: push |
| 59 ; OPTM1-NEXT: push |
| 60 ; OPTM1-NEXT: push 123 |
| 61 ; OPTM1-NEXT: push |
| 62 ; OPTM1-NEXT: push |
| 63 ; OPTM1-NEXT: call ignore64BitArgNoInline |
41 | 64 |
42 declare i32 @ignore64BitArgNoInline(i64, i32, i64) | 65 declare i32 @ignore64BitArgNoInline(i64, i32, i64) |
43 | 66 |
44 define internal i32 @pass64BitConstArg(i64 %a, i64 %b) { | 67 define internal i32 @pass64BitConstArg(i64 %a, i64 %b) { |
45 entry: | 68 entry: |
46 %call = call i32 @ignore64BitArgNoInline(i64 %a, i32 123, i64 -240105309230672
5256) | 69 %call = call i32 @ignore64BitArgNoInline(i64 %a, i32 123, i64 -240105309230672
5256) |
47 ret i32 %call | 70 ret i32 %call |
48 } | 71 } |
49 ; CHECK: pass64BitConstArg: | 72 ; CHECK: pass64BitConstArg: |
50 ; CHECK: push 3735928559 | 73 ; CHECK: push 3735928559 |
51 ; CHECK-NEXT: push 305419896 | 74 ; CHECK-NEXT: push 305419896 |
52 ; CHECK-NEXT: push 123 | 75 ; CHECK-NEXT: push 123 |
53 ; CHECK-NEXT: push ecx | 76 ; CHECK-NEXT: push ecx |
54 ; CHECK-NEXT: push eax | 77 ; CHECK-NEXT: push eax |
55 ; CHECK-NEXT: call ignore64BitArgNoInline | 78 ; CHECK-NEXT: call ignore64BitArgNoInline |
| 79 ; |
| 80 ; OPTM1: pass64BitConstArg: |
| 81 ; OPTM1: push 3735928559 |
| 82 ; OPTM1-NEXT: push 305419896 |
| 83 ; OPTM1-NEXT: push 123 |
| 84 ; OPTM1-NEXT: push dword ptr [ |
| 85 ; OPTM1-NEXT: push dword ptr [ |
| 86 ; OPTM1-NEXT: call ignore64BitArgNoInline |
56 | 87 |
57 define internal i64 @return64BitArg(i64 %a) { | 88 define internal i64 @return64BitArg(i64 %a) { |
58 entry: | 89 entry: |
59 ret i64 %a | 90 ret i64 %a |
60 } | 91 } |
61 ; CHECK: return64BitArg: | 92 ; CHECK: return64BitArg: |
62 ; CHECK: mov {{.*}}, dword ptr [esp+4] | 93 ; CHECK: mov {{.*}}, dword ptr [esp+4] |
63 ; CHECK: mov {{.*}}, dword ptr [esp+8] | 94 ; CHECK: mov {{.*}}, dword ptr [esp+8] |
64 ; CHECK: ret | 95 ; CHECK: ret |
| 96 ; |
| 97 ; OPTM1: return64BitArg: |
| 98 ; OPTM1: mov {{.*}}, dword ptr [esp+4] |
| 99 ; OPTM1: mov {{.*}}, dword ptr [esp+8] |
| 100 ; OPTM1: ret |
65 | 101 |
66 define internal i64 @return64BitConst() { | 102 define internal i64 @return64BitConst() { |
67 entry: | 103 entry: |
68 ret i64 -2401053092306725256 | 104 ret i64 -2401053092306725256 |
69 } | 105 } |
70 ; CHECK: return64BitConst: | 106 ; CHECK: return64BitConst: |
71 ; CHECK: mov eax, 305419896 | 107 ; CHECK: mov eax, 305419896 |
72 ; CHECK: mov edx, 3735928559 | 108 ; CHECK: mov edx, 3735928559 |
73 ; CHECK: ret | 109 ; CHECK: ret |
| 110 ; |
| 111 ; OPTM1: return64BitConst: |
| 112 ; OPTM1: mov eax, 305419896 |
| 113 ; OPTM1: mov edx, 3735928559 |
| 114 ; OPTM1: ret |
74 | 115 |
75 define internal i64 @add64BitSigned(i64 %a, i64 %b) { | 116 define internal i64 @add64BitSigned(i64 %a, i64 %b) { |
76 entry: | 117 entry: |
77 %add = add i64 %b, %a | 118 %add = add i64 %b, %a |
78 ret i64 %add | 119 ret i64 %add |
79 } | 120 } |
80 ; CHECK: add64BitSigned: | 121 ; CHECK: add64BitSigned: |
81 ; CHECK: add | 122 ; CHECK: add |
82 ; CHECK: adc | 123 ; CHECK: adc |
83 ; CHECK: ret | 124 ; CHECK: ret |
| 125 ; |
| 126 ; OPTM1: add64BitSigned: |
| 127 ; OPTM1: add |
| 128 ; OPTM1: adc |
| 129 ; OPTM1: ret |
84 | 130 |
85 define internal i64 @add64BitUnsigned(i64 %a, i64 %b) { | 131 define internal i64 @add64BitUnsigned(i64 %a, i64 %b) { |
86 entry: | 132 entry: |
87 %add = add i64 %b, %a | 133 %add = add i64 %b, %a |
88 ret i64 %add | 134 ret i64 %add |
89 } | 135 } |
90 ; CHECK: add64BitUnsigned: | 136 ; CHECK: add64BitUnsigned: |
91 ; CHECK: add | 137 ; CHECK: add |
92 ; CHECK: adc | 138 ; CHECK: adc |
93 ; CHECK: ret | 139 ; CHECK: ret |
| 140 ; |
| 141 ; OPTM1: add64BitUnsigned: |
| 142 ; OPTM1: add |
| 143 ; OPTM1: adc |
| 144 ; OPTM1: ret |
94 | 145 |
95 define internal i64 @sub64BitSigned(i64 %a, i64 %b) { | 146 define internal i64 @sub64BitSigned(i64 %a, i64 %b) { |
96 entry: | 147 entry: |
97 %sub = sub i64 %a, %b | 148 %sub = sub i64 %a, %b |
98 ret i64 %sub | 149 ret i64 %sub |
99 } | 150 } |
100 ; CHECK: sub64BitSigned: | 151 ; CHECK: sub64BitSigned: |
101 ; CHECK: sub | 152 ; CHECK: sub |
102 ; CHECK: sbb | 153 ; CHECK: sbb |
103 ; CHECK: ret | 154 ; CHECK: ret |
| 155 ; |
| 156 ; OPTM1: sub64BitSigned: |
| 157 ; OPTM1: sub |
| 158 ; OPTM1: sbb |
| 159 ; OPTM1: ret |
104 | 160 |
105 define internal i64 @sub64BitUnsigned(i64 %a, i64 %b) { | 161 define internal i64 @sub64BitUnsigned(i64 %a, i64 %b) { |
106 entry: | 162 entry: |
107 %sub = sub i64 %a, %b | 163 %sub = sub i64 %a, %b |
108 ret i64 %sub | 164 ret i64 %sub |
109 } | 165 } |
110 ; CHECK: sub64BitUnsigned: | 166 ; CHECK: sub64BitUnsigned: |
111 ; CHECK: sub | 167 ; CHECK: sub |
112 ; CHECK: sbb | 168 ; CHECK: sbb |
113 ; CHECK: ret | 169 ; CHECK: ret |
| 170 ; |
| 171 ; OPTM1: sub64BitUnsigned: |
| 172 ; OPTM1: sub |
| 173 ; OPTM1: sbb |
| 174 ; OPTM1: ret |
114 | 175 |
115 define internal i64 @mul64BitSigned(i64 %a, i64 %b) { | 176 define internal i64 @mul64BitSigned(i64 %a, i64 %b) { |
116 entry: | 177 entry: |
117 %mul = mul i64 %b, %a | 178 %mul = mul i64 %b, %a |
118 ret i64 %mul | 179 ret i64 %mul |
119 } | 180 } |
120 ; CHECK: mul64BitSigned: | 181 ; CHECK: mul64BitSigned: |
121 ; CHECK: imul | 182 ; CHECK: imul |
122 ; CHECK: imul | 183 ; CHECK: imul |
123 ; CHECK: mul | 184 ; CHECK: mul |
124 ; CHECK: add | 185 ; CHECK: add |
125 ; CHECK: add | 186 ; CHECK: add |
126 ; CHECK: ret | 187 ; CHECK: ret |
| 188 ; |
| 189 ; OPTM1: mul64BitSigned: |
| 190 ; OPTM1: imul |
| 191 ; OPTM1: imul |
| 192 ; OPTM1: mul |
| 193 ; OPTM1: add |
| 194 ; OPTM1: add |
| 195 ; OPTM1: ret |
127 | 196 |
128 define internal i64 @mul64BitUnsigned(i64 %a, i64 %b) { | 197 define internal i64 @mul64BitUnsigned(i64 %a, i64 %b) { |
129 entry: | 198 entry: |
130 %mul = mul i64 %b, %a | 199 %mul = mul i64 %b, %a |
131 ret i64 %mul | 200 ret i64 %mul |
132 } | 201 } |
133 ; CHECK: mul64BitUnsigned: | 202 ; CHECK: mul64BitUnsigned: |
134 ; CHECK: imul | 203 ; CHECK: imul |
135 ; CHECK: imul | 204 ; CHECK: imul |
136 ; CHECK: mul | 205 ; CHECK: mul |
137 ; CHECK: add | 206 ; CHECK: add |
138 ; CHECK: add | 207 ; CHECK: add |
139 ; CHECK: ret | 208 ; CHECK: ret |
| 209 ; |
| 210 ; OPTM1: mul64BitUnsigned: |
| 211 ; OPTM1: imul |
| 212 ; OPTM1: imul |
| 213 ; OPTM1: mul |
| 214 ; OPTM1: add |
| 215 ; OPTM1: add |
| 216 ; OPTM1: ret |
140 | 217 |
141 define internal i64 @div64BitSigned(i64 %a, i64 %b) { | 218 define internal i64 @div64BitSigned(i64 %a, i64 %b) { |
142 entry: | 219 entry: |
143 %div = sdiv i64 %a, %b | 220 %div = sdiv i64 %a, %b |
144 ret i64 %div | 221 ret i64 %div |
145 } | 222 } |
146 ; CHECK: div64BitSigned: | 223 ; CHECK: div64BitSigned: |
147 ; CHECK: call __divdi3 | 224 ; CHECK: call __divdi3 |
148 ; CHECK: ret | 225 ; CHECK: ret |
| 226 ; |
| 227 ; OPTM1: div64BitSigned: |
| 228 ; OPTM1: call __divdi3 |
| 229 ; OPTM1: ret |
149 | 230 |
150 define internal i64 @div64BitUnsigned(i64 %a, i64 %b) { | 231 define internal i64 @div64BitUnsigned(i64 %a, i64 %b) { |
151 entry: | 232 entry: |
152 %div = udiv i64 %a, %b | 233 %div = udiv i64 %a, %b |
153 ret i64 %div | 234 ret i64 %div |
154 } | 235 } |
155 ; CHECK: div64BitUnsigned: | 236 ; CHECK: div64BitUnsigned: |
156 ; CHECK: call __udivdi3 | 237 ; CHECK: call __udivdi3 |
157 ; CHECK: ret | 238 ; CHECK: ret |
| 239 ; |
| 240 ; OPTM1: div64BitUnsigned: |
| 241 ; OPTM1: call __udivdi3 |
| 242 ; OPTM1: ret |
158 | 243 |
159 define internal i64 @rem64BitSigned(i64 %a, i64 %b) { | 244 define internal i64 @rem64BitSigned(i64 %a, i64 %b) { |
160 entry: | 245 entry: |
161 %rem = srem i64 %a, %b | 246 %rem = srem i64 %a, %b |
162 ret i64 %rem | 247 ret i64 %rem |
163 } | 248 } |
164 ; CHECK: rem64BitSigned: | 249 ; CHECK: rem64BitSigned: |
165 ; CHECK: call __moddi3 | 250 ; CHECK: call __moddi3 |
166 ; CHECK: ret | 251 ; CHECK: ret |
| 252 ; |
| 253 ; OPTM1: rem64BitSigned: |
| 254 ; OPTM1: call __moddi3 |
| 255 ; OPTM1: ret |
167 | 256 |
168 define internal i64 @rem64BitUnsigned(i64 %a, i64 %b) { | 257 define internal i64 @rem64BitUnsigned(i64 %a, i64 %b) { |
169 entry: | 258 entry: |
170 %rem = urem i64 %a, %b | 259 %rem = urem i64 %a, %b |
171 ret i64 %rem | 260 ret i64 %rem |
172 } | 261 } |
173 ; CHECK: rem64BitUnsigned: | 262 ; CHECK: rem64BitUnsigned: |
174 ; CHECK: call __umoddi3 | 263 ; CHECK: call __umoddi3 |
175 ; CHECK: ret | 264 ; CHECK: ret |
| 265 ; |
| 266 ; OPTM1: rem64BitUnsigned: |
| 267 ; OPTM1: call __umoddi3 |
| 268 ; OPTM1: ret |
176 | 269 |
177 define internal i64 @shl64BitSigned(i64 %a, i64 %b) { | 270 define internal i64 @shl64BitSigned(i64 %a, i64 %b) { |
178 entry: | 271 entry: |
179 %shl = shl i64 %a, %b | 272 %shl = shl i64 %a, %b |
180 ret i64 %shl | 273 ret i64 %shl |
181 } | 274 } |
182 ; CHECK: shl64BitSigned: | 275 ; CHECK: shl64BitSigned: |
183 ; CHECK: shld | 276 ; CHECK: shld |
184 ; CHECK: shl e | 277 ; CHECK: shl e |
185 ; CHECK: test {{.*}}, 32 | 278 ; CHECK: test {{.*}}, 32 |
186 ; CHECK: je | 279 ; CHECK: je |
| 280 ; |
| 281 ; OPTM1: shl64BitSigned: |
| 282 ; OPTM1: shld |
| 283 ; OPTM1: shl e |
| 284 ; OPTM1: test {{.*}}, 32 |
| 285 ; OPTM1: je |
187 | 286 |
188 define internal i64 @shl64BitUnsigned(i64 %a, i64 %b) { | 287 define internal i64 @shl64BitUnsigned(i64 %a, i64 %b) { |
189 entry: | 288 entry: |
190 %shl = shl i64 %a, %b | 289 %shl = shl i64 %a, %b |
191 ret i64 %shl | 290 ret i64 %shl |
192 } | 291 } |
193 ; CHECK: shl64BitUnsigned: | 292 ; CHECK: shl64BitUnsigned: |
194 ; CHECK: shld | 293 ; CHECK: shld |
195 ; CHECK: shl e | 294 ; CHECK: shl e |
196 ; CHECK: test {{.*}}, 32 | 295 ; CHECK: test {{.*}}, 32 |
197 ; CHECK: je | 296 ; CHECK: je |
| 297 ; |
| 298 ; OPTM1: shl64BitUnsigned: |
| 299 ; OPTM1: shld |
| 300 ; OPTM1: shl e |
| 301 ; OPTM1: test {{.*}}, 32 |
| 302 ; OPTM1: je |
198 | 303 |
199 define internal i64 @shr64BitSigned(i64 %a, i64 %b) { | 304 define internal i64 @shr64BitSigned(i64 %a, i64 %b) { |
200 entry: | 305 entry: |
201 %shr = ashr i64 %a, %b | 306 %shr = ashr i64 %a, %b |
202 ret i64 %shr | 307 ret i64 %shr |
203 } | 308 } |
204 ; CHECK: shr64BitSigned: | 309 ; CHECK: shr64BitSigned: |
205 ; CHECK: shrd | 310 ; CHECK: shrd |
206 ; CHECK: sar | 311 ; CHECK: sar |
207 ; CHECK: test {{.*}}, 32 | 312 ; CHECK: test {{.*}}, 32 |
208 ; CHECK: je | 313 ; CHECK: je |
209 ; CHECK: sar {{.*}}, 31 | 314 ; CHECK: sar {{.*}}, 31 |
| 315 ; |
| 316 ; OPTM1: shr64BitSigned: |
| 317 ; OPTM1: shrd |
| 318 ; OPTM1: sar |
| 319 ; OPTM1: test {{.*}}, 32 |
| 320 ; OPTM1: je |
| 321 ; OPTM1: sar {{.*}}, 31 |
210 | 322 |
211 define internal i64 @shr64BitUnsigned(i64 %a, i64 %b) { | 323 define internal i64 @shr64BitUnsigned(i64 %a, i64 %b) { |
212 entry: | 324 entry: |
213 %shr = lshr i64 %a, %b | 325 %shr = lshr i64 %a, %b |
214 ret i64 %shr | 326 ret i64 %shr |
215 } | 327 } |
216 ; CHECK: shr64BitUnsigned: | 328 ; CHECK: shr64BitUnsigned: |
217 ; CHECK: shrd | 329 ; CHECK: shrd |
218 ; CHECK: shr | 330 ; CHECK: shr |
219 ; CHECK: test {{.*}}, 32 | 331 ; CHECK: test {{.*}}, 32 |
220 ; CHECK: je | 332 ; CHECK: je |
| 333 ; |
| 334 ; OPTM1: shr64BitUnsigned: |
| 335 ; OPTM1: shrd |
| 336 ; OPTM1: shr |
| 337 ; OPTM1: test {{.*}}, 32 |
| 338 ; OPTM1: je |
221 | 339 |
222 define internal i64 @and64BitSigned(i64 %a, i64 %b) { | 340 define internal i64 @and64BitSigned(i64 %a, i64 %b) { |
223 entry: | 341 entry: |
224 %and = and i64 %b, %a | 342 %and = and i64 %b, %a |
225 ret i64 %and | 343 ret i64 %and |
226 } | 344 } |
227 ; CHECK: and64BitSigned: | 345 ; CHECK: and64BitSigned: |
228 ; CHECK: and | 346 ; CHECK: and |
229 ; CHECK: and | 347 ; CHECK: and |
| 348 ; |
| 349 ; OPTM1: and64BitSigned: |
| 350 ; OPTM1: and |
| 351 ; OPTM1: and |
230 | 352 |
231 define internal i64 @and64BitUnsigned(i64 %a, i64 %b) { | 353 define internal i64 @and64BitUnsigned(i64 %a, i64 %b) { |
232 entry: | 354 entry: |
233 %and = and i64 %b, %a | 355 %and = and i64 %b, %a |
234 ret i64 %and | 356 ret i64 %and |
235 } | 357 } |
236 ; CHECK: and64BitUnsigned: | 358 ; CHECK: and64BitUnsigned: |
237 ; CHECK: and | 359 ; CHECK: and |
238 ; CHECK: and | 360 ; CHECK: and |
| 361 ; |
| 362 ; OPTM1: and64BitUnsigned: |
| 363 ; OPTM1: and |
| 364 ; OPTM1: and |
239 | 365 |
240 define internal i64 @or64BitSigned(i64 %a, i64 %b) { | 366 define internal i64 @or64BitSigned(i64 %a, i64 %b) { |
241 entry: | 367 entry: |
242 %or = or i64 %b, %a | 368 %or = or i64 %b, %a |
243 ret i64 %or | 369 ret i64 %or |
244 } | 370 } |
245 ; CHECK: or64BitSigned: | 371 ; CHECK: or64BitSigned: |
246 ; CHECK: or | 372 ; CHECK: or |
247 ; CHECK: or | 373 ; CHECK: or |
| 374 ; |
| 375 ; OPTM1: or64BitSigned: |
| 376 ; OPTM1: or |
| 377 ; OPTM1: or |
248 | 378 |
249 define internal i64 @or64BitUnsigned(i64 %a, i64 %b) { | 379 define internal i64 @or64BitUnsigned(i64 %a, i64 %b) { |
250 entry: | 380 entry: |
251 %or = or i64 %b, %a | 381 %or = or i64 %b, %a |
252 ret i64 %or | 382 ret i64 %or |
253 } | 383 } |
254 ; CHECK: or64BitUnsigned: | 384 ; CHECK: or64BitUnsigned: |
255 ; CHECK: or | 385 ; CHECK: or |
256 ; CHECK: or | 386 ; CHECK: or |
| 387 ; |
| 388 ; OPTM1: or64BitUnsigned: |
| 389 ; OPTM1: or |
| 390 ; OPTM1: or |
257 | 391 |
258 define internal i64 @xor64BitSigned(i64 %a, i64 %b) { | 392 define internal i64 @xor64BitSigned(i64 %a, i64 %b) { |
259 entry: | 393 entry: |
260 %xor = xor i64 %b, %a | 394 %xor = xor i64 %b, %a |
261 ret i64 %xor | 395 ret i64 %xor |
262 } | 396 } |
263 ; CHECK: xor64BitSigned: | 397 ; CHECK: xor64BitSigned: |
264 ; CHECK: xor | 398 ; CHECK: xor |
265 ; CHECK: xor | 399 ; CHECK: xor |
| 400 ; |
| 401 ; OPTM1: xor64BitSigned: |
| 402 ; OPTM1: xor |
| 403 ; OPTM1: xor |
266 | 404 |
267 define internal i64 @xor64BitUnsigned(i64 %a, i64 %b) { | 405 define internal i64 @xor64BitUnsigned(i64 %a, i64 %b) { |
268 entry: | 406 entry: |
269 %xor = xor i64 %b, %a | 407 %xor = xor i64 %b, %a |
270 ret i64 %xor | 408 ret i64 %xor |
271 } | 409 } |
272 ; CHECK: xor64BitUnsigned: | 410 ; CHECK: xor64BitUnsigned: |
273 ; CHECK: xor | 411 ; CHECK: xor |
274 ; CHECK: xor | 412 ; CHECK: xor |
| 413 ; |
| 414 ; OPTM1: xor64BitUnsigned: |
| 415 ; OPTM1: xor |
| 416 ; OPTM1: xor |
275 | 417 |
276 define internal i32 @trunc64To32Signed(i64 %a) { | 418 define internal i32 @trunc64To32Signed(i64 %a) { |
277 entry: | 419 entry: |
278 %conv = trunc i64 %a to i32 | 420 %conv = trunc i64 %a to i32 |
279 ret i32 %conv | 421 ret i32 %conv |
280 } | 422 } |
281 ; CHECK: trunc64To32Signed: | 423 ; CHECK: trunc64To32Signed: |
282 ; CHECK: mov eax, dword ptr [esp+4] | 424 ; CHECK: mov eax, dword ptr [esp+4] |
283 ; CHECK-NEXT: ret | 425 ; CHECK-NEXT: ret |
| 426 ; |
| 427 ; OPTM1: trunc64To32Signed: |
| 428 ; OPTM1: mov eax, dword ptr [esp+ |
| 429 ; OPTM1: ret |
284 | 430 |
285 define internal i32 @trunc64To16Signed(i64 %a) { | 431 define internal i32 @trunc64To16Signed(i64 %a) { |
286 entry: | 432 entry: |
287 %conv = trunc i64 %a to i16 | 433 %conv = trunc i64 %a to i16 |
288 %conv.ret_ext = sext i16 %conv to i32 | 434 %conv.ret_ext = sext i16 %conv to i32 |
289 ret i32 %conv.ret_ext | 435 ret i32 %conv.ret_ext |
290 } | 436 } |
291 ; CHECK: trunc64To16Signed: | 437 ; CHECK: trunc64To16Signed: |
292 ; CHECK: mov eax, dword ptr [esp+4] | 438 ; CHECK: mov eax, dword ptr [esp+4] |
293 ; CHECK-NEXT: movsx eax, ax | 439 ; CHECK-NEXT: movsx eax, ax |
294 ; CHECK-NEXT: ret | 440 ; CHECK-NEXT: ret |
| 441 ; |
| 442 ; OPTM1: trunc64To16Signed: |
| 443 ; OPTM1: mov eax, dword ptr [esp+ |
| 444 ; OPTM1: movsx eax, |
| 445 ; OPTM1: ret |
295 | 446 |
296 define internal i32 @trunc64To8Signed(i64 %a) { | 447 define internal i32 @trunc64To8Signed(i64 %a) { |
297 entry: | 448 entry: |
298 %conv = trunc i64 %a to i8 | 449 %conv = trunc i64 %a to i8 |
299 %conv.ret_ext = sext i8 %conv to i32 | 450 %conv.ret_ext = sext i8 %conv to i32 |
300 ret i32 %conv.ret_ext | 451 ret i32 %conv.ret_ext |
301 } | 452 } |
302 ; CHECK: trunc64To8Signed: | 453 ; CHECK: trunc64To8Signed: |
303 ; CHECK: mov eax, dword ptr [esp+4] | 454 ; CHECK: mov eax, dword ptr [esp+4] |
304 ; CHECK-NEXT: movsx eax, al | 455 ; CHECK-NEXT: movsx eax, al |
305 ; CHECK-NEXT: ret | 456 ; CHECK-NEXT: ret |
| 457 ; |
| 458 ; OPTM1: trunc64To8Signed: |
| 459 ; OPTM1: mov eax, dword ptr [esp+ |
| 460 ; OPTM1: movsx eax, |
| 461 ; OPTM1: ret |
306 | 462 |
307 define internal i32 @trunc64To32Unsigned(i64 %a) { | 463 define internal i32 @trunc64To32Unsigned(i64 %a) { |
308 entry: | 464 entry: |
309 %conv = trunc i64 %a to i32 | 465 %conv = trunc i64 %a to i32 |
310 ret i32 %conv | 466 ret i32 %conv |
311 } | 467 } |
312 ; CHECK: trunc64To32Unsigned: | 468 ; CHECK: trunc64To32Unsigned: |
313 ; CHECK: mov eax, dword ptr [esp+4] | 469 ; CHECK: mov eax, dword ptr [esp+4] |
314 ; CHECK-NEXT: ret | 470 ; CHECK-NEXT: ret |
| 471 ; |
| 472 ; OPTM1: trunc64To32Unsigned: |
| 473 ; OPTM1: mov eax, dword ptr [esp+ |
| 474 ; OPTM1: ret |
315 | 475 |
316 define internal i32 @trunc64To16Unsigned(i64 %a) { | 476 define internal i32 @trunc64To16Unsigned(i64 %a) { |
317 entry: | 477 entry: |
318 %conv = trunc i64 %a to i16 | 478 %conv = trunc i64 %a to i16 |
319 %conv.ret_ext = zext i16 %conv to i32 | 479 %conv.ret_ext = zext i16 %conv to i32 |
320 ret i32 %conv.ret_ext | 480 ret i32 %conv.ret_ext |
321 } | 481 } |
322 ; CHECK: trunc64To16Unsigned: | 482 ; CHECK: trunc64To16Unsigned: |
323 ; CHECK: mov eax, dword ptr [esp+4] | 483 ; CHECK: mov eax, dword ptr [esp+4] |
324 ; CHECK-NEXT: movzx eax, ax | 484 ; CHECK-NEXT: movzx eax, ax |
325 ; CHECK-NEXT: ret | 485 ; CHECK-NEXT: ret |
| 486 ; |
| 487 ; OPTM1: trunc64To16Unsigned: |
| 488 ; OPTM1: mov eax, dword ptr [esp+ |
| 489 ; OPTM1: movzx eax, |
| 490 ; OPTM1: ret |
326 | 491 |
327 define internal i32 @trunc64To8Unsigned(i64 %a) { | 492 define internal i32 @trunc64To8Unsigned(i64 %a) { |
328 entry: | 493 entry: |
329 %conv = trunc i64 %a to i8 | 494 %conv = trunc i64 %a to i8 |
330 %conv.ret_ext = zext i8 %conv to i32 | 495 %conv.ret_ext = zext i8 %conv to i32 |
331 ret i32 %conv.ret_ext | 496 ret i32 %conv.ret_ext |
332 } | 497 } |
333 ; CHECK: trunc64To8Unsigned: | 498 ; CHECK: trunc64To8Unsigned: |
334 ; CHECK: mov eax, dword ptr [esp+4] | 499 ; CHECK: mov eax, dword ptr [esp+4] |
335 ; CHECK-NEXT: movzx eax, al | 500 ; CHECK-NEXT: movzx eax, al |
336 ; CHECK-NEXT: ret | 501 ; CHECK-NEXT: ret |
| 502 ; |
| 503 ; OPTM1: trunc64To8Unsigned: |
| 504 ; OPTM1: mov eax, dword ptr [esp+ |
| 505 ; OPTM1: movzx eax, |
| 506 ; OPTM1: ret |
337 | 507 |
338 define internal i32 @trunc64To1(i64 %a) { | 508 define internal i32 @trunc64To1(i64 %a) { |
339 entry: | 509 entry: |
340 ; %tobool = icmp ne i64 %a, 0 | 510 ; %tobool = icmp ne i64 %a, 0 |
341 %tobool = trunc i64 %a to i1 | 511 %tobool = trunc i64 %a to i1 |
342 %tobool.ret_ext = zext i1 %tobool to i32 | 512 %tobool.ret_ext = zext i1 %tobool to i32 |
343 ret i32 %tobool.ret_ext | 513 ret i32 %tobool.ret_ext |
344 } | 514 } |
345 ; CHECK: trunc64To1: | 515 ; CHECK: trunc64To1: |
346 ; CHECK: mov eax, dword ptr [esp+4] | 516 ; CHECK: mov eax, dword ptr [esp+4] |
347 ; CHECK: and eax, 1 | 517 ; CHECK: and eax, 1 |
348 ; CHECK-NEXT: ret | 518 ; CHECK-NEXT: ret |
| 519 ; |
| 520 ; OPTM1: trunc64To1: |
| 521 ; OPTM1: mov eax, dword ptr [esp+ |
| 522 ; OPTM1: and eax, 1 |
| 523 ; OPTM1: ret |
349 | 524 |
350 define internal i64 @sext32To64(i32 %a) { | 525 define internal i64 @sext32To64(i32 %a) { |
351 entry: | 526 entry: |
352 %conv = sext i32 %a to i64 | 527 %conv = sext i32 %a to i64 |
353 ret i64 %conv | 528 ret i64 %conv |
354 } | 529 } |
355 ; CHECK: sext32To64: | 530 ; CHECK: sext32To64: |
356 ; CHECK: mov | 531 ; CHECK: mov |
357 ; CHECK: sar {{.*}}, 31 | 532 ; CHECK: sar {{.*}}, 31 |
| 533 ; |
| 534 ; OPTM1: sext32To64: |
| 535 ; OPTM1: mov |
| 536 ; OPTM1: sar {{.*}}, 31 |
358 | 537 |
359 define internal i64 @sext16To64(i32 %a) { | 538 define internal i64 @sext16To64(i32 %a) { |
360 entry: | 539 entry: |
361 %a.arg_trunc = trunc i32 %a to i16 | 540 %a.arg_trunc = trunc i32 %a to i16 |
362 %conv = sext i16 %a.arg_trunc to i64 | 541 %conv = sext i16 %a.arg_trunc to i64 |
363 ret i64 %conv | 542 ret i64 %conv |
364 } | 543 } |
365 ; CHECK: sext16To64: | 544 ; CHECK: sext16To64: |
366 ; CHECK: movsx | 545 ; CHECK: movsx |
367 ; CHECK: sar {{.*}}, 31 | 546 ; CHECK: sar {{.*}}, 31 |
| 547 ; |
| 548 ; OPTM1: sext16To64: |
| 549 ; OPTM1: movsx |
| 550 ; OPTM1: sar {{.*}}, 31 |
368 | 551 |
369 define internal i64 @sext8To64(i32 %a) { | 552 define internal i64 @sext8To64(i32 %a) { |
370 entry: | 553 entry: |
371 %a.arg_trunc = trunc i32 %a to i8 | 554 %a.arg_trunc = trunc i32 %a to i8 |
372 %conv = sext i8 %a.arg_trunc to i64 | 555 %conv = sext i8 %a.arg_trunc to i64 |
373 ret i64 %conv | 556 ret i64 %conv |
374 } | 557 } |
375 ; CHECK: sext8To64: | 558 ; CHECK: sext8To64: |
376 ; CHECK: movsx | 559 ; CHECK: movsx |
377 ; CHECK: sar {{.*}}, 31 | 560 ; CHECK: sar {{.*}}, 31 |
| 561 ; |
| 562 ; OPTM1: sext8To64: |
| 563 ; OPTM1: movsx |
| 564 ; OPTM1: sar {{.*}}, 31 |
378 | 565 |
379 define internal i64 @zext32To64(i32 %a) { | 566 define internal i64 @zext32To64(i32 %a) { |
380 entry: | 567 entry: |
381 %conv = zext i32 %a to i64 | 568 %conv = zext i32 %a to i64 |
382 ret i64 %conv | 569 ret i64 %conv |
383 } | 570 } |
384 ; CHECK: zext32To64: | 571 ; CHECK: zext32To64: |
385 ; CHECK: mov | 572 ; CHECK: mov |
386 ; CHECK: mov {{.*}}, 0 | 573 ; CHECK: mov {{.*}}, 0 |
| 574 ; |
| 575 ; OPTM1: zext32To64: |
| 576 ; OPTM1: mov |
| 577 ; OPTM1: mov {{.*}}, 0 |
387 | 578 |
388 define internal i64 @zext16To64(i32 %a) { | 579 define internal i64 @zext16To64(i32 %a) { |
389 entry: | 580 entry: |
390 %a.arg_trunc = trunc i32 %a to i16 | 581 %a.arg_trunc = trunc i32 %a to i16 |
391 %conv = zext i16 %a.arg_trunc to i64 | 582 %conv = zext i16 %a.arg_trunc to i64 |
392 ret i64 %conv | 583 ret i64 %conv |
393 } | 584 } |
394 ; CHECK: zext16To64: | 585 ; CHECK: zext16To64: |
395 ; CHECK: movzx | 586 ; CHECK: movzx |
396 ; CHECK: mov {{.*}}, 0 | 587 ; CHECK: mov {{.*}}, 0 |
| 588 ; |
| 589 ; OPTM1: zext16To64: |
| 590 ; OPTM1: movzx |
| 591 ; OPTM1: mov {{.*}}, 0 |
397 | 592 |
398 define internal i64 @zext8To64(i32 %a) { | 593 define internal i64 @zext8To64(i32 %a) { |
399 entry: | 594 entry: |
400 %a.arg_trunc = trunc i32 %a to i8 | 595 %a.arg_trunc = trunc i32 %a to i8 |
401 %conv = zext i8 %a.arg_trunc to i64 | 596 %conv = zext i8 %a.arg_trunc to i64 |
402 ret i64 %conv | 597 ret i64 %conv |
403 } | 598 } |
404 ; CHECK: zext8To64: | 599 ; CHECK: zext8To64: |
405 ; CHECK: movzx | 600 ; CHECK: movzx |
406 ; CHECK: mov {{.*}}, 0 | 601 ; CHECK: mov {{.*}}, 0 |
| 602 ; |
| 603 ; OPTM1: zext8To64: |
| 604 ; OPTM1: movzx |
| 605 ; OPTM1: mov {{.*}}, 0 |
407 | 606 |
408 define internal i64 @zext1To64(i32 %a) { | 607 define internal i64 @zext1To64(i32 %a) { |
409 entry: | 608 entry: |
410 %a.arg_trunc = trunc i32 %a to i1 | 609 %a.arg_trunc = trunc i32 %a to i1 |
411 %conv = zext i1 %a.arg_trunc to i64 | 610 %conv = zext i1 %a.arg_trunc to i64 |
412 ret i64 %conv | 611 ret i64 %conv |
413 } | 612 } |
414 ; CHECK: zext1To64: | 613 ; CHECK: zext1To64: |
415 ; CHECK: movzx | 614 ; CHECK: movzx |
416 ; CHECK: mov {{.*}}, 0 | 615 ; CHECK: mov {{.*}}, 0 |
| 616 ; |
| 617 ; OPTM1: zext1To64: |
| 618 ; OPTM1: movzx |
| 619 ; OPTM1: mov {{.*}}, 0 |
417 | 620 |
418 define internal void @icmpEq64(i64 %a, i64 %b, i64 %c, i64 %d) { | 621 define internal void @icmpEq64(i64 %a, i64 %b, i64 %c, i64 %d) { |
419 entry: | 622 entry: |
420 %cmp = icmp eq i64 %a, %b | 623 %cmp = icmp eq i64 %a, %b |
421 br i1 %cmp, label %if.then, label %if.end | 624 br i1 %cmp, label %if.then, label %if.end |
422 | 625 |
423 if.then: ; preds = %entry | 626 if.then: ; preds = %entry |
424 call void @func() | 627 call void @func() |
425 br label %if.end | 628 br label %if.end |
426 | 629 |
427 if.end: ; preds = %if.then, %entry | 630 if.end: ; preds = %if.then, %entry |
428 %cmp1 = icmp eq i64 %c, %d | 631 %cmp1 = icmp eq i64 %c, %d |
429 br i1 %cmp1, label %if.then2, label %if.end3 | 632 br i1 %cmp1, label %if.then2, label %if.end3 |
430 | 633 |
431 if.then2: ; preds = %if.end | 634 if.then2: ; preds = %if.end |
432 call void @func() | 635 call void @func() |
433 br label %if.end3 | 636 br label %if.end3 |
434 | 637 |
435 if.end3: ; preds = %if.then2, %if.end | 638 if.end3: ; preds = %if.then2, %if.end |
436 ret void | 639 ret void |
437 } | 640 } |
438 ; CHECK: icmpEq64: | 641 ; CHECK: icmpEq64: |
439 ; CHECK: jne | 642 ; CHECK: jne |
440 ; CHECK: jne | 643 ; CHECK: jne |
441 ; CHECK: call | 644 ; CHECK: call |
442 ; CHECK: jne | 645 ; CHECK: jne |
443 ; CHECK: jne | 646 ; CHECK: jne |
444 ; CHECK: call | 647 ; CHECK: call |
| 648 ; |
| 649 ; OPTM1: icmpEq64: |
| 650 ; OPTM1: jne |
| 651 ; OPTM1: jne |
| 652 ; OPTM1: call |
| 653 ; OPTM1: jne |
| 654 ; OPTM1: jne |
| 655 ; OPTM1: call |
445 | 656 |
446 declare void @func() | 657 declare void @func() |
447 | 658 |
448 define internal void @icmpNe64(i64 %a, i64 %b, i64 %c, i64 %d) { | 659 define internal void @icmpNe64(i64 %a, i64 %b, i64 %c, i64 %d) { |
449 entry: | 660 entry: |
450 %cmp = icmp ne i64 %a, %b | 661 %cmp = icmp ne i64 %a, %b |
451 br i1 %cmp, label %if.then, label %if.end | 662 br i1 %cmp, label %if.then, label %if.end |
452 | 663 |
453 if.then: ; preds = %entry | 664 if.then: ; preds = %entry |
454 call void @func() | 665 call void @func() |
(...skipping 10 matching lines...) Expand all Loading... |
465 if.end3: ; preds = %if.end, %if.then2 | 676 if.end3: ; preds = %if.end, %if.then2 |
466 ret void | 677 ret void |
467 } | 678 } |
468 ; CHECK: icmpNe64: | 679 ; CHECK: icmpNe64: |
469 ; CHECK: jne | 680 ; CHECK: jne |
470 ; CHECK: jne | 681 ; CHECK: jne |
471 ; CHECK: call | 682 ; CHECK: call |
472 ; CHECK: jne | 683 ; CHECK: jne |
473 ; CHECK: jne | 684 ; CHECK: jne |
474 ; CHECK: call | 685 ; CHECK: call |
| 686 ; |
| 687 ; OPTM1: icmpNe64: |
| 688 ; OPTM1: jne |
| 689 ; OPTM1: jne |
| 690 ; OPTM1: call |
| 691 ; OPTM1: jne |
| 692 ; OPTM1: jne |
| 693 ; OPTM1: call |
475 | 694 |
476 define internal void @icmpGt64(i64 %a, i64 %b, i64 %c, i64 %d) { | 695 define internal void @icmpGt64(i64 %a, i64 %b, i64 %c, i64 %d) { |
477 entry: | 696 entry: |
478 %cmp = icmp ugt i64 %a, %b | 697 %cmp = icmp ugt i64 %a, %b |
479 br i1 %cmp, label %if.then, label %if.end | 698 br i1 %cmp, label %if.then, label %if.end |
480 | 699 |
481 if.then: ; preds = %entry | 700 if.then: ; preds = %entry |
482 call void @func() | 701 call void @func() |
483 br label %if.end | 702 br label %if.end |
484 | 703 |
(...skipping 10 matching lines...) Expand all Loading... |
495 } | 714 } |
496 ; CHECK: icmpGt64: | 715 ; CHECK: icmpGt64: |
497 ; CHECK: ja | 716 ; CHECK: ja |
498 ; CHECK: jb | 717 ; CHECK: jb |
499 ; CHECK: ja | 718 ; CHECK: ja |
500 ; CHECK: call | 719 ; CHECK: call |
501 ; CHECK: jg | 720 ; CHECK: jg |
502 ; CHECK: jl | 721 ; CHECK: jl |
503 ; CHECK: ja | 722 ; CHECK: ja |
504 ; CHECK: call | 723 ; CHECK: call |
| 724 ; |
| 725 ; OPTM1: icmpGt64: |
| 726 ; OPTM1: ja |
| 727 ; OPTM1: jb |
| 728 ; OPTM1: ja |
| 729 ; OPTM1: call |
| 730 ; OPTM1: jg |
| 731 ; OPTM1: jl |
| 732 ; OPTM1: ja |
| 733 ; OPTM1: call |
505 | 734 |
506 define internal void @icmpGe64(i64 %a, i64 %b, i64 %c, i64 %d) { | 735 define internal void @icmpGe64(i64 %a, i64 %b, i64 %c, i64 %d) { |
507 entry: | 736 entry: |
508 %cmp = icmp uge i64 %a, %b | 737 %cmp = icmp uge i64 %a, %b |
509 br i1 %cmp, label %if.then, label %if.end | 738 br i1 %cmp, label %if.then, label %if.end |
510 | 739 |
511 if.then: ; preds = %entry | 740 if.then: ; preds = %entry |
512 call void @func() | 741 call void @func() |
513 br label %if.end | 742 br label %if.end |
514 | 743 |
(...skipping 10 matching lines...) Expand all Loading... |
525 } | 754 } |
526 ; CHECK: icmpGe64: | 755 ; CHECK: icmpGe64: |
527 ; CHECK: ja | 756 ; CHECK: ja |
528 ; CHECK: jb | 757 ; CHECK: jb |
529 ; CHECK: jae | 758 ; CHECK: jae |
530 ; CHECK: call | 759 ; CHECK: call |
531 ; CHECK: jg | 760 ; CHECK: jg |
532 ; CHECK: jl | 761 ; CHECK: jl |
533 ; CHECK: jae | 762 ; CHECK: jae |
534 ; CHECK: call | 763 ; CHECK: call |
| 764 ; |
| 765 ; OPTM1: icmpGe64: |
| 766 ; OPTM1: ja |
| 767 ; OPTM1: jb |
| 768 ; OPTM1: jae |
| 769 ; OPTM1: call |
| 770 ; OPTM1: jg |
| 771 ; OPTM1: jl |
| 772 ; OPTM1: jae |
| 773 ; OPTM1: call |
535 | 774 |
536 define internal void @icmpLt64(i64 %a, i64 %b, i64 %c, i64 %d) { | 775 define internal void @icmpLt64(i64 %a, i64 %b, i64 %c, i64 %d) { |
537 entry: | 776 entry: |
538 %cmp = icmp ult i64 %a, %b | 777 %cmp = icmp ult i64 %a, %b |
539 br i1 %cmp, label %if.then, label %if.end | 778 br i1 %cmp, label %if.then, label %if.end |
540 | 779 |
541 if.then: ; preds = %entry | 780 if.then: ; preds = %entry |
542 call void @func() | 781 call void @func() |
543 br label %if.end | 782 br label %if.end |
544 | 783 |
(...skipping 10 matching lines...) Expand all Loading... |
555 } | 794 } |
556 ; CHECK: icmpLt64: | 795 ; CHECK: icmpLt64: |
557 ; CHECK: jb | 796 ; CHECK: jb |
558 ; CHECK: ja | 797 ; CHECK: ja |
559 ; CHECK: jb | 798 ; CHECK: jb |
560 ; CHECK: call | 799 ; CHECK: call |
561 ; CHECK: jl | 800 ; CHECK: jl |
562 ; CHECK: jg | 801 ; CHECK: jg |
563 ; CHECK: jb | 802 ; CHECK: jb |
564 ; CHECK: call | 803 ; CHECK: call |
| 804 ; |
| 805 ; OPTM1: icmpLt64: |
| 806 ; OPTM1: jb |
| 807 ; OPTM1: ja |
| 808 ; OPTM1: jb |
| 809 ; OPTM1: call |
| 810 ; OPTM1: jl |
| 811 ; OPTM1: jg |
| 812 ; OPTM1: jb |
| 813 ; OPTM1: call |
565 | 814 |
566 define internal void @icmpLe64(i64 %a, i64 %b, i64 %c, i64 %d) { | 815 define internal void @icmpLe64(i64 %a, i64 %b, i64 %c, i64 %d) { |
567 entry: | 816 entry: |
568 %cmp = icmp ule i64 %a, %b | 817 %cmp = icmp ule i64 %a, %b |
569 br i1 %cmp, label %if.then, label %if.end | 818 br i1 %cmp, label %if.then, label %if.end |
570 | 819 |
571 if.then: ; preds = %entry | 820 if.then: ; preds = %entry |
572 call void @func() | 821 call void @func() |
573 br label %if.end | 822 br label %if.end |
574 | 823 |
(...skipping 10 matching lines...) Expand all Loading... |
585 } | 834 } |
586 ; CHECK: icmpLe64: | 835 ; CHECK: icmpLe64: |
587 ; CHECK: jb | 836 ; CHECK: jb |
588 ; CHECK: ja | 837 ; CHECK: ja |
589 ; CHECK: jbe | 838 ; CHECK: jbe |
590 ; CHECK: call | 839 ; CHECK: call |
591 ; CHECK: jl | 840 ; CHECK: jl |
592 ; CHECK: jg | 841 ; CHECK: jg |
593 ; CHECK: jbe | 842 ; CHECK: jbe |
594 ; CHECK: call | 843 ; CHECK: call |
| 844 ; |
| 845 ; OPTM1: icmpLe64: |
| 846 ; OPTM1: jb |
| 847 ; OPTM1: ja |
| 848 ; OPTM1: jbe |
| 849 ; OPTM1: call |
| 850 ; OPTM1: jl |
| 851 ; OPTM1: jg |
| 852 ; OPTM1: jbe |
| 853 ; OPTM1: call |
595 | 854 |
596 define internal i32 @icmpEq64Bool(i64 %a, i64 %b) { | 855 define internal i32 @icmpEq64Bool(i64 %a, i64 %b) { |
597 entry: | 856 entry: |
598 %cmp = icmp eq i64 %a, %b | 857 %cmp = icmp eq i64 %a, %b |
599 %cmp.ret_ext = zext i1 %cmp to i32 | 858 %cmp.ret_ext = zext i1 %cmp to i32 |
600 ret i32 %cmp.ret_ext | 859 ret i32 %cmp.ret_ext |
601 } | 860 } |
602 ; CHECK: icmpEq64Bool: | 861 ; CHECK: icmpEq64Bool: |
603 ; CHECK: jne | 862 ; CHECK: jne |
604 ; CHECK: jne | 863 ; CHECK: jne |
| 864 ; |
| 865 ; OPTM1: icmpEq64Bool: |
| 866 ; OPTM1: jne |
| 867 ; OPTM1: jne |
605 | 868 |
606 define internal i32 @icmpNe64Bool(i64 %a, i64 %b) { | 869 define internal i32 @icmpNe64Bool(i64 %a, i64 %b) { |
607 entry: | 870 entry: |
608 %cmp = icmp ne i64 %a, %b | 871 %cmp = icmp ne i64 %a, %b |
609 %cmp.ret_ext = zext i1 %cmp to i32 | 872 %cmp.ret_ext = zext i1 %cmp to i32 |
610 ret i32 %cmp.ret_ext | 873 ret i32 %cmp.ret_ext |
611 } | 874 } |
612 ; CHECK: icmpNe64Bool: | 875 ; CHECK: icmpNe64Bool: |
613 ; CHECK: jne | 876 ; CHECK: jne |
614 ; CHECK: jne | 877 ; CHECK: jne |
| 878 ; |
| 879 ; OPTM1: icmpNe64Bool: |
| 880 ; OPTM1: jne |
| 881 ; OPTM1: jne |
615 | 882 |
616 define internal i32 @icmpSgt64Bool(i64 %a, i64 %b) { | 883 define internal i32 @icmpSgt64Bool(i64 %a, i64 %b) { |
617 entry: | 884 entry: |
618 %cmp = icmp sgt i64 %a, %b | 885 %cmp = icmp sgt i64 %a, %b |
619 %cmp.ret_ext = zext i1 %cmp to i32 | 886 %cmp.ret_ext = zext i1 %cmp to i32 |
620 ret i32 %cmp.ret_ext | 887 ret i32 %cmp.ret_ext |
621 } | 888 } |
622 ; CHECK: icmpSgt64Bool: | 889 ; CHECK: icmpSgt64Bool: |
623 ; CHECK: cmp | 890 ; CHECK: cmp |
624 ; CHECK: jg | 891 ; CHECK: jg |
625 ; CHECK: jl | 892 ; CHECK: jl |
626 ; CHECK: cmp | 893 ; CHECK: cmp |
627 ; CHECK: ja | 894 ; CHECK: ja |
| 895 ; |
| 896 ; OPTM1: icmpSgt64Bool: |
| 897 ; OPTM1: cmp |
| 898 ; OPTM1: jg |
| 899 ; OPTM1: jl |
| 900 ; OPTM1: cmp |
| 901 ; OPTM1: ja |
628 | 902 |
629 define internal i32 @icmpUgt64Bool(i64 %a, i64 %b) { | 903 define internal i32 @icmpUgt64Bool(i64 %a, i64 %b) { |
630 entry: | 904 entry: |
631 %cmp = icmp ugt i64 %a, %b | 905 %cmp = icmp ugt i64 %a, %b |
632 %cmp.ret_ext = zext i1 %cmp to i32 | 906 %cmp.ret_ext = zext i1 %cmp to i32 |
633 ret i32 %cmp.ret_ext | 907 ret i32 %cmp.ret_ext |
634 } | 908 } |
635 ; CHECK: icmpUgt64Bool: | 909 ; CHECK: icmpUgt64Bool: |
636 ; CHECK: cmp | 910 ; CHECK: cmp |
637 ; CHECK: ja | 911 ; CHECK: ja |
638 ; CHECK: jb | 912 ; CHECK: jb |
639 ; CHECK: cmp | 913 ; CHECK: cmp |
640 ; CHECK: ja | 914 ; CHECK: ja |
| 915 ; |
| 916 ; OPTM1: icmpUgt64Bool: |
| 917 ; OPTM1: cmp |
| 918 ; OPTM1: ja |
| 919 ; OPTM1: jb |
| 920 ; OPTM1: cmp |
| 921 ; OPTM1: ja |
641 | 922 |
642 define internal i32 @icmpSge64Bool(i64 %a, i64 %b) { | 923 define internal i32 @icmpSge64Bool(i64 %a, i64 %b) { |
643 entry: | 924 entry: |
644 %cmp = icmp sge i64 %a, %b | 925 %cmp = icmp sge i64 %a, %b |
645 %cmp.ret_ext = zext i1 %cmp to i32 | 926 %cmp.ret_ext = zext i1 %cmp to i32 |
646 ret i32 %cmp.ret_ext | 927 ret i32 %cmp.ret_ext |
647 } | 928 } |
648 ; CHECK: icmpSge64Bool: | 929 ; CHECK: icmpSge64Bool: |
649 ; CHECK: cmp | 930 ; CHECK: cmp |
650 ; CHECK: jg | 931 ; CHECK: jg |
651 ; CHECK: jl | 932 ; CHECK: jl |
652 ; CHECK: cmp | 933 ; CHECK: cmp |
653 ; CHECK: jae | 934 ; CHECK: jae |
| 935 ; |
| 936 ; OPTM1: icmpSge64Bool: |
| 937 ; OPTM1: cmp |
| 938 ; OPTM1: jg |
| 939 ; OPTM1: jl |
| 940 ; OPTM1: cmp |
| 941 ; OPTM1: jae |
654 | 942 |
655 define internal i32 @icmpUge64Bool(i64 %a, i64 %b) { | 943 define internal i32 @icmpUge64Bool(i64 %a, i64 %b) { |
656 entry: | 944 entry: |
657 %cmp = icmp uge i64 %a, %b | 945 %cmp = icmp uge i64 %a, %b |
658 %cmp.ret_ext = zext i1 %cmp to i32 | 946 %cmp.ret_ext = zext i1 %cmp to i32 |
659 ret i32 %cmp.ret_ext | 947 ret i32 %cmp.ret_ext |
660 } | 948 } |
661 ; CHECK: icmpUge64Bool: | 949 ; CHECK: icmpUge64Bool: |
662 ; CHECK: cmp | 950 ; CHECK: cmp |
663 ; CHECK: ja | 951 ; CHECK: ja |
664 ; CHECK: jb | 952 ; CHECK: jb |
665 ; CHECK: cmp | 953 ; CHECK: cmp |
666 ; CHECK: jae | 954 ; CHECK: jae |
| 955 ; |
| 956 ; OPTM1: icmpUge64Bool: |
| 957 ; OPTM1: cmp |
| 958 ; OPTM1: ja |
| 959 ; OPTM1: jb |
| 960 ; OPTM1: cmp |
| 961 ; OPTM1: jae |
667 | 962 |
668 define internal i32 @icmpSlt64Bool(i64 %a, i64 %b) { | 963 define internal i32 @icmpSlt64Bool(i64 %a, i64 %b) { |
669 entry: | 964 entry: |
670 %cmp = icmp slt i64 %a, %b | 965 %cmp = icmp slt i64 %a, %b |
671 %cmp.ret_ext = zext i1 %cmp to i32 | 966 %cmp.ret_ext = zext i1 %cmp to i32 |
672 ret i32 %cmp.ret_ext | 967 ret i32 %cmp.ret_ext |
673 } | 968 } |
674 ; CHECK: icmpSlt64Bool: | 969 ; CHECK: icmpSlt64Bool: |
675 ; CHECK: cmp | 970 ; CHECK: cmp |
676 ; CHECK: jl | 971 ; CHECK: jl |
677 ; CHECK: jg | 972 ; CHECK: jg |
678 ; CHECK: cmp | 973 ; CHECK: cmp |
679 ; CHECK: jb | 974 ; CHECK: jb |
| 975 ; |
| 976 ; OPTM1: icmpSlt64Bool: |
| 977 ; OPTM1: cmp |
| 978 ; OPTM1: jl |
| 979 ; OPTM1: jg |
| 980 ; OPTM1: cmp |
| 981 ; OPTM1: jb |
680 | 982 |
681 define internal i32 @icmpUlt64Bool(i64 %a, i64 %b) { | 983 define internal i32 @icmpUlt64Bool(i64 %a, i64 %b) { |
682 entry: | 984 entry: |
683 %cmp = icmp ult i64 %a, %b | 985 %cmp = icmp ult i64 %a, %b |
684 %cmp.ret_ext = zext i1 %cmp to i32 | 986 %cmp.ret_ext = zext i1 %cmp to i32 |
685 ret i32 %cmp.ret_ext | 987 ret i32 %cmp.ret_ext |
686 } | 988 } |
687 ; CHECK: icmpUlt64Bool: | 989 ; CHECK: icmpUlt64Bool: |
688 ; CHECK: cmp | 990 ; CHECK: cmp |
689 ; CHECK: jb | 991 ; CHECK: jb |
690 ; CHECK: ja | 992 ; CHECK: ja |
691 ; CHECK: cmp | 993 ; CHECK: cmp |
692 ; CHECK: jb | 994 ; CHECK: jb |
| 995 ; |
| 996 ; OPTM1: icmpUlt64Bool: |
| 997 ; OPTM1: cmp |
| 998 ; OPTM1: jb |
| 999 ; OPTM1: ja |
| 1000 ; OPTM1: cmp |
| 1001 ; OPTM1: jb |
693 | 1002 |
694 define internal i32 @icmpSle64Bool(i64 %a, i64 %b) { | 1003 define internal i32 @icmpSle64Bool(i64 %a, i64 %b) { |
695 entry: | 1004 entry: |
696 %cmp = icmp sle i64 %a, %b | 1005 %cmp = icmp sle i64 %a, %b |
697 %cmp.ret_ext = zext i1 %cmp to i32 | 1006 %cmp.ret_ext = zext i1 %cmp to i32 |
698 ret i32 %cmp.ret_ext | 1007 ret i32 %cmp.ret_ext |
699 } | 1008 } |
700 ; CHECK: icmpSle64Bool: | 1009 ; CHECK: icmpSle64Bool: |
701 ; CHECK: cmp | 1010 ; CHECK: cmp |
702 ; CHECK: jl | 1011 ; CHECK: jl |
703 ; CHECK: jg | 1012 ; CHECK: jg |
704 ; CHECK: cmp | 1013 ; CHECK: cmp |
705 ; CHECK: jbe | 1014 ; CHECK: jbe |
| 1015 ; |
| 1016 ; OPTM1: icmpSle64Bool: |
| 1017 ; OPTM1: cmp |
| 1018 ; OPTM1: jl |
| 1019 ; OPTM1: jg |
| 1020 ; OPTM1: cmp |
| 1021 ; OPTM1: jbe |
706 | 1022 |
707 define internal i32 @icmpUle64Bool(i64 %a, i64 %b) { | 1023 define internal i32 @icmpUle64Bool(i64 %a, i64 %b) { |
708 entry: | 1024 entry: |
709 %cmp = icmp ule i64 %a, %b | 1025 %cmp = icmp ule i64 %a, %b |
710 %cmp.ret_ext = zext i1 %cmp to i32 | 1026 %cmp.ret_ext = zext i1 %cmp to i32 |
711 ret i32 %cmp.ret_ext | 1027 ret i32 %cmp.ret_ext |
712 } | 1028 } |
713 ; CHECK: icmpUle64Bool: | 1029 ; CHECK: icmpUle64Bool: |
714 ; CHECK: cmp | 1030 ; CHECK: cmp |
715 ; CHECK: jb | 1031 ; CHECK: jb |
716 ; CHECK: ja | 1032 ; CHECK: ja |
717 ; CHECK: cmp | 1033 ; CHECK: cmp |
718 ; CHECK: jbe | 1034 ; CHECK: jbe |
| 1035 ; |
| 1036 ; OPTM1: icmpUle64Bool: |
| 1037 ; OPTM1: cmp |
| 1038 ; OPTM1: jb |
| 1039 ; OPTM1: ja |
| 1040 ; OPTM1: cmp |
| 1041 ; OPTM1: jbe |
719 | 1042 |
720 define internal i64 @load64(i32 %a) { | 1043 define internal i64 @load64(i32 %a) { |
721 entry: | 1044 entry: |
722 %a.asptr = inttoptr i32 %a to i64* | 1045 %a.asptr = inttoptr i32 %a to i64* |
723 %v0 = load i64* %a.asptr, align 1 | 1046 %v0 = load i64* %a.asptr, align 1 |
724 ret i64 %v0 | 1047 ret i64 %v0 |
725 } | 1048 } |
726 ; CHECK: load64: | 1049 ; CHECK: load64: |
727 ; CHECK: mov e[[REGISTER:[a-z]+]], dword ptr [esp+4] | 1050 ; CHECK: mov e[[REGISTER:[a-z]+]], dword ptr [esp+4] |
728 ; CHECK-NEXT: mov {{.*}}, dword ptr [e[[REGISTER]]] | 1051 ; CHECK-NEXT: mov {{.*}}, dword ptr [e[[REGISTER]]] |
729 ; CHECK-NEXT: mov {{.*}}, dword ptr [e[[REGISTER]]+4] | 1052 ; CHECK-NEXT: mov {{.*}}, dword ptr [e[[REGISTER]]+4] |
| 1053 ; |
| 1054 ; OPTM1: load64: |
| 1055 ; OPTM1: mov e{{..}}, dword ptr [e{{..}}] |
| 1056 ; OPTM1: mov e{{..}}, dword ptr [e{{..}}+4] |
730 | 1057 |
731 define internal void @store64(i32 %a, i64 %value) { | 1058 define internal void @store64(i32 %a, i64 %value) { |
732 entry: | 1059 entry: |
733 %a.asptr = inttoptr i32 %a to i64* | 1060 %a.asptr = inttoptr i32 %a to i64* |
734 store i64 %value, i64* %a.asptr, align 1 | 1061 store i64 %value, i64* %a.asptr, align 1 |
735 ret void | 1062 ret void |
736 } | 1063 } |
737 ; CHECK: store64: | 1064 ; CHECK: store64: |
738 ; CHECK: mov e[[REGISTER:[a-z]+]], dword ptr [esp+4] | 1065 ; CHECK: mov e[[REGISTER:[a-z]+]], dword ptr [esp+4] |
739 ; CHECK: mov dword ptr [e[[REGISTER]]+4], | 1066 ; CHECK: mov dword ptr [e[[REGISTER]]+4], |
740 ; CHECK: mov dword ptr [e[[REGISTER]]], | 1067 ; CHECK: mov dword ptr [e[[REGISTER]]], |
| 1068 ; |
| 1069 ; OPTM1: store64: |
| 1070 ; OPTM1: mov dword ptr [e[[REGISTER:[a-z]+]]+4], |
| 1071 ; OPTM1: mov dword ptr [e[[REGISTER]]], |
741 | 1072 |
742 define internal void @store64Const(i32 %a) { | 1073 define internal void @store64Const(i32 %a) { |
743 entry: | 1074 entry: |
744 %a.asptr = inttoptr i32 %a to i64* | 1075 %a.asptr = inttoptr i32 %a to i64* |
745 store i64 -2401053092306725256, i64* %a.asptr, align 1 | 1076 store i64 -2401053092306725256, i64* %a.asptr, align 1 |
746 ret void | 1077 ret void |
747 } | 1078 } |
748 ; CHECK: store64Const: | 1079 ; CHECK: store64Const: |
749 ; CHECK: mov e[[REGISTER:[a-z]+]], dword ptr [esp+4] | 1080 ; CHECK: mov e[[REGISTER:[a-z]+]], dword ptr [esp+4] |
750 ; CHECK: mov dword ptr [e[[REGISTER]]+4], 3735928559 | 1081 ; CHECK: mov dword ptr [e[[REGISTER]]+4], 3735928559 |
751 ; CHECK: mov dword ptr [e[[REGISTER]]], 305419896 | 1082 ; CHECK: mov dword ptr [e[[REGISTER]]], 305419896 |
| 1083 ; |
| 1084 ; OPTM1: store64Const: |
| 1085 ; OPTM1: mov dword ptr [e[[REGISTER:[a-z]+]]+4], 3735928559 |
| 1086 ; OPTM1: mov dword ptr [e[[REGISTER]]], 305419896 |
752 | 1087 |
753 define internal i64 @select64VarVar(i64 %a, i64 %b) { | 1088 define internal i64 @select64VarVar(i64 %a, i64 %b) { |
754 entry: | 1089 entry: |
755 %cmp = icmp ult i64 %a, %b | 1090 %cmp = icmp ult i64 %a, %b |
756 %cond = select i1 %cmp, i64 %a, i64 %b | 1091 %cond = select i1 %cmp, i64 %a, i64 %b |
757 ret i64 %cond | 1092 ret i64 %cond |
758 } | 1093 } |
759 ; CHECK: select64VarVar: | 1094 ; CHECK: select64VarVar: |
760 ; CHECK: cmp | 1095 ; CHECK: cmp |
761 ; CHECK: jb | 1096 ; CHECK: jb |
762 ; CHECK: ja | 1097 ; CHECK: ja |
763 ; CHECK: cmp | 1098 ; CHECK: cmp |
764 ; CHECK: jb | 1099 ; CHECK: jb |
765 ; CHECK: cmp | 1100 ; CHECK: cmp |
766 ; CHECK: jne | 1101 ; CHECK: jne |
| 1102 ; |
| 1103 ; OPTM1: select64VarVar: |
| 1104 ; OPTM1: cmp |
| 1105 ; OPTM1: jb |
| 1106 ; OPTM1: ja |
| 1107 ; OPTM1: cmp |
| 1108 ; OPTM1: jb |
| 1109 ; OPTM1: cmp |
| 1110 ; OPTM1: jne |
767 | 1111 |
768 define internal i64 @select64VarConst(i64 %a, i64 %b) { | 1112 define internal i64 @select64VarConst(i64 %a, i64 %b) { |
769 entry: | 1113 entry: |
770 %cmp = icmp ult i64 %a, %b | 1114 %cmp = icmp ult i64 %a, %b |
771 %cond = select i1 %cmp, i64 %a, i64 -2401053092306725256 | 1115 %cond = select i1 %cmp, i64 %a, i64 -2401053092306725256 |
772 ret i64 %cond | 1116 ret i64 %cond |
773 } | 1117 } |
774 ; CHECK: select64VarConst: | 1118 ; CHECK: select64VarConst: |
775 ; CHECK: cmp | 1119 ; CHECK: cmp |
776 ; CHECK: jb | 1120 ; CHECK: jb |
777 ; CHECK: ja | 1121 ; CHECK: ja |
778 ; CHECK: cmp | 1122 ; CHECK: cmp |
779 ; CHECK: jb | 1123 ; CHECK: jb |
780 ; CHECK: cmp | 1124 ; CHECK: cmp |
781 ; CHECK: jne | 1125 ; CHECK: jne |
| 1126 ; |
| 1127 ; OPTM1: select64VarConst: |
| 1128 ; OPTM1: cmp |
| 1129 ; OPTM1: jb |
| 1130 ; OPTM1: ja |
| 1131 ; OPTM1: cmp |
| 1132 ; OPTM1: jb |
| 1133 ; OPTM1: cmp |
| 1134 ; OPTM1: jne |
782 | 1135 |
783 define internal i64 @select64ConstVar(i64 %a, i64 %b) { | 1136 define internal i64 @select64ConstVar(i64 %a, i64 %b) { |
784 entry: | 1137 entry: |
785 %cmp = icmp ult i64 %a, %b | 1138 %cmp = icmp ult i64 %a, %b |
786 %cond = select i1 %cmp, i64 -2401053092306725256, i64 %b | 1139 %cond = select i1 %cmp, i64 -2401053092306725256, i64 %b |
787 ret i64 %cond | 1140 ret i64 %cond |
788 } | 1141 } |
789 ; CHECK: select64ConstVar: | 1142 ; CHECK: select64ConstVar: |
790 ; CHECK: cmp | 1143 ; CHECK: cmp |
791 ; CHECK: jb | 1144 ; CHECK: jb |
792 ; CHECK: ja | 1145 ; CHECK: ja |
793 ; CHECK: cmp | 1146 ; CHECK: cmp |
794 ; CHECK: jb | 1147 ; CHECK: jb |
795 ; CHECK: cmp | 1148 ; CHECK: cmp |
796 ; CHECK: jne | 1149 ; CHECK: jne |
| 1150 ; |
| 1151 ; OPTM1: select64ConstVar: |
| 1152 ; OPTM1: cmp |
| 1153 ; OPTM1: jb |
| 1154 ; OPTM1: ja |
| 1155 ; OPTM1: cmp |
| 1156 ; OPTM1: jb |
| 1157 ; OPTM1: cmp |
| 1158 ; OPTM1: jne |
797 | 1159 |
798 ; ERRORS-NOT: ICE translation error | 1160 ; ERRORS-NOT: ICE translation error |
799 ; DUMP-NOT: SZ | 1161 ; DUMP-NOT: SZ |
OLD | NEW |