X86: Fix the overflow bit for rotate right with carry.
authorGabe Black <gblack@eecs.umich.edu>
Wed, 5 Aug 2009 10:01:23 +0000 (03:01 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 5 Aug 2009 10:01:23 +0000 (03:01 -0700)
src/arch/x86/isa/microops/regop.isa

index e3ad164ebc0b194595525b5e020a9bfa1735e64c..0bf3420b81b3b5a138dcc28c029de5f944a1c215 100644 (file)
@@ -777,13 +777,15 @@ let {{
         flag_code = '''
             // If the shift amount is zero, no flags should be modified.
             if (shiftAmt) {
+                int origCFBit = (ccFlagBits & CFBit) ? 1 : 0;
                 //Zero out any flags we might modify. This way we only have to
                 //worry about setting them.
                 ccFlagBits = ccFlagBits & ~(ext & (CFBit | ECFBit | OFBit));
                 //Figure out what the OF bit should be.
-                if ((ext & OFBit) && ((ccFlagBits & CFBit) ^
-                                      bits(SrcReg1, dataSize * 8 - 1)))
+                if ((ext & OFBit) && (origCFBit ^
+                                      bits(SrcReg1, dataSize * 8 - 1))) {
                     ccFlagBits = ccFlagBits | OFBit;
+                }
                 //If some combination of the CF bits need to be set, set them.
                 if ((ext & (CFBit | ECFBit)) && bits(SrcReg1, shiftAmt - 1))
                     ccFlagBits = ccFlagBits | (ext & (CFBit | ECFBit));