@@ -276,6 +276,8 @@ class AArch64AsmParser : public MCTargetAsmParser {
276
276
ParseStatus tryParseSVEDataVector (OperandVector &Operands);
277
277
template <RegKind RK>
278
278
ParseStatus tryParseSVEPredicateVector (OperandVector &Operands);
279
+ ParseStatus
280
+ tryParseSVEPredicateOrPredicateAsCounterVector (OperandVector &Operands);
279
281
template <RegKind VectorKind>
280
282
ParseStatus tryParseVectorList (OperandVector &Operands,
281
283
bool ExpectMatch = false );
@@ -1241,6 +1243,7 @@ class AArch64Operand : public MCParsedAsmOperand {
1241
1243
case AArch64::PPR_p8to15RegClassID:
1242
1244
case AArch64::PNRRegClassID:
1243
1245
case AArch64::PNR_p8to15RegClassID:
1246
+ case AArch64::PPRorPNRRegClassID:
1244
1247
RK = RegKind::SVEPredicateAsCounter;
1245
1248
break ;
1246
1249
default :
@@ -1264,6 +1267,7 @@ class AArch64Operand : public MCParsedAsmOperand {
1264
1267
case AArch64::PPR_p8to15RegClassID:
1265
1268
case AArch64::PNRRegClassID:
1266
1269
case AArch64::PNR_p8to15RegClassID:
1270
+ case AArch64::PPRorPNRRegClassID:
1267
1271
RK = RegKind::SVEPredicateVector;
1268
1272
break ;
1269
1273
default :
@@ -1290,6 +1294,20 @@ class AArch64Operand : public MCParsedAsmOperand {
1290
1294
return DiagnosticPredicateTy::NearMatch;
1291
1295
}
1292
1296
1297
+ template <int ElementWidth, unsigned Class>
1298
+ DiagnosticPredicate isSVEPredicateOrPredicateAsCounterRegOfWidth () const {
1299
+ if (Kind != k_Register || (Reg.Kind != RegKind::SVEPredicateAsCounter &&
1300
+ Reg.Kind != RegKind::SVEPredicateVector))
1301
+ return DiagnosticPredicateTy::NoMatch;
1302
+
1303
+ if ((isSVEPredicateAsCounterReg<Class>() ||
1304
+ isSVEPredicateVectorRegOfWidth<ElementWidth, Class>()) &&
1305
+ (Reg.ElementWidth == ElementWidth))
1306
+ return DiagnosticPredicateTy::Match;
1307
+
1308
+ return DiagnosticPredicateTy::NearMatch;
1309
+ }
1310
+
1293
1311
template <int ElementWidth, unsigned Class>
1294
1312
DiagnosticPredicate isSVEPredicateAsCounterRegOfWidth () const {
1295
1313
if (Kind != k_Register || Reg.Kind != RegKind::SVEPredicateAsCounter)
@@ -1770,6 +1788,15 @@ class AArch64Operand : public MCParsedAsmOperand {
1770
1788
Inst.addOperand (MCOperand::createReg (AArch64::Z0 + getReg () - Base));
1771
1789
}
1772
1790
1791
+ void addPPRorPNRRegOperands (MCInst &Inst, unsigned N) const {
1792
+ assert (N == 1 && " Invalid number of operands!" );
1793
+ unsigned Reg = getReg ();
1794
+ // Normalise to PPR
1795
+ if (Reg >= AArch64::PN0)
1796
+ Reg = Reg - AArch64::PN0 + AArch64::P0;
1797
+ Inst.addOperand (MCOperand::createReg (Reg));
1798
+ }
1799
+
1773
1800
void addPNRasPPRRegOperands (MCInst &Inst, unsigned N) const {
1774
1801
assert (N == 1 && " Invalid number of operands!" );
1775
1802
Inst.addOperand (
@@ -4167,6 +4194,15 @@ ParseStatus AArch64AsmParser::tryParseVectorRegister(MCRegister &Reg,
4167
4194
return ParseStatus::NoMatch;
4168
4195
}
4169
4196
4197
+ ParseStatus AArch64AsmParser::tryParseSVEPredicateOrPredicateAsCounterVector (
4198
+ OperandVector &Operands) {
4199
+ ParseStatus Status =
4200
+ tryParseSVEPredicateVector<RegKind::SVEPredicateAsCounter>(Operands);
4201
+ if (!Status.isSuccess ())
4202
+ Status = tryParseSVEPredicateVector<RegKind::SVEPredicateVector>(Operands);
4203
+ return Status;
4204
+ }
4205
+
4170
4206
// / tryParseSVEPredicateVector - Parse a SVE predicate register operand.
4171
4207
template <RegKind RK>
4172
4208
ParseStatus
0 commit comments