X86: Make sure immediate values are truncated properly.
authorGabe Black <gblack@eecs.umich.edu>
Wed, 5 Aug 2009 10:06:01 +0000 (03:06 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 5 Aug 2009 10:06:01 +0000 (03:06 -0700)
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.

src/arch/x86/isa/microops/regop.isa

index e0228ec0e448ed6af984c714204ffb9f80f726bf..f2a57495454aceae6b33a48ef57d3996a5f2ae79 100644 (file)
@@ -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) +