diff --git a/Source/Core/Core/PowerPC/Interpreter/Interpreter_FloatingPoint.cpp b/Source/Core/Core/PowerPC/Interpreter/Interpreter_FloatingPoint.cpp index 071e1218e5..def12b5029 100644 --- a/Source/Core/Core/PowerPC/Interpreter/Interpreter_FloatingPoint.cpp +++ b/Source/Core/Core/PowerPC/Interpreter/Interpreter_FloatingPoint.cpp @@ -24,7 +24,6 @@ void Interpreter::Helper_FloatCompareOrdered(UGeckoInstruction _inst, double fa, if (std::isnan(fa) || std::isnan(fb)) { - FPSCR.FX = 1; compareResult = FPCC::FU; if (IsSNAN(fa) || IsSNAN(fb)) { @@ -68,7 +67,6 @@ void Interpreter::Helper_FloatCompareUnordered(UGeckoInstruction _inst, double f if (IsSNAN(fa) || IsSNAN(fb)) { - FPSCR.FX = 1; SetFPException(FPSCR_VXSNAN); } } diff --git a/Source/Core/Core/PowerPC/Jit64/Jit.h b/Source/Core/Core/PowerPC/Jit64/Jit.h index edb393e52b..17934d48b3 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit.h +++ b/Source/Core/Core/PowerPC/Jit64/Jit.h @@ -214,7 +214,7 @@ public: void fp_arith(UGeckoInstruction inst); - void fcmpx(UGeckoInstruction inst); + void fcmpX(UGeckoInstruction inst); void fctiwx(UGeckoInstruction inst); void fmrx(UGeckoInstruction inst); void frspx(UGeckoInstruction inst); diff --git a/Source/Core/Core/PowerPC/Jit64/Jit64_Tables.cpp b/Source/Core/Core/PowerPC/Jit64/Jit64_Tables.cpp index fad907c7dc..d6541173fe 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit64_Tables.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit64_Tables.cpp @@ -322,8 +322,8 @@ static GekkoOPTemplate table59[] = static GekkoOPTemplate table63[] = { {264, &Jit64::fsign}, // fabsx - {32, &Jit64::fcmpx}, // fcmpo - {0, &Jit64::fcmpx}, // fcmpu + {32, &Jit64::fcmpX}, // fcmpo + {0, &Jit64::fcmpX}, // fcmpu {14, &Jit64::fctiwx}, // fctiwx {15, &Jit64::fctiwx}, // fctiwzx {72, &Jit64::fmrx}, // fmrx diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_FloatingPoint.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_FloatingPoint.cpp index aa3ca677ae..dc3cbd3cf9 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit_FloatingPoint.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit_FloatingPoint.cpp @@ -556,7 +556,7 @@ void Jit64::FloatCompare(UGeckoInstruction inst, bool upper) fpr.UnlockAll(); } -void Jit64::fcmpx(UGeckoInstruction inst) +void Jit64::fcmpX(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(bJITFloatingPointOff); diff --git a/Source/Core/Core/PowerPC/Jit64IL/JitIL_Tables.cpp b/Source/Core/Core/PowerPC/Jit64IL/JitIL_Tables.cpp index ec721d19d4..793b5bd5bd 100644 --- a/Source/Core/Core/PowerPC/Jit64IL/JitIL_Tables.cpp +++ b/Source/Core/Core/PowerPC/Jit64IL/JitIL_Tables.cpp @@ -323,8 +323,8 @@ static GekkoOPTemplate table59[] = static GekkoOPTemplate table63[] = { {264, &JitIL::fsign}, //"fabsx", OPTYPE_FPU, FL_RC_BIT_F}}, - {32, &JitIL::fcmpx}, //"fcmpo", OPTYPE_FPU, FL_RC_BIT_F}}, - {0, &JitIL::fcmpx}, //"fcmpu", OPTYPE_FPU, FL_RC_BIT_F}}, + {32, &JitIL::fcmpX}, //"fcmpo", OPTYPE_FPU, FL_RC_BIT_F}}, + {0, &JitIL::fcmpX}, //"fcmpu", OPTYPE_FPU, FL_RC_BIT_F}}, {14, &JitIL::FallBackToInterpreter}, //"fctiwx", OPTYPE_FPU, FL_RC_BIT_F}}, {15, &JitIL::FallBackToInterpreter}, //"fctiwzx", OPTYPE_FPU, FL_RC_BIT_F}}, {72, &JitIL::fmrx}, //"fmrx", OPTYPE_FPU, FL_RC_BIT_F}}, diff --git a/Source/Core/Core/PowerPC/JitArm64/Jit.h b/Source/Core/Core/PowerPC/JitArm64/Jit.h index 91d4de7782..764f639004 100644 --- a/Source/Core/Core/PowerPC/JitArm64/Jit.h +++ b/Source/Core/Core/PowerPC/JitArm64/Jit.h @@ -155,7 +155,7 @@ public: void fselx(UGeckoInstruction inst); void fsubsx(UGeckoInstruction inst); void fsubx(UGeckoInstruction inst); - void fcmpx(UGeckoInstruction inst); + void fcmpX(UGeckoInstruction inst); void frspx(UGeckoInstruction inst); void fctiwzx(UGeckoInstruction inst); void fdivx(UGeckoInstruction inst); diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp index d8233b09ec..e40f3d4917 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp @@ -362,10 +362,11 @@ void JitArm64::frspx(UGeckoInstruction inst) m_float_emit.FCVT(64, 32, EncodeRegToDouble(VD), EncodeRegToDouble(VD)); } -void JitArm64::fcmpx(UGeckoInstruction inst) +void JitArm64::fcmpX(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(bJITFloatingPointOff); + FALLBACK_IF(SConfig::GetInstance().bFPRF && js.op->wantsFPRF); u32 a = inst.FA, b = inst.FB; int crf = inst.CRFD; @@ -376,27 +377,12 @@ void JitArm64::fcmpx(UGeckoInstruction inst) ARM64Reg WA = gpr.GetReg(); ARM64Reg XA = EncodeRegTo64(WA); - FixupBranch pNaN1, pNaN2, pNaN3, pLesser, pGreater; + FixupBranch pNaN, pLesser, pGreater; FixupBranch continue1, continue2, continue3; ORR(XA, ZR, 32, 0, true); - if (a != b) - { - m_float_emit.FCMP(EncodeRegToDouble(VA), EncodeRegToDouble(VA)); - - // if (B != B) or (A != A), goto NaN's jump target - pNaN1 = B(CC_NEQ); - - m_float_emit.FCMP(EncodeRegToDouble(VB), EncodeRegToDouble(VB)); - - pNaN2 = B(CC_NEQ); - } - m_float_emit.FCMP(EncodeRegToDouble(VA), EncodeRegToDouble(VB)); - if (a == b) - pNaN3 = B(CC_NEQ); - if (a != b) { // if B > A goto Greater's jump target @@ -405,18 +391,13 @@ void JitArm64::fcmpx(UGeckoInstruction inst) pLesser = B(CC_MI); } + pNaN = B(CC_VS); + + // A == B ORR(XA, XA, 64 - 63, 0, true); continue1 = B(); - if (a != b) - { - SetJumpTarget(pNaN1); - SetJumpTarget(pNaN2); - } - else - { - SetJumpTarget(pNaN3); - } + SetJumpTarget(pNaN); ORR(XA, XA, 64 - 61, 0, true); ORR(XA, XA, 0, 0, true); @@ -433,14 +414,11 @@ void JitArm64::fcmpx(UGeckoInstruction inst) SetJumpTarget(pLesser); ORR(XA, XA, 64 - 62, 1, true); ORR(XA, XA, 0, 0, true); - } - SetJumpTarget(continue1); - if (a != b) - { SetJumpTarget(continue2); SetJumpTarget(continue3); } + SetJumpTarget(continue1); STR(INDEX_UNSIGNED, XA, X29, PPCSTATE_OFF(cr_val[0]) + (sizeof(PowerPC::ppcState.cr_val[0]) * crf)); diff --git a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp index ada18aca26..af5bc38481 100644 --- a/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp +++ b/Source/Core/Core/PowerPC/JitArm64/JitArm64_Tables.cpp @@ -327,8 +327,8 @@ static GekkoOPTemplate table59[] = static GekkoOPTemplate table63[] = { {264, &JitArm64::fabsx}, // fabsx - {32, &JitArm64::fcmpx}, // fcmpo - {0, &JitArm64::fcmpx}, // fcmpu + {32, &JitArm64::fcmpX}, // fcmpo + {0, &JitArm64::fcmpX}, // fcmpu {14, &JitArm64::FallBackToInterpreter}, // fctiwx {15, &JitArm64::fctiwzx}, // fctiwzx {72, &JitArm64::fmrx}, // fmrx diff --git a/Source/Core/Core/PowerPC/JitILCommon/JitILBase.h b/Source/Core/Core/PowerPC/JitILCommon/JitILBase.h index 3d1aec4c8b..f7ed6ce49f 100644 --- a/Source/Core/Core/PowerPC/JitILCommon/JitILBase.h +++ b/Source/Core/Core/PowerPC/JitILCommon/JitILBase.h @@ -102,7 +102,7 @@ public: void fp_arith_s(UGeckoInstruction inst); - void fcmpx(UGeckoInstruction inst); + void fcmpX(UGeckoInstruction inst); void fmrx(UGeckoInstruction inst); void cmpXX(UGeckoInstruction inst); diff --git a/Source/Core/Core/PowerPC/JitILCommon/JitILBase_FloatingPoint.cpp b/Source/Core/Core/PowerPC/JitILCommon/JitILBase_FloatingPoint.cpp index 16bdf56a8f..bc89b6471f 100644 --- a/Source/Core/Core/PowerPC/JitILCommon/JitILBase_FloatingPoint.cpp +++ b/Source/Core/Core/PowerPC/JitILCommon/JitILBase_FloatingPoint.cpp @@ -86,7 +86,7 @@ void JitILBase::fmrx(UGeckoInstruction inst) ibuild.EmitStoreFReg(val, inst.FD); } -void JitILBase::fcmpx(UGeckoInstruction inst) +void JitILBase::fcmpX(UGeckoInstruction inst) { INSTRUCTION_START JITDISABLE(bJITFloatingPointOff);