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: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ | 5 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ |
6 ; RUN: --target x8632 -i %s --args -O2 -allow-externally-defined-symbols \ | 6 ; RUN: --target x8632 -i %s --args -O2 -allow-externally-defined-symbols \ |
7 ; RUN: | %if --need=target_X8632 --command FileCheck %s | 7 ; RUN: | %if --need=target_X8632 --command FileCheck %s |
8 | 8 |
9 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ | 9 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ |
10 ; RUN: --target x8632 -i %s --args -Om1 -allow-externally-defined-symbols \ | 10 ; RUN: --target x8632 -i %s --args -Om1 -allow-externally-defined-symbols \ |
11 ; RUN: | %if --need=target_X8632 --command FileCheck --check-prefix=OPTM1 %s | 11 ; RUN: | %if --need=target_X8632 --command FileCheck --check-prefix=OPTM1 %s |
12 | 12 |
13 ; TODO(jvoung): Stop skipping unimplemented parts (via --skip-unimplemented) | |
14 ; once enough infrastructure is in. Also, switch to --filetype=obj | |
15 ; when possible. | |
16 ; RUN: %if --need=target_ARM32 --need=allow_dump \ | 13 ; RUN: %if --need=target_ARM32 --need=allow_dump \ |
17 ; RUN: --command %p2i --filetype=asm --assemble \ | 14 ; RUN: --command %p2i --filetype=obj --assemble \ |
18 ; RUN: --disassemble --target arm32 -i %s --args -O2 --skip-unimplemented \ | 15 ; RUN: --disassemble --target arm32 -i %s --args -O2 \ |
19 ; RUN: -allow-externally-defined-symbols \ | 16 ; RUN: -allow-externally-defined-symbols \ |
20 ; RUN: | %if --need=target_ARM32 --need=allow_dump \ | 17 ; RUN: | %if --need=target_ARM32 --need=allow_dump \ |
21 ; RUN: --command FileCheck --check-prefix ARM32 --check-prefix ARM32-O2 %s | 18 ; RUN: --command FileCheck --check-prefix ARM32 --check-prefix ARM32-O2 %s |
22 ; RUN: %if --need=target_ARM32 --need=allow_dump \ | 19 ; RUN: %if --need=target_ARM32 --need=allow_dump \ |
23 ; RUN: --command %p2i --filetype=asm --assemble --disassemble --target arm32 \ | 20 ; RUN: --command %p2i --filetype=obj --assemble --disassemble --target arm32 \ |
24 ; RUN: -i %s --args -Om1 --skip-unimplemented \ | 21 ; RUN: -i %s --args -Om1 \ |
25 ; RUN: -allow-externally-defined-symbols \ | 22 ; RUN: -allow-externally-defined-symbols \ |
26 ; RUN: | %if --need=target_ARM32 --need=allow_dump \ | 23 ; RUN: | %if --need=target_ARM32 --need=allow_dump \ |
27 ; RUN: --command FileCheck --check-prefix ARM32 --check-prefix ARM32-OM1 %s | 24 ; RUN: --command FileCheck --check-prefix ARM32 --check-prefix ARM32-OM1 %s |
28 | 25 |
29 ; TODO(rkotler): Stop skipping unimplemented parts (via --skip-unimplemented) | 26 ; TODO(rkotler): Stop skipping unimplemented parts (via --skip-unimplemented) |
30 ; once enough infrastructure is in. Also, switch to --filetype=obj | 27 ; once enough infrastructure is in. Also, switch to --filetype=obj |
31 ; when possible. | 28 ; when possible. |
32 ; RUN: %if --need=target_MIPS32 --need=allow_dump \ | 29 ; RUN: %if --need=target_MIPS32 --need=allow_dump \ |
33 ; RUN: --command %p2i --filetype=asm --assemble \ | 30 ; RUN: --command %p2i --filetype=asm --assemble \ |
34 ; RUN: --disassemble --target mips32 -i %s --args -O2 --skip-unimplemented \ | 31 ; RUN: --disassemble --target mips32 -i %s --args -O2 --skip-unimplemented \ |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 ; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline | 92 ; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline |
96 ; OPTM1: mov DWORD PTR [esp+0x4] | 93 ; OPTM1: mov DWORD PTR [esp+0x4] |
97 ; OPTM1: mov DWORD PTR [esp] | 94 ; OPTM1: mov DWORD PTR [esp] |
98 ; OPTM1: mov DWORD PTR [esp+0x8],0x7b | 95 ; OPTM1: mov DWORD PTR [esp+0x8],0x7b |
99 ; OPTM1: mov DWORD PTR [esp+0x10] | 96 ; OPTM1: mov DWORD PTR [esp+0x10] |
100 ; OPTM1: mov DWORD PTR [esp+0xc] | 97 ; OPTM1: mov DWORD PTR [esp+0xc] |
101 ; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline | 98 ; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline |
102 | 99 |
103 ; ARM32-LABEL: pass64BitArg | 100 ; ARM32-LABEL: pass64BitArg |
104 ; ARM32: str {{.*}}, [sp] | 101 ; ARM32: str {{.*}}, [sp] |
| 102 ; ARM32: movw [[CALL:r[0-9]]], {{.+}} ignore64BitArgNoInline |
| 103 ; ARM32: movt [[CALL]], {{.+}} ignore64BitArgNoInline |
105 ; ARM32: mov r2, #123 | 104 ; ARM32: mov r2, #123 |
106 ; ARM32: bl {{.*}} ignore64BitArgNoInline | 105 ; ARM32: blx [[CALL]] |
107 ; ARM32: str {{.*}}, [sp] | 106 ; ARM32: str {{.*}}, [sp] |
| 107 ; ARM32: movw [[CALL:r[0-9]]], {{.+}} ignore64BitArgNoInline |
| 108 ; ARM32: movt [[CALL]], {{.+}} ignore64BitArgNoInline |
108 ; ARM32: {{mov|ldr}} r0 | 109 ; ARM32: {{mov|ldr}} r0 |
109 ; ARM32: {{mov|ldr}} r1 | 110 ; ARM32: {{mov|ldr}} r1 |
110 ; ARM32: mov r2, #123 | 111 ; ARM32: mov r2, #123 |
111 ; ARM32: bl {{.*}} ignore64BitArgNoInline | 112 ; ARM32: blx [[CALL]] |
112 ; ARM32: str {{.*}}, [sp] | 113 ; ARM32: str {{.*}}, [sp] |
| 114 ; ARM32: movw [[CALL:r[0-9]]], {{.+}} ignore64BitArgNoInline |
| 115 ; ARM32: movt [[CALL]], {{.+}} ignore64BitArgNoInline |
113 ; ARM32: {{mov|ldr}} r0 | 116 ; ARM32: {{mov|ldr}} r0 |
114 ; ARM32: {{mov|ldr}} r1 | 117 ; ARM32: {{mov|ldr}} r1 |
115 ; ARM32: mov r2, #123 | 118 ; ARM32: mov r2, #123 |
116 ; ARM32: bl {{.*}} ignore64BitArgNoInline | 119 ; ARM32: blx [[CALL]] |
117 | 120 |
118 ; MIPS32-LABEL: pass64BitArg | 121 ; MIPS32-LABEL: pass64BitArg |
119 | 122 |
120 | 123 |
121 declare i32 @ignore64BitArgNoInline(i64, i32, i64) | 124 declare i32 @ignore64BitArgNoInline(i64, i32, i64) |
122 | 125 |
123 define internal i32 @pass64BitConstArg(i64 %a, i64 %b) { | 126 define internal i32 @pass64BitConstArg(i64 %a, i64 %b) { |
124 entry: | 127 entry: |
125 %call = call i32 @ignore64BitArgNoInline(i64 %b, i32 123, i64 -240105309230672
5256) | 128 %call = call i32 @ignore64BitArgNoInline(i64 %b, i32 123, i64 -240105309230672
5256) |
126 ret i32 %call | 129 ret i32 %call |
(...skipping 21 matching lines...) Expand all Loading... |
148 ; OPTM1-NOT: mov | 151 ; OPTM1-NOT: mov |
149 ; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline | 152 ; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline |
150 | 153 |
151 ; ARM32-LABEL: pass64BitConstArg | 154 ; ARM32-LABEL: pass64BitConstArg |
152 ; ARM32: movw [[REG1:r.*]], {{.*}} ; 0xbeef | 155 ; ARM32: movw [[REG1:r.*]], {{.*}} ; 0xbeef |
153 ; ARM32: movt [[REG1]], {{.*}} ; 0xdead | 156 ; ARM32: movt [[REG1]], {{.*}} ; 0xdead |
154 ; ARM32: movw [[REG2:r.*]], {{.*}} ; 0x5678 | 157 ; ARM32: movw [[REG2:r.*]], {{.*}} ; 0x5678 |
155 ; ARM32: movt [[REG2]], {{.*}} ; 0x1234 | 158 ; ARM32: movt [[REG2]], {{.*}} ; 0x1234 |
156 ; ARM32: str [[REG1]], [sp, #4] | 159 ; ARM32: str [[REG1]], [sp, #4] |
157 ; ARM32: str [[REG2]], [sp] | 160 ; ARM32: str [[REG2]], [sp] |
| 161 ; ARM32: movw [[CALL:r[0-9]]], {{.+}} ignore64BitArgNoInline |
| 162 ; ARM32: movt [[CALL]], {{.+}} ignore64BitArgNoInline |
158 ; ARM32: {{mov|ldr}} r0 | 163 ; ARM32: {{mov|ldr}} r0 |
159 ; ARM32: {{mov|ldr}} r1 | 164 ; ARM32: {{mov|ldr}} r1 |
160 ; ARM32: mov r2, #123 | 165 ; ARM32: mov r2, #123 |
161 ; ARM32: bl {{.*}} ignore64BitArgNoInline | 166 ; ARM32: blx [[CALL]] |
| 167 |
162 | 168 |
163 define internal i32 @pass64BitUndefArg() { | 169 define internal i32 @pass64BitUndefArg() { |
164 entry: | 170 entry: |
165 %call = call i32 @ignore64BitArgNoInline(i64 0, i32 123, i64 undef) | 171 %call = call i32 @ignore64BitArgNoInline(i64 0, i32 123, i64 undef) |
166 ret i32 %call | 172 ret i32 %call |
167 } | 173 } |
168 ; CHECK-LABEL: pass64BitUndefArg | 174 ; CHECK-LABEL: pass64BitUndefArg |
169 ; CHECK: sub esp | 175 ; CHECK: sub esp |
170 ; CHECK: mov DWORD PTR{{.*}},0x7b | 176 ; CHECK: mov DWORD PTR{{.*}},0x7b |
171 ; CHECK: mov DWORD PTR{{.*}},0x0 | 177 ; CHECK: mov DWORD PTR{{.*}},0x0 |
172 ; CHECK: call {{.*}} R_{{.*}} ignore64BitArgNoInline | 178 ; CHECK: call {{.*}} R_{{.*}} ignore64BitArgNoInline |
173 ; OPTM1-LABEL: pass64BitUndefArg | 179 ; OPTM1-LABEL: pass64BitUndefArg |
174 ; OPTM1: sub esp | 180 ; OPTM1: sub esp |
175 ; OPTM1: mov DWORD PTR{{.*}},0x7b | 181 ; OPTM1: mov DWORD PTR{{.*}},0x7b |
176 ; OPTM1: mov DWORD PTR{{.*}},0x0 | 182 ; OPTM1: mov DWORD PTR{{.*}},0x0 |
177 ; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline | 183 ; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline |
178 ; ARM32-LABEL: pass64BitUndefArg | 184 ; ARM32-LABEL: pass64BitUndefArg |
179 ; ARM32: sub sp | 185 ; ARM32: sub sp |
180 ; ARM32: mov {{.*}}, #0 | 186 ; ARM32: mov {{.*}}, #0 |
181 ; ARM32: str | 187 ; ARM32: str |
| 188 ; ARM32: movw [[CALL:r[0-9]]], {{.+}} ignore64BitArgNoInline |
| 189 ; ARM32: movt [[CALL]], {{.+}} ignore64BitArgNoInline |
182 ; ARM32: mov {{.*}}, #123 | 190 ; ARM32: mov {{.*}}, #123 |
183 ; ARM32: bl {{.*}} ignore64BitArgNoInline | 191 ; ARM32: blx [[CALL]] |
184 | 192 |
185 ; MIPS32-LABEL: pass64BitUndefArg | 193 ; MIPS32-LABEL: pass64BitUndefArg |
186 ; MIPS32: jr ra | 194 ; MIPS32: jr ra |
187 | 195 |
188 define internal i64 @return64BitArg(i64 %padding, i64 %a) { | 196 define internal i64 @return64BitArg(i64 %padding, i64 %a) { |
189 entry: | 197 entry: |
190 ret i64 %a | 198 ret i64 %a |
191 } | 199 } |
192 ; CHECK-LABEL: return64BitArg | 200 ; CHECK-LABEL: return64BitArg |
193 ; CHECK: mov {{.*}},DWORD PTR [esp+0xc] | 201 ; CHECK: mov {{.*}},DWORD PTR [esp+0xc] |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 } | 389 } |
382 ; CHECK-LABEL: div64BitSigned | 390 ; CHECK-LABEL: div64BitSigned |
383 ; CHECK: call {{.*}} R_{{.*}} __divdi3 | 391 ; CHECK: call {{.*}} R_{{.*}} __divdi3 |
384 | 392 |
385 ; OPTM1-LABEL: div64BitSigned | 393 ; OPTM1-LABEL: div64BitSigned |
386 ; OPTM1: call {{.*}} R_{{.*}} __divdi3 | 394 ; OPTM1: call {{.*}} R_{{.*}} __divdi3 |
387 ; | 395 ; |
388 ; ARM32-LABEL: div64BitSigned | 396 ; ARM32-LABEL: div64BitSigned |
389 ; ARM32: orrs {{r.*}}, {{r.*}} | 397 ; ARM32: orrs {{r.*}}, {{r.*}} |
390 ; ARM32: bne | 398 ; ARM32: bne |
391 ; ARM32: bl {{.*}} __divdi3 | 399 ; ARM32: movw» [[CALL:r[0-9]]], {{.+}} __divdi3 |
| 400 ; ARM32: movt» [[CALL]], {{.+}} __divdi3 |
| 401 ; ARM32: blx [[CALL]] |
392 | 402 |
393 define internal i64 @div64BitSignedConst(i64 %a) { | 403 define internal i64 @div64BitSignedConst(i64 %a) { |
394 entry: | 404 entry: |
395 %div = sdiv i64 %a, 12345678901234 | 405 %div = sdiv i64 %a, 12345678901234 |
396 ret i64 %div | 406 ret i64 %div |
397 } | 407 } |
398 ; CHECK-LABEL: div64BitSignedConst | 408 ; CHECK-LABEL: div64BitSignedConst |
399 ; CHECK: mov DWORD PTR [esp+0xc],0xb3a | 409 ; CHECK: mov DWORD PTR [esp+0xc],0xb3a |
400 ; CHECK: mov DWORD PTR [esp+0x8],0x73ce2ff2 | 410 ; CHECK: mov DWORD PTR [esp+0x8],0x73ce2ff2 |
401 ; CHECK: call {{.*}} R_{{.*}} __divdi3 | 411 ; CHECK: call {{.*}} R_{{.*}} __divdi3 |
402 ; | 412 ; |
403 ; OPTM1-LABEL: div64BitSignedConst | 413 ; OPTM1-LABEL: div64BitSignedConst |
404 ; OPTM1: mov DWORD PTR [esp+0xc],0xb3a | 414 ; OPTM1: mov DWORD PTR [esp+0xc],0xb3a |
405 ; OPTM1: mov DWORD PTR [esp+0x8],0x73ce2ff2 | 415 ; OPTM1: mov DWORD PTR [esp+0x8],0x73ce2ff2 |
406 ; OPTM1: call {{.*}} R_{{.*}} __divdi3 | 416 ; OPTM1: call {{.*}} R_{{.*}} __divdi3 |
407 ; | 417 ; |
408 ; ARM32-LABEL: div64BitSignedConst | 418 ; ARM32-LABEL: div64BitSignedConst |
409 ; For a constant, we should be able to optimize-out the divide by zero check. | 419 ; For a constant, we should be able to optimize-out the divide by zero check. |
410 ; ARM32-NOT: orrs | 420 ; ARM32-NOT: orrs |
| 421 ; ARM32: movw [[CALL:r[0-9]]], {{.+}} __divdi3 |
| 422 ; ARM32: movt [[CALL]], {{.+}} __divdi3 |
411 ; ARM32: movw {{.*}} ; 0x2ff2 | 423 ; ARM32: movw {{.*}} ; 0x2ff2 |
412 ; ARM32: movt {{.*}} ; 0x73ce | 424 ; ARM32: movt {{.*}} ; 0x73ce |
413 ; ARM32: movw {{.*}} ; 0xb3a | 425 ; ARM32: movw {{.*}} ; 0xb3a |
414 ; ARM32: bl {{.*}} __divdi3 | 426 ; ARM32: blx [[CALL]] |
415 | 427 |
416 define internal i64 @div64BitUnsigned(i64 %a, i64 %b) { | 428 define internal i64 @div64BitUnsigned(i64 %a, i64 %b) { |
417 entry: | 429 entry: |
418 %div = udiv i64 %a, %b | 430 %div = udiv i64 %a, %b |
419 ret i64 %div | 431 ret i64 %div |
420 } | 432 } |
421 ; CHECK-LABEL: div64BitUnsigned | 433 ; CHECK-LABEL: div64BitUnsigned |
422 ; CHECK: call {{.*}} R_{{.*}} __udivdi3 | 434 ; CHECK: call {{.*}} R_{{.*}} __udivdi3 |
423 ; | 435 ; |
424 ; OPTM1-LABEL: div64BitUnsigned | 436 ; OPTM1-LABEL: div64BitUnsigned |
425 ; OPTM1: call {{.*}} R_{{.*}} __udivdi3 | 437 ; OPTM1: call {{.*}} R_{{.*}} __udivdi3 |
426 ; | 438 ; |
427 ; ARM32-LABEL: div64BitUnsigned | 439 ; ARM32-LABEL: div64BitUnsigned |
428 ; ARM32: orrs {{r.*}}, {{r.*}} | 440 ; ARM32: orrs {{r.*}}, {{r.*}} |
429 ; ARM32: bne | 441 ; ARM32: bne |
430 ; ARM32: bl {{.*}} __udivdi3 | 442 ; ARM32: movw [[CALL:r[0-9]]], {{.+}} __udivdi3 |
| 443 ; ARM32: movt [[CALL]], {{.+}} __udivdi3 |
| 444 ; ARM32: blx [[CALL]] |
431 | 445 |
432 define internal i64 @rem64BitSigned(i64 %a, i64 %b) { | 446 define internal i64 @rem64BitSigned(i64 %a, i64 %b) { |
433 entry: | 447 entry: |
434 %rem = srem i64 %a, %b | 448 %rem = srem i64 %a, %b |
435 ret i64 %rem | 449 ret i64 %rem |
436 } | 450 } |
437 ; CHECK-LABEL: rem64BitSigned | 451 ; CHECK-LABEL: rem64BitSigned |
438 ; CHECK: call {{.*}} R_{{.*}} __moddi3 | 452 ; CHECK: call {{.*}} R_{{.*}} __moddi3 |
439 ; | 453 ; |
440 ; OPTM1-LABEL: rem64BitSigned | 454 ; OPTM1-LABEL: rem64BitSigned |
441 ; OPTM1: call {{.*}} R_{{.*}} __moddi3 | 455 ; OPTM1: call {{.*}} R_{{.*}} __moddi3 |
442 ; | 456 ; |
443 ; ARM32-LABEL: rem64BitSigned | 457 ; ARM32-LABEL: rem64BitSigned |
444 ; ARM32: orrs {{r.*}}, {{r.*}} | 458 ; ARM32: orrs {{r.*}}, {{r.*}} |
445 ; ARM32: bne | 459 ; ARM32: bne |
446 ; ARM32: bl {{.*}} __moddi3 | 460 ; ARM32: movw [[CALL:r[0-9]]], {{.+}} __moddi3 |
| 461 ; ARM32: movt [[CALL]], {{.+}} __moddi3 |
| 462 ; ARM32: blx [[CALL]] |
447 | 463 |
448 define internal i64 @rem64BitUnsigned(i64 %a, i64 %b) { | 464 define internal i64 @rem64BitUnsigned(i64 %a, i64 %b) { |
449 entry: | 465 entry: |
450 %rem = urem i64 %a, %b | 466 %rem = urem i64 %a, %b |
451 ret i64 %rem | 467 ret i64 %rem |
452 } | 468 } |
453 ; CHECK-LABEL: rem64BitUnsigned | 469 ; CHECK-LABEL: rem64BitUnsigned |
454 ; CHECK: call {{.*}} R_{{.*}} __umoddi3 | 470 ; CHECK: call {{.*}} R_{{.*}} __umoddi3 |
455 ; | 471 ; |
456 ; OPTM1-LABEL: rem64BitUnsigned | 472 ; OPTM1-LABEL: rem64BitUnsigned |
457 ; OPTM1: call {{.*}} R_{{.*}} __umoddi3 | 473 ; OPTM1: call {{.*}} R_{{.*}} __umoddi3 |
458 ; | 474 ; |
459 ; ARM32-LABEL: rem64BitUnsigned | 475 ; ARM32-LABEL: rem64BitUnsigned |
460 ; ARM32: orrs {{r.*}}, {{r.*}} | 476 ; ARM32: orrs {{r.*}}, {{r.*}} |
461 ; ARM32: bne | 477 ; ARM32: bne |
462 ; ARM32: bl {{.*}} __umoddi3 | 478 ; ARM32: movw [[CALL:r[0-9]]], {{.+}} __umoddi3 |
| 479 ; ARM32: movt [[CALL]], {{.+}} __umoddi3 |
| 480 ; ARM32: blx [[CALL]] |
463 | 481 |
464 define internal i64 @shl64BitSigned(i64 %a, i64 %b) { | 482 define internal i64 @shl64BitSigned(i64 %a, i64 %b) { |
465 entry: | 483 entry: |
466 %shl = shl i64 %a, %b | 484 %shl = shl i64 %a, %b |
467 ret i64 %shl | 485 ret i64 %shl |
468 } | 486 } |
469 ; CHECK-LABEL: shl64BitSigned | 487 ; CHECK-LABEL: shl64BitSigned |
470 ; CHECK: shld | 488 ; CHECK: shld |
471 ; CHECK: shl e | 489 ; CHECK: shl e |
472 ; CHECK: test {{.*}},0x20 | 490 ; CHECK: test {{.*}},0x20 |
(...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1115 ; OPTM1-NEXT: cmp [[RESULT]],0x0 | 1133 ; OPTM1-NEXT: cmp [[RESULT]],0x0 |
1116 ; OPTM1-NEXT: jne | 1134 ; OPTM1-NEXT: jne |
1117 ; OPTM1-NEXT: jmp | 1135 ; OPTM1-NEXT: jmp |
1118 ; OPTM1-NEXT: call | 1136 ; OPTM1-NEXT: call |
1119 | 1137 |
1120 ; ARM32-LABEL: icmpEq64 | 1138 ; ARM32-LABEL: icmpEq64 |
1121 ; ARM32: cmp | 1139 ; ARM32: cmp |
1122 ; ARM32: cmpeq | 1140 ; ARM32: cmpeq |
1123 ; ARM32-OM1: tst | 1141 ; ARM32-OM1: tst |
1124 ; ARM32: bne | 1142 ; ARM32: bne |
1125 ; ARM32: bl {{.*}} <func> | 1143 ; ARM32: movw [[CALL:r[0-9]]], {{.+}} func |
| 1144 ; ARM32: movt [[CALL]], {{.+}} func |
| 1145 ; ARM32: blx [[CALL]] |
1126 ; ARM32: cmp | 1146 ; ARM32: cmp |
1127 ; ARM32: cmpeq | 1147 ; ARM32: cmpeq |
1128 ; ARM32-OM1: tst | 1148 ; ARM32-OM1: tst |
1129 ; ARM32: bne | 1149 ; ARM32: bne |
1130 ; ARM32: bl {{.*}} <func> | 1150 ; ARM32: movw [[CALL:r[0-9]]], {{.+}} func |
| 1151 ; ARM32: movt [[CALL]], {{.+}} func |
| 1152 ; ARM32: blx [[CALL]] |
1131 ; ARM32: bx | 1153 ; ARM32: bx |
1132 | 1154 |
1133 declare void @func() | 1155 declare void @func() |
1134 | 1156 |
1135 define internal void @icmpNe64(i64 %a, i64 %b, i64 %c, i64 %d) { | 1157 define internal void @icmpNe64(i64 %a, i64 %b, i64 %c, i64 %d) { |
1136 entry: | 1158 entry: |
1137 %cmp = icmp ne i64 %a, %b | 1159 %cmp = icmp ne i64 %a, %b |
1138 br i1 %cmp, label %if.then, label %if.end | 1160 br i1 %cmp, label %if.then, label %if.end |
1139 | 1161 |
1140 if.then: ; preds = %entry | 1162 if.then: ; preds = %entry |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1185 ; OPTM1-NEXT: jne {{.*}} | 1207 ; OPTM1-NEXT: jne {{.*}} |
1186 ; OPTM1-NEXT: jmp {{.*}} | 1208 ; OPTM1-NEXT: jmp {{.*}} |
1187 ; OPTM1-NEXT: call | 1209 ; OPTM1-NEXT: call |
1188 | 1210 |
1189 ; ARM32-LABEL: icmpNe64 | 1211 ; ARM32-LABEL: icmpNe64 |
1190 ; ARM32: cmp | 1212 ; ARM32: cmp |
1191 ; ARM32: cmpeq | 1213 ; ARM32: cmpeq |
1192 ; ARM32-OM1: tst | 1214 ; ARM32-OM1: tst |
1193 ; ARM32-OM1: bne | 1215 ; ARM32-OM1: bne |
1194 ; ARM32-O2: beq | 1216 ; ARM32-O2: beq |
1195 ; ARM32: bl {{.*}} <func> | 1217 ; ARM32: movw [[CALL:r[0-9]]], {{.+}} func |
| 1218 ; ARM32: movt [[CALL]], {{.+}} func |
| 1219 ; ARM32: blx [[CALL]] |
1196 ; ARM32: cmp | 1220 ; ARM32: cmp |
1197 ; ARM32: cmpeq | 1221 ; ARM32: cmpeq |
1198 ; ARM32-OM1: tst | 1222 ; ARM32-OM1: tst |
1199 ; ARM32-OM1: bne | 1223 ; ARM32-OM1: bne |
1200 ; ARM32-O2: beq | 1224 ; ARM32-O2: beq |
1201 ; ARM32: bl | 1225 ; ARM32: bl |
1202 | 1226 |
1203 define internal void @icmpGt64(i64 %a, i64 %b, i64 %c, i64 %d) { | 1227 define internal void @icmpGt64(i64 %a, i64 %b, i64 %c, i64 %d) { |
1204 entry: | 1228 entry: |
1205 %cmp = icmp ugt i64 %a, %b | 1229 %cmp = icmp ugt i64 %a, %b |
(...skipping 724 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1930 ; CHECK-LABEL: phi64Undef | 1954 ; CHECK-LABEL: phi64Undef |
1931 ; CHECK: mov {{.*}},0x0 | 1955 ; CHECK: mov {{.*}},0x0 |
1932 ; CHECK: mov {{.*}},0x0 | 1956 ; CHECK: mov {{.*}},0x0 |
1933 ; OPTM1-LABEL: phi64Undef | 1957 ; OPTM1-LABEL: phi64Undef |
1934 ; OPTM1: mov {{.*}},0x0 | 1958 ; OPTM1: mov {{.*}},0x0 |
1935 ; OPTM1: mov {{.*}},0x0 | 1959 ; OPTM1: mov {{.*}},0x0 |
1936 ; ARM32-LABEL: phi64Undef | 1960 ; ARM32-LABEL: phi64Undef |
1937 ; ARM32: mov {{.*}} #0 | 1961 ; ARM32: mov {{.*}} #0 |
1938 ; ARM32: mov {{.*}} #0 | 1962 ; ARM32: mov {{.*}} #0 |
1939 | 1963 |
OLD | NEW |