diff --git a/Source/Core/Core/PowerPC/Jit64/Jit.h b/Source/Core/Core/PowerPC/Jit64/Jit.h index 8c5056c372..58b38de73f 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit.h +++ b/Source/Core/Core/PowerPC/Jit64/Jit.h @@ -191,6 +191,7 @@ public: void fmaddXX(UGeckoInstruction inst); void fsign(UGeckoInstruction inst); + void frsp(UGeckoInstruction inst); void stX(UGeckoInstruction inst); //stw sth stb void rlwinmx(UGeckoInstruction inst); void rlwimix(UGeckoInstruction inst); diff --git a/Source/Core/Core/PowerPC/Jit64/Jit64_Tables.cpp b/Source/Core/Core/PowerPC/Jit64/Jit64_Tables.cpp index c64cbdca66..b82484ea47 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit64_Tables.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit64_Tables.cpp @@ -342,7 +342,7 @@ static GekkoOPTemplate table63[] = {72, &Jit64::fmrx}, //"fmrx", OPTYPE_FPU, FL_RC_BIT_F}}, {136, &Jit64::fsign}, //"fnabsx", OPTYPE_FPU, FL_RC_BIT_F}}, {40, &Jit64::fsign}, //"fnegx", OPTYPE_FPU, FL_RC_BIT_F}}, - {12, &Jit64::FallBackToInterpreter}, //"frspx", OPTYPE_FPU, FL_RC_BIT_F}}, + {12, &Jit64::frsp}, //"frspx", OPTYPE_FPU, FL_RC_BIT_F}}, {64, &Jit64::FallBackToInterpreter}, //"mcrfs", OPTYPE_SYSTEMFP, 0}}, {583, &Jit64::FallBackToInterpreter}, //"mffsx", OPTYPE_SYSTEMFP, 0}}, diff --git a/Source/Core/Core/PowerPC/Jit64/Jit_FloatingPoint.cpp b/Source/Core/Core/PowerPC/Jit64/Jit_FloatingPoint.cpp index 648da27d26..4d2ec1d1f3 100644 --- a/Source/Core/Core/PowerPC/Jit64/Jit_FloatingPoint.cpp +++ b/Source/Core/Core/PowerPC/Jit64/Jit_FloatingPoint.cpp @@ -175,6 +175,21 @@ void Jit64::fsign(UGeckoInstruction inst) fpr.UnlockAll(); } +void Jit64::frsp(UGeckoInstruction inst) +{ + INSTRUCTION_START + JITDISABLE(bJITFloatingPointOff); + FALLBACK_IF(inst.Rc); + + int d = inst.FD, b = inst.FB; + fpr.Lock(d, b); + fpr.BindToRegister(d, d == b); + CVTSD2SS(fpr.RX(d), fpr.R(b)); + CVTSS2SD(fpr.RX(d), fpr.R(d)); + UNPCKLPD(fpr.RX(d), fpr.R(d)); + fpr.UnlockAll(); +} + void Jit64::fmrx(UGeckoInstruction inst) { INSTRUCTION_START