diff --git a/Core/MIPS/IR/IRCompFPU.cpp b/Core/MIPS/IR/IRCompFPU.cpp index 55fb03380452..ce01c7ff75de 100644 --- a/Core/MIPS/IR/IRCompFPU.cpp +++ b/Core/MIPS/IR/IRCompFPU.cpp @@ -111,7 +111,7 @@ void IRFrontend::Comp_FPUComp(MIPSOpcode op) { IRFpCompareMode mode; switch (opc) { case 1: // un, ngle (unordered) - mode = IRFpCompareMode::NotEqualUnordered; + mode = IRFpCompareMode::EitherUnordered; break; case 2: // eq, seq (equal, ordered) mode = IRFpCompareMode::EqualOrdered; diff --git a/Core/MIPS/IR/IRInst.h b/Core/MIPS/IR/IRInst.h index 30257c43e75a..ba1712b954e4 100644 --- a/Core/MIPS/IR/IRInst.h +++ b/Core/MIPS/IR/IRInst.h @@ -263,7 +263,7 @@ inline IROp ComparisonToExit(IRComparison comp) { enum IRFpCompareMode { False = 0, - NotEqualUnordered, + EitherUnordered, EqualOrdered, // eq, seq (equal, ordered) EqualUnordered, // ueq, ngl (equal, unordered) LessOrdered, // olt, lt (less than, ordered) diff --git a/Core/MIPS/IR/IRInterpreter.cpp b/Core/MIPS/IR/IRInterpreter.cpp index f9dc4a278519..e86f88ab7a31 100644 --- a/Core/MIPS/IR/IRInterpreter.cpp +++ b/Core/MIPS/IR/IRInterpreter.cpp @@ -782,9 +782,13 @@ u32 IRInterpret(MIPSState *mips, const IRInst *inst, int count) { case IRFpCompareMode::False: mips->fpcond = 0; break; - case IRFpCompareMode::NotEqualUnordered: - mips->fpcond = mips->f[inst->src1] != mips->f[inst->src2]; + case IRFpCompareMode::EitherUnordered: + { + float a = mips->f[inst->src1]; + float b = mips->f[inst->src2]; + mips->fpcond = !(a > b || a < b || a == b); break; + } case IRFpCompareMode::EqualOrdered: case IRFpCompareMode::EqualUnordered: mips->fpcond = mips->f[inst->src1] == mips->f[inst->src2];