Skip to content

Commit 8c5b567

Browse files
committed
fixup: Add parsing and rendering functions
1 parent a229c76 commit 8c5b567

File tree

3 files changed

+50
-2
lines changed

3 files changed

+50
-2
lines changed

llvm/lib/Target/AArch64/AArch64RegisterInfo.td

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1010,8 +1010,20 @@ class PPRorPNRClass : RegisterClass<
10101010
(add PPR, PNR)> {
10111011
let Size = 16;
10121012
}
1013+
10131014
def PPRorPNR : PPRorPNRClass;
1014-
def PPRorPNRAsmOpAny : PPRAsmOperand<"PPRorPNRAny", "PPRorPNR", 0>;
1015+
1016+
class PPRorPNRAsmOperand<string name, string RegClass, int Width>: AsmOperandClass {
1017+
let Name = "SVE" # name # "Reg";
1018+
let PredicateMethod = "isSVEPredicateOrPredicateAsCounterRegOfWidth<"
1019+
# Width # ", " # "AArch64::"
1020+
# RegClass # "RegClassID>";
1021+
let DiagnosticType = "InvalidSVE" # name # "Reg";
1022+
let RenderMethod = "addPPRorPNRRegOperands";
1023+
let ParserMethod = "tryParseSVEPredicateOrPredicateAsCounterVector";
1024+
}
1025+
1026+
def PPRorPNRAsmOpAny : PPRorPNRAsmOperand<"PPRorPNRAny", "PPRorPNR", 0>;
10151027
def PPRorPNRAny : PPRRegOp<"", PPRorPNRAsmOpAny, ElementSizeNone, PPRorPNR>;
10161028

10171029
// Pairs of SVE predicate vector registers.

llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,8 @@ class AArch64AsmParser : public MCTargetAsmParser {
276276
ParseStatus tryParseSVEDataVector(OperandVector &Operands);
277277
template <RegKind RK>
278278
ParseStatus tryParseSVEPredicateVector(OperandVector &Operands);
279+
ParseStatus
280+
tryParseSVEPredicateOrPredicateAsCounterVector(OperandVector &Operands);
279281
template <RegKind VectorKind>
280282
ParseStatus tryParseVectorList(OperandVector &Operands,
281283
bool ExpectMatch = false);
@@ -1241,6 +1243,7 @@ class AArch64Operand : public MCParsedAsmOperand {
12411243
case AArch64::PPR_p8to15RegClassID:
12421244
case AArch64::PNRRegClassID:
12431245
case AArch64::PNR_p8to15RegClassID:
1246+
case AArch64::PPRorPNRRegClassID:
12441247
RK = RegKind::SVEPredicateAsCounter;
12451248
break;
12461249
default:
@@ -1264,6 +1267,7 @@ class AArch64Operand : public MCParsedAsmOperand {
12641267
case AArch64::PPR_p8to15RegClassID:
12651268
case AArch64::PNRRegClassID:
12661269
case AArch64::PNR_p8to15RegClassID:
1270+
case AArch64::PPRorPNRRegClassID:
12671271
RK = RegKind::SVEPredicateVector;
12681272
break;
12691273
default:
@@ -1290,6 +1294,20 @@ class AArch64Operand : public MCParsedAsmOperand {
12901294
return DiagnosticPredicateTy::NearMatch;
12911295
}
12921296

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+
12931311
template <int ElementWidth, unsigned Class>
12941312
DiagnosticPredicate isSVEPredicateAsCounterRegOfWidth() const {
12951313
if (Kind != k_Register || Reg.Kind != RegKind::SVEPredicateAsCounter)
@@ -1770,6 +1788,15 @@ class AArch64Operand : public MCParsedAsmOperand {
17701788
Inst.addOperand(MCOperand::createReg(AArch64::Z0 + getReg() - Base));
17711789
}
17721790

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+
17731800
void addPNRasPPRRegOperands(MCInst &Inst, unsigned N) const {
17741801
assert(N == 1 && "Invalid number of operands!");
17751802
Inst.addOperand(
@@ -4167,6 +4194,15 @@ ParseStatus AArch64AsmParser::tryParseVectorRegister(MCRegister &Reg,
41674194
return ParseStatus::NoMatch;
41684195
}
41694196

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+
41704206
/// tryParseSVEPredicateVector - Parse a SVE predicate register operand.
41714207
template <RegKind RK>
41724208
ParseStatus

llvm/lib/Target/AArch64/SVEInstrFormats.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7881,7 +7881,7 @@ multiclass sve_mem_p_fill<string asm> {
78817881
def NAME : sve_mem_p_fill<asm>;
78827882

78837883
def : InstAlias<asm # "\t$Pt, [$Rn]",
7884-
(!cast<Instruction>(NAME) PPRAny:$Pt, GPR64sp:$Rn, 0), 1>;
7884+
(!cast<Instruction>(NAME) PPRorPNRAny:$Pt, GPR64sp:$Rn, 0), 1>;
78857885
}
78867886

78877887
class sve2_mem_gldnt_vs_base<bits<5> opc, dag iops, string asm,

0 commit comments

Comments
 (0)