diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp b/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp index 842295699..6743ae2ee 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp @@ -1877,8 +1877,11 @@ void OpDispatchBuilder::BZHI(OpcodeArgs) { auto Zero = _Constant(0); auto One = _Constant(1); - auto CF = _NZCVSelect(OpSize::i32Bit, {COND_NEQ}, One, Zero); - CalculateFlags_BZHI(Size, Result, CF); + auto CFInv = _NZCVSelect(OpSize::i32Bit, {COND_EQ}, One, Zero); + + InvalidatePF_AF(); + SetNZ_ZeroCV(Size, Result); + SetCFInverted(CFInv); } void OpDispatchBuilder::RORX(OpcodeArgs) { diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher.h b/FEXCore/Source/Interface/Core/OpcodeDispatcher.h index 0515a632a..3c502940a 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher.h +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher.h @@ -2306,7 +2306,6 @@ private: void CalculateFlags_BLSMSK(uint8_t SrcSize, Ref Res, Ref Src); void CalculateFlags_BLSR(uint8_t SrcSize, Ref Res, Ref Src); void CalculateFlags_POPCOUNT(Ref Src); - void CalculateFlags_BZHI(uint8_t SrcSize, Ref Result, Ref Src); void CalculateFlags_ZCNT(uint8_t SrcSize, Ref Result); void CalculateFlags_RDRAND(Ref Src); /** @} */ diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp b/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp index 116bc17bd..2e382cab2 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp @@ -603,12 +603,6 @@ void OpDispatchBuilder::CalculateFlags_POPCOUNT(Ref Result) { ZeroPF_AF(); } -void OpDispatchBuilder::CalculateFlags_BZHI(uint8_t SrcSize, Ref Result, Ref Src) { - InvalidatePF_AF(); - SetNZ_ZeroCV(SrcSize, Result); - SetCFDirect(Src); -} - void OpDispatchBuilder::CalculateFlags_ZCNT(uint8_t SrcSize, Ref Result) { // OF, SF, AF, PF all undefined // Test ZF of result, SF is undefined so this is ok.