diff --git a/lib/Target/X86/AsmParser/X86AsmParser.cpp b/lib/Target/X86/AsmParser/X86AsmParser.cpp index 841b42743f3..ea5528a951a 100644 --- a/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -46,7 +46,9 @@ private: bool MatchInstruction(SmallVectorImpl &Operands, MCInst &Inst); - bool MatchRegisterName(const StringRef &Name, unsigned &RegNo); + /// MatchRegisterName - Match the given string to a register name, or 0 if + /// there is no match. + unsigned MatchRegisterName(const StringRef &Name); /// } @@ -214,7 +216,9 @@ bool X86ATTAsmParser::ParseRegister(X86Operand &Op) { // validation later, so maybe there is no need for this here. unsigned RegNo; assert(Tok.getString().startswith("%") && "Invalid register name!"); - if (MatchRegisterName(Tok.getString().substr(1), RegNo)) + + RegNo = MatchRegisterName(Tok.getString().substr(1)); + if (RegNo == 0) return Error(Tok.getLoc(), "invalid register name"); Op = X86Operand::CreateReg(RegNo); diff --git a/utils/TableGen/AsmMatcherEmitter.cpp b/utils/TableGen/AsmMatcherEmitter.cpp index 015a910ee20..5b590e311d8 100644 --- a/utils/TableGen/AsmMatcherEmitter.cpp +++ b/utils/TableGen/AsmMatcherEmitter.cpp @@ -690,27 +690,6 @@ static void EmitMatchClassEnumeration(CodeGenTarget &Target, OS << "}\n\n"; } -/// EmitMatchRegisterName - Emit the function to match a string to appropriate -/// match class value. -static void EmitMatchTokenString(CodeGenTarget &Target, - std::vector &Infos, - raw_ostream &OS) { - // FIXME: TableGen should have a fast string matcher generator. - OS << "static MatchClassKind MatchTokenString(const StringRef &Name) {\n"; - for (std::vector::iterator it = Infos.begin(), - ie = Infos.end(); it != ie; ++it) { - ClassInfo &CI = **it; - - if (CI.Kind == ClassInfo::Token) - OS << " if (Name == \"" << CI.ValueName << "\")\n" - << " return " << CI.Name << ";\n\n"; - } - OS << " return InvalidMatchClass;\n"; - OS << "}\n\n"; -} - - - /// EmitClassifyOperand - Emit the function to classify an operand. static void EmitClassifyOperand(CodeGenTarget &Target, std::vector &Infos, @@ -860,32 +839,51 @@ static void EmitStringMatcher(const std::string &StrVariableName, } +/// EmitMatchTokenString - Emit the function to match a token string to the +/// appropriate match class value. +static void EmitMatchTokenString(CodeGenTarget &Target, + std::vector &Infos, + raw_ostream &OS) { + // Construct the match list. + std::vector Matches; + for (std::vector::iterator it = Infos.begin(), + ie = Infos.end(); it != ie; ++it) { + ClassInfo &CI = **it; + + if (CI.Kind == ClassInfo::Token) + Matches.push_back(StringPair(CI.ValueName, "return " + CI.Name + ";")); + } + + OS << "static MatchClassKind MatchTokenString(const StringRef &Name) {\n"; + + EmitStringMatcher("Name", Matches, OS); + + OS << " return InvalidMatchClass;\n"; + OS << "}\n\n"; +} /// EmitMatchRegisterName - Emit the function to match a string to the target /// specific register enum. static void EmitMatchRegisterName(CodeGenTarget &Target, Record *AsmParser, raw_ostream &OS) { - const std::vector &Registers = Target.getRegisters(); - - OS << "bool " << Target.getName() - << AsmParser->getValueAsString("AsmParserClassName") - << "::MatchRegisterName(const StringRef &Name, unsigned &RegNo) {\n"; - + // Construct the match list. std::vector Matches; - - // FIXME: TableGen should have a fast string matcher generator. - for (unsigned i = 0, e = Registers.size(); i != e; ++i) { - const CodeGenRegister &Reg = Registers[i]; + for (unsigned i = 0, e = Target.getRegisters().size(); i != e; ++i) { + const CodeGenRegister &Reg = Target.getRegisters()[i]; if (Reg.TheDef->getValueAsString("AsmName").empty()) continue; Matches.push_back(StringPair(Reg.TheDef->getValueAsString("AsmName"), - "RegNo=" + utostr(i + 1) + "; return false;")); + "return " + utostr(i + 1) + ";")); } + OS << "unsigned " << Target.getName() + << AsmParser->getValueAsString("AsmParserClassName") + << "::MatchRegisterName(const StringRef &Name) {\n"; + EmitStringMatcher("Name", Matches, OS); - OS << " return true;\n"; + OS << " return 0;\n"; OS << "}\n\n"; }