Fixed width parameter and provided a parameter to flip the carry bit on subtract.
--HG-- extra : convert_revision : d01bb791b000a2fdfc8600f8fb2f8aadd52b0b63
This commit is contained in:
parent
cfadef74d1
commit
0781609693
2 changed files with 21 additions and 12 deletions
|
@ -63,24 +63,32 @@
|
||||||
namespace X86ISA
|
namespace X86ISA
|
||||||
{
|
{
|
||||||
uint64_t RegOpBase::genFlags(uint64_t oldFlags, uint64_t flagMask,
|
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;
|
uint64_t flags = oldFlags & ~flagMask;
|
||||||
if(flagMask & CFBit && findCarry(dataSize, _dest, _src1, _src2))
|
if(flagMask & CFBit)
|
||||||
flags |= CFBit;
|
if(findCarry(dataSize*8, _dest, _src1, _src2))
|
||||||
if(flagMask & PFBit && findParity(dataSize, _dest))
|
flags |= CFBit;
|
||||||
|
if(subtract)
|
||||||
|
flags ^= CFBit;
|
||||||
|
if(flagMask & PFBit && findParity(dataSize*8, _dest))
|
||||||
flags |= PFBit;
|
flags |= PFBit;
|
||||||
if(flagMask & ECFBit && findCarry(dataSize, _dest, _src1, _src2))
|
if(flagMask & ECFBit && findCarry(dataSize*8, _dest, _src1, _src2))
|
||||||
flags |= ECFBit;
|
flags |= ECFBit;
|
||||||
if(flagMask & AFBit && findCarry(4, _dest, _src1, _src2))
|
if(flagMask & AFBit)
|
||||||
flags |= AFBit;
|
if(findCarry(4, _dest, _src1, _src2))
|
||||||
if(flagMask & EZFBit && findZero(dataSize, _dest))
|
flags |= AFBit;
|
||||||
|
if(subtract)
|
||||||
|
flags ^= AFBit;
|
||||||
|
if(flagMask & EZFBit && findZero(dataSize*8, _dest))
|
||||||
flags |= EZFBit;
|
flags |= EZFBit;
|
||||||
if(flagMask & ZFBit && findZero(dataSize, _dest))
|
if(flagMask & ZFBit && findZero(dataSize*8, _dest))
|
||||||
flags |= ZFBit;
|
flags |= ZFBit;
|
||||||
if(flagMask & SFBit && findNegative(dataSize, _dest))
|
if(flagMask & SFBit && findNegative(dataSize*8, _dest))
|
||||||
flags |= SFBit;
|
flags |= SFBit;
|
||||||
if(flagMask & OFBit && findOverflow(dataSize, _dest, _src1, _src2))
|
if(flagMask & OFBit && findOverflow(dataSize*8, _dest, _src1, _src2))
|
||||||
flags |= OFBit;
|
flags |= OFBit;
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
|
@ -132,7 +132,8 @@ namespace X86ISA
|
||||||
|
|
||||||
//Figure out what the condition code flags should be.
|
//Figure out what the condition code flags should be.
|
||||||
uint64_t genFlags(uint64_t oldFlags, uint64_t flagMask,
|
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;
|
bool checkCondition(uint64_t flags) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue