summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2007-07-20 14:52:44 -0700
committerGabe Black <gblack@eecs.umich.edu>2007-07-20 14:52:44 -0700
commit0781609693ef3ec0ee12aa6031c62d8a2e67d49c (patch)
tree1fdde601ed31e1f4f46317b595472521238efbb9
parentcfadef74d1d7ce47d0bd30a14a509a15a354849a (diff)
downloadgem5-0781609693ef3ec0ee12aa6031c62d8a2e67d49c.tar.xz
Fixed width parameter and provided a parameter to flip the carry bit on subtract.
--HG-- extra : convert_revision : d01bb791b000a2fdfc8600f8fb2f8aadd52b0b63
-rw-r--r--src/arch/x86/insts/microregop.cc30
-rw-r--r--src/arch/x86/insts/microregop.hh3
2 files changed, 21 insertions, 12 deletions
diff --git a/src/arch/x86/insts/microregop.cc b/src/arch/x86/insts/microregop.cc
index f4559d95f..976b04688 100644
--- a/src/arch/x86/insts/microregop.cc
+++ b/src/arch/x86/insts/microregop.cc
@@ -63,24 +63,32 @@
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;
}
diff --git a/src/arch/x86/insts/microregop.hh b/src/arch/x86/insts/microregop.hh
index a8049ba19..f411c0775 100644
--- a/src/arch/x86/insts/microregop.hh
+++ b/src/arch/x86/insts/microregop.hh
@@ -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;
};