diff options
author | Gabe Black <gblack@eecs.umich.edu> | 2009-08-05 03:06:01 -0700 |
---|---|---|
committer | Gabe Black <gblack@eecs.umich.edu> | 2009-08-05 03:06:01 -0700 |
commit | e2e0ae576a3f0425cd7092d9115debefa64d7476 (patch) | |
tree | 84f887209ee15b2dbf80891aa26f74865391ca9f /src/arch/x86 | |
parent | ef3896d8517990c22fe822649cf1965d6152a137 (diff) | |
download | gem5-e2e0ae576a3f0425cd7092d9115debefa64d7476.tar.xz |
X86: Make sure immediate values are truncated properly.
Register values will be "picked" which will assure they don't have junk beyond
the part we're using. Immediate values don't go through a similar process, so
we should truncate them explicitly.
Diffstat (limited to 'src/arch/x86')
-rw-r--r-- | src/arch/x86/isa/microops/regop.isa | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/src/arch/x86/isa/microops/regop.isa b/src/arch/x86/isa/microops/regop.isa index e0228ec0e..f2a574954 100644 --- a/src/arch/x86/isa/microops/regop.isa +++ b/src/arch/x86/isa/microops/regop.isa @@ -525,7 +525,7 @@ let {{ uint64_t hiResult; uint64_t psrc1_h = psrc1 / shifter; uint64_t psrc1_l = psrc1 & mask(halfSize); - uint64_t psrc2_h = op2 / shifter; + uint64_t psrc2_h = (op2 / shifter) & mask(halfSize); uint64_t psrc2_l = op2 & mask(halfSize); hiResult = ((psrc1_l * psrc2_h + psrc1_h * psrc2_l + ((psrc1_l * psrc2_l) / shifter)) /shifter) + @@ -545,7 +545,7 @@ let {{ uint64_t shifter = (1ULL << halfSize); uint64_t psrc1_h = psrc1 / shifter; uint64_t psrc1_l = psrc1 & mask(halfSize); - uint64_t psrc2_h = op2 / shifter; + uint64_t psrc2_h = (op2 / shifter) & mask(halfSize); uint64_t psrc2_l = op2 & mask(halfSize); ProdHi = ((psrc1_l * psrc2_h + psrc1_h * psrc2_l + ((psrc1_l * psrc2_l) / shifter)) / shifter) + |