llvm-mc: Introduce method to match a parsed x86 instruction into an MCInst.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74573 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Daniel Dunbar 2009-06-30 23:38:38 +00:00
parent e303503da3
commit d9627e11bf
3 changed files with 35 additions and 30 deletions

View File

@ -506,7 +506,7 @@ bool AsmParser::ParseStatement() {
}
MCInst Inst;
if (ParseX86InstOperands(Inst))
if (ParseX86InstOperands(IDVal, Inst))
return true;
if (Lexer.isNot(asmtok::EndOfStatement))

View File

@ -25,12 +25,14 @@ class MCStreamer;
class MCValue;
class AsmParser {
public:
struct X86Operand;
private:
AsmLexer Lexer;
MCContext &Ctx;
MCStreamer &Out;
struct X86Operand;
public:
AsmParser(SourceMgr &SM, MCContext &ctx, MCStreamer &OutStr)
: Lexer(SM), Ctx(ctx), Out(OutStr) {}
@ -76,7 +78,7 @@ private:
bool ParseParenExpr(AsmExpr *&Res);
// X86 specific.
bool ParseX86InstOperands(MCInst &Inst);
bool ParseX86InstOperands(const char *InstName, MCInst &Inst);
bool ParseX86Operand(X86Operand &Op);
bool ParseX86MemOperand(X86Operand &Op);

View File

@ -65,10 +65,6 @@ struct AsmParser::X86Operand {
Res.Mem.ScaleReg = ScaleReg;
return Res;
}
void AddToMCInst(MCInst &I) {
// FIXME: Add in x86 order here.
}
};
bool AsmParser::ParseX86Operand(X86Operand &Op) {
@ -195,27 +191,34 @@ bool AsmParser::ParseX86MemOperand(X86Operand &Op) {
return false;
}
/// ParseX86InstOperands - Parse the operands of an X86 instruction and return
/// them as the operands of an MCInst.
bool AsmParser::ParseX86InstOperands(MCInst &Inst) {
// If no operands are present, just return.
if (Lexer.is(asmtok::EndOfStatement))
return false;
// Read the first operand.
X86Operand Op;
if (ParseX86Operand(Op))
return true;
Op.AddToMCInst(Inst);
while (Lexer.is(asmtok::Comma)) {
Lexer.Lex(); // Eat the comma.
// Parse and remember the operand.
Op = X86Operand();
if (ParseX86Operand(Op))
return true;
Op.AddToMCInst(Inst);
}
/// MatchX86Inst - Convert a parsed instruction name and operand list into a
/// concrete instruction.
static bool MatchX86Inst(const char *Name,
llvm::SmallVector<AsmParser::X86Operand, 3> &Operands,
MCInst &Inst) {
return false;
}
/// ParseX86InstOperands - Parse the operands of an X86 instruction and return
/// them as the operands of an MCInst.
bool AsmParser::ParseX86InstOperands(const char *InstName, MCInst &Inst) {
llvm::SmallVector<X86Operand, 3> Operands;
if (Lexer.isNot(asmtok::EndOfStatement)) {
// Read the first operand.
Operands.push_back(X86Operand());
if (ParseX86Operand(Operands.back()))
return true;
while (Lexer.is(asmtok::Comma)) {
Lexer.Lex(); // Eat the comma.
// Parse and remember the operand.
Operands.push_back(X86Operand());
if (ParseX86Operand(Operands.back()))
return true;
}
}
return MatchX86Inst(InstName, Operands, Inst);
}