diff --git a/tools/llvm-mc/AsmParser.cpp b/tools/llvm-mc/AsmParser.cpp
index 9e8b3cf..04c1d03 100644
--- a/tools/llvm-mc/AsmParser.cpp
+++ b/tools/llvm-mc/AsmParser.cpp
@@ -12,6 +12,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "AsmParser.h"
+#include "llvm/MC/MCInst.h"
 #include "llvm/Support/SourceMgr.h"
 #include "llvm/Support/raw_ostream.h"
 using namespace llvm;
@@ -49,182 +50,6 @@
 }
 
 
-struct AsmParser::X86Operand {
-  enum {
-    Register,
-    Immediate,
-    Memory
-  } Kind;
-  
-  union {
-    struct {
-      unsigned RegNo;
-    } Reg;
-
-    struct {
-      // FIXME: Should be a general expression.
-      int64_t Val;
-    } Imm;
-    
-    struct {
-      unsigned SegReg;
-      int64_t Disp;     // FIXME: Should be a general expression.
-      unsigned BaseReg;
-      unsigned Scale;
-      unsigned ScaleReg;
-    } Mem;
-  };
-  
-  static X86Operand CreateReg(unsigned RegNo) {
-    X86Operand Res;
-    Res.Kind = Register;
-    Res.Reg.RegNo = RegNo;
-    return Res;
-  }
-  static X86Operand CreateImm(int64_t Val) {
-    X86Operand Res;
-    Res.Kind = Immediate;
-    Res.Imm.Val = Val;
-    return Res;
-  }
-  static X86Operand CreateMem(unsigned SegReg, int64_t Disp, unsigned BaseReg,
-                              unsigned Scale, unsigned ScaleReg) {
-    X86Operand Res;
-    Res.Kind = Memory;
-    Res.Mem.SegReg   = SegReg;
-    Res.Mem.Disp     = Disp;
-    Res.Mem.BaseReg  = BaseReg;
-    Res.Mem.Scale    = Scale;
-    Res.Mem.ScaleReg = ScaleReg;
-    return Res;
-  }
-};
-
-bool AsmParser::ParseX86Operand(X86Operand &Op) {
-  switch (Lexer.getKind()) {
-  default:
-    return ParseX86MemOperand(Op);
-  case asmtok::Register:
-    // FIXME: Decode reg #.
-    // FIXME: if a segment register, this could either be just the seg reg, or
-    // the start of a memory operand.
-    Op = X86Operand::CreateReg(123);
-    Lexer.Lex(); // Eat register.
-    return false;
-  case asmtok::Dollar: {
-    // $42 -> immediate.
-    Lexer.Lex();
-    int64_t Val;
-    if (ParseExpression(Val))
-      return TokError("expected integer constant");
-    Op = X86Operand::CreateReg(Val);
-    return false;
-  case asmtok::Star:
-    Lexer.Lex(); // Eat the star.
-    
-    if (Lexer.is(asmtok::Register)) {
-      Op = X86Operand::CreateReg(123);
-      Lexer.Lex(); // Eat register.
-    } else if (ParseX86MemOperand(Op))
-      return true;
-
-    // FIXME: Note that these are 'dereferenced' so that clients know the '*' is
-    // there.
-    return false;
-  }
-  }
-}
-
-/// ParseX86MemOperand: segment: disp(basereg, indexreg, scale)
-bool AsmParser::ParseX86MemOperand(X86Operand &Op) {
-  // FIXME: If SegReg ':'  (e.g. %gs:), eat and remember.
-  unsigned SegReg = 0;
-  
-  
-  // We have to disambiguate a parenthesized expression "(4+5)" from the start
-  // of a memory operand with a missing displacement "(%ebx)" or "(,%eax)".  The
-  // only way to do this without lookahead is to eat the ( and see what is after
-  // it.
-  int64_t Disp = 0;
-  if (Lexer.isNot(asmtok::LParen)) {
-    if (ParseExpression(Disp)) return true;
-    
-    // After parsing the base expression we could either have a parenthesized
-    // memory address or not.  If not, return now.  If so, eat the (.
-    if (Lexer.isNot(asmtok::LParen)) {
-      Op = X86Operand::CreateMem(SegReg, Disp, 0, 0, 0);
-      return false;
-    }
-    
-    // Eat the '('.
-    Lexer.Lex();
-  } else {
-    // Okay, we have a '('.  We don't know if this is an expression or not, but
-    // so we have to eat the ( to see beyond it.
-    Lexer.Lex(); // Eat the '('.
-    
-    if (Lexer.is(asmtok::Register) || Lexer.is(asmtok::Comma)) {
-      // Nothing to do here, fall into the code below with the '(' part of the
-      // memory operand consumed.
-    } else {
-      // It must be an parenthesized expression, parse it now.
-      if (ParseParenExpr(Disp) ||
-          ParseBinOpRHS(1, Disp))
-        return true;
-      
-      // After parsing the base expression we could either have a parenthesized
-      // memory address or not.  If not, return now.  If so, eat the (.
-      if (Lexer.isNot(asmtok::LParen)) {
-        Op = X86Operand::CreateMem(SegReg, Disp, 0, 0, 0);
-        return false;
-      }
-      
-      // Eat the '('.
-      Lexer.Lex();
-    }
-  }
-  
-  // If we reached here, then we just ate the ( of the memory operand.  Process
-  // the rest of the memory operand.
-  unsigned BaseReg = 0, ScaleReg = 0, Scale = 0;
-  
-  if (Lexer.is(asmtok::Register)) {
-    BaseReg = 123; // FIXME: decode reg #
-    Lexer.Lex();  // eat the register.
-  }
-  
-  if (Lexer.is(asmtok::Comma)) {
-    Lexer.Lex(); // eat the comma.
-    
-    if (Lexer.is(asmtok::Register)) {
-      ScaleReg = 123; // FIXME: decode reg #
-      Lexer.Lex();  // eat the register.
-      Scale = 1;      // If not specified, the scale defaults to 1.
-    }
-    
-    if (Lexer.is(asmtok::Comma)) {
-      Lexer.Lex(); // eat the comma.
-
-      // If present, get and validate scale amount.
-      if (Lexer.is(asmtok::IntVal)) {
-        int64_t ScaleVal = Lexer.getCurIntVal();
-        if (ScaleVal != 1 && ScaleVal != 2 && ScaleVal != 4 && ScaleVal != 8)
-          return TokError("scale factor in address must be 1, 2, 4 or 8");
-        Lexer.Lex();  // eat the scale.
-        Scale = (unsigned)ScaleVal;
-      }
-    }
-  }
-  
-  // Ok, we've eaten the memory operand, verify we have a ')' and eat it too.
-  if (Lexer.isNot(asmtok::RParen))
-    return TokError("unexpected token in memory operand");
-  Lexer.Lex(); // Eat the ')'.
-  
-  Op = X86Operand::CreateMem(SegReg, Disp, BaseReg, Scale, ScaleReg);
-  return false;
-}
-
 /// ParseParenExpr - Parse a paren expression and return it.
 /// NOTE: This assumes the leading '(' has already been consumed.
 ///
@@ -368,27 +193,10 @@
     return false;
   }
 
-  // If it's an instruction, parse an operand list.
-  std::vector<X86Operand> Operands;
-  
-  // Read the first operand, if present.  Note that we require a newline at the
-  // end of file, so we don't have to worry about Eof here.
-  if (Lexer.isNot(asmtok::EndOfStatement)) {
-    X86Operand Op;
-    if (ParseX86Operand(Op))
-      return true;
-    Operands.push_back(Op);
-  }
 
-  while (Lexer.is(asmtok::Comma)) {
-    Lexer.Lex();  // Eat the comma.
-    
-    // Parse and remember the operand.
-    X86Operand Op;
-    if (ParseX86Operand(Op))
-      return true;
-    Operands.push_back(Op);
-  }
+  MCInst Inst;
+  if (ParseX86InstOperands(Inst))
+    return true;
   
   if (Lexer.isNot(asmtok::EndOfStatement))
     return TokError("unexpected token in operand list");
@@ -397,7 +205,7 @@
   Lexer.Lex();
   
   // Instruction is good, process it.
-  outs() << "Found instruction: " << IDVal << " with " << Operands.size()
+  outs() << "Found instruction: " << IDVal << " with " << Inst.getNumOperands()
          << " operands.\n";
   
   // Skip to end of line for now.
diff --git a/tools/llvm-mc/AsmParser.h b/tools/llvm-mc/AsmParser.h
index 1dadb40..c133345 100644
--- a/tools/llvm-mc/AsmParser.h
+++ b/tools/llvm-mc/AsmParser.h
@@ -17,6 +17,7 @@
 #include "AsmLexer.h"
 
 namespace llvm {
+class MCInst;
   
 class AsmParser {
   AsmLexer Lexer;
@@ -36,12 +37,15 @@
   
   void EatToEndOfStatement();
   
-  bool ParseX86Operand(X86Operand &Op);
-  bool ParseX86MemOperand(X86Operand &Op);
   bool ParseExpression(int64_t &Res);
   bool ParsePrimaryExpr(int64_t &Res);
   bool ParseBinOpRHS(unsigned Precedence, int64_t &Res);
   bool ParseParenExpr(int64_t &Res);
+  
+  // X86 specific.
+  bool ParseX86InstOperands(MCInst &Inst);
+  bool ParseX86Operand(X86Operand &Op);
+  bool ParseX86MemOperand(X86Operand &Op);
 };
 
 } // end namespace llvm
diff --git a/tools/llvm-mc/CMakeLists.txt b/tools/llvm-mc/CMakeLists.txt
index d8195e7..369d522 100644
--- a/tools/llvm-mc/CMakeLists.txt
+++ b/tools/llvm-mc/CMakeLists.txt
@@ -4,4 +4,5 @@
   llvm-mc.cpp
   AsmLexer.cpp
   AsmParser.cpp
+  MC-X86Specific.cpp
   )
diff --git a/tools/llvm-mc/MC-X86Specific.cpp b/tools/llvm-mc/MC-X86Specific.cpp
new file mode 100644
index 0000000..45774cf
--- /dev/null
+++ b/tools/llvm-mc/MC-X86Specific.cpp
@@ -0,0 +1,222 @@
+//===- MC-X86Specific.cpp - X86-Specific code for MC ----------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements X86-specific parsing, encoding and decoding stuff for
+// MC.
+//
+//===----------------------------------------------------------------------===//
+
+#include "AsmParser.h"
+#include "llvm/MC/MCInst.h"
+using namespace llvm;
+
+/// X86Operand - Instances of this class represent one X86 machine instruction.
+struct AsmParser::X86Operand {
+  enum {
+    Register,
+    Immediate,
+    Memory
+  } Kind;
+  
+  union {
+    struct {
+      unsigned RegNo;
+    } Reg;
+
+    struct {
+      // FIXME: Should be a general expression.
+      int64_t Val;
+    } Imm;
+    
+    struct {
+      unsigned SegReg;
+      int64_t Disp;     // FIXME: Should be a general expression.
+      unsigned BaseReg;
+      unsigned Scale;
+      unsigned ScaleReg;
+    } Mem;
+  };
+  
+  static X86Operand CreateReg(unsigned RegNo) {
+    X86Operand Res;
+    Res.Kind = Register;
+    Res.Reg.RegNo = RegNo;
+    return Res;
+  }
+  static X86Operand CreateImm(int64_t Val) {
+    X86Operand Res;
+    Res.Kind = Immediate;
+    Res.Imm.Val = Val;
+    return Res;
+  }
+  static X86Operand CreateMem(unsigned SegReg, int64_t Disp, unsigned BaseReg,
+                              unsigned Scale, unsigned ScaleReg) {
+    X86Operand Res;
+    Res.Kind = Memory;
+    Res.Mem.SegReg   = SegReg;
+    Res.Mem.Disp     = Disp;
+    Res.Mem.BaseReg  = BaseReg;
+    Res.Mem.Scale    = Scale;
+    Res.Mem.ScaleReg = ScaleReg;
+    return Res;
+  }
+  
+  void AddToMCInst(MCInst &I) {
+    // FIXME: Add in x86 order here.
+  }
+};
+
+bool AsmParser::ParseX86Operand(X86Operand &Op) {
+  switch (Lexer.getKind()) {
+  default:
+    return ParseX86MemOperand(Op);
+  case asmtok::Register:
+    // FIXME: Decode reg #.
+    // FIXME: if a segment register, this could either be just the seg reg, or
+    // the start of a memory operand.
+    Op = X86Operand::CreateReg(123);
+    Lexer.Lex(); // Eat register.
+    return false;
+  case asmtok::Dollar: {
+    // $42 -> immediate.
+    Lexer.Lex();
+    int64_t Val;
+    if (ParseExpression(Val))
+      return TokError("expected integer constant");
+    Op = X86Operand::CreateReg(Val);
+    return false;
+  case asmtok::Star:
+    Lexer.Lex(); // Eat the star.
+    
+    if (Lexer.is(asmtok::Register)) {
+      Op = X86Operand::CreateReg(123);
+      Lexer.Lex(); // Eat register.
+    } else if (ParseX86MemOperand(Op))
+      return true;
+
+    // FIXME: Note that these are 'dereferenced' so that clients know the '*' is
+    // there.
+    return false;
+  }
+  }
+}
+
+/// ParseX86MemOperand: segment: disp(basereg, indexreg, scale)
+bool AsmParser::ParseX86MemOperand(X86Operand &Op) {
+  // FIXME: If SegReg ':'  (e.g. %gs:), eat and remember.
+  unsigned SegReg = 0;
+  
+  // We have to disambiguate a parenthesized expression "(4+5)" from the start
+  // of a memory operand with a missing displacement "(%ebx)" or "(,%eax)".  The
+  // only way to do this without lookahead is to eat the ( and see what is after
+  // it.
+  int64_t Disp = 0;
+  if (Lexer.isNot(asmtok::LParen)) {
+    if (ParseExpression(Disp)) return true;
+    
+    // After parsing the base expression we could either have a parenthesized
+    // memory address or not.  If not, return now.  If so, eat the (.
+    if (Lexer.isNot(asmtok::LParen)) {
+      Op = X86Operand::CreateMem(SegReg, Disp, 0, 0, 0);
+      return false;
+    }
+    
+    // Eat the '('.
+    Lexer.Lex();
+  } else {
+    // Okay, we have a '('.  We don't know if this is an expression or not, but
+    // so we have to eat the ( to see beyond it.
+    Lexer.Lex(); // Eat the '('.
+    
+    if (Lexer.is(asmtok::Register) || Lexer.is(asmtok::Comma)) {
+      // Nothing to do here, fall into the code below with the '(' part of the
+      // memory operand consumed.
+    } else {
+      // It must be an parenthesized expression, parse it now.
+      if (ParseParenExpr(Disp) ||
+          ParseBinOpRHS(1, Disp))
+        return true;
+      
+      // After parsing the base expression we could either have a parenthesized
+      // memory address or not.  If not, return now.  If so, eat the (.
+      if (Lexer.isNot(asmtok::LParen)) {
+        Op = X86Operand::CreateMem(SegReg, Disp, 0, 0, 0);
+        return false;
+      }
+      
+      // Eat the '('.
+      Lexer.Lex();
+    }
+  }
+  
+  // If we reached here, then we just ate the ( of the memory operand.  Process
+  // the rest of the memory operand.
+  unsigned BaseReg = 0, ScaleReg = 0, Scale = 0;
+  
+  if (Lexer.is(asmtok::Register)) {
+    BaseReg = 123; // FIXME: decode reg #
+    Lexer.Lex();  // eat the register.
+  }
+  
+  if (Lexer.is(asmtok::Comma)) {
+    Lexer.Lex(); // eat the comma.
+    
+    if (Lexer.is(asmtok::Register)) {
+      ScaleReg = 123; // FIXME: decode reg #
+      Lexer.Lex();  // eat the register.
+      Scale = 1;      // If not specified, the scale defaults to 1.
+    }
+    
+    if (Lexer.is(asmtok::Comma)) {
+      Lexer.Lex(); // eat the comma.
+
+      // If present, get and validate scale amount.
+      if (Lexer.is(asmtok::IntVal)) {
+        int64_t ScaleVal = Lexer.getCurIntVal();
+        if (ScaleVal != 1 && ScaleVal != 2 && ScaleVal != 4 && ScaleVal != 8)
+          return TokError("scale factor in address must be 1, 2, 4 or 8");
+        Lexer.Lex();  // eat the scale.
+        Scale = (unsigned)ScaleVal;
+      }
+    }
+  }
+  
+  // Ok, we've eaten the memory operand, verify we have a ')' and eat it too.
+  if (Lexer.isNot(asmtok::RParen))
+    return TokError("unexpected token in memory operand");
+  Lexer.Lex(); // Eat the ')'.
+  
+  Op = X86Operand::CreateMem(SegReg, Disp, BaseReg, Scale, ScaleReg);
+  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);
+  }
+  return false;
+}
