From a2cbfccb3b7b4506fb03ae770a82e4351f8dcebb Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Tue, 6 Jun 2023 17:56:25 -0700 Subject: [PATCH] OpcodeDispatcher: Optimize EFLAG unpacking Noticed this was slightly unoptimal. Resulting in a 18% code reduction in the case of of a simple four instruction test ASM case. --- External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp | 2 +- .../FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp index cf9463f3f..620b11305 100644 --- a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp +++ b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp @@ -1544,7 +1544,7 @@ void OpDispatchBuilder::SAHFOp(OpcodeArgs) { OrderedNode *Src = LoadGPRRegister(X86State::REG_RAX, 1, 8); // Clear bits that aren't supposed to be set - Src = _And(Src, _Constant(~0b101000)); + Src = _Andn(Src, _Constant(0b101000)); // Set the bit that is always set here Src = _Or(Src, _Constant(0b10)); diff --git a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp index d8675fc53..93144c966 100644 --- a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp +++ b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp @@ -52,10 +52,9 @@ void OpDispatchBuilder::SetPackedRFLAG(bool Lower8, OrderedNode *Src) { InvalidateDeferredFlags(); } - auto OneConst = _Constant(1); for (size_t i = 0; i < NumFlags; ++i) { const auto FlagOffset = FlagOffsets[i]; - auto Tmp = _And(_Lshr(Src, _Constant(FlagOffset)), OneConst); + auto Tmp = _Bfe(4, 1, FlagOffset, Src); SetRFLAG(Tmp, FlagOffset); } }