Index: utils/TableGen/AsmMatcherEmitter.cpp =================================================================== --- utils/TableGen/AsmMatcherEmitter.cpp +++ utils/TableGen/AsmMatcherEmitter.cpp @@ -310,11 +310,16 @@ /// The suboperand index within SrcOpName, or -1 for the entire operand. int SubOpIdx; + /// Whether the token was a "new" token, i.e., it was preceded by a token + /// separator (for instance whitespace). + bool IsNewTok; + /// Register record if this token is singleton register. Record *SingletonReg; - explicit AsmOperand(StringRef T) - : Token(T), Class(nullptr), SubOpIdx(-1), SingletonReg(nullptr) {} + explicit AsmOperand(bool IsNewTok, StringRef T) + : Token(T), Class(nullptr), SubOpIdx(-1), IsNewTok(IsNewTok), + SingletonReg(nullptr) {} }; /// ResOperand - This represents a single operand in the result instruction @@ -805,7 +810,10 @@ void MatchableInfo::addAsmOperand(size_t Start, size_t End) { StringRef String = AsmString; - AsmOperands.push_back(AsmOperand(String.slice(Start, End))); + bool IsNewTok = + !Start || (isspace(String[Start - 1]) || String[Start - 1] == ',' || + String[Start - 1] == '$'); + AsmOperands.push_back(AsmOperand(IsNewTok, String.slice(Start, End))); } /// tokenizeAsmString - Tokenize a simplified assembly string. @@ -960,6 +968,11 @@ std::string &RegisterPrefix) { StringRef Tok = AsmOperands[OperandNo].Token; + // If wasn't separater from another token (e.g. with whitespace), don't + // interpret this as a register name. + if (!AsmOperands[OperandNo].IsNewTok) + return; + if (RegisterPrefix.empty()) { std::string LoweredTok = Tok.lower(); if (const CodeGenRegister *Reg = Info.Target.getRegisterByName(LoweredTok)) @@ -1508,7 +1521,7 @@ // Insert remaining suboperands after AsmOpIdx in II->AsmOperands. StringRef Token = Op->Token; // save this in case Op gets moved for (unsigned SI = 1, SE = Operands[Idx].MINumOperands; SI != SE; ++SI) { - MatchableInfo::AsmOperand NewAsmOp(Token); + MatchableInfo::AsmOperand NewAsmOp(/*IsNewTok=*/true, Token); NewAsmOp.SubOpIdx = SI; II->AsmOperands.insert(II->AsmOperands.begin()+AsmOpIdx+SI, NewAsmOp); }