diff --git a/src/arch/x86/predecoder.cc b/src/arch/x86/predecoder.cc index 2c997f34b..295ca10a4 100644 --- a/src/arch/x86/predecoder.cc +++ b/src/arch/x86/predecoder.cc @@ -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! diff --git a/src/arch/x86/predecoder.hh b/src/arch/x86/predecoder.hh index f34b66364..450ebd79b 100644 --- a/src/arch/x86/predecoder.hh +++ b/src/arch/x86/predecoder.hh @@ -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 {