| 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 \ |
| (...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 513 | 513 |
| 514 ; ARM32-LABEL: shl64BitSigned | 514 ; ARM32-LABEL: shl64BitSigned |
| 515 ; ARM32: rsb [[T0:r[0-9]+]], r2, #32 | 515 ; ARM32: rsb [[T0:r[0-9]+]], r2, #32 |
| 516 ; ARM32: lsr [[T1:r[0-9]+]], r0, [[T0]] | 516 ; ARM32: lsr [[T1:r[0-9]+]], r0, [[T0]] |
| 517 ; ARM32: orr [[T2:r[0-9]+]], [[T1]], r1, lsl r2 | 517 ; ARM32: orr [[T2:r[0-9]+]], [[T1]], r1, lsl r2 |
| 518 ; ARM32: sub [[T3:r[0-9]+]], r2, #32 | 518 ; ARM32: sub [[T3:r[0-9]+]], r2, #32 |
| 519 ; ARM32: cmp [[T3]], #0 | 519 ; ARM32: cmp [[T3]], #0 |
| 520 ; ARM32: lslge [[T2]], r0, [[T3]] | 520 ; ARM32: lslge [[T2]], r0, [[T3]] |
| 521 ; ARM32: lsl r{{[0-9]+}}, r0, r2 | 521 ; ARM32: lsl r{{[0-9]+}}, r0, r2 |
| 522 | 522 |
| 523 ; MIPS32-LABEL: shl64BitSigned |
| 524 ; MIPS32: sllv [[T1:.*]],[[A_HI:.*]],[[B_LO:.*]] |
| 525 ; MIPS32: nor [[T2:.*]],[[B_LO]],zero |
| 526 ; MIPS32: srl [[T3:.*]],[[A_LO:.*]],0x1 |
| 527 ; MIPS32: srlv [[T4:.*]],[[T3]],[[T2]] |
| 528 ; MIPS32: or [[T_HI:.*]],[[T1]],[[T4]] |
| 529 ; MIPS32: sllv [[T_LO:.*]],[[A_LO]],[[B_LO]] |
| 530 ; MIPS32: move [[T1_LO:.*]],[[T_LO]] |
| 531 ; MIPS32: andi [[T5:.*]],[[B_LO]],0x20 |
| 532 ; MIPS32: movn [[T_HI]],[[T_LO]],[[T5]] |
| 533 ; MIPS32: movn [[T1_LO]],zero,[[T5]] |
| 534 ; MIPS32: move v1,[[T_HI]] |
| 535 |
| 523 define internal i32 @shl64BitSignedTrunc(i64 %a, i64 %b) { | 536 define internal i32 @shl64BitSignedTrunc(i64 %a, i64 %b) { |
| 524 entry: | 537 entry: |
| 525 %shl = shl i64 %a, %b | 538 %shl = shl i64 %a, %b |
| 526 %result = trunc i64 %shl to i32 | 539 %result = trunc i64 %shl to i32 |
| 527 ret i32 %result | 540 ret i32 %result |
| 528 } | 541 } |
| 529 ; CHECK-LABEL: shl64BitSignedTrunc | 542 ; CHECK-LABEL: shl64BitSignedTrunc |
| 530 ; CHECK: mov | 543 ; CHECK: mov |
| 531 ; CHECK: shl e | 544 ; CHECK: shl e |
| 532 ; CHECK: test {{.*}},0x20 | 545 ; CHECK: test {{.*}},0x20 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 560 | 573 |
| 561 ; ARM32-LABEL: shl64BitUnsigned | 574 ; ARM32-LABEL: shl64BitUnsigned |
| 562 ; ARM32: rsb | 575 ; ARM32: rsb |
| 563 ; ARM32: lsr | 576 ; ARM32: lsr |
| 564 ; ARM32: orr | 577 ; ARM32: orr |
| 565 ; ARM32: sub | 578 ; ARM32: sub |
| 566 ; ARM32: cmp | 579 ; ARM32: cmp |
| 567 ; ARM32: lslge | 580 ; ARM32: lslge |
| 568 ; ARM32: lsl | 581 ; ARM32: lsl |
| 569 | 582 |
| 583 ; MIPS32-LABEL: shl64BitUnsigned |
| 584 ; MIPS32: sllv [[T1:.*]],[[A_HI:.*]],[[B_LO:.*]] |
| 585 ; MIPS32: nor [[T2:.*]],[[B_LO]],zero |
| 586 ; MIPS32: srl [[T3:.*]],[[A_LO:.*]],0x1 |
| 587 ; MIPS32: srlv [[T4:.*]],[[T3]],[[T2]] |
| 588 ; MIPS32: or [[T_HI:.*]],[[T1]],[[T4]] |
| 589 ; MIPS32: sllv [[T_LO:.*]],[[A_LO]],[[B_LO]] |
| 590 ; MIPS32: move [[T1_LO:.*]],[[T_LO]] |
| 591 ; MIPS32: andi [[T5:.*]],[[B_LO]],0x20 |
| 592 ; MIPS32: movn [[T_HI]],[[T_LO]],[[T5]] |
| 593 ; MIPS32: movn [[T1_LO]],zero,[[T5]] |
| 594 ; MIPS32: move v1,[[T_HI]] |
| 595 |
| 570 define internal i64 @shr64BitSigned(i64 %a, i64 %b) { | 596 define internal i64 @shr64BitSigned(i64 %a, i64 %b) { |
| 571 entry: | 597 entry: |
| 572 %shr = ashr i64 %a, %b | 598 %shr = ashr i64 %a, %b |
| 573 ret i64 %shr | 599 ret i64 %shr |
| 574 } | 600 } |
| 575 ; CHECK-LABEL: shr64BitSigned | 601 ; CHECK-LABEL: shr64BitSigned |
| 576 ; CHECK: shrd | 602 ; CHECK: shrd |
| 577 ; CHECK: sar | 603 ; CHECK: sar |
| 578 ; CHECK: test {{.*}},0x20 | 604 ; CHECK: test {{.*}},0x20 |
| 579 ; CHECK: je | 605 ; CHECK: je |
| 580 ; CHECK: sar {{.*}},0x1f | 606 ; CHECK: sar {{.*}},0x1f |
| 581 ; | 607 ; |
| 582 ; OPTM1-LABEL: shr64BitSigned | 608 ; OPTM1-LABEL: shr64BitSigned |
| 583 ; OPTM1: shrd | 609 ; OPTM1: shrd |
| 584 ; OPTM1: sar | 610 ; OPTM1: sar |
| 585 ; OPTM1: test {{.*}},0x20 | 611 ; OPTM1: test {{.*}},0x20 |
| 586 ; OPTM1: je | 612 ; OPTM1: je |
| 587 ; OPTM1: sar {{.*}},0x1f | 613 ; OPTM1: sar {{.*}},0x1f |
| 588 | 614 |
| 589 ; ARM32-LABEL: shr64BitSigned | 615 ; ARM32-LABEL: shr64BitSigned |
| 590 ; ARM32: lsr [[T0:r[0-9]+]], r{{[0-9]+}}, r{{[0-9]+}} | 616 ; ARM32: lsr [[T0:r[0-9]+]], r{{[0-9]+}}, r{{[0-9]+}} |
| 591 ; ARM32: rsb [[T1:r[0-9]+]], r{{[0-9]+}}, #32 | 617 ; ARM32: rsb [[T1:r[0-9]+]], r{{[0-9]+}}, #32 |
| 592 ; ARM32: orr r{{[0-9]+}}, [[T0]], r{{[0-9]+}}, lsl [[T1]] | 618 ; ARM32: orr r{{[0-9]+}}, [[T0]], r{{[0-9]+}}, lsl [[T1]] |
| 593 ; ARM32: sub [[T2:r[0-9]+]], r{{[0-9]+}}, #32 | 619 ; ARM32: sub [[T2:r[0-9]+]], r{{[0-9]+}}, #32 |
| 594 ; ARM32: cmp [[T2]], #0 | 620 ; ARM32: cmp [[T2]], #0 |
| 595 ; ARM32: asrge r{{[0-9]+}}, r{{[0-9]+}}, [[T2]] | 621 ; ARM32: asrge r{{[0-9]+}}, r{{[0-9]+}}, [[T2]] |
| 596 ; ARM32: asr r{{[0-9]+}}, r{{[0-9]+}}, r{{[0-9]+}} | 622 ; ARM32: asr r{{[0-9]+}}, r{{[0-9]+}}, r{{[0-9]+}} |
| 597 | 623 |
| 624 ; MIPS32-LABEL: shr64BitSigned |
| 625 ; MIPS32: srlv [[T1:.*]],[[A_LO:.*]],[[B_LO:.*]] |
| 626 ; MIPS32: nor [[T2:.*]],[[B_LO]],zero |
| 627 ; MIPS32: sll [[T3:.*]],[[A_HI:.*]],0x1 |
| 628 ; MIPS32: sllv [[T4:.*]],[[T3]],[[T2]] |
| 629 ; MIPS32: or [[T_LO:.*]],[[T1]],[[T4]] |
| 630 ; MIPS32: srav [[T_HI:.*]],[[A_HI]],[[B_LO]] |
| 631 ; MIPS32: move [[T_HI1:.*]],[[T_HI]] |
| 632 ; MIPS32: andi [[T5:.*]],[[B_LO]],0x20 |
| 633 ; MIPS32: movn [[T_LO1:.*]],[[T_HI]],[[T5]] |
| 634 ; MIPS32: sra [[T6:.*]],[[A_HI]],0x1f |
| 635 ; MIPS32: movn [[T_HI1]],[[T6]],[[T5]] |
| 636 |
| 598 define internal i32 @shr64BitSignedTrunc(i64 %a, i64 %b) { | 637 define internal i32 @shr64BitSignedTrunc(i64 %a, i64 %b) { |
| 599 entry: | 638 entry: |
| 600 %shr = ashr i64 %a, %b | 639 %shr = ashr i64 %a, %b |
| 601 %result = trunc i64 %shr to i32 | 640 %result = trunc i64 %shr to i32 |
| 602 ret i32 %result | 641 ret i32 %result |
| 603 } | 642 } |
| 604 ; CHECK-LABEL: shr64BitSignedTrunc | 643 ; CHECK-LABEL: shr64BitSignedTrunc |
| 605 ; CHECK: shrd | 644 ; CHECK: shrd |
| 606 ; CHECK: sar | 645 ; CHECK: sar |
| 607 ; CHECK: test {{.*}},0x20 | 646 ; CHECK: test {{.*}},0x20 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 641 | 680 |
| 642 ; ARM32-LABEL: shr64BitUnsigned | 681 ; ARM32-LABEL: shr64BitUnsigned |
| 643 ; ARM32: lsr | 682 ; ARM32: lsr |
| 644 ; ARM32: rsb | 683 ; ARM32: rsb |
| 645 ; ARM32: orr | 684 ; ARM32: orr |
| 646 ; ARM32: sub | 685 ; ARM32: sub |
| 647 ; ARM32: cmp | 686 ; ARM32: cmp |
| 648 ; ARM32: lsrge | 687 ; ARM32: lsrge |
| 649 ; ARM32: lsr | 688 ; ARM32: lsr |
| 650 | 689 |
| 690 ; MIPS32-LABEL: shr64BitUnsigned |
| 691 ; MIPS32: srlv [[T1:.*]],[[A_LO:.*]],[[B_LO:.*]] |
| 692 ; MIPS32: nor [[T2:.*]],[[B_LO]],zero |
| 693 ; MIPS32: sll [[T3:.*]],[[A_HI:.*]],0x1 |
| 694 ; MIPS32: sllv [[T4:.*]],[[T3]],[[T2]] |
| 695 ; MIPS32: or [[T_LO:.*]],[[T1]],[[T4]] |
| 696 ; MIPS32: srlv [[T_HI:.*]],[[A_HI]],[[B_LO]] |
| 697 ; MIPS32: move [[T_HI1:.*]],[[T_HI]] |
| 698 ; MIPS32: andi [[T5:.*]],[[B_LO]],0x20 |
| 699 ; MIPS32: movn [[T_LO1:.*]],[[T_HI]],[[T5]] |
| 700 ; MIPS32: movn [[T_HI1]],zero,[[T5]] |
| 701 |
| 651 define internal i32 @shr64BitUnsignedTrunc(i64 %a, i64 %b) { | 702 define internal i32 @shr64BitUnsignedTrunc(i64 %a, i64 %b) { |
| 652 entry: | 703 entry: |
| 653 %shr = lshr i64 %a, %b | 704 %shr = lshr i64 %a, %b |
| 654 %result = trunc i64 %shr to i32 | 705 %result = trunc i64 %shr to i32 |
| 655 ret i32 %result | 706 ret i32 %result |
| 656 } | 707 } |
| 657 ; CHECK-LABEL: shr64BitUnsignedTrunc | 708 ; CHECK-LABEL: shr64BitUnsignedTrunc |
| 658 ; CHECK: shrd | 709 ; CHECK: shrd |
| 659 ; CHECK: shr | 710 ; CHECK: shr |
| 660 ; CHECK: test {{.*}},0x20 | 711 ; CHECK: test {{.*}},0x20 |
| (...skipping 1413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2074 %s = lshr i64 %a, 40 | 2125 %s = lshr i64 %a, 40 |
| 2075 %t = trunc i64 %s to i32 | 2126 %t = trunc i64 %s to i32 |
| 2076 %r = sub i32 %t, 1 | 2127 %r = sub i32 %t, 1 |
| 2077 ret i32 %r | 2128 ret i32 %r |
| 2078 ; ARM32-LABEL: subOneToUpperAfterShift | 2129 ; ARM32-LABEL: subOneToUpperAfterShift |
| 2079 ; ARM32: subs | 2130 ; ARM32: subs |
| 2080 ; ARM32: sbc | 2131 ; ARM32: sbc |
| 2081 ; ARM32: lsr | 2132 ; ARM32: lsr |
| 2082 ; ARM32: sub | 2133 ; ARM32: sub |
| 2083 } | 2134 } |
| OLD | NEW |