
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;
}
