@@ -51,6 +51,8 @@ let Namespace = "AArch64" in {
51
51
def zasubd1 : SubRegIndex<256>; // (16 x 16)/8 bytes = 256 bits
52
52
def zasubq0 : SubRegIndex<128>; // (16 x 16)/16 bytes = 128 bits
53
53
def zasubq1 : SubRegIndex<128>; // (16 x 16)/16 bytes = 128 bits
54
+
55
+ def psub : SubRegIndex<16>;
54
56
}
55
57
56
58
let Namespace = "AArch64" in {
@@ -763,23 +765,43 @@ def GPR64x8 : RegisterOperand<GPR64x8Class, "printGPR64x8"> {
763
765
764
766
//===----- END: v8.7a accelerator extension register operands -------------===//
765
767
768
+ // SVE predicate-as-counter registers
769
+ def PN0 : AArch64Reg<0, "pn0">, DwarfRegNum<[48]>;
770
+ def PN1 : AArch64Reg<1, "pn1">, DwarfRegNum<[49]>;
771
+ def PN2 : AArch64Reg<2, "pn2">, DwarfRegNum<[50]>;
772
+ def PN3 : AArch64Reg<3, "pn3">, DwarfRegNum<[51]>;
773
+ def PN4 : AArch64Reg<4, "pn4">, DwarfRegNum<[52]>;
774
+ def PN5 : AArch64Reg<5, "pn5">, DwarfRegNum<[53]>;
775
+ def PN6 : AArch64Reg<6, "pn6">, DwarfRegNum<[54]>;
776
+ def PN7 : AArch64Reg<7, "pn7">, DwarfRegNum<[55]>;
777
+ def PN8 : AArch64Reg<8, "pn8">, DwarfRegNum<[56]>;
778
+ def PN9 : AArch64Reg<9, "pn9">, DwarfRegNum<[57]>;
779
+ def PN10 : AArch64Reg<10, "pn10">, DwarfRegNum<[58]>;
780
+ def PN11 : AArch64Reg<11, "pn11">, DwarfRegNum<[59]>;
781
+ def PN12 : AArch64Reg<12, "pn12">, DwarfRegNum<[60]>;
782
+ def PN13 : AArch64Reg<13, "pn13">, DwarfRegNum<[61]>;
783
+ def PN14 : AArch64Reg<14, "pn14">, DwarfRegNum<[62]>;
784
+ def PN15 : AArch64Reg<15, "pn15">, DwarfRegNum<[63]>;
785
+
766
786
// SVE predicate registers
767
- def P0 : AArch64Reg<0, "p0">, DwarfRegNum<[48]>;
768
- def P1 : AArch64Reg<1, "p1">, DwarfRegNum<[49]>;
769
- def P2 : AArch64Reg<2, "p2">, DwarfRegNum<[50]>;
770
- def P3 : AArch64Reg<3, "p3">, DwarfRegNum<[51]>;
771
- def P4 : AArch64Reg<4, "p4">, DwarfRegNum<[52]>;
772
- def P5 : AArch64Reg<5, "p5">, DwarfRegNum<[53]>;
773
- def P6 : AArch64Reg<6, "p6">, DwarfRegNum<[54]>;
774
- def P7 : AArch64Reg<7, "p7">, DwarfRegNum<[55]>;
775
- def P8 : AArch64Reg<8, "p8">, DwarfRegNum<[56]>;
776
- def P9 : AArch64Reg<9, "p9">, DwarfRegNum<[57]>;
777
- def P10 : AArch64Reg<10, "p10">, DwarfRegNum<[58]>;
778
- def P11 : AArch64Reg<11, "p11">, DwarfRegNum<[59]>;
779
- def P12 : AArch64Reg<12, "p12">, DwarfRegNum<[60]>;
780
- def P13 : AArch64Reg<13, "p13">, DwarfRegNum<[61]>;
781
- def P14 : AArch64Reg<14, "p14">, DwarfRegNum<[62]>;
782
- def P15 : AArch64Reg<15, "p15">, DwarfRegNum<[63]>;
787
+ let SubRegIndices = [psub] in {
788
+ def P0 : AArch64Reg<0, "p0", [PN0]>, DwarfRegAlias<PN0>;
789
+ def P1 : AArch64Reg<1, "p1", [PN1]>, DwarfRegAlias<PN1>;
790
+ def P2 : AArch64Reg<2, "p2", [PN2]>, DwarfRegAlias<PN2>;
791
+ def P3 : AArch64Reg<3, "p3", [PN3]>, DwarfRegAlias<PN3>;
792
+ def P4 : AArch64Reg<4, "p4", [PN4]>, DwarfRegAlias<PN4>;
793
+ def P5 : AArch64Reg<5, "p5", [PN5]>, DwarfRegAlias<PN5>;
794
+ def P6 : AArch64Reg<6, "p6", [PN6]>, DwarfRegAlias<PN6>;
795
+ def P7 : AArch64Reg<7, "p7", [PN7]>, DwarfRegAlias<PN7>;
796
+ def P8 : AArch64Reg<8, "p8", [PN8]>, DwarfRegAlias<PN8>;
797
+ def P9 : AArch64Reg<9, "p9", [PN9]>, DwarfRegAlias<PN9>;
798
+ def P10 : AArch64Reg<10, "p10", [PN10]>, DwarfRegAlias<PN10>;
799
+ def P11 : AArch64Reg<11, "p11", [PN11]>, DwarfRegAlias<PN11>;
800
+ def P12 : AArch64Reg<12, "p12", [PN12]>, DwarfRegAlias<PN12>;
801
+ def P13 : AArch64Reg<13, "p13", [PN13]>, DwarfRegAlias<PN13>;
802
+ def P14 : AArch64Reg<14, "p14", [PN14]>, DwarfRegAlias<PN14>;
803
+ def P15 : AArch64Reg<15, "p15", [PN15]>, DwarfRegAlias<PN15>;
804
+ }
783
805
784
806
// SVE variable-size vector registers
785
807
let SubRegIndices = [zsub] in {
@@ -842,8 +864,6 @@ class SVERegOp <string Suffix, AsmOperandClass C,
842
864
let ParserMatchClass = C;
843
865
}
844
866
845
- class PPRRegOp <string Suffix, AsmOperandClass C, ElementSizeEnum Size,
846
- RegisterClass RC> : SVERegOp<Suffix, C, Size, RC> {}
847
867
class ZPRRegOp <string Suffix, AsmOperandClass C, ElementSizeEnum Size,
848
868
RegisterClass RC> : SVERegOp<Suffix, C, Size, RC> {}
849
869
@@ -852,7 +872,7 @@ class ZPRRegOp <string Suffix, AsmOperandClass C, ElementSizeEnum Size,
852
872
// SVE predicate register classes.
853
873
class PPRClass<int firstreg, int lastreg> : RegisterClass<
854
874
"AArch64",
855
- [ nxv16i1, nxv8i1, nxv4i1, nxv2i1, nxv1i1, aarch64svcount ], 16,
875
+ [ nxv16i1, nxv8i1, nxv4i1, nxv2i1, nxv1i1 ], 16,
856
876
(sequence "P%u", firstreg, lastreg)> {
857
877
let Size = 16;
858
878
}
@@ -870,69 +890,89 @@ class PPRAsmOperand <string name, string RegClass, int Width>: AsmOperandClass {
870
890
let ParserMethod = "tryParseSVEPredicateVector<RegKind::SVEPredicateVector>";
871
891
}
872
892
873
- def PPRAsmOpAny : PPRAsmOperand<"PredicateAny", "PPR", 0>;
874
- def PPRAsmOp8 : PPRAsmOperand<"PredicateB", "PPR", 8>;
875
- def PPRAsmOp16 : PPRAsmOperand<"PredicateH", "PPR", 16>;
876
- def PPRAsmOp32 : PPRAsmOperand<"PredicateS", "PPR", 32>;
877
- def PPRAsmOp64 : PPRAsmOperand<"PredicateD", "PPR", 64>;
878
-
879
- def PPRAny : PPRRegOp<"", PPRAsmOpAny, ElementSizeNone, PPR>;
880
- def PPR8 : PPRRegOp<"b", PPRAsmOp8, ElementSizeB, PPR>;
881
- def PPR16 : PPRRegOp<"h", PPRAsmOp16, ElementSizeH, PPR>;
882
- def PPR32 : PPRRegOp<"s", PPRAsmOp32, ElementSizeS, PPR>;
883
- def PPR64 : PPRRegOp<"d", PPRAsmOp64, ElementSizeD, PPR>;
884
-
893
+ def PPRAsmOpAny : PPRAsmOperand<"PredicateAny", "PPR", 0>;
894
+ def PPRAsmOp8 : PPRAsmOperand<"PredicateB", "PPR", 8>;
895
+ def PPRAsmOp16 : PPRAsmOperand<"PredicateH", "PPR", 16>;
896
+ def PPRAsmOp32 : PPRAsmOperand<"PredicateS", "PPR", 32>;
897
+ def PPRAsmOp64 : PPRAsmOperand<"PredicateD", "PPR", 64>;
885
898
def PPRAsmOp3bAny : PPRAsmOperand<"Predicate3bAny", "PPR_3b", 0>;
886
899
900
+ class PPRRegOp <string Suffix, AsmOperandClass C, ElementSizeEnum Size,
901
+ RegisterClass RC> : SVERegOp<Suffix, C, Size, RC> {}
902
+
903
+ def PPRAny : PPRRegOp<"", PPRAsmOpAny, ElementSizeNone, PPR>;
904
+ def PPR8 : PPRRegOp<"b", PPRAsmOp8, ElementSizeB, PPR>;
905
+ def PPR16 : PPRRegOp<"h", PPRAsmOp16, ElementSizeH, PPR>;
906
+ def PPR32 : PPRRegOp<"s", PPRAsmOp32, ElementSizeS, PPR>;
907
+ def PPR64 : PPRRegOp<"d", PPRAsmOp64, ElementSizeD, PPR>;
887
908
def PPR3bAny : PPRRegOp<"", PPRAsmOp3bAny, ElementSizeNone, PPR_3b>;
888
909
910
+ class PNRClass<int firstreg, int lastreg> : RegisterClass<
911
+ "AArch64",
912
+ [ aarch64svcount ], 16,
913
+ (sequence "PN%u", firstreg, lastreg)> {
914
+ let Size = 16;
915
+ }
916
+
917
+ def PNR : PNRClass<0, 15>;
918
+ def PNR_p8to15 : PNRClass<8, 15>;
889
919
890
920
// SVE predicate-as-counter operand
891
- class PNRAsmOperand<string name, string RegClass, int Width>
892
- : PPRAsmOperand<name, RegClass, Width> {
921
+ class PNRAsmOperand<string name, string RegClass, int Width>: AsmOperandClass {
922
+ let Name = "SVE" # name # "Reg";
893
923
let PredicateMethod = "isSVEPredicateAsCounterRegOfWidth<"
894
924
# Width # ", " # "AArch64::"
895
925
# RegClass # "RegClassID>";
896
926
let DiagnosticType = "InvalidSVE" # name # "Reg";
927
+ let RenderMethod = "addRegOperands";
897
928
let ParserMethod = "tryParseSVEPredicateVector<RegKind::SVEPredicateAsCounter>";
898
929
}
899
930
900
- class PNRRegOp<string Suffix, AsmOperandClass C, int EltSize, RegisterClass RC>
901
- : PPRRegOp<Suffix, C, ElementSizeNone, RC> {
902
- let PrintMethod = "printPredicateAsCounter<" # EltSize # ">" ;
931
+ let RenderMethod = "addPNRasPPRRegOperands" in {
932
+ def PNRasPPROpAny : PNRAsmOperand<"PNRasPPRPredicateAny", "PNR", 0>;
933
+ def PNRasPPROp8 : PNRAsmOperand<"PNRasPPRPredicateB", "PNR", 8> ;
903
934
}
904
935
905
- def PNRAsmOpAny: PNRAsmOperand<"PNPredicateAny", "PPR", 0>;
906
- def PNRAsmOp8 : PNRAsmOperand<"PNPredicateB", "PPR", 8>;
907
- def PNRAsmOp16 : PNRAsmOperand<"PNPredicateH", "PPR", 16>;
908
- def PNRAsmOp32 : PNRAsmOperand<"PNPredicateS", "PPR", 32>;
909
- def PNRAsmOp64 : PNRAsmOperand<"PNPredicateD", "PPR", 64>;
910
-
911
- def PNRAny : PNRRegOp<"", PNRAsmOpAny, 0, PPR>;
912
- def PNR8 : PNRRegOp<"b", PNRAsmOp8, 8, PPR>;
913
- def PNR16 : PNRRegOp<"h", PNRAsmOp16, 16, PPR>;
914
- def PNR32 : PNRRegOp<"s", PNRAsmOp32, 32, PPR>;
915
- def PNR64 : PNRRegOp<"d", PNRAsmOp64, 64, PPR>;
916
-
917
- class PNRP8to15RegOp<string Suffix, AsmOperandClass C, int EltSize, RegisterClass RC>
918
- : PPRRegOp<Suffix, C, ElementSizeNone, RC> {
919
- let PrintMethod = "printPredicateAsCounter<" # EltSize # ">";
920
- let EncoderMethod = "EncodePPR_p8to15";
921
- let DecoderMethod = "DecodePPR_p8to15RegisterClass";
922
- }
923
-
924
- def PNRAsmAny_p8to15 : PNRAsmOperand<"PNPredicateAny_p8to15", "PPR_p8to15", 0>;
925
- def PNRAsmOp8_p8to15 : PNRAsmOperand<"PNPredicateB_p8to15", "PPR_p8to15", 8>;
926
- def PNRAsmOp16_p8to15 : PNRAsmOperand<"PNPredicateH_p8to15", "PPR_p8to15", 16>;
927
- def PNRAsmOp32_p8to15 : PNRAsmOperand<"PNPredicateS_p8to15", "PPR_p8to15", 32>;
928
- def PNRAsmOp64_p8to15 : PNRAsmOperand<"PNPredicateD_p8to15", "PPR_p8to15", 64>;
929
-
930
- def PNRAny_p8to15 : PNRP8to15RegOp<"", PNRAsmAny_p8to15, 0, PPR_p8to15>;
931
- def PNR8_p8to15 : PNRP8to15RegOp<"b", PNRAsmOp8_p8to15, 8, PPR_p8to15>;
932
- def PNR16_p8to15 : PNRP8to15RegOp<"h", PNRAsmOp16_p8to15, 16, PPR_p8to15>;
933
- def PNR32_p8to15 : PNRP8to15RegOp<"s", PNRAsmOp32_p8to15, 32, PPR_p8to15>;
934
- def PNR64_p8to15 : PNRP8to15RegOp<"d", PNRAsmOp64_p8to15, 64, PPR_p8to15>;
936
+ class PNRasPPRRegOp<string Suffix, AsmOperandClass C, ElementSizeEnum Size,
937
+ RegisterClass RC> : SVERegOp<Suffix, C, Size, RC> {}
935
938
939
+ def PNRasPPRAny : PNRasPPRRegOp<"", PNRasPPROpAny, ElementSizeNone, PPR>;
940
+ def PNRasPPR8 : PNRasPPRRegOp<"b", PNRasPPROp8, ElementSizeB, PPR>;
941
+
942
+ def PNRAsmOpAny: PNRAsmOperand<"PNPredicateAny", "PNR", 0>;
943
+ def PNRAsmOp8 : PNRAsmOperand<"PNPredicateB", "PNR", 8>;
944
+ def PNRAsmOp16 : PNRAsmOperand<"PNPredicateH", "PNR", 16>;
945
+ def PNRAsmOp32 : PNRAsmOperand<"PNPredicateS", "PNR", 32>;
946
+ def PNRAsmOp64 : PNRAsmOperand<"PNPredicateD", "PNR", 64>;
947
+
948
+ class PNRRegOp<string Suffix, AsmOperandClass C, int Size, RegisterClass RC>
949
+ : SVERegOp<Suffix, C, ElementSizeNone, RC> {
950
+ let PrintMethod = "printPredicateAsCounter<" # Size # ">";
951
+ }
952
+ def PNRAny : PNRRegOp<"", PNRAsmOpAny, 0, PNR>;
953
+ def PNR8 : PNRRegOp<"b", PNRAsmOp8, 8, PNR>;
954
+ def PNR16 : PNRRegOp<"h", PNRAsmOp16, 16, PNR>;
955
+ def PNR32 : PNRRegOp<"s", PNRAsmOp32, 32, PNR>;
956
+ def PNR64 : PNRRegOp<"d", PNRAsmOp64, 64, PNR>;
957
+
958
+ def PNRAsmAny_p8to15 : PNRAsmOperand<"PNPredicateAny_p8to15", "PNR_p8to15", 0>;
959
+ def PNRAsmOp8_p8to15 : PNRAsmOperand<"PNPredicateB_p8to15", "PNR_p8to15", 8>;
960
+ def PNRAsmOp16_p8to15 : PNRAsmOperand<"PNPredicateH_p8to15", "PNR_p8to15", 16>;
961
+ def PNRAsmOp32_p8to15 : PNRAsmOperand<"PNPredicateS_p8to15", "PNR_p8to15", 32>;
962
+ def PNRAsmOp64_p8to15 : PNRAsmOperand<"PNPredicateD_p8to15", "PNR_p8to15", 64>;
963
+
964
+ class PNRP8to15RegOp<string Suffix, AsmOperandClass C, int Width, RegisterClass RC>
965
+ : SVERegOp<Suffix, C, ElementSizeNone, RC> {
966
+ let PrintMethod = "printPredicateAsCounter<" # Width # ">";
967
+ let EncoderMethod = "EncodePNR_p8to15";
968
+ let DecoderMethod = "DecodePNR_p8to15RegisterClass";
969
+ }
970
+
971
+ def PNRAny_p8to15 : PNRP8to15RegOp<"", PNRAsmAny_p8to15, 0, PNR_p8to15>;
972
+ def PNR8_p8to15 : PNRP8to15RegOp<"b", PNRAsmOp8_p8to15, 8, PNR_p8to15>;
973
+ def PNR16_p8to15 : PNRP8to15RegOp<"h", PNRAsmOp16_p8to15, 16, PNR_p8to15>;
974
+ def PNR32_p8to15 : PNRP8to15RegOp<"s", PNRAsmOp32_p8to15, 32, PNR_p8to15>;
975
+ def PNR64_p8to15 : PNRP8to15RegOp<"d", PNRAsmOp64_p8to15, 64, PNR_p8to15>;
936
976
937
977
let Namespace = "AArch64" in {
938
978
def psub0 : SubRegIndex<16, -1>;
0 commit comments