Fixed immediate byte accounting bug.
authorGabe Black <gblack@eecs.umich.edu>
Sun, 22 Jul 2007 02:34:52 +0000 (02:34 +0000)
committerGabe Black <gblack@eecs.umich.edu>
Sun, 22 Jul 2007 02:34:52 +0000 (02:34 +0000)
--HG--
extra : convert_revision : ee5275da14a2923b9a525ae5b5c582c15df4608a

src/arch/x86/predecoder.cc
src/arch/x86/predecoder.hh

index 2c997f34b295a37299ed0741123dbbe48b8ca4f3..295ca10a4e9ee7d8fbeb728f3a75ff8bdbbb5a17 100644 (file)
@@ -72,7 +72,6 @@ namespace X86ISA
 
         immediateCollected = 0;
         emi.immediate = 0;
-        displacementCollected = 0;
         emi.displacement = 0;
 
         emi.modRM = 0;
@@ -359,14 +358,16 @@ namespace X86ISA
     {
         State nextState = ErrorState;
 
-        getImmediate(displacementCollected,
+        getImmediate(immediateCollected,
                 emi.displacement,
                 displacementSize);
 
         DPRINTF(Predecoder, "Collecting %d byte displacement, got %d bytes.\n",
-                displacementSize, displacementCollected);
+                displacementSize, immediateCollected);
 
-        if(displacementSize == displacementCollected) {
+        if(displacementSize == immediateCollected) {
+            //Reset this for other immediates.
+            immediateCollected = 0;
             //Sign extend the displacement
             switch(displacementSize)
             {
@@ -411,6 +412,9 @@ namespace X86ISA
 
         if(immediateSize == immediateCollected)
         {
+            //Reset this for other immediates.
+            immediateCollected = 0;
+
             //XXX Warning! The following is an observed pattern and might
             //not always be true!
 
index f34b663640209811c080ee82c0060e56abc77616..450ebd79bccabb0927fec7218b989deea6cfb076 100644 (file)
@@ -106,13 +106,13 @@ namespace X86ISA
             toGet = toGet > remaining ? remaining : toGet;
 
             //Shift the bytes we want to be all the way to the right
-            uint64_t partialDisp = fetchChunk >> (offset * 8);
+            uint64_t partialImm = fetchChunk >> (offset * 8);
             //Mask off what we don't want
-            partialDisp &= mask(toGet * 8);
+            partialImm &= mask(toGet * 8);
             //Shift it over to overlay with our displacement.
-            partialDisp <<= (displacementCollected * 8);
+            partialImm <<= (immediateCollected * 8);
             //Put it into our displacement
-            current |= partialDisp;
+            current |= partialImm;
             //Update how many bytes we've collected.
             collected += toGet;
             consumeBytes(toGet);
@@ -144,9 +144,10 @@ namespace X86ISA
         bool emiIsReady;
         //The size of the displacement value
         int displacementSize;
-        int displacementCollected;
         //The size of the immediate value
         int immediateSize;
+        //This is how much of any immediate value we've gotten. This is used
+        //for both the actual immediate and the displacement.
         int immediateCollected;
 
         enum State {