summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp')
-rw-r--r--llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp112
1 files changed, 18 insertions, 94 deletions
diff --git a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
index d042370acf4..5736802affe 100644
--- a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
+++ b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
@@ -66,12 +66,6 @@ enum class RegKind {
SVEPredicateVector
};
-enum RegConstraintEqualityTy {
- EqualsReg,
- EqualsSuperReg,
- EqualsSubReg
-};
-
class AArch64AsmParser : public MCTargetAsmParser {
private:
StringRef Mnemonic; ///< Instruction mnemonic.
@@ -98,8 +92,7 @@ private:
bool parseOperand(OperandVector &Operands, bool isCondCode,
bool invertCondCode);
- bool showMatchError(SMLoc Loc, unsigned ErrCode, uint64_t ErrorInfo,
- OperandVector &Operands);
+ bool showMatchError(SMLoc Loc, unsigned ErrCode, OperandVector &Operands);
bool parseDirectiveArch(SMLoc L);
bool parseDirectiveCPU(SMLoc L);
@@ -146,8 +139,7 @@ private:
bool tryParseNeonVectorRegister(OperandVector &Operands);
OperandMatchResultTy tryParseVectorIndex(OperandVector &Operands);
OperandMatchResultTy tryParseGPRSeqPair(OperandVector &Operands);
- template <bool ParseShiftExtend,
- RegConstraintEqualityTy EqTy = RegConstraintEqualityTy::EqualsReg>
+ template <bool ParseShiftExtend>
OperandMatchResultTy tryParseGPROperand(OperandVector &Operands);
template <bool ParseShiftExtend, bool ParseSuffix>
OperandMatchResultTy tryParseSVEDataVector(OperandVector &Operands);
@@ -185,8 +177,6 @@ public:
setAvailableFeatures(ComputeAvailableFeatures(getSTI().getFeatureBits()));
}
- bool regsEqual(const MCParsedAsmOperand &Op1,
- const MCParsedAsmOperand &Op2) const override;
bool ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
SMLoc NameLoc, OperandVector &Operands) override;
bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc) override;
@@ -241,10 +231,6 @@ private:
RegKind Kind;
int ElementWidth;
- // The register may be allowed as a different register class,
- // e.g. for GPR64as32 or GPR32as64.
- RegConstraintEqualityTy EqualityTy;
-
// In some cases the shift/extend needs to be explicitly parsed together
// with the register, rather than as a separate operand. This is needed
// for addressing modes where the instruction as a whole dictates the
@@ -460,11 +446,6 @@ public:
return Reg.RegNum;
}
- RegConstraintEqualityTy getRegEqualityTy() const {
- assert(Kind == k_Register && "Invalid access!");
- return Reg.EqualityTy;
- }
-
unsigned getVectorListStart() const {
assert(Kind == k_VectorList && "Invalid access!");
return VectorList.RegNum;
@@ -573,16 +554,14 @@ public:
return DiagnosticPredicateTy::NearMatch;
}
- DiagnosticPredicate isSVEPattern() const {
+ bool isSVEPattern() const {
if (!isImm())
- return DiagnosticPredicateTy::NoMatch;
+ return false;
auto *MCE = dyn_cast<MCConstantExpr>(getImm());
if (!MCE)
- return DiagnosticPredicateTy::NoMatch;
+ return false;
int64_t Val = MCE->getValue();
- if (Val >= 0 && Val < 32)
- return DiagnosticPredicateTy::Match;
- return DiagnosticPredicateTy::NearMatch;
+ return Val >= 0 && Val < 32;
}
bool isSymbolicUImm12Offset(const MCExpr *Expr, unsigned Scale) const {
@@ -1023,11 +1002,6 @@ public:
AArch64MCRegisterClasses[AArch64::GPR64RegClassID].contains(Reg.RegNum);
}
- bool isGPR64as32() const {
- return Kind == k_Register && Reg.Kind == RegKind::Scalar &&
- AArch64MCRegisterClasses[AArch64::GPR32RegClassID].contains(Reg.RegNum);
- }
-
bool isWSeqPair() const {
return Kind == k_Register && Reg.Kind == RegKind::Scalar &&
AArch64MCRegisterClasses[AArch64::WSeqPairsClassRegClassID].contains(
@@ -1344,18 +1318,6 @@ public:
Inst.addOperand(MCOperand::createReg(Reg));
}
- void addGPR64as32Operands(MCInst &Inst, unsigned N) const {
- assert(N == 1 && "Invalid number of operands!");
- assert(
- AArch64MCRegisterClasses[AArch64::GPR32RegClassID].contains(getReg()));
-
- const MCRegisterInfo *RI = Ctx.getRegisterInfo();
- uint32_t Reg = RI->getRegClass(AArch64::GPR64RegClassID).getRegister(
- RI->getEncodingValue(getReg()));
-
- Inst.addOperand(MCOperand::createReg(Reg));
- }
-
template <int Width>
void addFPRasZPRRegOperands(MCInst &Inst, unsigned N) const {
unsigned Base;
@@ -1706,7 +1668,6 @@ public:
static std::unique_ptr<AArch64Operand>
CreateReg(unsigned RegNum, RegKind Kind, SMLoc S, SMLoc E, MCContext &Ctx,
- RegConstraintEqualityTy EqTy = RegConstraintEqualityTy::EqualsReg,
AArch64_AM::ShiftExtendType ExtTy = AArch64_AM::LSL,
unsigned ShiftAmount = 0,
unsigned HasExplicitAmount = false) {
@@ -1714,7 +1675,6 @@ public:
Op->Reg.RegNum = RegNum;
Op->Reg.Kind = Kind;
Op->Reg.ElementWidth = 0;
- Op->Reg.EqualityTy = EqTy;
Op->Reg.ShiftExtend.Type = ExtTy;
Op->Reg.ShiftExtend.Amount = ShiftAmount;
Op->Reg.ShiftExtend.HasExplicitAmount = HasExplicitAmount;
@@ -1732,7 +1692,7 @@ public:
assert((Kind == RegKind::NeonVector || Kind == RegKind::SVEDataVector ||
Kind == RegKind::SVEPredicateVector) &&
"Invalid vector kind");
- auto Op = CreateReg(RegNum, Kind, S, E, Ctx, EqualsReg, ExtTy, ShiftAmount,
+ auto Op = CreateReg(RegNum, Kind, S, E, Ctx, ExtTy, ShiftAmount,
HasExplicitAmount);
Op->Reg.ElementWidth = ElementWidth;
return Op;
@@ -3204,7 +3164,7 @@ AArch64AsmParser::tryParseGPR64sp0Operand(OperandVector &Operands) {
return MatchOperand_Success;
}
-template <bool ParseShiftExtend, RegConstraintEqualityTy EqTy>
+template <bool ParseShiftExtend>
OperandMatchResultTy
AArch64AsmParser::tryParseGPROperand(OperandVector &Operands) {
SMLoc StartLoc = getLoc();
@@ -3217,7 +3177,7 @@ AArch64AsmParser::tryParseGPROperand(OperandVector &Operands) {
// No shift/extend is the default.
if (!ParseShiftExtend || getParser().getTok().isNot(AsmToken::Comma)) {
Operands.push_back(AArch64Operand::CreateReg(
- RegNum, RegKind::Scalar, StartLoc, getLoc(), getContext(), EqTy));
+ RegNum, RegKind::Scalar, StartLoc, getLoc(), getContext()));
return MatchOperand_Success;
}
@@ -3231,10 +3191,10 @@ AArch64AsmParser::tryParseGPROperand(OperandVector &Operands) {
return Res;
auto Ext = static_cast<AArch64Operand*>(ExtOpnd.back().get());
- Operands.push_back(AArch64Operand::CreateReg(
- RegNum, RegKind::Scalar, StartLoc, Ext->getEndLoc(), getContext(), EqTy,
- Ext->getShiftExtendType(), Ext->getShiftExtendAmount(),
- Ext->hasShiftExtendAmount()));
+ Operands.push_back(AArch64Operand::CreateReg(RegNum, RegKind::Scalar,
+ StartLoc, Ext->getEndLoc(), getContext(),
+ Ext->getShiftExtendType(), Ext->getShiftExtendAmount(),
+ Ext->hasShiftExtendAmount()));
return MatchOperand_Success;
}
@@ -3452,30 +3412,6 @@ bool AArch64AsmParser::parseOperand(OperandVector &Operands, bool isCondCode,
}
}
-bool AArch64AsmParser::regsEqual(const MCParsedAsmOperand &Op1,
- const MCParsedAsmOperand &Op2) const {
- auto &AOp1 = static_cast<const AArch64Operand&>(Op1);
- auto &AOp2 = static_cast<const AArch64Operand&>(Op2);
- if (AOp1.getRegEqualityTy() == RegConstraintEqualityTy::EqualsReg &&
- AOp2.getRegEqualityTy() == RegConstraintEqualityTy::EqualsReg)
- return MCTargetAsmParser::regsEqual(Op1, Op2);
-
- assert(AOp1.isScalarReg() && AOp2.isScalarReg() &&
- "Testing equality of non-scalar registers not supported");
-
- // Check if a registers match their sub/super register classes.
- if (AOp1.getRegEqualityTy() == EqualsSuperReg)
- return getXRegFromWReg(Op1.getReg()) == Op2.getReg();
- if (AOp1.getRegEqualityTy() == EqualsSubReg)
- return getWRegFromXReg(Op1.getReg()) == Op2.getReg();
- if (AOp2.getRegEqualityTy() == EqualsSuperReg)
- return getXRegFromWReg(Op2.getReg()) == Op1.getReg();
- if (AOp2.getRegEqualityTy() == EqualsSubReg)
- return getWRegFromXReg(Op2.getReg()) == Op1.getReg();
-
- return false;
-}
-
/// ParseInstruction - Parse an AArch64 instruction mnemonic followed by its
/// operands.
bool AArch64AsmParser::ParseInstruction(ParseInstructionInfo &Info,
@@ -3829,22 +3765,10 @@ static std::string AArch64MnemonicSpellCheck(StringRef S, uint64_t FBS,
unsigned VariantID = 0);
bool AArch64AsmParser::showMatchError(SMLoc Loc, unsigned ErrCode,
- uint64_t ErrorInfo,
OperandVector &Operands) {
switch (ErrCode) {
- case Match_InvalidTiedOperand: {
- RegConstraintEqualityTy EqTy =
- static_cast<const AArch64Operand &>(*Operands[ErrorInfo])
- .getRegEqualityTy();
- switch (EqTy) {
- case RegConstraintEqualityTy::EqualsSubReg:
- return Error(Loc, "operand must be 64-bit form of destination register");
- case RegConstraintEqualityTy::EqualsSuperReg:
- return Error(Loc, "operand must be 32-bit form of destination register");
- case RegConstraintEqualityTy::EqualsReg:
- return Error(Loc, "operand must match destination register");
- }
- }
+ case Match_InvalidTiedOperand:
+ return Error(Loc, "operand must match destination register");
case Match_MissingFeature:
return Error(Loc,
"instruction requires a CPU feature not currently enabled");
@@ -4465,7 +4389,7 @@ bool AArch64AsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
return Error(IDLoc, Msg);
}
case Match_MnemonicFail:
- return showMatchError(IDLoc, MatchResult, ErrorInfo, Operands);
+ return showMatchError(IDLoc, MatchResult, Operands);
case Match_InvalidOperand: {
SMLoc ErrorLoc = IDLoc;
@@ -4484,7 +4408,7 @@ bool AArch64AsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
((AArch64Operand &)*Operands[ErrorInfo]).isTokenSuffix())
MatchResult = Match_InvalidSuffix;
- return showMatchError(ErrorLoc, MatchResult, ErrorInfo, Operands);
+ return showMatchError(ErrorLoc, MatchResult, Operands);
}
case Match_InvalidTiedOperand:
case Match_InvalidMemoryIndexed1:
@@ -4622,7 +4546,7 @@ bool AArch64AsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
SMLoc ErrorLoc = ((AArch64Operand &)*Operands[ErrorInfo]).getStartLoc();
if (ErrorLoc == SMLoc())
ErrorLoc = IDLoc;
- return showMatchError(ErrorLoc, MatchResult, ErrorInfo, Operands);
+ return showMatchError(ErrorLoc, MatchResult, Operands);
}
}
OpenPOWER on IntegriCloud