diff --git a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp index 2ac844f3f..afc187a56 100644 --- a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp +++ b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp @@ -3414,10 +3414,7 @@ void OpDispatchBuilder::DAAOp(OpcodeArgs) { SetRFLAG(_Select(FEXCore::IR::COND_UGE, _And(AL, _Constant(0x80)), _Constant(0), _Constant(1), _Constant(0))); SetRFLAG(_Select(FEXCore::IR::COND_EQ, _And(AL, _Constant(0xFF)), _Constant(0), _Constant(1), _Constant(0))); - auto EightBitMask = _Constant(0xFF); - auto PopCountOp = _Popcount(_And(AL, EightBitMask)); - auto XorOp = _Xor(PopCountOp, _Constant(1)); - SetRFLAG(XorOp); + CalculatePFUncheckedABI(AL); } void OpDispatchBuilder::DASOp(OpcodeArgs) { @@ -3478,10 +3475,7 @@ void OpDispatchBuilder::DASOp(OpcodeArgs) { AL = LoadGPRRegister(X86State::REG_RAX, 1); SetRFLAG(_Select(FEXCore::IR::COND_UGE, _And(AL, _Constant(0x80)), _Constant(0), _Constant(1), _Constant(0))); SetRFLAG(_Select(FEXCore::IR::COND_EQ, _And(AL, _Constant(0xFF)), _Constant(0), _Constant(1), _Constant(0))); - auto EightBitMask = _Constant(0xFF); - auto PopCountOp = _Popcount(_And(AL, EightBitMask)); - auto XorOp = _Xor(PopCountOp, _Constant(1)); - SetRFLAG(XorOp); + CalculatePFUncheckedABI(AL); } void OpDispatchBuilder::AAAOp(OpcodeArgs) { @@ -3566,10 +3560,7 @@ void OpDispatchBuilder::AAMOp(OpcodeArgs) { AL = LoadGPRRegister(X86State::REG_RAX, 1); SetRFLAG(_Select(FEXCore::IR::COND_UGE, _And(AL, _Constant(0x80)), _Constant(0), _Constant(1), _Constant(0))); SetRFLAG(_Select(FEXCore::IR::COND_EQ, _And(AL, _Constant(0xFF)), _Constant(0), _Constant(1), _Constant(0))); - auto EightBitMask = _Constant(0xFF); - auto PopCountOp = _Popcount(_And(AL, EightBitMask)); - auto XorOp = _Xor(PopCountOp, _Constant(1)); - SetRFLAG(XorOp); + CalculatePFUncheckedABI(AL); } void OpDispatchBuilder::AADOp(OpcodeArgs) { @@ -3586,10 +3577,7 @@ void OpDispatchBuilder::AADOp(OpcodeArgs) { AL = LoadGPRRegister(X86State::REG_RAX, 1); SetRFLAG(_Select(FEXCore::IR::COND_UGE, _And(AL, _Constant(0x80)), _Constant(0), _Constant(1), _Constant(0))); SetRFLAG(_Select(FEXCore::IR::COND_EQ, _And(AL, _Constant(0xFF)), _Constant(0), _Constant(1), _Constant(0))); - auto EightBitMask = _Constant(0xFF); - auto PopCountOp = _Popcount(_And(AL, EightBitMask)); - auto XorOp = _Xor(PopCountOp, _Constant(1)); - SetRFLAG(XorOp); + CalculatePFUncheckedABI(AL); } void OpDispatchBuilder::XLATOp(OpcodeArgs) { diff --git a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.h b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.h index 9e71c119b..e84624dbc 100644 --- a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.h +++ b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.h @@ -1155,6 +1155,9 @@ private: /** * @name These functions are used by the deferred flag handling while it is calculating and storing flags in to RFLAGs. * @{ */ + void CalculatePFUncheckedABI(OrderedNode *Res); + void CalculatePF(OrderedNode *Res); + void CalculateOF_Add(uint8_t SrcSize, OrderedNode *Res, OrderedNode *Src1, OrderedNode *Src2); void CalculateFlags_ADC(uint8_t SrcSize, OrderedNode *Res, OrderedNode *Src1, OrderedNode *Src2, OrderedNode *CF); void CalculateFlags_SBB(uint8_t SrcSize, OrderedNode *Res, OrderedNode *Src1, OrderedNode *Src2, OrderedNode *CF); diff --git a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp index a83c2f784..ea6f1002d 100644 --- a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp +++ b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp @@ -86,6 +86,23 @@ void OpDispatchBuilder::CalculateOF_Add(uint8_t SrcSize, OrderedNode *Res, Order SetRFLAG(AndOp1); } +void OpDispatchBuilder::CalculatePFUncheckedABI(OrderedNode *Res) { + auto One = _Constant(1); + auto EightBitMask = _Constant(0xFF); + + auto PopCountOp = _Popcount(_And(Res, EightBitMask)); + auto XorOp = _Xor(PopCountOp, One); + SetRFLAG(XorOp); +} + +void OpDispatchBuilder::CalculatePF(OrderedNode *Res) { + if (!CTX->Config.ABINoPF) { + CalculatePFUncheckedABI(Res); + } else { + _InvalidateFlags(1UL << FEXCore::X86State::RFLAG_PF_LOC); + } +} + void OpDispatchBuilder::CalculateDeferredFlags(uint32_t FlagsToCalculateMask) { if (CurrentDeferredFlags.Type == FlagsGenerationType::TYPE_NONE) { // Nothing to do @@ -282,15 +299,7 @@ void OpDispatchBuilder::CalculateFlags_ADC(uint8_t SrcSize, OrderedNode *Res, Or SetRFLAG(SignOp); } - // PF - if (!CTX->Config.ABINoPF) { - auto PopCountOp = _Popcount(_And(Res, _Constant(0xFF))); - - auto XorOp = _Xor(PopCountOp, One); - SetRFLAG(XorOp); - } else { - _InvalidateFlags(1UL << FEXCore::X86State::RFLAG_PF_LOC); - } + CalculatePF(Res); // ZF { @@ -329,15 +338,7 @@ void OpDispatchBuilder::CalculateFlags_SBB(uint8_t SrcSize, OrderedNode *Res, Or SetRFLAG(SignOp); } - // PF - if (!CTX->Config.ABINoPF) { - auto PopCountOp = _Popcount(_And(Res, _Constant(0xFF))); - - auto XorOp = _Xor(PopCountOp, One); - SetRFLAG(XorOp); - } else { - _InvalidateFlags(1UL << FEXCore::X86State::RFLAG_PF_LOC); - } + CalculatePF(Res); // ZF { @@ -383,15 +384,7 @@ void OpDispatchBuilder::CalculateFlags_SUB(uint8_t SrcSize, OrderedNode *Res, Or SetRFLAG(SignOp); } - // PF - if (!CTX->Config.ABINoPF) { - auto EightBitMask = _Constant(0xFF); - auto PopCountOp = _Popcount(_And(Res, EightBitMask)); - auto XorOp = _Xor(PopCountOp, One); - SetRFLAG(XorOp); - } else { - _InvalidateFlags(1UL << FEXCore::X86State::RFLAG_PF_LOC); - } + CalculatePF(Res); // ZF { @@ -436,15 +429,7 @@ void OpDispatchBuilder::CalculateFlags_ADD(uint8_t SrcSize, OrderedNode *Res, Or SetRFLAG(SignOp); } - // PF - if (!CTX->Config.ABINoPF) { - auto EightBitMask = _Constant(0xFF); - auto PopCountOp = _Popcount(_And(Res, EightBitMask)); - auto XorOp = _Xor(PopCountOp, One); - SetRFLAG(XorOp); - } else { - _InvalidateFlags(1UL << FEXCore::X86State::RFLAG_PF_LOC); - } + CalculatePF(Res); // ZF { @@ -530,15 +515,7 @@ void OpDispatchBuilder::CalculateFlags_Logical(uint8_t SrcSize, OrderedNode *Res SetRFLAG(SignOp); } - // PF - if (!CTX->Config.ABINoPF) { - auto EightBitMask = _Constant(0xFF); - auto PopCountOp = _Popcount(_And(Res, EightBitMask)); - auto XorOp = _Xor(PopCountOp, One); - SetRFLAG(XorOp); - } else { - _InvalidateFlags(1UL << FEXCore::X86State::RFLAG_PF_LOC); - } + CalculatePF(Res); // ZF { @@ -572,15 +549,7 @@ void OpDispatchBuilder::CalculateFlags_ShiftLeft(uint8_t SrcSize, OrderedNode *R COND_FLAG_SET(Src2, RFLAG_CF_LOC, LastBit); } - // PF - if (!CTX->Config.ABINoPF) { - auto EightBitMask = _Constant(0xFF); - auto PopCountOp = _Popcount(_And(Res, EightBitMask)); - auto XorOp = _Xor(PopCountOp, One); - COND_FLAG_SET(Src2, RFLAG_PF_LOC, XorOp); - } else { - _InvalidateFlags(1UL << FEXCore::X86State::RFLAG_PF_LOC); - } + CalculatePF(Res); // AF { @@ -623,15 +592,7 @@ void OpDispatchBuilder::CalculateFlags_ShiftRight(uint8_t SrcSize, OrderedNode * COND_FLAG_SET(Src2, RFLAG_CF_LOC, LastBit); } - // PF - if (!CTX->Config.ABINoPF) { - auto EightBitMask = _Constant(0xFF); - auto PopCountOp = _Popcount(_And(Res, EightBitMask)); - auto XorOp = _Xor(PopCountOp, One); - COND_FLAG_SET(Src2, RFLAG_PF_LOC, XorOp); - } else { - _InvalidateFlags(1UL << FEXCore::X86State::RFLAG_PF_LOC); - } + CalculatePF(Res); // AF { @@ -674,15 +635,7 @@ void OpDispatchBuilder::CalculateFlags_SignShiftRight(uint8_t SrcSize, OrderedNo COND_FLAG_SET(Src2, RFLAG_CF_LOC, LastBit); } - // PF - if (!CTX->Config.ABINoPF) { - auto EightBitMask = _Constant(0xFF); - auto PopCountOp = _Popcount(_And(Res, EightBitMask)); - auto XorOp = _Xor(PopCountOp, One); - COND_FLAG_SET(Src2, RFLAG_PF_LOC, XorOp); - } else { - _InvalidateFlags(1UL << FEXCore::X86State::RFLAG_PF_LOC); - } + CalculatePF(Res); // AF { @@ -727,15 +680,7 @@ void OpDispatchBuilder::CalculateFlags_ShiftLeftImmediate(uint8_t SrcSize, Order SetRFLAG(_Bfe(1, OpSize - Shift, Src1)); } - // PF - if (!CTX->Config.ABINoPF) { - auto EightBitMask = _Constant(0xFF); - auto PopCountOp = _Popcount(_And(Res, EightBitMask)); - auto XorOp = _Xor(PopCountOp, One); - SetRFLAG(XorOp); - } else { - _InvalidateFlags(1UL << FEXCore::X86State::RFLAG_PF_LOC); - } + CalculatePF(Res); // AF { @@ -778,15 +723,7 @@ void OpDispatchBuilder::CalculateFlags_SignShiftRightImmediate(uint8_t SrcSize, SetRFLAG(_Bfe(1, Shift-1, Src1)); } - // PF - if (!CTX->Config.ABINoPF) { - auto EightBitMask = _Constant(0xFF); - auto PopCountOp = _Popcount(_And(Res, EightBitMask)); - auto XorOp = _Xor(PopCountOp, One); - SetRFLAG(XorOp); - } else { - _InvalidateFlags(1UL << FEXCore::X86State::RFLAG_PF_LOC); - } + CalculatePF(Res); // AF { @@ -830,15 +767,7 @@ void OpDispatchBuilder::CalculateFlags_ShiftRightImmediate(uint8_t SrcSize, Orde SetRFLAG(_Bfe(1, Shift-1, Src1)); } - // PF - if (!CTX->Config.ABINoPF) { - auto EightBitMask = _Constant(0xFF); - auto PopCountOp = _Popcount(_And(Res, EightBitMask)); - auto XorOp = _Xor(PopCountOp, One); - SetRFLAG(XorOp); - } else { - _InvalidateFlags(1UL << FEXCore::X86State::RFLAG_PF_LOC); - } + CalculatePF(Res); // AF {