diff options
author | Owen Anderson <resistor@mac.com> | 2012-07-16 23:20:09 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2012-07-16 23:20:09 +0000 |
commit | b885dc8d39fd5ffe4be01059ca6d8977374db02f (patch) | |
tree | be45cfd8985d2319504a47c3309efee55c959332 | |
parent | d49981a9bbeb49626389119ebec3b0626337b233 (diff) |
Defer checking for registers in the MC AsmMatcher until the after user-defined match classes have been checked. This allows the creation of MatchClass's that are supersets of a register class.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160327 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | utils/TableGen/AsmMatcherEmitter.cpp | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/utils/TableGen/AsmMatcherEmitter.cpp b/utils/TableGen/AsmMatcherEmitter.cpp index da493b3a3b..0a8ae466ef 100644 --- a/utils/TableGen/AsmMatcherEmitter.cpp +++ b/utils/TableGen/AsmMatcherEmitter.cpp @@ -1829,22 +1829,6 @@ static void emitValidateOperandClass(AsmMatcherInfo &Info, << " MCTargetAsmParser::Match_Success :\n" << " MCTargetAsmParser::Match_InvalidOperand;\n\n"; - // Check for register operands, including sub-classes. - OS << " if (Operand.isReg()) {\n"; - OS << " MatchClassKind OpKind;\n"; - OS << " switch (Operand.getReg()) {\n"; - OS << " default: OpKind = InvalidMatchClass; break;\n"; - for (std::map<Record*, ClassInfo*>::iterator - it = Info.RegisterClasses.begin(), ie = Info.RegisterClasses.end(); - it != ie; ++it) - OS << " case " << Info.Target.getName() << "::" - << it->first->getName() << ": OpKind = " << it->second->Name - << "; break;\n"; - OS << " }\n"; - OS << " return isSubclass(OpKind, Kind) ? " - << "MCTargetAsmParser::Match_Success :\n " - << " MCTargetAsmParser::Match_InvalidOperand;\n }\n\n"; - // Check the user classes. We don't care what order since we're only // actually matching against one of them. for (std::vector<ClassInfo*>::iterator it = Info.Classes.begin(), @@ -1864,6 +1848,22 @@ static void emitValidateOperandClass(AsmMatcherInfo &Info, OS << " }\n\n"; } + // Check for register operands, including sub-classes. + OS << " if (Operand.isReg()) {\n"; + OS << " MatchClassKind OpKind;\n"; + OS << " switch (Operand.getReg()) {\n"; + OS << " default: OpKind = InvalidMatchClass; break;\n"; + for (std::map<Record*, ClassInfo*>::iterator + it = Info.RegisterClasses.begin(), ie = Info.RegisterClasses.end(); + it != ie; ++it) + OS << " case " << Info.Target.getName() << "::" + << it->first->getName() << ": OpKind = " << it->second->Name + << "; break;\n"; + OS << " }\n"; + OS << " return isSubclass(OpKind, Kind) ? " + << "MCTargetAsmParser::Match_Success :\n " + << " MCTargetAsmParser::Match_InvalidOperand;\n }\n\n"; + // Generic fallthrough match failure case for operands that don't have // specialized diagnostic types. OS << " return MCTargetAsmParser::Match_InvalidOperand;\n"; |