diff --git a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp index 860ed4c3a..aadfa202d 100644 --- a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp +++ b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp @@ -876,7 +876,7 @@ OrderedNode *OpDispatchBuilder::SelectCC(uint8_t OP, OrderedNode *TrueValue, Ord case 0x7: { // JA - Jump if CF == 0 && ZF == 0 auto Flag1 = GetRFLAG(FEXCore::X86State::RFLAG_ZF_LOC); auto Flag2 = GetRFLAG(FEXCore::X86State::RFLAG_CF_LOC); - auto Check = _Or(Flag1, _Lshl(Flag2, _Constant(1))); + auto Check = _Or(Flag1, Flag2); SrcCond = _Select(FEXCore::IR::COND_EQ, Check, ZeroConst, TrueValue, FalseValue); break; diff --git a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp index c317c3b65..5f3c0b248 100644 --- a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp +++ b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp @@ -271,10 +271,8 @@ void OpDispatchBuilder::CalculcateFlags_ADC(uint8_t SrcSize, OrderedNode *Res, O // SF { - auto SignBitConst = _Constant(Size - 1); - - auto LshrOp = _Lshr(Res, SignBitConst); - SetRFLAG(LshrOp); + auto SignOp = _Bfe(1, SrcSize * 8 - 1, Res); + SetRFLAG(SignOp); } // PF @@ -342,10 +340,8 @@ void OpDispatchBuilder::CalculcateFlags_SBB(uint8_t SrcSize, OrderedNode *Res, O // SF { - auto SignBitConst = _Constant(SrcSize * 8 - 1); - - auto LshrOp = _Lshr(Res, SignBitConst); - SetRFLAG(LshrOp); + auto SignOp = _Bfe(1, SrcSize * 8 - 1, Res); + SetRFLAG(SignOp); } // PF @@ -412,10 +408,8 @@ void OpDispatchBuilder::CalculcateFlags_SUB(uint8_t SrcSize, OrderedNode *Res, O // SF { - auto SignBitConst = _Constant(SrcSize * 8 - 1); - - auto LshrOp = _Lshr(Res, SignBitConst); - SetRFLAG(LshrOp); + auto SignOp = _Bfe(1, SrcSize * 8 - 1, Res); + SetRFLAG(SignOp); } // PF @@ -469,10 +463,8 @@ void OpDispatchBuilder::CalculcateFlags_ADD(uint8_t SrcSize, OrderedNode *Res, O // SF { - auto SignBitConst = _Constant(SrcSize * 8 - 1); - - auto LshrOp = _Lshr(Res, SignBitConst); - SetRFLAG(LshrOp); + auto SignOp = _Bfe(1, SrcSize * 8 - 1, Res); + SetRFLAG(SignOp); } // PF @@ -583,10 +575,8 @@ void OpDispatchBuilder::CalculcateFlags_Logical(uint8_t SrcSize, OrderedNode *Re // SF { - auto SignBitConst = _Constant(SrcSize * 8 - 1); - - auto LshrOp = _Lshr(Res, SignBitConst); - SetRFLAG(LshrOp); + auto SignOp = _Bfe(1, SrcSize * 8 - 1, Res); + SetRFLAG(SignOp); } // PF @@ -750,10 +740,8 @@ void OpDispatchBuilder::CalculcateFlags_SignShiftRight(uint8_t SrcSize, OrderedN // SF { - auto SignBitConst = _Constant(SrcSize * 8 - 1); - - auto LshrOp = _Lshr(Res, SignBitConst); - COND_FLAG_SET(Src2, RFLAG_SF_LOC, LshrOp); + auto SignBitOp = _Bfe(1, SrcSize * 8 - 1, Res); + COND_FLAG_SET(Src2, RFLAG_SF_LOC, SignBitOp); } // OF @@ -802,15 +790,14 @@ void OpDispatchBuilder::CalculcateFlags_ShiftLeftImmediate(uint8_t SrcSize, Orde // SF { - auto LshrOp = _Bfe(1, SrcSize * 8 - 1, Res); - - SetRFLAG(LshrOp); + auto SignOp = _Bfe(1, SrcSize * 8 - 1, Res); + SetRFLAG(SignOp); // OF // In the case of left shift. OF is only set from the result of XOR if (Shift == 1) { auto SourceBit = _Bfe(1, SrcSize * 8 - 1, Src1); - SetRFLAG(_Xor(SourceBit, LshrOp)); + SetRFLAG(_Xor(SourceBit, SignOp)); } } } @@ -851,10 +838,8 @@ void OpDispatchBuilder::CalculcateFlags_SignShiftRightImmediate(uint8_t SrcSize, // SF { - auto SignBitConst = _Constant(SrcSize * 8 - 1); - - auto LshrOp = _Lshr(Res, SignBitConst); - SetRFLAG(LshrOp); + auto SignBitOp = _Bfe(1, SrcSize * 8 - 1, Res); + SetRFLAG(SignBitOp); // OF // Only defined when Shift is 1 else undefined @@ -902,10 +887,8 @@ void OpDispatchBuilder::CalculcateFlags_ShiftRightImmediate(uint8_t SrcSize, Ord // SF { - auto SignBitConst = _Constant(SrcSize * 8 - 1); - - auto LshrOp = _Lshr(Res, SignBitConst); - SetRFLAG(LshrOp); + auto SignBitOp = _Bfe(1, SrcSize * 8 - 1, Res); + SetRFLAG(SignBitOp); } // OF @@ -1115,10 +1098,8 @@ void OpDispatchBuilder::CalculcateFlags_BLSI(uint8_t SrcSize, OrderedNode *Src) // SF { - auto SignBit = _Constant(SrcSize * 8 - 1); - auto SFOp = _Lshr(Src, SignBit); - - SetRFLAG(SFOp); + auto SignOp = _Bfe(1, SrcSize * 8 - 1, Src); + SetRFLAG(SignOp); } } @@ -1174,10 +1155,8 @@ void OpDispatchBuilder::CalculcateFlags_BLSR(uint8_t SrcSize, OrderedNode *Resul // SF { - auto SignBit = _Constant(SrcSize * 8 - 1); - auto SFOp = _Lshr(Result, SignBit); - - SetRFLAG(SFOp); + auto SignOp = _Bfe(1, SrcSize * 8 - 1, Result); + SetRFLAG(SignOp); } } @@ -1230,9 +1209,8 @@ void OpDispatchBuilder::CalculcateFlags_BZHI(uint8_t SrcSize, OrderedNode *Resul // SF { - auto SFOp = _Lshr(Result, Bounds); - - SetRFLAG(SFOp); + auto SignOp = _Bfe(1, SrcSize * 8 - 1, Result); + SetRFLAG(SignOp); } }