From 0ef8aaebeb291189d9d79399eab3a5cb3bdb1c42 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Fri, 9 Aug 2024 17:22:51 -0400 Subject: [PATCH] OpcodeDispatcher: optimize BZHI Signed-off-by: Alyssa Rosenzweig --- FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp | 7 +++++-- FEXCore/Source/Interface/Core/OpcodeDispatcher.h | 1 - FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp | 6 ------ 3 files changed, 5 insertions(+), 9 deletions(-) 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.