diff --git a/FEXCore/Source/Common/SoftFloat.h b/FEXCore/Source/Common/SoftFloat.h index c4c343542..aa81c8a61 100644 --- a/FEXCore/Source/Common/SoftFloat.h +++ b/FEXCore/Source/Common/SoftFloat.h @@ -294,7 +294,11 @@ struct FEX_PACKED X80SoftFloat { FCMP(softfloat_state* state, const X80SoftFloat& lhs, const X80SoftFloat& rhs, bool* eq, bool* lt, bool* nan) { *eq = extF80_eq(state, lhs, rhs); *lt = extF80_lt(state, lhs, rhs); - *nan = IsNan(lhs) || IsNan(rhs); + + // Use IEEE 754 semantics: unordered if neither <, =, nor > is true + // This is more reliable than custom NaN detection + bool gt = !(*eq) && !(*lt) && extF80_le(state, rhs, lhs); + *nan = !(*eq) && !(*lt) && !gt; } FEXCORE_PRESERVE_ALL_ATTR static X80SoftFloat FSCALE(softfloat_state* state, const X80SoftFloat& lhs, const X80SoftFloat& rhs) { diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher/X87.cpp b/FEXCore/Source/Interface/Core/OpcodeDispatcher/X87.cpp index 3e0a8ec15..fb24a903e 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher/X87.cpp +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher/X87.cpp @@ -680,6 +680,9 @@ void OpDispatchBuilder::FCOMI(OpcodeArgs, IR::OpSize Width, bool Integer, OpDisp SetRFLAG(PF); } + // Set Invalid Operation flag when unordered (NaN comparison) + SetRFLAG(HostFlag_Unordered); + if (PopTwice) { _PopStackDestroy(); _PopStackDestroy(); @@ -701,6 +704,9 @@ void OpDispatchBuilder::FTST(OpcodeArgs) { SetRFLAG(Constant(0)); SetRFLAG(HostFlag_Unordered); SetRFLAG(HostFlag_ZF); + + // Set Invalid Operation flag when unordered (NaN comparison) + SetRFLAG(HostFlag_Unordered); } void OpDispatchBuilder::X87OpHelper(OpcodeArgs, FEXCore::IR::IROps IROp, bool ZeroC2) {