llvm-mc: Introduce method to match a parsed x86 instruction into an MCInst.
authorDaniel Dunbar <daniel@zuster.org>
Tue, 30 Jun 2009 23:38:38 +0000 (23:38 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Tue, 30 Jun 2009 23:38:38 +0000 (23:38 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74573 91177308-0d34-0410-b5e6-96231b3b80d8

tools/llvm-mc/AsmParser.cpp
tools/llvm-mc/AsmParser.h
tools/llvm-mc/MC-X86Specific.cpp

index 4c6c4cc63039595b2b43533d7583efaeaa5eb0d4..744e1f6e64cd4ae7af97ad44b19d529baeb6e6f4 100644 (file)
@@ -506,7 +506,7 @@ bool AsmParser::ParseStatement() {
   }
 
   MCInst Inst;
-  if (ParseX86InstOperands(Inst))
+  if (ParseX86InstOperands(IDVal, Inst))
     return true;
   
   if (Lexer.isNot(asmtok::EndOfStatement))
index 3a812c3e05d709b9b2ad70d9cab2c9c9ff0dcac9..92ff38829fbb4df2f13f5eb32fb756826f6036c3 100644 (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);
   
index 806ec4429ce37423f941d0a4e69aae81b1b07488..be0a1281b76ac445e1aff846873e69c9df6f751f 100644 (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;
 }
 
+/// 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(MCInst &Inst) {
-  // If no operands are present, just return.
-  if (Lexer.is(asmtok::EndOfStatement))
-    return false;
+bool AsmParser::ParseX86InstOperands(const char *InstName, MCInst &Inst) {
+  llvm::SmallVector<X86Operand, 3> Operands;
 
-  // 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))
+  if (Lexer.isNot(asmtok::EndOfStatement)) {
+    // Read the first operand.
+    Operands.push_back(X86Operand());
+    if (ParseX86Operand(Operands.back()))
       return true;
-    Op.AddToMCInst(Inst);
+    
+    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 false;
+
+  return MatchX86Inst(InstName, Operands, Inst);
 }