Fixed width parameter and provided a parameter to flip the carry bit on subtract.
authorGabe Black <gblack@eecs.umich.edu>
Fri, 20 Jul 2007 21:52:44 +0000 (14:52 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Fri, 20 Jul 2007 21:52:44 +0000 (14:52 -0700)
--HG--
extra : convert_revision : d01bb791b000a2fdfc8600f8fb2f8aadd52b0b63

src/arch/x86/insts/microregop.cc
src/arch/x86/insts/microregop.hh

index f4559d95f61d2844815ae55a6cc2c00d4e5b77c7..976b04688f599dbcde67d2195d8bf7c369e59690 100644 (file)
 namespace X86ISA
 {
     uint64_t RegOpBase::genFlags(uint64_t oldFlags, uint64_t flagMask,
-            uint64_t _dest, uint64_t _src1, uint64_t _src2) const
+            uint64_t _dest, uint64_t _src1, uint64_t _src2,
+            bool subtract) const
     {
+        DPRINTF(Sparc, "flagMask = %#x\n", flagMask);
         uint64_t flags = oldFlags & ~flagMask;
-        if(flagMask & CFBit && findCarry(dataSize, _dest, _src1, _src2))
-            flags |= CFBit;
-        if(flagMask & PFBit && findParity(dataSize, _dest))
+        if(flagMask & CFBit)
+            if(findCarry(dataSize*8, _dest, _src1, _src2))
+                flags |= CFBit;
+            if(subtract)
+                flags ^= CFBit;
+        if(flagMask & PFBit && findParity(dataSize*8, _dest))
             flags |= PFBit;
-        if(flagMask & ECFBit && findCarry(dataSize, _dest, _src1, _src2))
+        if(flagMask & ECFBit && findCarry(dataSize*8, _dest, _src1, _src2))
             flags |= ECFBit;
-        if(flagMask & AFBit && findCarry(4, _dest, _src1, _src2))
-            flags |= AFBit;
-        if(flagMask & EZFBit && findZero(dataSize, _dest))
+        if(flagMask & AFBit)
+            if(findCarry(4, _dest, _src1, _src2))
+                flags |= AFBit;
+            if(subtract)
+                flags ^= AFBit;
+        if(flagMask & EZFBit && findZero(dataSize*8, _dest))
             flags |= EZFBit;
-        if(flagMask & ZFBit && findZero(dataSize, _dest))
+        if(flagMask & ZFBit && findZero(dataSize*8, _dest))
             flags |= ZFBit;
-        if(flagMask & SFBit && findNegative(dataSize, _dest))
+        if(flagMask & SFBit && findNegative(dataSize*8, _dest))
             flags |= SFBit;
-        if(flagMask & OFBit && findOverflow(dataSize, _dest, _src1, _src2))
+        if(flagMask & OFBit && findOverflow(dataSize*8, _dest, _src1, _src2))
             flags |= OFBit;
         return flags;
     }
index a8049ba1927886e4d6e1ab31118c4826e89cd120..f411c07751362adeb1845fde8d89844a2342725a 100644 (file)
@@ -132,7 +132,8 @@ namespace X86ISA
 
         //Figure out what the condition code flags should be.
         uint64_t genFlags(uint64_t oldFlags, uint64_t flagMask,
-                uint64_t _dest, uint64_t _src1, uint64_t _src2) const;
+                uint64_t _dest, uint64_t _src1, uint64_t _src2,
+                bool subtract = false) const;
         bool checkCondition(uint64_t flags) const;
     };