@@ -672,7 +672,10 @@ def : Pat<(i32 (and GPR:$rs, 0xFFFF)), (PACK GPR:$rs, (XLenVT X0))>;
672
672
let Predicates = [HasStdExtZbkb, NoStdExtZbb, IsRV64] in
673
673
def : Pat<(i64 (and GPR:$rs, 0xFFFF)), (PACKW GPR:$rs, (XLenVT X0))>;
674
674
675
- multiclass ShxAddPat<int i, Instruction shxadd> {
675
+ let Predicates = [HasStdExtZba] in {
676
+
677
+ foreach i = {1,2,3} in {
678
+ defvar shxadd = !cast<Instruction>("SH"#i#"ADD");
676
679
def : Pat<(XLenVT (add_like_non_imm12 (shl GPR:$rs1, (XLenVT i)), GPR:$rs2)),
677
680
(shxadd GPR:$rs1, GPR:$rs2)>;
678
681
def : Pat<(XLenVT (riscv_shl_add GPR:$rs1, (XLenVT i), GPR:$rs2)),
@@ -684,90 +687,15 @@ multiclass ShxAddPat<int i, Instruction shxadd> {
684
687
(shxadd pat:$rs1, GPR:$rs2)>;
685
688
}
686
689
687
- class CSImm12MulBy4Pat<Instruction sh2add>
688
- : Pat<(add_like (XLenVT GPR:$r), CSImm12MulBy4:$i),
689
- (sh2add (XLenVT (ADDI (XLenVT X0), CSImm12MulBy4:$i)),
690
+ def : Pat<(add_like (XLenVT GPR:$r), CSImm12MulBy4:$i),
691
+ (SH2ADD (XLenVT (ADDI (XLenVT X0), CSImm12MulBy4:$i)),
690
692
GPR:$r)>;
691
-
692
- class CSImm12MulBy8Pat<Instruction sh3add>
693
- : Pat<(add_like (XLenVT GPR:$r), CSImm12MulBy8:$i),
694
- (sh3add (XLenVT (ADDI (XLenVT X0), CSImm12MulBy8:$i)),
693
+ def : Pat<(add_like (XLenVT GPR:$r), CSImm12MulBy8:$i),
694
+ (SH3ADD (XLenVT (ADDI (XLenVT X0), CSImm12MulBy8:$i)),
695
695
GPR:$r)>;
696
696
697
- let Predicates = [HasStdExtZba] in {
698
- foreach i = {1,2,3} in {
699
- defvar shxadd = !cast<Instruction>("SH"#i#"ADD");
700
- defm : ShxAddPat<i, shxadd>;
701
- }
702
-
703
- def : CSImm12MulBy4Pat<SH2ADD>;
704
- def : CSImm12MulBy8Pat<SH3ADD>;
705
697
} // Predicates = [HasStdExtZba]
706
698
707
- multiclass ADD_UWPat<Instruction add_uw> {
708
- def : Pat<(i64 (add_like_non_imm12 (and GPR:$rs1, 0xFFFFFFFF), GPR:$rs2)),
709
- (add_uw GPR:$rs1, GPR:$rs2)>;
710
- def : Pat<(i64 (and GPR:$rs, 0xFFFFFFFF)), (add_uw GPR:$rs, (XLenVT X0))>;
711
- }
712
-
713
- multiclass ShxAdd_UWPat<int i, Instruction shxadd_uw> {
714
- def : Pat<(i64 (add_like_non_imm12 (shl (and GPR:$rs1, 0xFFFFFFFF), (i64 i)),
715
- (XLenVT GPR:$rs2))),
716
- (shxadd_uw GPR:$rs1, GPR:$rs2)>;
717
- def : Pat<(i64 (riscv_shl_add (and GPR:$rs1, 0xFFFFFFFF), (i64 i), GPR:$rs2)),
718
- (shxadd_uw GPR:$rs1, GPR:$rs2)>;
719
-
720
- defvar pat = !cast<ComplexPattern>("sh"#i#"add_uw_op");
721
- // More complex cases use a ComplexPattern.
722
- def : Pat<(i64 (add_like_non_imm12 pat:$rs1, (XLenVT GPR:$rs2))),
723
- (shxadd_uw pat:$rs1, GPR:$rs2)>;
724
- }
725
-
726
- multiclass Sh1Add_UWPat<Instruction sh1add_uw> {
727
- def : Pat<(i64 (add_like_non_imm12 (and (shl GPR:$rs1, (i64 1)), 0x1FFFFFFFF),
728
- (XLenVT GPR:$rs2))),
729
- (sh1add_uw GPR:$rs1, GPR:$rs2)>;
730
- // Use SRLI to clear the LSBs and SHXADD_UW to mask and shift.
731
- def : Pat<(i64 (add_like_non_imm12 (and GPR:$rs1, 0x1FFFFFFFE),
732
- (XLenVT GPR:$rs2))),
733
- (sh1add_uw (XLenVT (SRLI GPR:$rs1, 1)), GPR:$rs2)>;
734
- }
735
-
736
- multiclass Sh2Add_UWPat<Instruction sh2add_uw> {
737
- def : Pat<(i64 (add_like_non_imm12 (and (shl GPR:$rs1, (i64 2)), 0x3FFFFFFFF),
738
- (XLenVT GPR:$rs2))),
739
- (sh2add_uw GPR:$rs1, GPR:$rs2)>;
740
- // Use SRLI to clear the LSBs and SHXADD_UW to mask and shift.
741
- def : Pat<(i64 (add_like_non_imm12 (and GPR:$rs1, 0x3FFFFFFFC),
742
- (XLenVT GPR:$rs2))),
743
- (sh2add_uw (XLenVT (SRLI GPR:$rs1, 2)), GPR:$rs2)>;
744
- }
745
-
746
- multiclass Sh3Add_UWPat<Instruction sh3add_uw> {
747
- def : Pat<(i64 (add_like_non_imm12 (and GPR:$rs1, 0xFFFFFFF8),
748
- (XLenVT GPR:$rs2))),
749
- (sh3add_uw (XLenVT (SRLIW GPR:$rs1, 3)), GPR:$rs2)>;
750
- // Use SRLI to clear the LSBs and SHXADD_UW to mask and shift.
751
- def : Pat<(i64 (add_like_non_imm12 (and GPR:$rs1, 0x7FFFFFFF8),
752
- (XLenVT GPR:$rs2))),
753
- (sh3add_uw (XLenVT (SRLI GPR:$rs1, 3)), GPR:$rs2)>;
754
- }
755
-
756
- class Sh1AddPat<Instruction sh1add>
757
- : Pat<(i64 (add_like_non_imm12 (and GPR:$rs1, 0xFFFFFFFE),
758
- (XLenVT GPR:$rs2))),
759
- (sh1add (XLenVT (SRLIW GPR:$rs1, 1)), GPR:$rs2)>;
760
-
761
- class Sh2AddPat<Instruction sh2add>
762
- : Pat<(i64 (add_like_non_imm12 (and GPR:$rs1, 0xFFFFFFFC),
763
- (XLenVT GPR:$rs2))),
764
- (sh2add (XLenVT (SRLIW GPR:$rs1, 2)), GPR:$rs2)>;
765
-
766
- class Sh3AddPat<Instruction sh3add>
767
- : Pat<(i64 (add_like_non_imm12 (and GPR:$rs1, 0xFFFFFFF8),
768
- (XLenVT GPR:$rs2))),
769
- (sh3add (XLenVT (SRLIW GPR:$rs1, 3)), GPR:$rs2)>;
770
-
771
699
let Predicates = [HasStdExtZba, IsRV64] in {
772
700
def : Pat<(i64 (shl (and GPR:$rs1, 0xFFFFFFFF), uimm5:$shamt)),
773
701
(SLLI_UW GPR:$rs1, uimm5:$shamt)>;
@@ -776,21 +704,47 @@ def : Pat<(i64 (shl (and GPR:$rs1, 0xFFFFFFFF), uimm5:$shamt)),
776
704
def : Pat<(i64 (and GPR:$rs1, Shifted32OnesMask:$mask)),
777
705
(SLLI_UW (XLenVT (SRLI GPR:$rs1, Shifted32OnesMask:$mask)),
778
706
Shifted32OnesMask:$mask)>;
779
-
780
- defm : ADD_UWPat<ADD_UW>;
707
+ def : Pat<(i64 (add_like_non_imm12 (and GPR:$rs1, 0xFFFFFFFF), GPR:$rs2)),
708
+ (ADD_UW GPR:$rs1, GPR:$rs2)>;
709
+ def : Pat<(i64 (and GPR:$rs, 0xFFFFFFFF)), (ADD_UW GPR:$rs, (XLenVT X0))>;
781
710
782
711
foreach i = {1,2,3} in {
783
712
defvar shxadd_uw = !cast<Instruction>("SH"#i#"ADD_UW");
784
- defm : ShxAdd_UWPat<i, shxadd_uw>;
713
+ def : Pat<(i64 (add_like_non_imm12 (shl (and GPR:$rs1, 0xFFFFFFFF), (i64 i)), (XLenVT GPR:$rs2))),
714
+ (shxadd_uw GPR:$rs1, GPR:$rs2)>;
715
+ def : Pat<(i64 (riscv_shl_add (and GPR:$rs1, 0xFFFFFFFF), (i64 i), GPR:$rs2)),
716
+ (shxadd_uw GPR:$rs1, GPR:$rs2)>;
717
+ }
718
+
719
+ def : Pat<(i64 (add_like_non_imm12 (and (shl GPR:$rs1, (i64 1)), 0x1FFFFFFFF), (XLenVT GPR:$rs2))),
720
+ (SH1ADD_UW GPR:$rs1, GPR:$rs2)>;
721
+ def : Pat<(i64 (add_like_non_imm12 (and (shl GPR:$rs1, (i64 2)), 0x3FFFFFFFF), (XLenVT GPR:$rs2))),
722
+ (SH2ADD_UW GPR:$rs1, GPR:$rs2)>;
723
+ def : Pat<(i64 (add_like_non_imm12 (and (shl GPR:$rs1, (i64 3)), 0x7FFFFFFFF), (XLenVT GPR:$rs2))),
724
+ (SH3ADD_UW GPR:$rs1, GPR:$rs2)>;
725
+
726
+ // More complex cases use a ComplexPattern.
727
+ foreach i = {1,2,3} in {
728
+ defvar pat = !cast<ComplexPattern>("sh"#i#"add_uw_op");
729
+ def : Pat<(i64 (add_like_non_imm12 pat:$rs1, (XLenVT GPR:$rs2))),
730
+ (!cast<Instruction>("SH"#i#"ADD_UW") pat:$rs1, GPR:$rs2)>;
785
731
}
786
732
787
- defm : Sh1Add_UWPat<SH1ADD_UW>;
788
- defm : Sh2Add_UWPat<SH2ADD_UW>;
789
- defm : Sh3Add_UWPat<SH3ADD_UW>;
733
+ def : Pat<(i64 (add_like_non_imm12 (and GPR:$rs1, 0xFFFFFFFE), (XLenVT GPR:$rs2))),
734
+ (SH1ADD (XLenVT (SRLIW GPR:$rs1, 1)), GPR:$rs2)>;
735
+ def : Pat<(i64 (add_like_non_imm12 (and GPR:$rs1, 0xFFFFFFFC), (XLenVT GPR:$rs2))),
736
+ (SH2ADD (XLenVT (SRLIW GPR:$rs1, 2)), GPR:$rs2)>;
737
+ def : Pat<(i64 (add_like_non_imm12 (and GPR:$rs1, 0xFFFFFFF8), (XLenVT GPR:$rs2))),
738
+ (SH3ADD (XLenVT (SRLIW GPR:$rs1, 3)), GPR:$rs2)>;
739
+
740
+ // Use SRLI to clear the LSBs and SHXADD_UW to mask and shift.
741
+ def : Pat<(i64 (add_like_non_imm12 (and GPR:$rs1, 0x1FFFFFFFE), (XLenVT GPR:$rs2))),
742
+ (SH1ADD_UW (XLenVT (SRLI GPR:$rs1, 1)), GPR:$rs2)>;
743
+ def : Pat<(i64 (add_like_non_imm12 (and GPR:$rs1, 0x3FFFFFFFC), (XLenVT GPR:$rs2))),
744
+ (SH2ADD_UW (XLenVT (SRLI GPR:$rs1, 2)), GPR:$rs2)>;
745
+ def : Pat<(i64 (add_like_non_imm12 (and GPR:$rs1, 0x7FFFFFFF8), (XLenVT GPR:$rs2))),
746
+ (SH3ADD_UW (XLenVT (SRLI GPR:$rs1, 3)), GPR:$rs2)>;
790
747
791
- def : Sh1AddPat<SH1ADD>;
792
- def : Sh2AddPat<SH2ADD>;
793
- def : Sh3AddPat<SH3ADD>;
794
748
} // Predicates = [HasStdExtZba, IsRV64]
795
749
796
750
let Predicates = [HasStdExtZbcOrZbkc] in {
0 commit comments