The final function which needs defining is
ParseInstruction
, which parses the instruction
mnemonic, followed by all the operands until the end of the statement
is reached, called by MatchInstructionImpl
to
identify all operands for matching.
The instruction mnemonic is parsed by a TableGen generated function, but is first split into sections separated by the dots in the mnemonic, with each part being added to the instructions operand list.
For example the mnemonic l.add
would become
[l, .add]
, lf.add.s
would
become [lf, .add, .s]
, etc.
Once the mnemonic has been split up and added to the operand list, the
ParseOperand
function defined above is repeatedly
called to parse the next operand until the end of the statement is
reached (AsmToken::EndOfStatement
), with commas
being consumed between operands.
bool OR1KAsmParser:: ParseInstruction(StringRef Name, SMLoc NameLoc, SmallVectorImpl<MCParsedAsmOperand*> &Operands) { // First operand is token for instruction size_t dotLoc = Name.find('.'); Operands.push_back(OR1KOperand::CreateToken(Name.substr(0,dotLoc),NameLoc)); if (dotLoc < Name.size()) { size_t dotLoc2 = Name.rfind('.'); if (dotLoc == dotLoc2) Operands.push_back(OR1KOperand::CreateToken(Name.substr(dotLoc),NameLoc)); else { Operands.push_back(OR1KOperand::CreateToken(Name.substr (dotLoc, dotLoc2-dotLoc), NameLoc)); Operands.push_back(OR1KOperand::CreateToken(Name.substr (dotLoc2), NameLoc)); } } // If there are no more operands, then finish if (getLexer().is(AsmToken::EndOfStatement)) return false; // Parse first operand if (ParseOperand(Operands)) return true; // Parse until end of statement, consuming commas between operands while (getLexer().isNot(AsmToken::EndOfStatement) && getLexer().is(AsmToken::Comma)) { // Consume comma token getLexer().Lex(); // Parse next operand if(ParseOperand(Operands)) return true; } return false; }