summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorSaleem Abdulrasool <compnerd@compnerd.org>2013-12-29 18:53:16 +0000
committerSaleem Abdulrasool <compnerd@compnerd.org>2013-12-29 18:53:16 +0000
commitaca443c02c8b20ed96fe97c04bcdd651e74098ca (patch)
treec4474c04f8a167991508aa185852b7de9bd21771 /llvm
parent4da9c6e566b798724ab2df2578c8ca23b025f780 (diff)
downloadbcm5719-llvm-aca443c02c8b20ed96fe97c04bcdd651e74098ca.tar.gz
bcm5719-llvm-aca443c02c8b20ed96fe97c04bcdd651e74098ca.zip
ARM IAS: fix after r198172
The DPR and SPR register lists are also register lists. Furthermore, the registers need not be checked individually since the register type can be checked via the list kind. Use that to simplify the logic and fix the incorrect assertion. llvm-svn: 198174
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp32
1 files changed, 11 insertions, 21 deletions
diff --git a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
index c0e54723469..6e0038c9b03 100644
--- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
+++ b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
@@ -5112,13 +5112,13 @@ bool ARMAsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
SMLoc NameLoc,
SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
// FIXME: Can this be done via tablegen in some fashion?
- bool HasPrecisionRestrictions;
+ bool RequireVFPRegisterList;
bool AcceptDoublePrecisionOnly;
bool AcceptSinglePrecisionOnly;
- HasPrecisionRestrictions = Name.startswith("fldm") || Name.startswith("fstm");
+ RequireVFPRegisterList = Name.startswith("fldm") || Name.startswith("fstm");
AcceptDoublePrecisionOnly =
- HasPrecisionRestrictions && (Name.back() == 'd' || Name.back() == 'x');
- AcceptSinglePrecisionOnly = HasPrecisionRestrictions && Name.back() == 's';
+ RequireVFPRegisterList && (Name.back() == 'd' || Name.back() == 'x');
+ AcceptSinglePrecisionOnly = RequireVFPRegisterList && Name.back() == 's';
// Apply mnemonic aliases before doing anything else, as the destination
// mnemonic may include suffices and we want to handle them normally.
@@ -5288,24 +5288,14 @@ bool ARMAsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
Parser.Lex(); // Consume the EndOfStatement
- if (HasPrecisionRestrictions) {
+ if (RequireVFPRegisterList) {
ARMOperand *Op = static_cast<ARMOperand*>(Operands.back());
- assert(Op->isRegList());
- const SmallVectorImpl<unsigned> &RegList = Op->getRegList();
- for (SmallVectorImpl<unsigned>::const_iterator RLI = RegList.begin(),
- RLE = RegList.end();
- RLI != RLE; ++RLI) {
- if (AcceptSinglePrecisionOnly &&
- !ARMMCRegisterClasses[ARM::SPRRegClassID].contains(*RLI))
- return Error(Op->getStartLoc(),
- "VFP/Neon single precision register expected");
- else if (AcceptDoublePrecisionOnly &&
- !ARMMCRegisterClasses[ARM::DPRRegClassID].contains(*RLI))
- return Error(Op->getStartLoc(),
- "VFP/Neon double precision register expected");
- else
- llvm_unreachable("must have single or double precision restrictions");
- }
+ if (AcceptSinglePrecisionOnly && !Op->isSPRRegList())
+ return Error(Op->getStartLoc(),
+ "VFP/Neon single precision register expected");
+ if (AcceptDoublePrecisionOnly && !Op->isDPRRegList())
+ return Error(Op->getStartLoc(),
+ "VFP/Neon double precision register expected");
}
// Some instructions, mostly Thumb, have forms for the same mnemonic that
OpenPOWER on IntegriCloud