forked from OSchip/llvm-project
[AArch64][SVE] Asm: Add parsing of merging/zeroing suffix for SVE predicate vector operands
Summary: Parsing of the '/m' (merging) or '/z' (zeroing) suffix of a predicate operand. Patch [2/3] in a series to add predicated ADD/SUB instructions for SVE. Reviewers: rengolin, mcrosier, evandro, fhahn, echristo, MatzeB, t.p.northover Reviewed By: fhahn Subscribers: t.p.northover, MatzeB, aemerson, javed.absar, tschuett, llvm-commits, kristof.beyls Differential Revision: https://reviews.llvm.org/D41442 llvm-svn: 322070
This commit is contained in:
parent
eededdade9
commit
7868e74033
|
@ -469,12 +469,14 @@ def GenericAsmParserVariant : AsmParserVariant {
|
|||
int Variant = 0;
|
||||
string Name = "generic";
|
||||
string BreakCharacters = ".";
|
||||
string TokenizingCharacters = "[]*!/";
|
||||
}
|
||||
|
||||
def AppleAsmParserVariant : AsmParserVariant {
|
||||
int Variant = 1;
|
||||
string Name = "apple-neon";
|
||||
string BreakCharacters = ".";
|
||||
string TokenizingCharacters = "[]*!/";
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -2808,6 +2808,36 @@ AArch64AsmParser::tryParseSVEPredicateVector(OperandVector &Operands) {
|
|||
AArch64Operand::CreateReg(RegNum, RegKind::SVEPredicateVector,
|
||||
ElementWidth, S, getLoc(), getContext()));
|
||||
|
||||
// Not all predicates are followed by a '/m' or '/z'.
|
||||
MCAsmParser &Parser = getParser();
|
||||
if (Parser.getTok().isNot(AsmToken::Slash))
|
||||
return MatchOperand_Success;
|
||||
|
||||
// But when they do they shouldn't have an element type suffix.
|
||||
if (!Kind.empty()) {
|
||||
Error(S, "not expecting size suffix");
|
||||
return MatchOperand_ParseFail;
|
||||
}
|
||||
|
||||
// Add a literal slash as operand
|
||||
Operands.push_back(
|
||||
AArch64Operand::CreateToken("/" , false, getLoc(), getContext()));
|
||||
|
||||
Parser.Lex(); // Eat the slash.
|
||||
|
||||
// Zeroing or merging?
|
||||
StringRef Pred = Parser.getTok().getString().lower();
|
||||
if (Pred != "z" && Pred != "m") {
|
||||
Error(getLoc(), "expecting 'm' or 'z' predication");
|
||||
return MatchOperand_ParseFail;
|
||||
}
|
||||
|
||||
// Add zero/merge token.
|
||||
const char *ZM = Pred == "z" ? "z" : "m";
|
||||
Operands.push_back(
|
||||
AArch64Operand::CreateToken(ZM, false, getLoc(), getContext()));
|
||||
|
||||
Parser.Lex(); // Eat zero/merge token.
|
||||
return MatchOperand_Success;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue