diff options
author | Gabe Black <gblack@eecs.umich.edu> | 2007-07-22 02:34:52 +0000 |
---|---|---|
committer | Gabe Black <gblack@eecs.umich.edu> | 2007-07-22 02:34:52 +0000 |
commit | 47b024261895adf02ca6428a9ba67db16d2172b1 (patch) | |
tree | 6145ea3cf4607b21cbb85835aedf838083b8a245 | |
parent | bff4f765f53b371139991e531ab00a0c650410e5 (diff) | |
download | gem5-47b024261895adf02ca6428a9ba67db16d2172b1.tar.xz |
Fixed immediate byte accounting bug.
--HG--
extra : convert_revision : ee5275da14a2923b9a525ae5b5c582c15df4608a
-rw-r--r-- | src/arch/x86/predecoder.cc | 12 | ||||
-rw-r--r-- | src/arch/x86/predecoder.hh | 11 |
2 files changed, 14 insertions, 9 deletions
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 { |