X86: Fix the expected size of the immediate offset in MOV_MI.
[gem5.git] / src / arch / x86 / types.hh
index bdf3a814e65616dbc1f08758c635d5e4445eda57..6fd36b487d80f2b8c9be736446464a235bde22b3 100644 (file)
@@ -156,8 +156,10 @@ namespace X86ISA
             uint8_t num;
             //The first byte detected in a 2+ byte opcode. Should be 0xF0.
             uint8_t prefixA;
-            //The second byte detected in a 3+ byte opcode. Could be 0xF0 for
-            //3dnow instructions, or 0x38-0x3F for some SSE instructions.
+            //The second byte detected in a 3+ byte opcode. Could be 0x38-0x3F
+            //for some SSE instructions. 3dNow! instructions are handled as
+            //two byte opcodes and then split out further by the immediate
+            //byte.
             uint8_t prefixB;
             //The main opcode byte. The highest addressed byte in the opcode.
             Opcode op;
@@ -175,6 +177,8 @@ namespace X86ISA
         uint8_t addrSize;
         //The effective stack size.
         uint8_t stackSize;
+        //The size of the displacement
+        uint8_t dispSize;
 
         //Mode information
         OperatingMode mode;
@@ -187,12 +191,13 @@ namespace X86ISA
                      "op = {\n\t\tnum = %d,\n\t\top = %#x,\n\t\t"
                            "prefixA = %#x,\n\t\tprefixB = %#x\n\t},\n\t"
                      "modRM = %#x,\n\tsib = %#x,\n\t"
-                     "immediate = %#x,\n\tdisplacement = %#x\n}\n",
+                     "immediate = %#x,\n\tdisplacement = %#x\n\t"
+                     "dispSize = %d}\n",
                      (uint8_t)emi.legacy, (uint8_t)emi.rex,
                      emi.opcode.num, (uint8_t)emi.opcode.op,
                      emi.opcode.prefixA, emi.opcode.prefixB,
                      (uint8_t)emi.modRM, (uint8_t)emi.sib,
-                     emi.immediate, emi.displacement);
+                     emi.immediate, emi.displacement, emi.dispSize);
         return os;
     }
 
@@ -227,6 +232,8 @@ namespace X86ISA
             return false;
         if(emi1.stackSize != emi2.stackSize)
             return false;
+        if(emi1.dispSize != emi2.dispSize)
+            return false;
         return true;
     }