Separate the concept of 16-bit/32-bit operand size controlled by 0x66 prefix and...
[oota-llvm.git] / lib / Target / X86 / X86CodeEmitter.cpp
index 072996679bc8f3d4929b9bf4cb5fcf3ee4703cd6..5dba4ecbfdb632b59ee35277b3ab7126a47521e8 100644 (file)
@@ -696,6 +696,12 @@ void Emitter<CodeEmitter>::emitOpcodePrefix(uint64_t TSFlags,
       Need0FPrefix = true;
       break;
     case X86II::REP: break; // already handled.
+    case X86II::PD:   // 66 0F
+    case X86II::T8PD: // 66 0F 38
+    case X86II::TAPD: // 66 0F 3A
+      MCE.emitByte(0x66);
+      Need0FPrefix = true;
+      break;
     case X86II::T8XS: // F3 0F 38
     case X86II::XS:   // F3 0F
       MCE.emitByte(0xF3);
@@ -728,11 +734,13 @@ void Emitter<CodeEmitter>::emitOpcodePrefix(uint64_t TSFlags,
     MCE.emitByte(0x0F);
 
   switch (Desc->TSFlags & X86II::Op0Mask) {
+    case X86II::T8PD:  // 66 0F 38
     case X86II::T8XD:  // F2 0F 38
     case X86II::T8XS:  // F3 0F 38
     case X86II::T8:    // 0F 38
       MCE.emitByte(0x38);
       break;
+    case X86II::TAPD:  // 66 0F 38
     case X86II::TAXD:  // F2 0F 38
     case X86II::TA:    // 0F 3A
       MCE.emitByte(0x3A);
@@ -882,6 +890,10 @@ void Emitter<CodeEmitter>::emitVEXOpcodePrefix(uint64_t TSFlags,
     case X86II::TA:  // 0F 3A
       VEX_5M = 0x3;
       break;
+    case X86II::T8PD: // 66 0F 38
+      VEX_PP = 0x1;
+      VEX_5M = 0x2;
+      break;
     case X86II::T8XS: // F3 0F 38
       VEX_PP = 0x2;
       VEX_5M = 0x2;
@@ -890,10 +902,17 @@ void Emitter<CodeEmitter>::emitVEXOpcodePrefix(uint64_t TSFlags,
       VEX_PP = 0x3;
       VEX_5M = 0x2;
       break;
+    case X86II::TAPD: // 66 0F 3A
+      VEX_PP = 0x1;
+      VEX_5M = 0x3;
+      break;
     case X86II::TAXD: // F2 0F 3A
       VEX_PP = 0x3;
       VEX_5M = 0x3;
       break;
+    case X86II::PD:  // 66 0F
+      VEX_PP = 0x1;
+      break;
     case X86II::XS:  // F3 0F
       VEX_PP = 0x2;
       break;