OLD | NEW |
1 ; This tries to be a comprehensive test of i64 operations, in | 1 ; This tries to be a comprehensive test of i64 operations, in |
2 ; particular the patterns for lowering i64 operations into constituent | 2 ; particular the patterns for lowering i64 operations into constituent |
3 ; i32 operations on x86-32. | 3 ; i32 operations on x86-32. |
4 | 4 |
5 ; RUN: %p2i -i %s --args -O2 --verbose none \ | 5 ; RUN: %p2i --assemble --disassemble -i %s --args -O2 --verbose none \ |
6 ; RUN: | llvm-mc -triple=i686-none-nacl -filetype=obj \ | 6 ; RUN: | FileCheck %s |
7 ; RUN: | llvm-objdump -d --symbolize -x86-asm-syntax=intel - | FileCheck %s | 7 ; RUN: %p2i --assemble --disassemble -i %s --args -Om1 --verbose none \ |
8 ; RUN: %p2i -i %s --args -Om1 --verbose none \ | |
9 ; RUN: | llvm-mc -triple=i686-none-nacl -filetype=obj \ | |
10 ; RUN: | llvm-objdump -d --symbolize -x86-asm-syntax=intel - \ | |
11 ; RUN: | FileCheck --check-prefix=OPTM1 %s | 8 ; RUN: | FileCheck --check-prefix=OPTM1 %s |
12 | 9 |
13 @__init_array_start = internal constant [0 x i8] zeroinitializer, align 4 | 10 @__init_array_start = internal constant [0 x i8] zeroinitializer, align 4 |
14 @__fini_array_start = internal constant [0 x i8] zeroinitializer, align 4 | 11 @__fini_array_start = internal constant [0 x i8] zeroinitializer, align 4 |
15 @__tls_template_start = internal constant [0 x i8] zeroinitializer, align 8 | 12 @__tls_template_start = internal constant [0 x i8] zeroinitializer, align 8 |
16 @__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 |
17 | 14 |
18 define internal i32 @ignore64BitArg(i64 %a, i32 %b, i64 %c) { | 15 define internal i32 @ignore64BitArg(i64 %a, i32 %b, i64 %c) { |
19 entry: | 16 entry: |
20 ret i32 %b | 17 ret i32 %b |
21 } | 18 } |
22 | 19 |
23 define internal i32 @pass64BitArg(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f
) { | 20 define internal i32 @pass64BitArg(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f
) { |
24 entry: | 21 entry: |
25 %call = call i32 @ignore64BitArgNoInline(i64 %a, i32 123, i64 %b) | 22 %call = call i32 @ignore64BitArgNoInline(i64 %a, i32 123, i64 %b) |
26 %call1 = call i32 @ignore64BitArgNoInline(i64 %c, i32 123, i64 %d) | 23 %call1 = call i32 @ignore64BitArgNoInline(i64 %c, i32 123, i64 %d) |
27 %call2 = call i32 @ignore64BitArgNoInline(i64 %e, i32 123, i64 %f) | 24 %call2 = call i32 @ignore64BitArgNoInline(i64 %e, i32 123, i64 %f) |
28 %add = add i32 %call1, %call | 25 %add = add i32 %call1, %call |
29 %add3 = add i32 %add, %call2 | 26 %add3 = add i32 %add, %call2 |
30 ret i32 %add3 | 27 ret i32 %add3 |
31 } | 28 } |
32 ; CHECK-LABEL: pass64BitArg | 29 ; CHECK-LABEL: pass64BitArg |
33 ; CHECK: sub esp | 30 ; CHECK: sub esp |
34 ; CHECK: mov dword ptr [esp + 4] | 31 ; CHECK: mov DWORD PTR [esp+4] |
35 ; CHECK: mov dword ptr [esp] | 32 ; CHECK: mov DWORD PTR [esp] |
36 ; CHECK: mov dword ptr [esp + 8], 123 | 33 ; CHECK: mov DWORD PTR [esp+8],123 |
37 ; CHECK: mov dword ptr [esp + 16] | 34 ; CHECK: mov DWORD PTR [esp+16] |
38 ; CHECK: mov dword ptr [esp + 12] | 35 ; CHECK: mov DWORD PTR [esp+12] |
39 ; CHECK: call ignore64BitArgNoInline | 36 ; CHECK: call |
| 37 ; CHECK-NEXT: R_{{.*}} ignore64BitArgNoInline |
40 ; CHECK: sub esp | 38 ; CHECK: sub esp |
41 ; CHECK: mov dword ptr [esp + 4] | 39 ; CHECK: mov DWORD PTR [esp+4] |
42 ; CHECK: mov dword ptr [esp] | 40 ; CHECK: mov DWORD PTR [esp] |
43 ; CHECK: mov dword ptr [esp + 8], 123 | 41 ; CHECK: mov DWORD PTR [esp+8],123 |
44 ; CHECK: mov dword ptr [esp + 16] | 42 ; CHECK: mov DWORD PTR [esp+16] |
45 ; CHECK: mov dword ptr [esp + 12] | 43 ; CHECK: mov DWORD PTR [esp+12] |
46 ; CHECK: call ignore64BitArgNoInline | 44 ; CHECK: call |
| 45 ; CHECK-NEXT: R_{{.*}} ignore64BitArgNoInline |
47 ; CHECK: sub esp | 46 ; CHECK: sub esp |
48 ; CHECK: mov dword ptr [esp + 4] | 47 ; CHECK: mov DWORD PTR [esp+4] |
49 ; CHECK: mov dword ptr [esp] | 48 ; CHECK: mov DWORD PTR [esp] |
50 ; CHECK: mov dword ptr [esp + 8], 123 | 49 ; CHECK: mov DWORD PTR [esp+8],123 |
51 ; CHECK: mov dword ptr [esp + 16] | 50 ; CHECK: mov DWORD PTR [esp+16] |
52 ; CHECK: mov dword ptr [esp + 12] | 51 ; CHECK: mov DWORD PTR [esp+12] |
53 ; CHECK: call ignore64BitArgNoInline | 52 ; CHECK: call |
| 53 ; CHECK-NEXT: R_{{.*}} ignore64BitArgNoInline |
54 ; | 54 ; |
55 ; OPTM1-LABEL: pass64BitArg | 55 ; OPTM1-LABEL: pass64BitArg |
56 ; OPTM1: sub esp | 56 ; OPTM1: sub esp |
57 ; OPTM1: mov dword ptr [esp + 4] | 57 ; OPTM1: mov DWORD PTR [esp + 4] |
58 ; OPTM1: mov dword ptr [esp] | 58 ; OPTM1: mov DWORD PTR [esp] |
59 ; OPTM1: mov dword ptr [esp + 8], 123 | 59 ; OPTM1: mov DWORD PTR [esp + 8], 123 |
60 ; OPTM1: mov dword ptr [esp + 16] | 60 ; OPTM1: mov DWORD PTR [esp + 16] |
61 ; OPTM1: mov dword ptr [esp + 12] | 61 ; OPTM1: mov DWORD PTR [esp + 12] |
62 ; OPTM1: call ignore64BitArgNoInline | 62 ; OPTM1: call ignore64BitArgNoInline |
63 ; OPTM1: sub esp | 63 ; OPTM1: sub esp |
64 ; OPTM1: mov dword ptr [esp + 4] | 64 ; OPTM1: mov DWORD PTR [esp + 4] |
65 ; OPTM1: mov dword ptr [esp] | 65 ; OPTM1: mov DWORD PTR [esp] |
66 ; OPTM1: mov dword ptr [esp + 8], 123 | 66 ; OPTM1: mov DWORD PTR [esp + 8], 123 |
67 ; OPTM1: mov dword ptr [esp + 16] | 67 ; OPTM1: mov DWORD PTR [esp + 16] |
68 ; OPTM1: mov dword ptr [esp + 12] | 68 ; OPTM1: mov DWORD PTR [esp + 12] |
69 ; OPTM1: call ignore64BitArgNoInline | 69 ; OPTM1: call ignore64BitArgNoInline |
70 ; OPTM1: sub esp | 70 ; OPTM1: sub esp |
71 ; OPTM1: mov dword ptr [esp + 4] | 71 ; OPTM1: mov DWORD PTR [esp + 4] |
72 ; OPTM1: mov dword ptr [esp] | 72 ; OPTM1: mov DWORD PTR [esp] |
73 ; OPTM1: mov dword ptr [esp + 8], 123 | 73 ; OPTM1: mov DWORD PTR [esp + 8], 123 |
74 ; OPTM1: mov dword ptr [esp + 16] | 74 ; OPTM1: mov DWORD PTR [esp + 16] |
75 ; OPTM1: mov dword ptr [esp + 12] | 75 ; OPTM1: mov DWORD PTR [esp + 12] |
76 ; OPTM1: call ignore64BitArgNoInline | 76 ; OPTM1: call ignore64BitArgNoInline |
77 | 77 |
78 declare i32 @ignore64BitArgNoInline(i64, i32, i64) | 78 declare i32 @ignore64BitArgNoInline(i64, i32, i64) |
79 | 79 |
80 define internal i32 @pass64BitConstArg(i64 %a, i64 %b) { | 80 define internal i32 @pass64BitConstArg(i64 %a, i64 %b) { |
81 entry: | 81 entry: |
82 %call = call i32 @ignore64BitArgNoInline(i64 %a, i32 123, i64 -240105309230672
5256) | 82 %call = call i32 @ignore64BitArgNoInline(i64 %a, i32 123, i64 -240105309230672
5256) |
83 ret i32 %call | 83 ret i32 %call |
84 } | 84 } |
85 ; CHECK-LABEL: pass64BitConstArg | 85 ; CHECK-LABEL: pass64BitConstArg |
86 ; CHECK: sub esp | 86 ; CHECK: sub esp |
87 ; CHECK: mov dword ptr [esp + 4] | 87 ; CHECK: mov DWORD PTR [esp+4] |
88 ; CHECK-NEXT: mov dword ptr [esp] | 88 ; CHECK-NEXT: mov DWORD PTR [esp] |
89 ; CHECK-NEXT: mov dword ptr [esp + 8], 123 | 89 ; CHECK-NEXT: mov DWORD PTR [esp + 8], 123 |
90 ; Bundle padding might be added (so not using -NEXT). | 90 ; Bundle padding might be added (so not using -NEXT). |
91 ; CHECK: mov dword ptr [esp + 16], 3735928559 | 91 ; CHECK: mov DWORD PTR [esp+16],3735928559 |
92 ; CHECK-NEXT: mov dword ptr [esp + 12], 305419896 | 92 ; CHECK-NEXT: mov DWORD PTR [esp + 12], 305419896 |
93 ; Bundle padding will push the call down. | 93 ; Bundle padding will push the call down. |
94 ; CHECK-NOT: mov | 94 ; CHECK-NOT: mov |
95 ; CHECK: call ignore64BitArgNoInline | 95 ; CHECK: call |
| 96 ; CHECK-NEXT: R_{{.*}} ignore64BitArgNoInline |
96 ; | 97 ; |
97 ; OPTM1-LABEL: pass64BitConstArg | 98 ; OPTM1-LABEL: pass64BitConstArg |
98 ; OPTM1: sub esp | 99 ; OPTM1: sub esp |
99 ; OPTM1: mov dword ptr [esp + 4] | 100 ; OPTM1: mov DWORD PTR [esp + 4] |
100 ; OPTM1-NEXT: mov dword ptr [esp] | 101 ; OPTM1-NEXT: mov DWORD PTR [esp] |
101 ; OPTM1-NEXT: mov dword ptr [esp + 8], 123 | 102 ; OPTM1-NEXT: mov DWORD PTR [esp + 8], 123 |
102 ; Bundle padding might be added (so not using -NEXT). | 103 ; Bundle padding might be added (so not using -NEXT). |
103 ; OPTM1: mov dword ptr [esp + 16], 3735928559 | 104 ; OPTM1: mov DWORD PTR [esp + 16], 3735928559 |
104 ; OPTM1-NEXT: mov dword ptr [esp + 12], 305419896 | 105 ; OPTM1-NEXT: mov DWORD PTR [esp + 12], 305419896 |
105 ; OPTM1-NOT: mov | 106 ; OPTM1-NOT: mov |
106 ; OPTM1: call ignore64BitArgNoInline | 107 ; OPTM1: call ignore64BitArgNoInline |
107 | 108 |
108 define internal i64 @return64BitArg(i64 %a) { | 109 define internal i64 @return64BitArg(i64 %a) { |
109 entry: | 110 entry: |
110 ret i64 %a | 111 ret i64 %a |
111 } | 112 } |
112 ; CHECK-LABEL: return64BitArg | 113 ; CHECK-LABEL: return64BitArg |
113 ; CHECK: mov {{.*}}, dword ptr [esp + 4] | 114 ; CHECK: mov {{.*}},DWORD ptr [esp+4] |
114 ; CHECK: mov {{.*}}, dword ptr [esp + 8] | 115 ; CHECK: mov {{.*}},DWORD ptr [esp+8] |
115 ; | 116 ; |
116 ; OPTM1-LABEL: return64BitArg | 117 ; OPTM1-LABEL: return64BitArg |
117 ; OPTM1: mov {{.*}}, dword ptr [esp + 4] | 118 ; OPTM1: mov {{.*}}, DWORD PTR [esp + 4] |
118 ; OPTM1: mov {{.*}}, dword ptr [esp + 8] | 119 ; OPTM1: mov {{.*}}, DWORD PTR [esp + 8] |
119 | 120 |
120 define internal i64 @return64BitConst() { | 121 define internal i64 @return64BitConst() { |
121 entry: | 122 entry: |
122 ret i64 -2401053092306725256 | 123 ret i64 -2401053092306725256 |
123 } | 124 } |
124 ; CHECK-LABEL: return64BitConst | 125 ; CHECK-LABEL: return64BitConst |
125 ; CHECK: mov eax, 305419896 | 126 ; CHECK: mov eax,305419896 |
126 ; CHECK: mov edx, 3735928559 | 127 ; CHECK: mov edx,3735928559 |
127 ; | 128 ; |
128 ; OPTM1-LABEL: return64BitConst | 129 ; OPTM1-LABEL: return64BitConst |
129 ; OPTM1: mov eax, 305419896 | 130 ; OPTM1: mov eax, 305419896 |
130 ; OPTM1: mov edx, 3735928559 | 131 ; OPTM1: mov edx, 3735928559 |
131 | 132 |
132 define internal i64 @add64BitSigned(i64 %a, i64 %b) { | 133 define internal i64 @add64BitSigned(i64 %a, i64 %b) { |
133 entry: | 134 entry: |
134 %add = add i64 %b, %a | 135 %add = add i64 %b, %a |
135 ret i64 %add | 136 ret i64 %add |
136 } | 137 } |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 ; OPTM1: mul | 219 ; OPTM1: mul |
219 ; OPTM1: add | 220 ; OPTM1: add |
220 ; OPTM1: add | 221 ; OPTM1: add |
221 | 222 |
222 define internal i64 @div64BitSigned(i64 %a, i64 %b) { | 223 define internal i64 @div64BitSigned(i64 %a, i64 %b) { |
223 entry: | 224 entry: |
224 %div = sdiv i64 %a, %b | 225 %div = sdiv i64 %a, %b |
225 ret i64 %div | 226 ret i64 %div |
226 } | 227 } |
227 ; CHECK-LABEL: div64BitSigned | 228 ; CHECK-LABEL: div64BitSigned |
228 ; CHECK: call __divdi3 | 229 ; CHECK: call |
| 230 ; CHECK-NEXT: R_{{.*}} __divdi3 |
229 | 231 |
230 ; OPTM1-LABEL: div64BitSigned | 232 ; OPTM1-LABEL: div64BitSigned |
231 ; OPTM1: call __divdi3 | 233 ; OPTM1: call __divdi3 |
232 | 234 |
233 define internal i64 @div64BitSignedConst(i64 %a) { | 235 define internal i64 @div64BitSignedConst(i64 %a) { |
234 entry: | 236 entry: |
235 %div = sdiv i64 %a, 12345678901234 | 237 %div = sdiv i64 %a, 12345678901234 |
236 ret i64 %div | 238 ret i64 %div |
237 } | 239 } |
238 ; CHECK-LABEL: div64BitSignedConst | 240 ; CHECK-LABEL: div64BitSignedConst |
239 ; CHECK: mov dword ptr [esp + 12], 2874 | 241 ; CHECK: mov DWORD PTR [esp+12],2874 |
240 ; CHECK: mov dword ptr [esp + 8], 1942892530 | 242 ; CHECK: mov DWORD PTR [esp+8],1942892530 |
241 ; CHECK: call __divdi3 | 243 ; CHECK: call |
| 244 ; CHECK-NEXT: R_{{.*}} __divdi3 |
242 ; | 245 ; |
243 ; OPTM1-LABEL: div64BitSignedConst | 246 ; OPTM1-LABEL: div64BitSignedConst |
244 ; OPTM1: mov dword ptr [esp + 12], 2874 | 247 ; OPTM1: mov DWORD PTR [esp + 12], 2874 |
245 ; OPTM1: mov dword ptr [esp + 8], 1942892530 | 248 ; OPTM1: mov DWORD PTR [esp + 8], 1942892530 |
246 ; OPTM1: call __divdi3 | 249 ; OPTM1: call __divdi3 |
247 | 250 |
248 define internal i64 @div64BitUnsigned(i64 %a, i64 %b) { | 251 define internal i64 @div64BitUnsigned(i64 %a, i64 %b) { |
249 entry: | 252 entry: |
250 %div = udiv i64 %a, %b | 253 %div = udiv i64 %a, %b |
251 ret i64 %div | 254 ret i64 %div |
252 } | 255 } |
253 ; CHECK-LABEL: div64BitUnsigned | 256 ; CHECK-LABEL: div64BitUnsigned |
254 ; CHECK: call __udivdi3 | 257 ; CHECK: call |
| 258 ; CHECK-NEXT: R_{{.*}} __udivdi3 |
255 ; | 259 ; |
256 ; OPTM1-LABEL: div64BitUnsigned | 260 ; OPTM1-LABEL: div64BitUnsigned |
257 ; OPTM1: call __udivdi3 | 261 ; OPTM1: call __udivdi3 |
258 | 262 |
259 define internal i64 @rem64BitSigned(i64 %a, i64 %b) { | 263 define internal i64 @rem64BitSigned(i64 %a, i64 %b) { |
260 entry: | 264 entry: |
261 %rem = srem i64 %a, %b | 265 %rem = srem i64 %a, %b |
262 ret i64 %rem | 266 ret i64 %rem |
263 } | 267 } |
264 ; CHECK-LABEL: rem64BitSigned | 268 ; CHECK-LABEL: rem64BitSigned |
265 ; CHECK: call __moddi3 | 269 ; CHECK: call |
| 270 ; CHECK-NEXT: R_{{.*}} __moddi3 |
266 ; | 271 ; |
267 ; OPTM1-LABEL: rem64BitSigned | 272 ; OPTM1-LABEL: rem64BitSigned |
268 ; OPTM1: call __moddi3 | 273 ; OPTM1: call __moddi3 |
269 | 274 |
270 define internal i64 @rem64BitUnsigned(i64 %a, i64 %b) { | 275 define internal i64 @rem64BitUnsigned(i64 %a, i64 %b) { |
271 entry: | 276 entry: |
272 %rem = urem i64 %a, %b | 277 %rem = urem i64 %a, %b |
273 ret i64 %rem | 278 ret i64 %rem |
274 } | 279 } |
275 ; CHECK-LABEL: rem64BitUnsigned | 280 ; CHECK-LABEL: rem64BitUnsigned |
276 ; CHECK: call __umoddi3 | 281 ; CHECK: call |
| 282 ; CHECK-NEXT: R_{{.*}} __umoddi3 |
277 ; | 283 ; |
278 ; OPTM1-LABEL: rem64BitUnsigned | 284 ; OPTM1-LABEL: rem64BitUnsigned |
279 ; OPTM1: call __umoddi3 | 285 ; OPTM1: call __umoddi3 |
280 | 286 |
281 define internal i64 @shl64BitSigned(i64 %a, i64 %b) { | 287 define internal i64 @shl64BitSigned(i64 %a, i64 %b) { |
282 entry: | 288 entry: |
283 %shl = shl i64 %a, %b | 289 %shl = shl i64 %a, %b |
284 ret i64 %shl | 290 ret i64 %shl |
285 } | 291 } |
286 ; CHECK-LABEL: shl64BitSigned | 292 ; CHECK-LABEL: shl64BitSigned |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
480 ; OPTM1-LABEL: xor64BitUnsigned | 486 ; OPTM1-LABEL: xor64BitUnsigned |
481 ; OPTM1: xor | 487 ; OPTM1: xor |
482 ; OPTM1: xor | 488 ; OPTM1: xor |
483 | 489 |
484 define internal i32 @trunc64To32Signed(i64 %a) { | 490 define internal i32 @trunc64To32Signed(i64 %a) { |
485 entry: | 491 entry: |
486 %conv = trunc i64 %a to i32 | 492 %conv = trunc i64 %a to i32 |
487 ret i32 %conv | 493 ret i32 %conv |
488 } | 494 } |
489 ; CHECK-LABEL: trunc64To32Signed | 495 ; CHECK-LABEL: trunc64To32Signed |
490 ; CHECK: mov eax, dword ptr [esp + 4] | 496 ; CHECK: mov eax,DWORD ptr [esp+4] |
491 ; | 497 ; |
492 ; OPTM1-LABEL: trunc64To32Signed | 498 ; OPTM1-LABEL: trunc64To32Signed |
493 ; OPTM1: mov eax, dword ptr [esp + | 499 ; OPTM1: mov eax, DWORD PTR [esp + |
494 | 500 |
495 define internal i32 @trunc64To16Signed(i64 %a) { | 501 define internal i32 @trunc64To16Signed(i64 %a) { |
496 entry: | 502 entry: |
497 %conv = trunc i64 %a to i16 | 503 %conv = trunc i64 %a to i16 |
498 %conv.ret_ext = sext i16 %conv to i32 | 504 %conv.ret_ext = sext i16 %conv to i32 |
499 ret i32 %conv.ret_ext | 505 ret i32 %conv.ret_ext |
500 } | 506 } |
501 ; CHECK-LABEL: trunc64To16Signed | 507 ; CHECK-LABEL: trunc64To16Signed |
502 ; CHECK: mov eax, dword ptr [esp + 4] | 508 ; CHECK: mov eax,DWORD ptr [esp+4] |
503 ; CHECK-NEXT: movsx eax, ax | 509 ; CHECK-NEXT: movsx eax, ax |
504 ; | 510 ; |
505 ; OPTM1-LABEL: trunc64To16Signed | 511 ; OPTM1-LABEL: trunc64To16Signed |
506 ; OPTM1: mov eax, dword ptr [esp + | 512 ; OPTM1: mov eax, DWORD PTR [esp + |
507 ; OPTM1: movsx eax, | 513 ; OPTM1: movsx eax, |
508 | 514 |
509 define internal i32 @trunc64To8Signed(i64 %a) { | 515 define internal i32 @trunc64To8Signed(i64 %a) { |
510 entry: | 516 entry: |
511 %conv = trunc i64 %a to i8 | 517 %conv = trunc i64 %a to i8 |
512 %conv.ret_ext = sext i8 %conv to i32 | 518 %conv.ret_ext = sext i8 %conv to i32 |
513 ret i32 %conv.ret_ext | 519 ret i32 %conv.ret_ext |
514 } | 520 } |
515 ; CHECK-LABEL: trunc64To8Signed | 521 ; CHECK-LABEL: trunc64To8Signed |
516 ; CHECK: mov eax, dword ptr [esp + 4] | 522 ; CHECK: mov eax,DWORD ptr [esp+4] |
517 ; CHECK-NEXT: movsx eax, al | 523 ; CHECK-NEXT: movsx eax, al |
518 ; | 524 ; |
519 ; OPTM1-LABEL: trunc64To8Signed | 525 ; OPTM1-LABEL: trunc64To8Signed |
520 ; OPTM1: mov eax, dword ptr [esp + | 526 ; OPTM1: mov eax, DWORD PTR [esp + |
521 ; OPTM1: movsx eax, | 527 ; OPTM1: movsx eax, |
522 | 528 |
523 define internal i32 @trunc64To32SignedConst() { | 529 define internal i32 @trunc64To32SignedConst() { |
524 entry: | 530 entry: |
525 %conv = trunc i64 12345678901234 to i32 | 531 %conv = trunc i64 12345678901234 to i32 |
526 ret i32 %conv | 532 ret i32 %conv |
527 } | 533 } |
528 ; CHECK-LABEL: trunc64To32SignedConst | 534 ; CHECK-LABEL: trunc64To32SignedConst |
529 ; CHECK: mov eax, 1942892530 | 535 ; CHECK: mov eax,1942892530 |
530 ; | 536 ; |
531 ; OPTM1-LABEL: trunc64To32SignedConst | 537 ; OPTM1-LABEL: trunc64To32SignedConst |
532 ; OPTM1: mov eax, 1942892530 | 538 ; OPTM1: mov eax, 1942892530 |
533 | 539 |
534 define internal i32 @trunc64To16SignedConst() { | 540 define internal i32 @trunc64To16SignedConst() { |
535 entry: | 541 entry: |
536 %conv = trunc i64 12345678901234 to i16 | 542 %conv = trunc i64 12345678901234 to i16 |
537 %conv.ret_ext = sext i16 %conv to i32 | 543 %conv.ret_ext = sext i16 %conv to i32 |
538 ret i32 %conv.ret_ext | 544 ret i32 %conv.ret_ext |
539 } | 545 } |
540 ; CHECK-LABEL: trunc64To16SignedConst | 546 ; CHECK-LABEL: trunc64To16SignedConst |
541 ; CHECK: mov eax, 1942892530 | 547 ; CHECK: mov eax,1942892530 |
542 ; CHECK: movsx eax, ax | 548 ; CHECK: movsx eax,ax |
543 ; | 549 ; |
544 ; OPTM1-LABEL: trunc64To16SignedConst | 550 ; OPTM1-LABEL: trunc64To16SignedConst |
545 ; OPTM1: mov eax, 1942892530 | 551 ; OPTM1: mov eax, 1942892530 |
546 ; OPTM1: movsx eax, | 552 ; OPTM1: movsx eax, |
547 | 553 |
548 define internal i32 @trunc64To32Unsigned(i64 %a) { | 554 define internal i32 @trunc64To32Unsigned(i64 %a) { |
549 entry: | 555 entry: |
550 %conv = trunc i64 %a to i32 | 556 %conv = trunc i64 %a to i32 |
551 ret i32 %conv | 557 ret i32 %conv |
552 } | 558 } |
553 ; CHECK-LABEL: trunc64To32Unsigned | 559 ; CHECK-LABEL: trunc64To32Unsigned |
554 ; CHECK: mov eax, dword ptr [esp + 4] | 560 ; CHECK: mov eax,DWORD ptr [esp+4] |
555 ; | 561 ; |
556 ; OPTM1-LABEL: trunc64To32Unsigned | 562 ; OPTM1-LABEL: trunc64To32Unsigned |
557 ; OPTM1: mov eax, dword ptr [esp + | 563 ; OPTM1: mov eax, DWORD PTR [esp + |
558 | 564 |
559 define internal i32 @trunc64To16Unsigned(i64 %a) { | 565 define internal i32 @trunc64To16Unsigned(i64 %a) { |
560 entry: | 566 entry: |
561 %conv = trunc i64 %a to i16 | 567 %conv = trunc i64 %a to i16 |
562 %conv.ret_ext = zext i16 %conv to i32 | 568 %conv.ret_ext = zext i16 %conv to i32 |
563 ret i32 %conv.ret_ext | 569 ret i32 %conv.ret_ext |
564 } | 570 } |
565 ; CHECK-LABEL: trunc64To16Unsigned | 571 ; CHECK-LABEL: trunc64To16Unsigned |
566 ; CHECK: mov eax, dword ptr [esp + 4] | 572 ; CHECK: mov eax,DWORD ptr [esp+4] |
567 ; CHECK-NEXT: movzx eax, ax | 573 ; CHECK-NEXT: movzx eax, ax |
568 ; | 574 ; |
569 ; OPTM1-LABEL: trunc64To16Unsigned | 575 ; OPTM1-LABEL: trunc64To16Unsigned |
570 ; OPTM1: mov eax, dword ptr [esp + | 576 ; OPTM1: mov eax, DWORD PTR [esp + |
571 ; OPTM1: movzx eax, | 577 ; OPTM1: movzx eax, |
572 | 578 |
573 define internal i32 @trunc64To8Unsigned(i64 %a) { | 579 define internal i32 @trunc64To8Unsigned(i64 %a) { |
574 entry: | 580 entry: |
575 %conv = trunc i64 %a to i8 | 581 %conv = trunc i64 %a to i8 |
576 %conv.ret_ext = zext i8 %conv to i32 | 582 %conv.ret_ext = zext i8 %conv to i32 |
577 ret i32 %conv.ret_ext | 583 ret i32 %conv.ret_ext |
578 } | 584 } |
579 ; CHECK-LABEL: trunc64To8Unsigned | 585 ; CHECK-LABEL: trunc64To8Unsigned |
580 ; CHECK: mov eax, dword ptr [esp + 4] | 586 ; CHECK: mov eax,DWORD ptr [esp+4] |
581 ; CHECK-NEXT: movzx eax, al | 587 ; CHECK-NEXT: movzx eax, al |
582 ; | 588 ; |
583 ; OPTM1-LABEL: trunc64To8Unsigned | 589 ; OPTM1-LABEL: trunc64To8Unsigned |
584 ; OPTM1: mov eax, dword ptr [esp + | 590 ; OPTM1: mov eax, DWORD PTR [esp + |
585 ; OPTM1: movzx eax, | 591 ; OPTM1: movzx eax, |
586 | 592 |
587 define internal i32 @trunc64To1(i64 %a) { | 593 define internal i32 @trunc64To1(i64 %a) { |
588 entry: | 594 entry: |
589 ; %tobool = icmp ne i64 %a, 0 | 595 ; %tobool = icmp ne i64 %a, 0 |
590 %tobool = trunc i64 %a to i1 | 596 %tobool = trunc i64 %a to i1 |
591 %tobool.ret_ext = zext i1 %tobool to i32 | 597 %tobool.ret_ext = zext i1 %tobool to i32 |
592 ret i32 %tobool.ret_ext | 598 ret i32 %tobool.ret_ext |
593 } | 599 } |
594 ; CHECK-LABEL: trunc64To1 | 600 ; CHECK-LABEL: trunc64To1 |
595 ; CHECK: mov eax, dword ptr [esp + 4] | 601 ; CHECK: mov eax,DWORD ptr [esp+4] |
596 ; CHECK: and eax, 1 | 602 ; CHECK: and eax, 1 |
597 ; CHECK: and eax, 1 | 603 ; CHECK: and eax, 1 |
598 ; | 604 ; |
599 ; OPTM1-LABEL: trunc64To1 | 605 ; OPTM1-LABEL: trunc64To1 |
600 ; OPTM1: mov eax, dword ptr [esp + | 606 ; OPTM1: mov eax, DWORD PTR [esp + |
601 ; OPTM1: and eax, 1 | 607 ; OPTM1: and eax, 1 |
602 ; OPTM1: and eax, 1 | 608 ; OPTM1: and eax, 1 |
603 | 609 |
604 define internal i64 @sext32To64(i32 %a) { | 610 define internal i64 @sext32To64(i32 %a) { |
605 entry: | 611 entry: |
606 %conv = sext i32 %a to i64 | 612 %conv = sext i32 %a to i64 |
607 ret i64 %conv | 613 ret i64 %conv |
608 } | 614 } |
609 ; CHECK-LABEL: sext32To64 | 615 ; CHECK-LABEL: sext32To64 |
610 ; CHECK: mov | 616 ; CHECK: mov |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
658 ; OPTM1: shl {{.*}}, 31 | 664 ; OPTM1: shl {{.*}}, 31 |
659 ; OPTM1: sar {{.*}}, 31 | 665 ; OPTM1: sar {{.*}}, 31 |
660 | 666 |
661 define internal i64 @zext32To64(i32 %a) { | 667 define internal i64 @zext32To64(i32 %a) { |
662 entry: | 668 entry: |
663 %conv = zext i32 %a to i64 | 669 %conv = zext i32 %a to i64 |
664 ret i64 %conv | 670 ret i64 %conv |
665 } | 671 } |
666 ; CHECK-LABEL: zext32To64 | 672 ; CHECK-LABEL: zext32To64 |
667 ; CHECK: mov | 673 ; CHECK: mov |
668 ; CHECK: mov {{.*}}, 0 | 674 ; CHECK: mov {{.*}},0 |
669 ; | 675 ; |
670 ; OPTM1-LABEL: zext32To64 | 676 ; OPTM1-LABEL: zext32To64 |
671 ; OPTM1: mov | 677 ; OPTM1: mov |
672 ; OPTM1: mov {{.*}}, 0 | 678 ; OPTM1: mov {{.*}}, 0 |
673 | 679 |
674 define internal i64 @zext16To64(i32 %a) { | 680 define internal i64 @zext16To64(i32 %a) { |
675 entry: | 681 entry: |
676 %a.arg_trunc = trunc i32 %a to i16 | 682 %a.arg_trunc = trunc i32 %a to i16 |
677 %conv = zext i16 %a.arg_trunc to i64 | 683 %conv = zext i16 %a.arg_trunc to i64 |
678 ret i64 %conv | 684 ret i64 %conv |
679 } | 685 } |
680 ; CHECK-LABEL: zext16To64 | 686 ; CHECK-LABEL: zext16To64 |
681 ; CHECK: movzx | 687 ; CHECK: movzx |
682 ; CHECK: mov {{.*}}, 0 | 688 ; CHECK: mov {{.*}},0 |
683 ; | 689 ; |
684 ; OPTM1-LABEL: zext16To64 | 690 ; OPTM1-LABEL: zext16To64 |
685 ; OPTM1: movzx | 691 ; OPTM1: movzx |
686 ; OPTM1: mov {{.*}}, 0 | 692 ; OPTM1: mov {{.*}}, 0 |
687 | 693 |
688 define internal i64 @zext8To64(i32 %a) { | 694 define internal i64 @zext8To64(i32 %a) { |
689 entry: | 695 entry: |
690 %a.arg_trunc = trunc i32 %a to i8 | 696 %a.arg_trunc = trunc i32 %a to i8 |
691 %conv = zext i8 %a.arg_trunc to i64 | 697 %conv = zext i8 %a.arg_trunc to i64 |
692 ret i64 %conv | 698 ret i64 %conv |
693 } | 699 } |
694 ; CHECK-LABEL: zext8To64 | 700 ; CHECK-LABEL: zext8To64 |
695 ; CHECK: movzx | 701 ; CHECK: movzx |
696 ; CHECK: mov {{.*}}, 0 | 702 ; CHECK: mov {{.*}},0 |
697 ; | 703 ; |
698 ; OPTM1-LABEL: zext8To64 | 704 ; OPTM1-LABEL: zext8To64 |
699 ; OPTM1: movzx | 705 ; OPTM1: movzx |
700 ; OPTM1: mov {{.*}}, 0 | 706 ; OPTM1: mov {{.*}}, 0 |
701 | 707 |
702 define internal i64 @zext1To64(i32 %a) { | 708 define internal i64 @zext1To64(i32 %a) { |
703 entry: | 709 entry: |
704 %a.arg_trunc = trunc i32 %a to i1 | 710 %a.arg_trunc = trunc i32 %a to i1 |
705 %conv = zext i1 %a.arg_trunc to i64 | 711 %conv = zext i1 %a.arg_trunc to i64 |
706 ret i64 %conv | 712 ret i64 %conv |
707 } | 713 } |
708 ; CHECK-LABEL: zext1To64 | 714 ; CHECK-LABEL: zext1To64 |
709 ; CHECK: and {{.*}}, 1 | 715 ; CHECK: and {{.*}}, 1 |
710 ; CHECK: mov {{.*}}, 0 | 716 ; CHECK: mov {{.*}},0 |
711 ; | 717 ; |
712 ; OPTM1-LABEL: zext1To64 | 718 ; OPTM1-LABEL: zext1To64 |
713 ; OPTM1: and {{.*}}, 1 | 719 ; OPTM1: and {{.*}}, 1 |
714 ; OPTM1: mov {{.*}}, 0 | 720 ; OPTM1: mov {{.*}}, 0 |
715 | 721 |
716 define internal void @icmpEq64(i64 %a, i64 %b, i64 %c, i64 %d) { | 722 define internal void @icmpEq64(i64 %a, i64 %b, i64 %c, i64 %d) { |
717 entry: | 723 entry: |
718 %cmp = icmp eq i64 %a, %b | 724 %cmp = icmp eq i64 %a, %b |
719 br i1 %cmp, label %if.then, label %if.end | 725 br i1 %cmp, label %if.then, label %if.end |
720 | 726 |
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1135 ; OPTM1: cmp | 1141 ; OPTM1: cmp |
1136 ; OPTM1: jbe | 1142 ; OPTM1: jbe |
1137 | 1143 |
1138 define internal i64 @load64(i32 %a) { | 1144 define internal i64 @load64(i32 %a) { |
1139 entry: | 1145 entry: |
1140 %__1 = inttoptr i32 %a to i64* | 1146 %__1 = inttoptr i32 %a to i64* |
1141 %v0 = load i64* %__1, align 1 | 1147 %v0 = load i64* %__1, align 1 |
1142 ret i64 %v0 | 1148 ret i64 %v0 |
1143 } | 1149 } |
1144 ; CHECK-LABEL: load64 | 1150 ; CHECK-LABEL: load64 |
1145 ; CHECK: mov e[[REGISTER:[a-z]+]], dword ptr [esp + 4] | 1151 ; CHECK: mov e[[REGISTER:[a-z]+]],DWORD ptr [esp+4] |
1146 ; CHECK-NEXT: mov {{.*}}, dword ptr [e[[REGISTER]]] | 1152 ; CHECK-NEXT: mov {{.*}}, DWORD PTR [e[[REGISTER]]] |
1147 ; CHECK-NEXT: mov {{.*}}, dword ptr [e[[REGISTER]] + 4] | 1153 ; CHECK-NEXT: mov {{.*}}, DWORD PTR [e[[REGISTER]] + 4] |
1148 ; | 1154 ; |
1149 ; OPTM1-LABEL: load64 | 1155 ; OPTM1-LABEL: load64 |
1150 ; OPTM1: mov e{{..}}, dword ptr [e{{..}}] | 1156 ; OPTM1: mov e{{..}}, DWORD PTR [e{{..}}] |
1151 ; OPTM1: mov e{{..}}, dword ptr [e{{..}} + 4] | 1157 ; OPTM1: mov e{{..}}, DWORD PTR [e{{..}} + 4] |
1152 | 1158 |
1153 define internal void @store64(i32 %a, i64 %value) { | 1159 define internal void @store64(i32 %a, i64 %value) { |
1154 entry: | 1160 entry: |
1155 %__2 = inttoptr i32 %a to i64* | 1161 %__2 = inttoptr i32 %a to i64* |
1156 store i64 %value, i64* %__2, align 1 | 1162 store i64 %value, i64* %__2, align 1 |
1157 ret void | 1163 ret void |
1158 } | 1164 } |
1159 ; CHECK-LABEL: store64 | 1165 ; CHECK-LABEL: store64 |
1160 ; CHECK: mov e[[REGISTER:[a-z]+]], dword ptr [esp + 4] | 1166 ; CHECK: mov e[[REGISTER:[a-z]+]],DWORD ptr [esp+4] |
1161 ; CHECK: mov dword ptr [e[[REGISTER]] + 4], | 1167 ; CHECK: mov DWORD PTR [e[[REGISTER]]+4], |
1162 ; CHECK: mov dword ptr [e[[REGISTER]]], | 1168 ; CHECK: mov DWORD PTR [e[[REGISTER]]], |
1163 ; | 1169 ; |
1164 ; OPTM1-LABEL: store64 | 1170 ; OPTM1-LABEL: store64 |
1165 ; OPTM1: mov dword ptr [e[[REGISTER:[a-z]+]] + 4], | 1171 ; OPTM1: mov DWORD PTR [e[[REGISTER:[a-z]+]] + 4], |
1166 ; OPTM1: mov dword ptr [e[[REGISTER]]], | 1172 ; OPTM1: mov DWORD PTR [e[[REGISTER]]], |
1167 | 1173 |
1168 define internal void @store64Const(i32 %a) { | 1174 define internal void @store64Const(i32 %a) { |
1169 entry: | 1175 entry: |
1170 %__1 = inttoptr i32 %a to i64* | 1176 %__1 = inttoptr i32 %a to i64* |
1171 store i64 -2401053092306725256, i64* %__1, align 1 | 1177 store i64 -2401053092306725256, i64* %__1, align 1 |
1172 ret void | 1178 ret void |
1173 } | 1179 } |
1174 ; CHECK-LABEL: store64Const | 1180 ; CHECK-LABEL: store64Const |
1175 ; CHECK: mov e[[REGISTER:[a-z]+]], dword ptr [esp + 4] | 1181 ; CHECK: mov e[[REGISTER:[a-z]+]],DWORD ptr [esp+4] |
1176 ; CHECK: mov dword ptr [e[[REGISTER]] + 4], 3735928559 | 1182 ; CHECK: mov DWORD PTR [e[[REGISTER]]+4],3735928559 |
1177 ; CHECK: mov dword ptr [e[[REGISTER]]], 305419896 | 1183 ; CHECK: mov DWORD PTR [e[[REGISTER]]],305419896 |
1178 ; | 1184 ; |
1179 ; OPTM1-LABEL: store64Const | 1185 ; OPTM1-LABEL: store64Const |
1180 ; OPTM1: mov dword ptr [e[[REGISTER:[a-z]+]] + 4], 3735928559 | 1186 ; OPTM1: mov DWORD PTR [e[[REGISTER:[a-z]+]] + 4], 3735928559 |
1181 ; OPTM1: mov dword ptr [e[[REGISTER]]], 305419896 | 1187 ; OPTM1: mov DWORD PTR [e[[REGISTER]]], 305419896 |
1182 | 1188 |
1183 define internal i64 @select64VarVar(i64 %a, i64 %b) { | 1189 define internal i64 @select64VarVar(i64 %a, i64 %b) { |
1184 entry: | 1190 entry: |
1185 %cmp = icmp ult i64 %a, %b | 1191 %cmp = icmp ult i64 %a, %b |
1186 %cond = select i1 %cmp, i64 %a, i64 %b | 1192 %cond = select i1 %cmp, i64 %a, i64 %b |
1187 ret i64 %cond | 1193 ret i64 %cond |
1188 } | 1194 } |
1189 ; CHECK-LABEL: select64VarVar | 1195 ; CHECK-LABEL: select64VarVar |
1190 ; CHECK: cmp | 1196 ; CHECK: cmp |
1191 ; CHECK: jb | 1197 ; CHECK: jb |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1298 | 1304 |
1299 if.end3: ; preds = %if.then2, %if.end | 1305 if.end3: ; preds = %if.then2, %if.end |
1300 ret void | 1306 ret void |
1301 } | 1307 } |
1302 ; The following checks are not strictly necessary since one of the RUN | 1308 ; The following checks are not strictly necessary since one of the RUN |
1303 ; lines actually runs the output through the assembler. | 1309 ; lines actually runs the output through the assembler. |
1304 ; CHECK-LABEL: icmpLt64Imm | 1310 ; CHECK-LABEL: icmpLt64Imm |
1305 ; CHECK-NOT: cmp {{[0-9]+}}, | 1311 ; CHECK-NOT: cmp {{[0-9]+}}, |
1306 ; OPTM1-LABEL: icmpLt64Imm | 1312 ; OPTM1-LABEL: icmpLt64Imm |
1307 ; OPTM1-NOT: cmp {{[0-9]+}}, | 1313 ; OPTM1-NOT: cmp {{[0-9]+}}, |
OLD | NEW |