From dcef1212c6cb7c0afa3e8ee885d22872da45b8ba Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Tue, 5 Aug 2025 09:29:38 -0400 Subject: [PATCH] OpcodeDispatcher: add and use NZCVSelect01 helper Signed-off-by: Alyssa Rosenzweig --- FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp | 4 +--- FEXCore/Source/Interface/Core/OpcodeDispatcher.h | 8 ++++---- FEXCore/Source/Interface/Core/OpcodeDispatcher/X87.cpp | 4 ++-- FEXCore/Source/Interface/IR/IREmitter.h | 4 ++++ 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp b/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp index 7f5c2c7ac..5fff30430 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp @@ -1769,9 +1769,7 @@ void OpDispatchBuilder::BZHI(OpcodeArgs) { auto Result = _NZCVSelect(Size, {COND_NEQ}, Src, MaskResult); StoreResult(GPRClass, Op, Result, OpSize::iInvalid); - auto Zero = _InlineConstant(0); - auto One = _InlineConstant(1); - auto CFInv = _NZCVSelect(OpSize::i32Bit, {COND_EQ}, One, Zero); + auto CFInv = _NZCVSelect01({COND_EQ}); InvalidatePF_AF(); SetNZ_ZeroCV(Size, Result); diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher.h b/FEXCore/Source/Interface/Core/OpcodeDispatcher.h index f996e7b85..89af6839f 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher.h +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher.h @@ -2050,7 +2050,7 @@ private: } else { // Because we explicitly inverted for CF above, we use the unsafe // _NZCVSelect rather than the safe CF-aware version. - return _NZCVSelect(OpSize::i32Bit, CondForNZCVBit(BitOffset, Invert), Constant(1), Constant(0)); + return _NZCVSelect01(CondForNZCVBit(BitOffset, Invert)); } } else if (BitOffset == FEXCore::X86State::RFLAG_PF_RAW_LOC) { return LoadGPR(Core::CPUState::PF_AS_GREG); @@ -2147,7 +2147,7 @@ private: void ConvertNZCVToX87() { LOGMAN_THROW_A_FMT(NZCVDirty && CachedNZCV, "NZCV must be saved"); - Ref V = _NZCVSelect(OpSize::i32Bit, CondForNZCVBit(FEXCore::X86State::RFLAG_OF_RAW_LOC, false), Constant(1), Constant(0)); + Ref V = _NZCVSelect01(CondForNZCVBit(FEXCore::X86State::RFLAG_OF_RAW_LOC, false)); if (CTX->HostFeatures.SupportsFlagM2) { // Convert to x86 flags, saves us from or'ing after. @@ -2155,8 +2155,8 @@ private: } // CF is inverted after FCMP - Ref C = _NZCVSelect(OpSize::i32Bit, CondForNZCVBit(FEXCore::X86State::RFLAG_CF_RAW_LOC, true), Constant(1), Constant(0)); - Ref Z = _NZCVSelect(OpSize::i32Bit, CondForNZCVBit(FEXCore::X86State::RFLAG_ZF_RAW_LOC, false), Constant(1), Constant(0)); + Ref C = _NZCVSelect01(CondForNZCVBit(FEXCore::X86State::RFLAG_CF_RAW_LOC, true)); + Ref Z = _NZCVSelect01(CondForNZCVBit(FEXCore::X86State::RFLAG_ZF_RAW_LOC, false)); if (!CTX->HostFeatures.SupportsFlagM2) { C = _Or(OpSize::i32Bit, C, V); diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher/X87.cpp b/FEXCore/Source/Interface/Core/OpcodeDispatcher/X87.cpp index 0c5e9d7ff..8e0512606 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher/X87.cpp +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher/X87.cpp @@ -164,12 +164,12 @@ void OpDispatchBuilder::FIST(OpcodeArgs, bool Truncate) { // Check for NaN/Infinity: exponent = 0x7fff SaveNZCV(); _TestNZ(OpSize::i64Bit, Exponent, Constant(0x7fff)); - Ref IsSpecial = _NZCVSelect(OpSize::i64Bit, {COND_EQ}, Constant(1), Constant(0)); + Ref IsSpecial = _NZCVSelect01({COND_EQ}); // For overflow detection, check if exponent indicates a value >= 2^15 // Biased exponent for 2^15 is 0x3fff + 15 = 0x400e _SubWithFlags(OpSize::i64Bit, Exponent, Constant(0x400e)); - Ref IsOverflow = _NZCVSelect(OpSize::i64Bit, {COND_UGE}, Constant(1), Constant(0)); + Ref IsOverflow = _NZCVSelect01({COND_UGE}); // Set Invalid Operation flag if overflow or special value Ref InvalidFlag = _Or(OpSize::i64Bit, IsSpecial, IsOverflow); diff --git a/FEXCore/Source/Interface/IR/IREmitter.h b/FEXCore/Source/Interface/IR/IREmitter.h index 0883aa75b..1c3b63d95 100644 --- a/FEXCore/Source/Interface/IR/IREmitter.h +++ b/FEXCore/Source/Interface/IR/IREmitter.h @@ -90,6 +90,10 @@ public: return Select01(CompareSize, CondClassType {COND_NEQ}, Cmp1, Constant(0)); } + IRPair _NZCVSelect01(CondClassType Cond) { + return _NZCVSelect(OpSize::i64Bit, Cond, _InlineConstant(1), _InlineConstant(0)); + } + int64_t Constants[32]; Ref ConstantRefs[32]; uint32_t NrConstants;