@@ -923,10 +923,9 @@ class ZPRRegOp <string Suffix, AsmOperandClass C, ElementSizeEnum Size,
923
923
//******************************************************************************
924
924
925
925
// 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",
928
927
[ nxv16i1, nxv8i1, nxv4i1, nxv2i1, nxv1i1 ], 16,
929
- (sequence "P%u", firstreg, lastreg)> {
928
+ (sequence "P%u", firstreg, lastreg, step )> {
930
929
let Size = 16;
931
930
}
932
931
@@ -940,6 +939,8 @@ def PPR_p8to15 : PPRClass<8, 15> {
940
939
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::PNRRegClassID, 8, 8>";
941
940
}
942
941
942
+ def PPRMul2 : PPRClass<0, 14, 2>;
943
+
943
944
class PPRAsmOperand <string name, string RegClass, int Width>: AsmOperandClass {
944
945
let Name = "SVE" # name # "Reg";
945
946
let PredicateMethod = "isSVEPredicateVectorRegOfWidth<"
@@ -1098,10 +1099,11 @@ class PPRVectorListMul<int ElementWidth, int NumRegs> : PPRVectorList<ElementWid
1098
1099
let DiagnosticType = "Invalid" # Name;
1099
1100
let PredicateMethod =
1100
1101
"isTypedVectorListMultiple<RegKind::SVEPredicateVector, " # NumRegs # ", 0, "
1101
- # ElementWidth # ">";
1102
+ # ElementWidth #
1103
+ ", AArch64::PPRMul2RegClassID>";
1102
1104
}
1103
1105
1104
- let EncoderMethod = "EncodeRegAsMultipleOf<2 >",
1106
+ let EncoderMethod = "EncodeRegMul_MinMax<2, 0, 14 >",
1105
1107
DecoderMethod = "DecodePPR2Mul2RegisterClass" in {
1106
1108
def PP_b_mul_r : RegisterOperand<PPR2Mul2, "printTypedVectorList<0,'b'>"> {
1107
1109
let ParserMatchClass = PPRVectorListMul<8, 2>;
@@ -1124,23 +1126,28 @@ let EncoderMethod = "EncodeRegAsMultipleOf<2>",
1124
1126
//******************************************************************************
1125
1127
1126
1128
// SVE vector register classes
1127
- class ZPRClass<int lastreg> : RegisterClass<"AArch64",
1129
+ class ZPRClass<int firstreg, int lastreg, int step = 1 > : RegisterClass<"AArch64",
1128
1130
[nxv16i8, nxv8i16, nxv4i32, nxv2i64,
1129
1131
nxv2f16, nxv4f16, nxv8f16,
1130
1132
nxv2bf16, nxv4bf16, nxv8bf16,
1131
1133
nxv2f32, nxv4f32,
1132
1134
nxv2f64],
1133
- 128, (sequence "Z%u", 0 , lastreg)> {
1135
+ 128, (sequence "Z%u", firstreg , lastreg, step )> {
1134
1136
let Size = 128;
1135
1137
}
1136
1138
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> {
1138
1145
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPRRegClassID, 0, 32>";
1139
1146
}
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.
1141
1148
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPRRegClassID, 0, 16>";
1142
1149
}
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.
1144
1151
let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPRRegClassID, 0, 8>";
1145
1152
}
1146
1153
@@ -1188,6 +1195,39 @@ def ZPR4b16 : ZPRRegOp<"h", ZPRAsmOp4b16, ElementSizeH, ZPR_4b>;
1188
1195
def ZPR4b32 : ZPRRegOp<"s", ZPRAsmOp4b32, ElementSizeS, ZPR_4b>;
1189
1196
def ZPR4b64 : ZPRRegOp<"d", ZPRAsmOp4b64, ElementSizeD, ZPR_4b>;
1190
1197
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
+
1191
1231
class FPRasZPR<int Width> : AsmOperandClass{
1192
1232
let Name = "FPR" # Width # "asZPR";
1193
1233
let PredicateMethod = "isFPRasZPR<AArch64::FPR" # Width # "RegClassID>";
@@ -1327,64 +1367,117 @@ def ZPR4Mul4 : RegisterClass<"AArch64", [untyped], 128, (add (decimate ZSeqQuads
1327
1367
let Size = 512;
1328
1368
}
1329
1369
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;
1332
1373
let DiagnosticType = "Invalid" # Name;
1333
1374
let PredicateMethod =
1334
- "isTypedVectorListMultiple<RegKind::SVEDataVector, " # NumRegs # ", 0, "
1335
- # ElementWidth # ">";
1375
+ "isTypedVectorListMultiple<RegKind::SVEDataVector, "
1376
+ # NumRegs # ", 0, "
1377
+ # ElementWidth # ", "
1378
+ # "AArch64::ZPR" # RegClassSuffix # "RegClassID" # ">";
1336
1379
}
1337
1380
1338
- let EncoderMethod = "EncodeRegAsMultipleOf<2 >",
1339
- DecoderMethod = "DecodeZPR2Mul2RegisterClass" in {
1381
+ let EncoderMethod = "EncodeRegMul_MinMax<2, 0, 30 >",
1382
+ DecoderMethod = "DecodeZPR2Mul2RegisterClass<0, 30> " in {
1340
1383
def ZZ_mul_r : RegisterOperand<ZPR2Mul2, "printTypedVectorList<0,0>"> {
1341
- let ParserMatchClass = ZPRVectorListMul<0, 2>;
1384
+ let ParserMatchClass = ZPRVectorListMul<0, 2, "Mul2" >;
1342
1385
}
1343
1386
1344
1387
def ZZ_b_mul_r : RegisterOperand<ZPR2Mul2, "printTypedVectorList<0,'b'>"> {
1345
- let ParserMatchClass = ZPRVectorListMul<8, 2>;
1388
+ let ParserMatchClass = ZPRVectorListMul<8, 2, "Mul2" >;
1346
1389
}
1347
1390
1348
1391
def ZZ_h_mul_r : RegisterOperand<ZPR2Mul2, "printTypedVectorList<0,'h'>"> {
1349
- let ParserMatchClass = ZPRVectorListMul<16, 2>;
1392
+ let ParserMatchClass = ZPRVectorListMul<16, 2, "Mul2" >;
1350
1393
}
1351
1394
1352
1395
def ZZ_s_mul_r : RegisterOperand<ZPR2Mul2, "printTypedVectorList<0,'s'>"> {
1353
- let ParserMatchClass = ZPRVectorListMul<32, 2>;
1396
+ let ParserMatchClass = ZPRVectorListMul<32, 2, "Mul2" >;
1354
1397
}
1355
1398
1356
1399
def ZZ_d_mul_r : RegisterOperand<ZPR2Mul2, "printTypedVectorList<0,'d'>"> {
1357
- let ParserMatchClass = ZPRVectorListMul<64, 2>;
1400
+ let ParserMatchClass = ZPRVectorListMul<64, 2, "Mul2" >;
1358
1401
}
1359
1402
1360
1403
def ZZ_q_mul_r : RegisterOperand<ZPR2Mul2, "printTypedVectorList<0,'q'>"> {
1361
- let ParserMatchClass = ZPRVectorListMul<128, 2>;
1404
+ let ParserMatchClass = ZPRVectorListMul<128, 2, "Mul2" >;
1362
1405
}
1363
1406
} // end let EncoderMethod/DecoderMethod
1364
1407
1365
- let EncoderMethod = "EncodeRegAsMultipleOf<4 >",
1408
+ let EncoderMethod = "EncodeRegMul_MinMax<4, 0, 28 >",
1366
1409
DecoderMethod = "DecodeZPR4Mul4RegisterClass" in {
1367
1410
def ZZZZ_b_mul_r : RegisterOperand<ZPR4Mul4, "printTypedVectorList<0,'b'>"> {
1368
- let ParserMatchClass = ZPRVectorListMul<8, 4>;
1411
+ let ParserMatchClass = ZPRVectorListMul<8, 4, "Mul4" >;
1369
1412
}
1370
1413
1371
1414
def ZZZZ_h_mul_r : RegisterOperand<ZPR4Mul4, "printTypedVectorList<0,'h'>"> {
1372
- let ParserMatchClass = ZPRVectorListMul<16, 4>;
1415
+ let ParserMatchClass = ZPRVectorListMul<16, 4, "Mul4" >;
1373
1416
}
1374
1417
1375
1418
def ZZZZ_s_mul_r : RegisterOperand<ZPR4Mul4, "printTypedVectorList<0,'s'>"> {
1376
- let ParserMatchClass = ZPRVectorListMul<32, 4>;
1419
+ let ParserMatchClass = ZPRVectorListMul<32, 4, "Mul4" >;
1377
1420
}
1378
1421
1379
1422
def ZZZZ_d_mul_r : RegisterOperand<ZPR4Mul4, "printTypedVectorList<0,'d'>"> {
1380
- let ParserMatchClass = ZPRVectorListMul<64, 4>;
1423
+ let ParserMatchClass = ZPRVectorListMul<64, 4, "Mul4" >;
1381
1424
}
1382
1425
1383
1426
def ZZZZ_q_mul_r : RegisterOperand<ZPR4Mul4, "printTypedVectorList<0,'q'>"> {
1384
- let ParserMatchClass = ZPRVectorListMul<128, 4>;
1427
+ let ParserMatchClass = ZPRVectorListMul<128, 4, "Mul4" >;
1385
1428
}
1386
1429
} // end let EncoderMethod/DecoderMethod
1387
1430
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
+
1388
1481
// SME2 strided multi-vector operands
1389
1482
1390
1483
// ZStridedPairs
0 commit comments