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. |
13 ; RUN: %if --need=target_ARM32 --need=allow_dump \ | 16 ; RUN: %if --need=target_ARM32 --need=allow_dump \ |
14 ; RUN: --command %p2i --filetype=obj --assemble \ | 17 ; RUN: --command %p2i --filetype=asm --assemble \ |
15 ; RUN: --disassemble --target arm32 -i %s --args -O2 \ | 18 ; RUN: --disassemble --target arm32 -i %s --args -O2 --skip-unimplemented \ |
16 ; RUN: -allow-externally-defined-symbols \ | 19 ; RUN: -allow-externally-defined-symbols \ |
17 ; RUN: | %if --need=target_ARM32 --need=allow_dump \ | 20 ; RUN: | %if --need=target_ARM32 --need=allow_dump \ |
18 ; RUN: --command FileCheck --check-prefix ARM32 --check-prefix ARM32-O2 %s | 21 ; RUN: --command FileCheck --check-prefix ARM32 --check-prefix ARM32-O2 %s |
19 ; RUN: %if --need=target_ARM32 --need=allow_dump \ | 22 ; RUN: %if --need=target_ARM32 --need=allow_dump \ |
20 ; RUN: --command %p2i --filetype=obj --assemble --disassemble --target arm32 \ | 23 ; RUN: --command %p2i --filetype=asm --assemble --disassemble --target arm32 \ |
21 ; RUN: -i %s --args -Om1 \ | 24 ; RUN: -i %s --args -Om1 --skip-unimplemented \ |
22 ; RUN: -allow-externally-defined-symbols \ | 25 ; RUN: -allow-externally-defined-symbols \ |
23 ; RUN: | %if --need=target_ARM32 --need=allow_dump \ | 26 ; RUN: | %if --need=target_ARM32 --need=allow_dump \ |
24 ; RUN: --command FileCheck --check-prefix ARM32 --check-prefix ARM32-OM1 %s | 27 ; RUN: --command FileCheck --check-prefix ARM32 --check-prefix ARM32-OM1 %s |
25 | 28 |
26 ; TODO(rkotler): Stop skipping unimplemented parts (via --skip-unimplemented) | 29 ; TODO(rkotler): Stop skipping unimplemented parts (via --skip-unimplemented) |
27 ; once enough infrastructure is in. Also, switch to --filetype=obj | 30 ; once enough infrastructure is in. Also, switch to --filetype=obj |
28 ; when possible. | 31 ; when possible. |
29 ; RUN: %if --need=target_MIPS32 --need=allow_dump \ | 32 ; RUN: %if --need=target_MIPS32 --need=allow_dump \ |
30 ; RUN: --command %p2i --filetype=asm --assemble \ | 33 ; RUN: --command %p2i --filetype=asm --assemble \ |
31 ; RUN: --disassemble --target mips32 -i %s --args -O2 --skip-unimplemented \ | 34 ; RUN: --disassemble --target mips32 -i %s --args -O2 --skip-unimplemented \ |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 ; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline | 95 ; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline |
93 ; OPTM1: mov DWORD PTR [esp+0x4] | 96 ; OPTM1: mov DWORD PTR [esp+0x4] |
94 ; OPTM1: mov DWORD PTR [esp] | 97 ; OPTM1: mov DWORD PTR [esp] |
95 ; OPTM1: mov DWORD PTR [esp+0x8],0x7b | 98 ; OPTM1: mov DWORD PTR [esp+0x8],0x7b |
96 ; OPTM1: mov DWORD PTR [esp+0x10] | 99 ; OPTM1: mov DWORD PTR [esp+0x10] |
97 ; OPTM1: mov DWORD PTR [esp+0xc] | 100 ; OPTM1: mov DWORD PTR [esp+0xc] |
98 ; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline | 101 ; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline |
99 | 102 |
100 ; ARM32-LABEL: pass64BitArg | 103 ; ARM32-LABEL: pass64BitArg |
101 ; ARM32: str {{.*}}, [sp] | 104 ; ARM32: str {{.*}}, [sp] |
102 ; ARM32: movw [[CALL:r[0-9]]], {{.+}} ignore64BitArgNoInline | |
103 ; ARM32: movt [[CALL]], {{.+}} ignore64BitArgNoInline | |
104 ; ARM32: mov r2, #123 | 105 ; ARM32: mov r2, #123 |
105 ; ARM32: blx [[CALL]] | 106 ; ARM32: bl {{.*}} ignore64BitArgNoInline |
106 ; ARM32: str {{.*}}, [sp] | 107 ; ARM32: str {{.*}}, [sp] |
107 ; ARM32: movw [[CALL:r[0-9]]], {{.+}} ignore64BitArgNoInline | |
108 ; ARM32: movt [[CALL]], {{.+}} ignore64BitArgNoInline | |
109 ; ARM32: {{mov|ldr}} r0 | 108 ; ARM32: {{mov|ldr}} r0 |
110 ; ARM32: {{mov|ldr}} r1 | 109 ; ARM32: {{mov|ldr}} r1 |
111 ; ARM32: mov r2, #123 | 110 ; ARM32: mov r2, #123 |
112 ; ARM32: blx [[CALL]] | 111 ; ARM32: bl {{.*}} ignore64BitArgNoInline |
113 ; ARM32: str {{.*}}, [sp] | 112 ; ARM32: str {{.*}}, [sp] |
114 ; ARM32: movw [[CALL:r[0-9]]], {{.+}} ignore64BitArgNoInline | |
115 ; ARM32: movt [[CALL]], {{.+}} ignore64BitArgNoInline | |
116 ; ARM32: {{mov|ldr}} r0 | 113 ; ARM32: {{mov|ldr}} r0 |
117 ; ARM32: {{mov|ldr}} r1 | 114 ; ARM32: {{mov|ldr}} r1 |
118 ; ARM32: mov r2, #123 | 115 ; ARM32: mov r2, #123 |
119 ; ARM32: blx [[CALL]] | 116 ; ARM32: bl {{.*}} ignore64BitArgNoInline |
120 | 117 |
121 ; MIPS32-LABEL: pass64BitArg | 118 ; MIPS32-LABEL: pass64BitArg |
122 | 119 |
123 | 120 |
124 declare i32 @ignore64BitArgNoInline(i64, i32, i64) | 121 declare i32 @ignore64BitArgNoInline(i64, i32, i64) |
125 | 122 |
126 define internal i32 @pass64BitConstArg(i64 %a, i64 %b) { | 123 define internal i32 @pass64BitConstArg(i64 %a, i64 %b) { |
127 entry: | 124 entry: |
128 %call = call i32 @ignore64BitArgNoInline(i64 %b, i32 123, i64 -240105309230672
5256) | 125 %call = call i32 @ignore64BitArgNoInline(i64 %b, i32 123, i64 -240105309230672
5256) |
129 ret i32 %call | 126 ret i32 %call |
(...skipping 21 matching lines...) Expand all Loading... |
151 ; OPTM1-NOT: mov | 148 ; OPTM1-NOT: mov |
152 ; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline | 149 ; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline |
153 | 150 |
154 ; ARM32-LABEL: pass64BitConstArg | 151 ; ARM32-LABEL: pass64BitConstArg |
155 ; ARM32: movw [[REG1:r.*]], {{.*}} ; 0xbeef | 152 ; ARM32: movw [[REG1:r.*]], {{.*}} ; 0xbeef |
156 ; ARM32: movt [[REG1]], {{.*}} ; 0xdead | 153 ; ARM32: movt [[REG1]], {{.*}} ; 0xdead |
157 ; ARM32: movw [[REG2:r.*]], {{.*}} ; 0x5678 | 154 ; ARM32: movw [[REG2:r.*]], {{.*}} ; 0x5678 |
158 ; ARM32: movt [[REG2]], {{.*}} ; 0x1234 | 155 ; ARM32: movt [[REG2]], {{.*}} ; 0x1234 |
159 ; ARM32: str [[REG1]], [sp, #4] | 156 ; ARM32: str [[REG1]], [sp, #4] |
160 ; ARM32: str [[REG2]], [sp] | 157 ; ARM32: str [[REG2]], [sp] |
161 ; ARM32: movw [[CALL:r[0-9]]], {{.+}} ignore64BitArgNoInline | |
162 ; ARM32: movt [[CALL]], {{.+}} ignore64BitArgNoInline | |
163 ; ARM32: {{mov|ldr}} r0 | 158 ; ARM32: {{mov|ldr}} r0 |
164 ; ARM32: {{mov|ldr}} r1 | 159 ; ARM32: {{mov|ldr}} r1 |
165 ; ARM32: mov r2, #123 | 160 ; ARM32: mov r2, #123 |
166 ; ARM32: blx [[CALL]] | 161 ; ARM32: bl {{.*}} ignore64BitArgNoInline |
167 | |
168 | 162 |
169 define internal i32 @pass64BitUndefArg() { | 163 define internal i32 @pass64BitUndefArg() { |
170 entry: | 164 entry: |
171 %call = call i32 @ignore64BitArgNoInline(i64 0, i32 123, i64 undef) | 165 %call = call i32 @ignore64BitArgNoInline(i64 0, i32 123, i64 undef) |
172 ret i32 %call | 166 ret i32 %call |
173 } | 167 } |
174 ; CHECK-LABEL: pass64BitUndefArg | 168 ; CHECK-LABEL: pass64BitUndefArg |
175 ; CHECK: sub esp | 169 ; CHECK: sub esp |
176 ; CHECK: mov DWORD PTR{{.*}},0x7b | 170 ; CHECK: mov DWORD PTR{{.*}},0x7b |
177 ; CHECK: mov DWORD PTR{{.*}},0x0 | 171 ; CHECK: mov DWORD PTR{{.*}},0x0 |
178 ; CHECK: call {{.*}} R_{{.*}} ignore64BitArgNoInline | 172 ; CHECK: call {{.*}} R_{{.*}} ignore64BitArgNoInline |
179 ; OPTM1-LABEL: pass64BitUndefArg | 173 ; OPTM1-LABEL: pass64BitUndefArg |
180 ; OPTM1: sub esp | 174 ; OPTM1: sub esp |
181 ; OPTM1: mov DWORD PTR{{.*}},0x7b | 175 ; OPTM1: mov DWORD PTR{{.*}},0x7b |
182 ; OPTM1: mov DWORD PTR{{.*}},0x0 | 176 ; OPTM1: mov DWORD PTR{{.*}},0x0 |
183 ; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline | 177 ; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline |
184 ; ARM32-LABEL: pass64BitUndefArg | 178 ; ARM32-LABEL: pass64BitUndefArg |
185 ; ARM32: sub sp | 179 ; ARM32: sub sp |
186 ; ARM32: mov {{.*}}, #0 | 180 ; ARM32: mov {{.*}}, #0 |
187 ; ARM32: str | 181 ; ARM32: str |
188 ; ARM32: movw [[CALL:r[0-9]]], {{.+}} ignore64BitArgNoInline | |
189 ; ARM32: movt [[CALL]], {{.+}} ignore64BitArgNoInline | |
190 ; ARM32: mov {{.*}}, #123 | 182 ; ARM32: mov {{.*}}, #123 |
191 ; ARM32: blx [[CALL]] | 183 ; ARM32: bl {{.*}} ignore64BitArgNoInline |
192 | 184 |
193 ; MIPS32-LABEL: pass64BitUndefArg | 185 ; MIPS32-LABEL: pass64BitUndefArg |
194 ; MIPS32: jr ra | 186 ; MIPS32: jr ra |
195 | 187 |
196 define internal i64 @return64BitArg(i64 %padding, i64 %a) { | 188 define internal i64 @return64BitArg(i64 %padding, i64 %a) { |
197 entry: | 189 entry: |
198 ret i64 %a | 190 ret i64 %a |
199 } | 191 } |
200 ; CHECK-LABEL: return64BitArg | 192 ; CHECK-LABEL: return64BitArg |
201 ; CHECK: mov {{.*}},DWORD PTR [esp+0xc] | 193 ; CHECK: mov {{.*}},DWORD PTR [esp+0xc] |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
407 } | 399 } |
408 ; CHECK-LABEL: div64BitSigned | 400 ; CHECK-LABEL: div64BitSigned |
409 ; CHECK: call {{.*}} R_{{.*}} __divdi3 | 401 ; CHECK: call {{.*}} R_{{.*}} __divdi3 |
410 | 402 |
411 ; OPTM1-LABEL: div64BitSigned | 403 ; OPTM1-LABEL: div64BitSigned |
412 ; OPTM1: call {{.*}} R_{{.*}} __divdi3 | 404 ; OPTM1: call {{.*}} R_{{.*}} __divdi3 |
413 ; | 405 ; |
414 ; ARM32-LABEL: div64BitSigned | 406 ; ARM32-LABEL: div64BitSigned |
415 ; ARM32: orrs {{r.*}}, {{r.*}} | 407 ; ARM32: orrs {{r.*}}, {{r.*}} |
416 ; ARM32: bne | 408 ; ARM32: bne |
417 ; ARM32: movw» [[CALL:r[0-9]]], {{.+}} __divdi3 | 409 ; ARM32: bl {{.*}} __divdi3 |
418 ; ARM32: movt» [[CALL]], {{.+}} __divdi3 | |
419 ; ARM32: blx [[CALL]] | |
420 | 410 |
421 define internal i64 @div64BitSignedConst(i64 %a) { | 411 define internal i64 @div64BitSignedConst(i64 %a) { |
422 entry: | 412 entry: |
423 %div = sdiv i64 %a, 12345678901234 | 413 %div = sdiv i64 %a, 12345678901234 |
424 ret i64 %div | 414 ret i64 %div |
425 } | 415 } |
426 ; CHECK-LABEL: div64BitSignedConst | 416 ; CHECK-LABEL: div64BitSignedConst |
427 ; CHECK: mov DWORD PTR [esp+0xc],0xb3a | 417 ; CHECK: mov DWORD PTR [esp+0xc],0xb3a |
428 ; CHECK: mov DWORD PTR [esp+0x8],0x73ce2ff2 | 418 ; CHECK: mov DWORD PTR [esp+0x8],0x73ce2ff2 |
429 ; CHECK: call {{.*}} R_{{.*}} __divdi3 | 419 ; CHECK: call {{.*}} R_{{.*}} __divdi3 |
430 ; | 420 ; |
431 ; OPTM1-LABEL: div64BitSignedConst | 421 ; OPTM1-LABEL: div64BitSignedConst |
432 ; OPTM1: mov DWORD PTR [esp+0xc],0xb3a | 422 ; OPTM1: mov DWORD PTR [esp+0xc],0xb3a |
433 ; OPTM1: mov DWORD PTR [esp+0x8],0x73ce2ff2 | 423 ; OPTM1: mov DWORD PTR [esp+0x8],0x73ce2ff2 |
434 ; OPTM1: call {{.*}} R_{{.*}} __divdi3 | 424 ; OPTM1: call {{.*}} R_{{.*}} __divdi3 |
435 ; | 425 ; |
436 ; ARM32-LABEL: div64BitSignedConst | 426 ; ARM32-LABEL: div64BitSignedConst |
437 ; For a constant, we should be able to optimize-out the divide by zero check. | 427 ; For a constant, we should be able to optimize-out the divide by zero check. |
438 ; ARM32-NOT: orrs | 428 ; ARM32-NOT: orrs |
439 ; ARM32: movw [[CALL:r[0-9]]], {{.+}} __divdi3 | |
440 ; ARM32: movt [[CALL]], {{.+}} __divdi3 | |
441 ; ARM32: movw {{.*}} ; 0x2ff2 | 429 ; ARM32: movw {{.*}} ; 0x2ff2 |
442 ; ARM32: movt {{.*}} ; 0x73ce | 430 ; ARM32: movt {{.*}} ; 0x73ce |
443 ; ARM32: movw {{.*}} ; 0xb3a | 431 ; ARM32: movw {{.*}} ; 0xb3a |
444 ; ARM32: blx [[CALL]] | 432 ; ARM32: bl {{.*}} __divdi3 |
445 | 433 |
446 define internal i64 @div64BitUnsigned(i64 %a, i64 %b) { | 434 define internal i64 @div64BitUnsigned(i64 %a, i64 %b) { |
447 entry: | 435 entry: |
448 %div = udiv i64 %a, %b | 436 %div = udiv i64 %a, %b |
449 ret i64 %div | 437 ret i64 %div |
450 } | 438 } |
451 ; CHECK-LABEL: div64BitUnsigned | 439 ; CHECK-LABEL: div64BitUnsigned |
452 ; CHECK: call {{.*}} R_{{.*}} __udivdi3 | 440 ; CHECK: call {{.*}} R_{{.*}} __udivdi3 |
453 ; | 441 ; |
454 ; OPTM1-LABEL: div64BitUnsigned | 442 ; OPTM1-LABEL: div64BitUnsigned |
455 ; OPTM1: call {{.*}} R_{{.*}} __udivdi3 | 443 ; OPTM1: call {{.*}} R_{{.*}} __udivdi3 |
456 ; | 444 ; |
457 ; ARM32-LABEL: div64BitUnsigned | 445 ; ARM32-LABEL: div64BitUnsigned |
458 ; ARM32: orrs {{r.*}}, {{r.*}} | 446 ; ARM32: orrs {{r.*}}, {{r.*}} |
459 ; ARM32: bne | 447 ; ARM32: bne |
460 ; ARM32: movw [[CALL:r[0-9]]], {{.+}} __udivdi3 | 448 ; ARM32: bl {{.*}} __udivdi3 |
461 ; ARM32: movt [[CALL]], {{.+}} __udivdi3 | |
462 ; ARM32: blx [[CALL]] | |
463 | 449 |
464 define internal i64 @rem64BitSigned(i64 %a, i64 %b) { | 450 define internal i64 @rem64BitSigned(i64 %a, i64 %b) { |
465 entry: | 451 entry: |
466 %rem = srem i64 %a, %b | 452 %rem = srem i64 %a, %b |
467 ret i64 %rem | 453 ret i64 %rem |
468 } | 454 } |
469 ; CHECK-LABEL: rem64BitSigned | 455 ; CHECK-LABEL: rem64BitSigned |
470 ; CHECK: call {{.*}} R_{{.*}} __moddi3 | 456 ; CHECK: call {{.*}} R_{{.*}} __moddi3 |
471 ; | 457 ; |
472 ; OPTM1-LABEL: rem64BitSigned | 458 ; OPTM1-LABEL: rem64BitSigned |
473 ; OPTM1: call {{.*}} R_{{.*}} __moddi3 | 459 ; OPTM1: call {{.*}} R_{{.*}} __moddi3 |
474 ; | 460 ; |
475 ; ARM32-LABEL: rem64BitSigned | 461 ; ARM32-LABEL: rem64BitSigned |
476 ; ARM32: orrs {{r.*}}, {{r.*}} | 462 ; ARM32: orrs {{r.*}}, {{r.*}} |
477 ; ARM32: bne | 463 ; ARM32: bne |
478 ; ARM32: movw [[CALL:r[0-9]]], {{.+}} __moddi3 | 464 ; ARM32: bl {{.*}} __moddi3 |
479 ; ARM32: movt [[CALL]], {{.+}} __moddi3 | |
480 ; ARM32: blx [[CALL]] | |
481 | 465 |
482 define internal i64 @rem64BitUnsigned(i64 %a, i64 %b) { | 466 define internal i64 @rem64BitUnsigned(i64 %a, i64 %b) { |
483 entry: | 467 entry: |
484 %rem = urem i64 %a, %b | 468 %rem = urem i64 %a, %b |
485 ret i64 %rem | 469 ret i64 %rem |
486 } | 470 } |
487 ; CHECK-LABEL: rem64BitUnsigned | 471 ; CHECK-LABEL: rem64BitUnsigned |
488 ; CHECK: call {{.*}} R_{{.*}} __umoddi3 | 472 ; CHECK: call {{.*}} R_{{.*}} __umoddi3 |
489 ; | 473 ; |
490 ; OPTM1-LABEL: rem64BitUnsigned | 474 ; OPTM1-LABEL: rem64BitUnsigned |
491 ; OPTM1: call {{.*}} R_{{.*}} __umoddi3 | 475 ; OPTM1: call {{.*}} R_{{.*}} __umoddi3 |
492 ; | 476 ; |
493 ; ARM32-LABEL: rem64BitUnsigned | 477 ; ARM32-LABEL: rem64BitUnsigned |
494 ; ARM32: orrs {{r.*}}, {{r.*}} | 478 ; ARM32: orrs {{r.*}}, {{r.*}} |
495 ; ARM32: bne | 479 ; ARM32: bne |
496 ; ARM32: movw [[CALL:r[0-9]]], {{.+}} __umoddi3 | 480 ; ARM32: bl {{.*}} __umoddi3 |
497 ; ARM32: movt [[CALL]], {{.+}} __umoddi3 | |
498 ; ARM32: blx [[CALL]] | |
499 | 481 |
500 define internal i64 @shl64BitSigned(i64 %a, i64 %b) { | 482 define internal i64 @shl64BitSigned(i64 %a, i64 %b) { |
501 entry: | 483 entry: |
502 %shl = shl i64 %a, %b | 484 %shl = shl i64 %a, %b |
503 ret i64 %shl | 485 ret i64 %shl |
504 } | 486 } |
505 ; CHECK-LABEL: shl64BitSigned | 487 ; CHECK-LABEL: shl64BitSigned |
506 ; CHECK: shld | 488 ; CHECK: shld |
507 ; CHECK: shl e | 489 ; CHECK: shl e |
508 ; CHECK: test {{.*}},0x20 | 490 ; CHECK: test {{.*}},0x20 |
(...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1151 ; OPTM1-NEXT: cmp [[RESULT]],0x0 | 1133 ; OPTM1-NEXT: cmp [[RESULT]],0x0 |
1152 ; OPTM1-NEXT: jne | 1134 ; OPTM1-NEXT: jne |
1153 ; OPTM1-NEXT: jmp | 1135 ; OPTM1-NEXT: jmp |
1154 ; OPTM1-NEXT: call | 1136 ; OPTM1-NEXT: call |
1155 | 1137 |
1156 ; ARM32-LABEL: icmpEq64 | 1138 ; ARM32-LABEL: icmpEq64 |
1157 ; ARM32: cmp | 1139 ; ARM32: cmp |
1158 ; ARM32: cmpeq | 1140 ; ARM32: cmpeq |
1159 ; ARM32-OM1: tst | 1141 ; ARM32-OM1: tst |
1160 ; ARM32: bne | 1142 ; ARM32: bne |
1161 ; ARM32: movw [[CALL:r[0-9]]], {{.+}} func | 1143 ; ARM32: bl {{.*}} <func> |
1162 ; ARM32: movt [[CALL]], {{.+}} func | |
1163 ; ARM32: blx [[CALL]] | |
1164 ; ARM32: cmp | 1144 ; ARM32: cmp |
1165 ; ARM32: cmpeq | 1145 ; ARM32: cmpeq |
1166 ; ARM32-OM1: tst | 1146 ; ARM32-OM1: tst |
1167 ; ARM32: bne | 1147 ; ARM32: bne |
1168 ; ARM32: movw [[CALL:r[0-9]]], {{.+}} func | 1148 ; ARM32: bl {{.*}} <func> |
1169 ; ARM32: movt [[CALL]], {{.+}} func | |
1170 ; ARM32: blx [[CALL]] | |
1171 ; ARM32: bx | 1149 ; ARM32: bx |
1172 | 1150 |
1173 declare void @func() | 1151 declare void @func() |
1174 | 1152 |
1175 define internal void @icmpNe64(i64 %a, i64 %b, i64 %c, i64 %d) { | 1153 define internal void @icmpNe64(i64 %a, i64 %b, i64 %c, i64 %d) { |
1176 entry: | 1154 entry: |
1177 %cmp = icmp ne i64 %a, %b | 1155 %cmp = icmp ne i64 %a, %b |
1178 br i1 %cmp, label %if.then, label %if.end | 1156 br i1 %cmp, label %if.then, label %if.end |
1179 | 1157 |
1180 if.then: ; preds = %entry | 1158 if.then: ; preds = %entry |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1225 ; OPTM1-NEXT: jne {{.*}} | 1203 ; OPTM1-NEXT: jne {{.*}} |
1226 ; OPTM1-NEXT: jmp {{.*}} | 1204 ; OPTM1-NEXT: jmp {{.*}} |
1227 ; OPTM1-NEXT: call | 1205 ; OPTM1-NEXT: call |
1228 | 1206 |
1229 ; ARM32-LABEL: icmpNe64 | 1207 ; ARM32-LABEL: icmpNe64 |
1230 ; ARM32: cmp | 1208 ; ARM32: cmp |
1231 ; ARM32: cmpeq | 1209 ; ARM32: cmpeq |
1232 ; ARM32-OM1: tst | 1210 ; ARM32-OM1: tst |
1233 ; ARM32-OM1: bne | 1211 ; ARM32-OM1: bne |
1234 ; ARM32-O2: beq | 1212 ; ARM32-O2: beq |
1235 ; ARM32: movw [[CALL:r[0-9]]], {{.+}} func | 1213 ; ARM32: bl {{.*}} <func> |
1236 ; ARM32: movt [[CALL]], {{.+}} func | |
1237 ; ARM32: blx [[CALL]] | |
1238 ; ARM32: cmp | 1214 ; ARM32: cmp |
1239 ; ARM32: cmpeq | 1215 ; ARM32: cmpeq |
1240 ; ARM32-OM1: tst | 1216 ; ARM32-OM1: tst |
1241 ; ARM32-OM1: bne | 1217 ; ARM32-OM1: bne |
1242 ; ARM32-O2: beq | 1218 ; ARM32-O2: beq |
1243 ; ARM32: bl | 1219 ; ARM32: bl |
1244 | 1220 |
1245 define internal void @icmpGt64(i64 %a, i64 %b, i64 %c, i64 %d) { | 1221 define internal void @icmpGt64(i64 %a, i64 %b, i64 %c, i64 %d) { |
1246 entry: | 1222 entry: |
1247 %cmp = icmp ugt i64 %a, %b | 1223 %cmp = icmp ugt i64 %a, %b |
(...skipping 723 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1971 | 1947 |
1972 ; CHECK-LABEL: phi64Undef | 1948 ; CHECK-LABEL: phi64Undef |
1973 ; CHECK: mov {{.*}},0x0 | 1949 ; CHECK: mov {{.*}},0x0 |
1974 ; CHECK: mov {{.*}},0x0 | 1950 ; CHECK: mov {{.*}},0x0 |
1975 ; OPTM1-LABEL: phi64Undef | 1951 ; OPTM1-LABEL: phi64Undef |
1976 ; OPTM1: mov {{.*}},0x0 | 1952 ; OPTM1: mov {{.*}},0x0 |
1977 ; OPTM1: mov {{.*}},0x0 | 1953 ; OPTM1: mov {{.*}},0x0 |
1978 ; ARM32-LABEL: phi64Undef | 1954 ; ARM32-LABEL: phi64Undef |
1979 ; ARM32: mov {{.*}} #0 | 1955 ; ARM32: mov {{.*}} #0 |
1980 ; ARM32: mov {{.*}} #0 | 1956 ; ARM32: mov {{.*}} #0 |
OLD | NEW |