diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher.h b/FEXCore/Source/Interface/Core/OpcodeDispatcher.h index 4db854ecd..bb4ccf185 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher.h +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher.h @@ -869,8 +869,9 @@ private: } } - OrderedNode* CachedNZCV = {}; - uint32_t PossiblySetNZCVBits = 0; + OrderedNode* CachedNZCV{}; + bool NZCVDirty{}; + uint32_t PossiblySetNZCVBits{}; fextl::map JumpTargets; bool HandledLock{false}; @@ -1115,11 +1116,13 @@ private: void SetNZCV(OrderedNode *Value) { CachedNZCV = Value; + NZCVDirty = true; } void ZeroNZCV() { CachedNZCV = _Constant(0); PossiblySetNZCVBits = 0; + NZCVDirty = true; } void ZeroCV() { @@ -1152,6 +1155,7 @@ private: // Mask off just the N bit, which now equals the sign bit CachedNZCV = _And(OpSize::i32Bit, Shifted, _Constant(1u << NBit)); PossiblySetNZCVBits = (1u << NBit); + NZCVDirty = true; } void SetNZ_ZeroCV(unsigned SrcSize, OrderedNode *Res) { @@ -1160,6 +1164,7 @@ private: if (SrcSize >= 4) { CachedNZCV = _TestNZ(SrcSize, Res); PossiblySetNZCVBits = (1u << 31) | (1u << 30); + NZCVDirty = true; } else { // N SetN_ZeroZCV(SrcSize, Res); diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp b/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp index 9d314dc3c..76e1ee533 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher/Flags.cpp @@ -272,10 +272,11 @@ void OpDispatchBuilder::CalculateAF(OpSize OpSize, OrderedNode *Res, OrderedNode void OpDispatchBuilder::CalculateDeferredFlags(uint32_t FlagsToCalculateMask) { if (CurrentDeferredFlags.Type == FlagsGenerationType::TYPE_NONE) { // Nothing to do - if (CachedNZCV) + if (NZCVDirty && CachedNZCV) _StoreFlag(CachedNZCV, FEXCore::X86State::RFLAG_NZCV_LOC); CachedNZCV = nullptr; + NZCVDirty = false; return; } @@ -459,10 +460,11 @@ void OpDispatchBuilder::CalculateDeferredFlags(uint32_t FlagsToCalculateMask) { // Done calculating CurrentDeferredFlags.Type = FlagsGenerationType::TYPE_NONE; - if (CachedNZCV) + if (NZCVDirty && CachedNZCV) _StoreFlag(CachedNZCV, FEXCore::X86State::RFLAG_NZCV_LOC); CachedNZCV = nullptr; + NZCVDirty = false; } void OpDispatchBuilder::CalculateFlags_ADC(uint8_t SrcSize, OrderedNode *Res, OrderedNode *Src1, OrderedNode *Src2, OrderedNode *CF) {