From a36bf438cde503f98964af16a958891ad9cd8ff9 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 12 Apr 2018 02:51:37 -0400 Subject: [PATCH] Interpreter_FloatingPoint: Handle QNaNs properly in frsp Essentially the same behavior as the SNaN path, minus the conditional result and setting of the VXSNAN FPSCR bit. --- .../PowerPC/Interpreter/Interpreter_FloatingPoint.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Source/Core/Core/PowerPC/Interpreter/Interpreter_FloatingPoint.cpp b/Source/Core/Core/PowerPC/Interpreter/Interpreter_FloatingPoint.cpp index 69f3a93de8..911f06af3b 100644 --- a/Source/Core/Core/PowerPC/Interpreter/Interpreter_FloatingPoint.cpp +++ b/Source/Core/Core/PowerPC/Interpreter/Interpreter_FloatingPoint.cpp @@ -275,11 +275,14 @@ void Interpreter::frspx(UGeckoInstruction inst) // round to single const double b = rPS0(inst.FB); const double rounded = ForceSingle(b); - if (MathUtil::IsSNAN(b)) + if (std::isnan(b)) { - SetFPException(FPSCR_VXSNAN); + const bool is_snan = MathUtil::IsSNAN(b); - if (FPSCR.VE == 0) + if (is_snan) + SetFPException(FPSCR_VXSNAN); + + if (!is_snan || FPSCR.VE == 0) { rPS0(inst.FD) = rounded; rPS1(inst.FD) = rounded;