@@ -532,11 +532,10 @@ define i32 @bextr64_32_b2(i64 %val, i64 %numskipbits, i8 %numlowbits) nounwind {
532
532
define i32 @bextr32_c0 (i32 %val , i32 %numskipbits , i32 %numlowbits ) nounwind {
533
533
; CHECK-LABEL: bextr32_c0:
534
534
; CHECK: // %bb.0:
535
- ; CHECK-NEXT: neg w8, w2
536
- ; CHECK-NEXT: mov w9, #-1 // =0xffffffff
537
- ; CHECK-NEXT: lsr w10, w0, w1
538
- ; CHECK-NEXT: lsr w8, w9, w8
539
- ; CHECK-NEXT: and w0, w8, w10
535
+ ; CHECK-NEXT: lsr w8, w0, w1
536
+ ; CHECK-NEXT: neg w9, w2
537
+ ; CHECK-NEXT: lsl w8, w8, w9
538
+ ; CHECK-NEXT: lsr w0, w8, w9
540
539
; CHECK-NEXT: ret
541
540
%shifted = lshr i32 %val , %numskipbits
542
541
%numhighbits = sub i32 32 , %numlowbits
@@ -548,12 +547,11 @@ define i32 @bextr32_c0(i32 %val, i32 %numskipbits, i32 %numlowbits) nounwind {
548
547
define i32 @bextr32_c1_indexzext (i32 %val , i8 %numskipbits , i8 %numlowbits ) nounwind {
549
548
; CHECK-LABEL: bextr32_c1_indexzext:
550
549
; CHECK: // %bb.0:
551
- ; CHECK-NEXT: mov w8, #32 // =0x20
552
- ; CHECK-NEXT: mov w9, #-1 // =0xffffffff
553
- ; CHECK-NEXT: lsr w10, w0, w1
554
- ; CHECK-NEXT: sub w8, w8, w2
555
- ; CHECK-NEXT: lsr w8, w9, w8
556
- ; CHECK-NEXT: and w0, w8, w10
550
+ ; CHECK-NEXT: lsr w8, w0, w1
551
+ ; CHECK-NEXT: mov w9, #32 // =0x20
552
+ ; CHECK-NEXT: sub w9, w9, w2
553
+ ; CHECK-NEXT: lsl w8, w8, w9
554
+ ; CHECK-NEXT: lsr w0, w8, w9
557
555
; CHECK-NEXT: ret
558
556
%skip = zext i8 %numskipbits to i32
559
557
%shifted = lshr i32 %val , %skip
@@ -569,10 +567,9 @@ define i32 @bextr32_c2_load(ptr %w, i32 %numskipbits, i32 %numlowbits) nounwind
569
567
; CHECK: // %bb.0:
570
568
; CHECK-NEXT: ldr w8, [x0]
571
569
; CHECK-NEXT: neg w9, w2
572
- ; CHECK-NEXT: mov w10, #-1 // =0xffffffff
573
- ; CHECK-NEXT: lsr w9, w10, w9
574
570
; CHECK-NEXT: lsr w8, w8, w1
575
- ; CHECK-NEXT: and w0, w9, w8
571
+ ; CHECK-NEXT: lsl w8, w8, w9
572
+ ; CHECK-NEXT: lsr w0, w8, w9
576
573
; CHECK-NEXT: ret
577
574
%val = load i32 , ptr %w
578
575
%shifted = lshr i32 %val , %numskipbits
@@ -587,11 +584,10 @@ define i32 @bextr32_c3_load_indexzext(ptr %w, i8 %numskipbits, i8 %numlowbits) n
587
584
; CHECK: // %bb.0:
588
585
; CHECK-NEXT: ldr w8, [x0]
589
586
; CHECK-NEXT: mov w9, #32 // =0x20
590
- ; CHECK-NEXT: mov w10, #-1 // =0xffffffff
591
587
; CHECK-NEXT: sub w9, w9, w2
592
588
; CHECK-NEXT: lsr w8, w8, w1
593
- ; CHECK-NEXT: lsr w9, w10 , w9
594
- ; CHECK-NEXT: and w0, w9, w8
589
+ ; CHECK-NEXT: lsl w8, w8 , w9
590
+ ; CHECK-NEXT: lsr w0, w8, w9
595
591
; CHECK-NEXT: ret
596
592
%val = load i32 , ptr %w
597
593
%skip = zext i8 %numskipbits to i32
@@ -606,11 +602,10 @@ define i32 @bextr32_c3_load_indexzext(ptr %w, i8 %numskipbits, i8 %numlowbits) n
606
602
define i32 @bextr32_c4_commutative (i32 %val , i32 %numskipbits , i32 %numlowbits ) nounwind {
607
603
; CHECK-LABEL: bextr32_c4_commutative:
608
604
; CHECK: // %bb.0:
609
- ; CHECK-NEXT: neg w8, w2
610
- ; CHECK-NEXT: mov w9, #-1 // =0xffffffff
611
- ; CHECK-NEXT: lsr w10, w0, w1
612
- ; CHECK-NEXT: lsr w8, w9, w8
613
- ; CHECK-NEXT: and w0, w10, w8
605
+ ; CHECK-NEXT: lsr w8, w0, w1
606
+ ; CHECK-NEXT: neg w9, w2
607
+ ; CHECK-NEXT: lsl w8, w8, w9
608
+ ; CHECK-NEXT: lsr w0, w8, w9
614
609
; CHECK-NEXT: ret
615
610
%shifted = lshr i32 %val , %numskipbits
616
611
%numhighbits = sub i32 32 , %numlowbits
@@ -624,11 +619,10 @@ define i32 @bextr32_c4_commutative(i32 %val, i32 %numskipbits, i32 %numlowbits)
624
619
define i64 @bextr64_c0 (i64 %val , i64 %numskipbits , i64 %numlowbits ) nounwind {
625
620
; CHECK-LABEL: bextr64_c0:
626
621
; CHECK: // %bb.0:
627
- ; CHECK-NEXT: neg x8, x2
628
- ; CHECK-NEXT: mov x9, #-1 // =0xffffffffffffffff
629
- ; CHECK-NEXT: lsr x10, x0, x1
630
- ; CHECK-NEXT: lsr x8, x9, x8
631
- ; CHECK-NEXT: and x0, x8, x10
622
+ ; CHECK-NEXT: lsr x8, x0, x1
623
+ ; CHECK-NEXT: neg x9, x2
624
+ ; CHECK-NEXT: lsl x8, x8, x9
625
+ ; CHECK-NEXT: lsr x0, x8, x9
632
626
; CHECK-NEXT: ret
633
627
%shifted = lshr i64 %val , %numskipbits
634
628
%numhighbits = sub i64 64 , %numlowbits
@@ -640,13 +634,12 @@ define i64 @bextr64_c0(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind {
640
634
define i64 @bextr64_c1_indexzext (i64 %val , i8 %numskipbits , i8 %numlowbits ) nounwind {
641
635
; CHECK-LABEL: bextr64_c1_indexzext:
642
636
; CHECK: // %bb.0:
643
- ; CHECK-NEXT: mov w8, #64 // =0x40
644
- ; CHECK-NEXT: mov x9, #-1 // =0xffffffffffffffff
645
637
; CHECK-NEXT: // kill: def $w1 killed $w1 def $x1
646
- ; CHECK-NEXT: lsr x10, x0, x1
647
- ; CHECK-NEXT: sub w8, w8, w2
648
- ; CHECK-NEXT: lsr x8, x9, x8
649
- ; CHECK-NEXT: and x0, x8, x10
638
+ ; CHECK-NEXT: lsr x8, x0, x1
639
+ ; CHECK-NEXT: mov w9, #64 // =0x40
640
+ ; CHECK-NEXT: sub w9, w9, w2
641
+ ; CHECK-NEXT: lsl x8, x8, x9
642
+ ; CHECK-NEXT: lsr x0, x8, x9
650
643
; CHECK-NEXT: ret
651
644
%skip = zext i8 %numskipbits to i64
652
645
%shifted = lshr i64 %val , %skip
@@ -662,10 +655,9 @@ define i64 @bextr64_c2_load(ptr %w, i64 %numskipbits, i64 %numlowbits) nounwind
662
655
; CHECK: // %bb.0:
663
656
; CHECK-NEXT: ldr x8, [x0]
664
657
; CHECK-NEXT: neg x9, x2
665
- ; CHECK-NEXT: mov x10, #-1 // =0xffffffffffffffff
666
- ; CHECK-NEXT: lsr x9, x10, x9
667
658
; CHECK-NEXT: lsr x8, x8, x1
668
- ; CHECK-NEXT: and x0, x9, x8
659
+ ; CHECK-NEXT: lsl x8, x8, x9
660
+ ; CHECK-NEXT: lsr x0, x8, x9
669
661
; CHECK-NEXT: ret
670
662
%val = load i64 , ptr %w
671
663
%shifted = lshr i64 %val , %numskipbits
@@ -679,13 +671,12 @@ define i64 @bextr64_c3_load_indexzext(ptr %w, i8 %numskipbits, i8 %numlowbits) n
679
671
; CHECK-LABEL: bextr64_c3_load_indexzext:
680
672
; CHECK: // %bb.0:
681
673
; CHECK-NEXT: ldr x8, [x0]
674
+ ; CHECK-NEXT: // kill: def $w1 killed $w1 def $x1
682
675
; CHECK-NEXT: mov w9, #64 // =0x40
683
- ; CHECK-NEXT: mov x10, #-1 // =0xffffffffffffffff
684
676
; CHECK-NEXT: sub w9, w9, w2
685
- ; CHECK-NEXT: // kill: def $w1 killed $w1 def $x1
686
677
; CHECK-NEXT: lsr x8, x8, x1
687
- ; CHECK-NEXT: lsr x9, x10 , x9
688
- ; CHECK-NEXT: and x0, x9, x8
678
+ ; CHECK-NEXT: lsl x8, x8 , x9
679
+ ; CHECK-NEXT: lsr x0, x8, x9
689
680
; CHECK-NEXT: ret
690
681
%val = load i64 , ptr %w
691
682
%skip = zext i8 %numskipbits to i64
@@ -700,11 +691,10 @@ define i64 @bextr64_c3_load_indexzext(ptr %w, i8 %numskipbits, i8 %numlowbits) n
700
691
define i64 @bextr64_c4_commutative (i64 %val , i64 %numskipbits , i64 %numlowbits ) nounwind {
701
692
; CHECK-LABEL: bextr64_c4_commutative:
702
693
; CHECK: // %bb.0:
703
- ; CHECK-NEXT: neg x8, x2
704
- ; CHECK-NEXT: mov x9, #-1 // =0xffffffffffffffff
705
- ; CHECK-NEXT: lsr x10, x0, x1
706
- ; CHECK-NEXT: lsr x8, x9, x8
707
- ; CHECK-NEXT: and x0, x10, x8
694
+ ; CHECK-NEXT: lsr x8, x0, x1
695
+ ; CHECK-NEXT: neg x9, x2
696
+ ; CHECK-NEXT: lsl x8, x8, x9
697
+ ; CHECK-NEXT: lsr x0, x8, x9
708
698
; CHECK-NEXT: ret
709
699
%shifted = lshr i64 %val , %numskipbits
710
700
%numhighbits = sub i64 64 , %numlowbits
@@ -737,11 +727,10 @@ define i32 @bextr64_32_c0(i64 %val, i64 %numskipbits, i64 %numlowbits) nounwind
737
727
define i32 @bextr64_32_c1 (i64 %val , i64 %numskipbits , i32 %numlowbits ) nounwind {
738
728
; CHECK-LABEL: bextr64_32_c1:
739
729
; CHECK: // %bb.0:
740
- ; CHECK-NEXT: neg w8, w2
741
- ; CHECK-NEXT: mov w9, #-1 // =0xffffffff
742
- ; CHECK-NEXT: lsr x10, x0, x1
743
- ; CHECK-NEXT: lsr w8, w9, w8
744
- ; CHECK-NEXT: and w0, w8, w10
730
+ ; CHECK-NEXT: lsr x8, x0, x1
731
+ ; CHECK-NEXT: neg w9, w2
732
+ ; CHECK-NEXT: lsl w8, w8, w9
733
+ ; CHECK-NEXT: lsr w0, w8, w9
745
734
; CHECK-NEXT: ret
746
735
%shifted = lshr i64 %val , %numskipbits
747
736
%truncshifted = trunc i64 %shifted to i32
@@ -756,11 +745,10 @@ define i32 @bextr64_32_c1(i64 %val, i64 %numskipbits, i32 %numlowbits) nounwind
756
745
define i32 @bextr64_32_c2 (i64 %val , i64 %numskipbits , i32 %numlowbits ) nounwind {
757
746
; CHECK-LABEL: bextr64_32_c2:
758
747
; CHECK: // %bb.0:
759
- ; CHECK-NEXT: neg w8, w2
760
- ; CHECK-NEXT: mov w9, #-1 // =0xffffffff
761
- ; CHECK-NEXT: lsr x10, x0, x1
762
- ; CHECK-NEXT: lsr w8, w9, w8
763
- ; CHECK-NEXT: and w0, w8, w10
748
+ ; CHECK-NEXT: lsr x8, x0, x1
749
+ ; CHECK-NEXT: neg w9, w2
750
+ ; CHECK-NEXT: lsl w8, w8, w9
751
+ ; CHECK-NEXT: lsr w0, w8, w9
764
752
; CHECK-NEXT: ret
765
753
%shifted = lshr i64 %val , %numskipbits
766
754
%numhighbits = sub i32 32 , %numlowbits
0 commit comments