@@ -923,10 +923,9 @@ class ZPRRegOp <string Suffix, AsmOperandClass C, ElementSizeEnum Size,
923923//******************************************************************************
924924
925925// SVE predicate register classes.
926- class PPRClass<int firstreg, int lastreg> : RegisterClass<
927- "AArch64",
926+ class PPRClass<int firstreg, int lastreg, int step = 1> : RegisterClass<"AArch64",
928927 [ nxv16i1, nxv8i1, nxv4i1, nxv2i1, nxv1i1 ], 16,
929- (sequence "P%u", firstreg, lastreg)> {
928+ (sequence "P%u", firstreg, lastreg, step )> {
930929 let Size = 16;
931930}
932931
@@ -940,6 +939,8 @@ def PPR_p8to15 : PPRClass<8, 15> {
940939 let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::PNRRegClassID, 8, 8>";
941940}
942941
942+ def PPRMul2 : PPRClass<0, 14, 2>;
943+
943944class PPRAsmOperand <string name, string RegClass, int Width>: AsmOperandClass {
944945 let Name = "SVE" # name # "Reg";
945946 let PredicateMethod = "isSVEPredicateVectorRegOfWidth<"
@@ -1098,10 +1099,11 @@ class PPRVectorListMul<int ElementWidth, int NumRegs> : PPRVectorList<ElementWid
10981099 let DiagnosticType = "Invalid" # Name;
10991100 let PredicateMethod =
11001101 "isTypedVectorListMultiple<RegKind::SVEPredicateVector, " # NumRegs # ", 0, "
1101- # ElementWidth # ">";
1102+ # ElementWidth #
1103+ ", AArch64::PPRMul2RegClassID>";
11021104}
11031105
1104- let EncoderMethod = "EncodeRegAsMultipleOf<2 >",
1106+ let EncoderMethod = "EncodeRegMul_MinMax<2, 0, 14 >",
11051107 DecoderMethod = "DecodePPR2Mul2RegisterClass" in {
11061108 def PP_b_mul_r : RegisterOperand<PPR2Mul2, "printTypedVectorList<0,'b'>"> {
11071109 let ParserMatchClass = PPRVectorListMul<8, 2>;
@@ -1124,23 +1126,28 @@ let EncoderMethod = "EncodeRegAsMultipleOf<2>",
11241126//******************************************************************************
11251127
11261128// SVE vector register classes
1127- class ZPRClass<int lastreg> : RegisterClass<"AArch64",
1129+ class ZPRClass<int firstreg, int lastreg, int step = 1 > : RegisterClass<"AArch64",
11281130 [nxv16i8, nxv8i16, nxv4i32, nxv2i64,
11291131 nxv2f16, nxv4f16, nxv8f16,
11301132 nxv2bf16, nxv4bf16, nxv8bf16,
11311133 nxv2f32, nxv4f32,
11321134 nxv2f64],
1133- 128, (sequence "Z%u", 0 , lastreg)> {
1135+ 128, (sequence "Z%u", firstreg , lastreg, step )> {
11341136 let Size = 128;
11351137}
11361138
1137- def ZPR : ZPRClass<31> {
1139+ def ZPRMul2 : ZPRClass<0, 30, 2>;
1140+ def ZPRMul4 : ZPRClass<0, 28, 4>;
1141+ def ZPRMul2_Lo : ZPRClass<0, 14, 2>;
1142+ def ZPRMul2_Hi : ZPRClass<16, 30, 2>;
1143+
1144+ def ZPR : ZPRClass<0, 31> {
11381145 let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPRRegClassID, 0, 32>";
11391146}
1140- def ZPR_4b : ZPRClass<15> { // Restricted 4 bit SVE vector register class.
1147+ def ZPR_4b : ZPRClass<0, 15> { // Restricted 4 bit SVE vector register class.
11411148 let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPRRegClassID, 0, 16>";
11421149}
1143- def ZPR_3b : ZPRClass<7> { // Restricted 3 bit SVE vector register class.
1150+ def ZPR_3b : ZPRClass<0, 7> { // Restricted 3 bit SVE vector register class.
11441151 let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPRRegClassID, 0, 8>";
11451152}
11461153
@@ -1188,6 +1195,39 @@ def ZPR4b16 : ZPRRegOp<"h", ZPRAsmOp4b16, ElementSizeH, ZPR_4b>;
11881195def ZPR4b32 : ZPRRegOp<"s", ZPRAsmOp4b32, ElementSizeS, ZPR_4b>;
11891196def ZPR4b64 : ZPRRegOp<"d", ZPRAsmOp4b64, ElementSizeD, ZPR_4b>;
11901197
1198+ class ZPRMul2_MinToMaxRegOp<string Suffix, AsmOperandClass C, int Min, int Max, ElementSizeEnum Width, RegisterClass RC>
1199+ : ZPRRegOp<Suffix, C, Width, RC> {
1200+ let EncoderMethod = "EncodeRegMul_MinMax<2," # Min # ", " # Max # ">";
1201+ let DecoderMethod = "DecodeZPRMul2_MinMax<" # Min # ", " # Max # ">";
1202+ }
1203+
1204+ def ZPRMul2AsmOp8_Lo : ZPRAsmOperand<"VectorB_Lo", 8, "Mul2_Lo">;
1205+ def ZPRMul2AsmOp8_Hi : ZPRAsmOperand<"VectorB_Hi", 8, "Mul2_Hi">;
1206+ def ZPRMul2AsmOp16_Lo : ZPRAsmOperand<"VectorH_Lo", 16, "Mul2_Lo">;
1207+ def ZPRMul2AsmOp16_Hi : ZPRAsmOperand<"VectorH_Hi", 16, "Mul2_Hi">;
1208+ def ZPRMul2AsmOp32_Lo : ZPRAsmOperand<"VectorS_Lo", 32, "Mul2_Lo">;
1209+ def ZPRMul2AsmOp32_Hi : ZPRAsmOperand<"VectorS_Hi", 32, "Mul2_Hi">;
1210+ def ZPRMul2AsmOp64_Lo : ZPRAsmOperand<"VectorD_Lo", 64, "Mul2_Lo">;
1211+ def ZPRMul2AsmOp64_Hi : ZPRAsmOperand<"VectorD_Hi", 64, "Mul2_Hi">;
1212+
1213+ def ZPR_K : RegisterClass<"AArch64", [untyped], 128,
1214+ (add Z20, Z21, Z22, Z23, Z28, Z29, Z30, Z31)>;
1215+
1216+ def ZK : RegisterOperand<ZPR_K, "printSVERegOp<>">{
1217+ let EncoderMethod = "EncodeZK";
1218+ let DecoderMethod = "DecodeZK";
1219+ let ParserMatchClass = ZPRAsmOperand<"Vector_20to23or28to31", 0, "_K">;
1220+ }
1221+
1222+ def ZPR8Mul2_Lo : ZPRMul2_MinToMaxRegOp<"b", ZPRMul2AsmOp8_Lo, 0, 14, ElementSizeB, ZPRMul2_Lo>;
1223+ def ZPR8Mul2_Hi : ZPRMul2_MinToMaxRegOp<"b", ZPRMul2AsmOp8_Hi, 16, 30, ElementSizeB, ZPRMul2_Hi>;
1224+ def ZPR16Mul2_Lo : ZPRMul2_MinToMaxRegOp<"h", ZPRMul2AsmOp16_Lo, 0, 14, ElementSizeH, ZPRMul2_Lo>;
1225+ def ZPR16Mul2_Hi : ZPRMul2_MinToMaxRegOp<"h", ZPRMul2AsmOp16_Hi, 16, 30, ElementSizeH, ZPRMul2_Hi>;
1226+ def ZPR32Mul2_Lo : ZPRMul2_MinToMaxRegOp<"s", ZPRMul2AsmOp32_Lo, 0, 14, ElementSizeS, ZPRMul2_Lo>;
1227+ def ZPR32Mul2_Hi : ZPRMul2_MinToMaxRegOp<"s", ZPRMul2AsmOp32_Hi, 16, 30, ElementSizeS, ZPRMul2_Hi>;
1228+ def ZPR64Mul2_Lo : ZPRMul2_MinToMaxRegOp<"d", ZPRMul2AsmOp64_Lo, 0, 14, ElementSizeD, ZPRMul2_Lo>;
1229+ def ZPR64Mul2_Hi : ZPRMul2_MinToMaxRegOp<"d", ZPRMul2AsmOp64_Hi, 16, 30, ElementSizeD, ZPRMul2_Hi>;
1230+
11911231class FPRasZPR<int Width> : AsmOperandClass{
11921232 let Name = "FPR" # Width # "asZPR";
11931233 let PredicateMethod = "isFPRasZPR<AArch64::FPR" # Width # "RegClassID>";
@@ -1327,64 +1367,117 @@ def ZPR4Mul4 : RegisterClass<"AArch64", [untyped], 128, (add (decimate ZSeqQuads
13271367 let Size = 512;
13281368}
13291369
1330- class ZPRVectorListMul<int ElementWidth, int NumRegs> : ZPRVectorList<ElementWidth, NumRegs> {
1331- let Name = "SVEVectorListMul" # NumRegs # "x" # ElementWidth;
1370+ class ZPRVectorListMul<int ElementWidth, int NumRegs, string RegClassSuffix = "">
1371+ : ZPRVectorList<ElementWidth, NumRegs> {
1372+ let Name = "SVEVectorList" # NumRegs # "x" # ElementWidth # RegClassSuffix;
13321373 let DiagnosticType = "Invalid" # Name;
13331374 let PredicateMethod =
1334- "isTypedVectorListMultiple<RegKind::SVEDataVector, " # NumRegs # ", 0, "
1335- # ElementWidth # ">";
1375+ "isTypedVectorListMultiple<RegKind::SVEDataVector, "
1376+ # NumRegs # ", 0, "
1377+ # ElementWidth # ", "
1378+ # "AArch64::ZPR" # RegClassSuffix # "RegClassID" # ">";
13361379}
13371380
1338- let EncoderMethod = "EncodeRegAsMultipleOf<2 >",
1339- DecoderMethod = "DecodeZPR2Mul2RegisterClass" in {
1381+ let EncoderMethod = "EncodeRegMul_MinMax<2, 0, 30 >",
1382+ DecoderMethod = "DecodeZPR2Mul2RegisterClass<0, 30> " in {
13401383 def ZZ_mul_r : RegisterOperand<ZPR2Mul2, "printTypedVectorList<0,0>"> {
1341- let ParserMatchClass = ZPRVectorListMul<0, 2>;
1384+ let ParserMatchClass = ZPRVectorListMul<0, 2, "Mul2" >;
13421385 }
13431386
13441387 def ZZ_b_mul_r : RegisterOperand<ZPR2Mul2, "printTypedVectorList<0,'b'>"> {
1345- let ParserMatchClass = ZPRVectorListMul<8, 2>;
1388+ let ParserMatchClass = ZPRVectorListMul<8, 2, "Mul2" >;
13461389 }
13471390
13481391 def ZZ_h_mul_r : RegisterOperand<ZPR2Mul2, "printTypedVectorList<0,'h'>"> {
1349- let ParserMatchClass = ZPRVectorListMul<16, 2>;
1392+ let ParserMatchClass = ZPRVectorListMul<16, 2, "Mul2" >;
13501393 }
13511394
13521395 def ZZ_s_mul_r : RegisterOperand<ZPR2Mul2, "printTypedVectorList<0,'s'>"> {
1353- let ParserMatchClass = ZPRVectorListMul<32, 2>;
1396+ let ParserMatchClass = ZPRVectorListMul<32, 2, "Mul2" >;
13541397 }
13551398
13561399 def ZZ_d_mul_r : RegisterOperand<ZPR2Mul2, "printTypedVectorList<0,'d'>"> {
1357- let ParserMatchClass = ZPRVectorListMul<64, 2>;
1400+ let ParserMatchClass = ZPRVectorListMul<64, 2, "Mul2" >;
13581401 }
13591402
13601403 def ZZ_q_mul_r : RegisterOperand<ZPR2Mul2, "printTypedVectorList<0,'q'>"> {
1361- let ParserMatchClass = ZPRVectorListMul<128, 2>;
1404+ let ParserMatchClass = ZPRVectorListMul<128, 2, "Mul2" >;
13621405 }
13631406} // end let EncoderMethod/DecoderMethod
13641407
1365- let EncoderMethod = "EncodeRegAsMultipleOf<4 >",
1408+ let EncoderMethod = "EncodeRegMul_MinMax<4, 0, 28 >",
13661409 DecoderMethod = "DecodeZPR4Mul4RegisterClass" in {
13671410 def ZZZZ_b_mul_r : RegisterOperand<ZPR4Mul4, "printTypedVectorList<0,'b'>"> {
1368- let ParserMatchClass = ZPRVectorListMul<8, 4>;
1411+ let ParserMatchClass = ZPRVectorListMul<8, 4, "Mul4" >;
13691412 }
13701413
13711414 def ZZZZ_h_mul_r : RegisterOperand<ZPR4Mul4, "printTypedVectorList<0,'h'>"> {
1372- let ParserMatchClass = ZPRVectorListMul<16, 4>;
1415+ let ParserMatchClass = ZPRVectorListMul<16, 4, "Mul4" >;
13731416 }
13741417
13751418 def ZZZZ_s_mul_r : RegisterOperand<ZPR4Mul4, "printTypedVectorList<0,'s'>"> {
1376- let ParserMatchClass = ZPRVectorListMul<32, 4>;
1419+ let ParserMatchClass = ZPRVectorListMul<32, 4, "Mul4" >;
13771420 }
13781421
13791422 def ZZZZ_d_mul_r : RegisterOperand<ZPR4Mul4, "printTypedVectorList<0,'d'>"> {
1380- let ParserMatchClass = ZPRVectorListMul<64, 4>;
1423+ let ParserMatchClass = ZPRVectorListMul<64, 4, "Mul4" >;
13811424 }
13821425
13831426 def ZZZZ_q_mul_r : RegisterOperand<ZPR4Mul4, "printTypedVectorList<0,'q'>"> {
1384- let ParserMatchClass = ZPRVectorListMul<128, 4>;
1427+ let ParserMatchClass = ZPRVectorListMul<128, 4, "Mul4" >;
13851428 }
13861429} // end let EncoderMethod/DecoderMethod
13871430
1431+ // Pairs of consecutive ZPR, starting with an even register, split into
1432+ // Lo=0-14 and Hi=16-30.
1433+ def ZPR2Mul2_Lo : RegisterClass<"AArch64", [untyped], 128,
1434+ (trunc (decimate ZSeqPairs, 2), 8)> {
1435+ let Size = 256;
1436+ }
1437+
1438+ def ZPR2Mul2_Hi : RegisterClass<"AArch64", [untyped], 128,
1439+ (trunc (rotr (decimate ZSeqPairs, 2), 8), 8)> {
1440+ let Size = 256;
1441+ }
1442+
1443+ let EncoderMethod = "EncodeRegMul_MinMax<2, 0, 14>",
1444+ DecoderMethod = "DecodeZPR2Mul2RegisterClass<0, 16>" in {
1445+ def ZZ_b_mul_r_Lo : RegisterOperand<ZPR2Mul2_Lo, "printTypedVectorList<0,'b'>"> {
1446+ let ParserMatchClass = ZPRVectorListMul<8, 2, "Mul2_Lo">;
1447+ }
1448+
1449+ def ZZ_h_mul_r_Lo : RegisterOperand<ZPR2Mul2_Lo, "printTypedVectorList<0,'h'>"> {
1450+ let ParserMatchClass = ZPRVectorListMul<16, 2, "Mul2_Lo">;
1451+ }
1452+
1453+ def ZZ_s_mul_r_Lo : RegisterOperand<ZPR2Mul2_Lo, "printTypedVectorList<0,'s'>"> {
1454+ let ParserMatchClass = ZPRVectorListMul<32, 2, "Mul2_Lo">;
1455+ }
1456+
1457+ def ZZ_d_mul_r_Lo : RegisterOperand<ZPR2Mul2_Lo, "printTypedVectorList<0,'d'>"> {
1458+ let ParserMatchClass = ZPRVectorListMul<64, 2, "Mul2_Lo">;
1459+ }
1460+ }
1461+
1462+ let EncoderMethod = "EncodeRegMul_MinMax<2, 16, 30>",
1463+ DecoderMethod = "DecodeZPR2Mul2RegisterClass<16, 31>" in {
1464+ def ZZ_b_mul_r_Hi : RegisterOperand<ZPR2Mul2_Hi, "printTypedVectorList<0,'b'>"> {
1465+ let ParserMatchClass = ZPRVectorListMul<8, 2, "Mul2_Hi">;
1466+ }
1467+
1468+ def ZZ_h_mul_r_Hi : RegisterOperand<ZPR2Mul2_Hi, "printTypedVectorList<0,'h'>"> {
1469+ let ParserMatchClass = ZPRVectorListMul<16, 2, "Mul2_Hi">;
1470+ }
1471+
1472+ def ZZ_s_mul_r_Hi : RegisterOperand<ZPR2Mul2_Hi, "printTypedVectorList<0,'s'>"> {
1473+ let ParserMatchClass = ZPRVectorListMul<32, 2, "Mul2_Hi">;
1474+ }
1475+
1476+ def ZZ_d_mul_r_Hi : RegisterOperand<ZPR2Mul2_Hi, "printTypedVectorList<0,'d'>"> {
1477+ let ParserMatchClass = ZPRVectorListMul<64, 2, "Mul2_Hi">;
1478+ }
1479+ } // end let EncoderMethod/DecoderMethod
1480+
13881481// SME2 strided multi-vector operands
13891482
13901483// ZStridedPairs
0 commit comments