Calculate the correct address size.
authorGabe Black <gblack@eecs.umich.edu>
Wed, 18 Jul 2007 03:54:55 +0000 (20:54 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 18 Jul 2007 03:54:55 +0000 (20:54 -0700)
--HG--
extra : convert_revision : 6bd9d5a01ba6600781e3678e0403dca524fb2cba

src/arch/x86/predecoder.cc

index 49f76699b384a0019e5efcd0d25607b91081f44e..6052d839291f84d52636afc9110152b436d90467 100644 (file)
@@ -235,14 +235,42 @@ namespace X86ISA
                     logOpSize = 1; // 16 bit operand size
             }
 
+            //Set the actual op size
+            emi.opSize = 1 << logOpSize;
+
+            //Figure out the effective address size. This can be overriden to
+            //a fixed value at the decoder level.
+            int logAddrSize;
+            if(/*FIXME 64-bit mode*/1)
+            {
+                if(emi.legacy.addr)
+                    logAddrSize = 2; // 32 bit address size
+                else
+                    logAddrSize = 3; // 64 bit address size
+            }
+            else if(/*FIXME default 32*/1)
+            {
+                if(emi.legacy.addr)
+                    logAddrSize = 1; // 16 bit address size
+                else
+                    logAddrSize = 2; // 32 bit address size
+            }
+            else // 16 bit default operand size
+            {
+                if(emi.legacy.addr)
+                    logAddrSize = 2; // 32 bit address size
+                else
+                    logAddrSize = 1; // 16 bit address size
+            }
+
+            //Set the actual address size
+            emi.addrSize = 1 << logAddrSize;
+
             //Figure out how big of an immediate we'll retreive based
             //on the opcode.
             int immType = ImmediateType[emi.opcode.num - 1][nextByte];
             immediateSize = SizeTypeToSize[logOpSize - 1][immType];
 
-            //Set the actual op size
-            emi.opSize = 1 << logOpSize;
-
             //Determine what to expect next
             if (UsesModRM[emi.opcode.num - 1][nextByte]) {
                 nextState = ModRMState;