[llvm-commits] [llvm] r95403 - /llvm/trunk/lib/Target/X86/X86MCCodeEmitter.cpp

Chris Lattner sabre at nondot.org
Fri Feb 5 11:04:37 PST 2010


Author: lattner
Date: Fri Feb  5 13:04:37 2010
New Revision: 95403

URL: http://llvm.org/viewvc/llvm-project?rev=95403&view=rev
Log:
add some more encodings.

Modified:
    llvm/trunk/lib/Target/X86/X86MCCodeEmitter.cpp

Modified: llvm/trunk/lib/Target/X86/X86MCCodeEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86MCCodeEmitter.cpp?rev=95403&r1=95402&r2=95403&view=diff

==============================================================================
--- llvm/trunk/lib/Target/X86/X86MCCodeEmitter.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86MCCodeEmitter.cpp Fri Feb  5 13:04:37 2010
@@ -146,7 +146,7 @@
   if (Op3.isImm()) {
     DispVal = Op3.getImm();
   } else {
-    assert(0 && "Unknown operand");
+    assert(0 && "relocatable operand");
 #if 0
   if (Op3.isGlobal()) {
     DispForReloc = &Op3;
@@ -416,6 +416,41 @@
       EmitConstant(MI.getOperand(CurOp++).getImm(),
                    X86InstrInfo::sizeOfImm(&Desc), OS);
     break;
+      
+  case X86II::MRMSrcReg:
+    EmitByte(BaseOpcode, OS);
+    EmitRegModRMByte(MI.getOperand(CurOp+1), GetX86RegNum(MI.getOperand(CurOp)),
+                     OS);
+    CurOp += 2;
+    if (CurOp != NumOps)
+      EmitConstant(MI.getOperand(CurOp++).getImm(),
+                   X86InstrInfo::sizeOfImm(&Desc), OS);
+    break;
+    
+  case X86II::MRMSrcMem: {
+    EmitByte(BaseOpcode, OS);
+
+    // FIXME: Maybe lea should have its own form?  This is a horrible hack.
+    int AddrOperands;
+    if (Opcode == X86::LEA64r || Opcode == X86::LEA64_32r ||
+        Opcode == X86::LEA16r || Opcode == X86::LEA32r)
+      AddrOperands = X86AddrNumOperands - 1; // No segment register
+    else
+      AddrOperands = X86AddrNumOperands;
+    
+    // FIXME: What is this actually doing?
+    intptr_t PCAdj = (CurOp + AddrOperands + 1 != NumOps) ?
+       X86InstrInfo::sizeOfImm(&Desc) : 0;
+    
+    EmitMemModRMByte(MI, CurOp+1, GetX86RegNum(MI.getOperand(CurOp)),
+                     PCAdj, OS);
+    CurOp += AddrOperands + 1;
+    if (CurOp != NumOps)
+      EmitConstant(MI.getOperand(CurOp++).getImm(),
+                   X86InstrInfo::sizeOfImm(&Desc), OS);
+    break;
+  }
+      
   }
   
 #ifndef NDEBUG





More information about the llvm-commits mailing list