Permalink
Browse files

Interpreter_FloatingPoint: Don't store to destination in frsqrte if V…

…E or ZE is set and a relevant exception occurs

As explained within commit a08ad82, if
an invalid exception occurs and VE is set, then the destination register
should remain unchanged. Ditto for when ZE is set and a zero divide
exception occurs.
  • Loading branch information...
lioncash committed Jun 2, 2018
1 parent 8d1b2f9 commit b71a9e658f669de41ca9799fe15a463452b08199
Showing with 10 additions and 7 deletions.
  1. +10 −7 Source/Core/Core/PowerPC/Interpreter/Interpreter_FloatingPoint.cpp
@@ -422,36 +422,39 @@ void Interpreter::fresx(UGeckoInstruction inst)
void Interpreter::frsqrtex(UGeckoInstruction inst)
{
const double b = rPS0(inst.FB);
const double result = Common::ApproximateReciprocalSquareRoot(b);
const auto compute_result = [inst](double value) {
const double result = Common::ApproximateReciprocalSquareRoot(value);
rPS0(inst.FD) = result;
PowerPC::UpdateFPRF(result);
};
if (b < 0.0)
{
SetFPException(FPSCR_VXSQRT);
if (FPSCR.VE == 0)
PowerPC::UpdateFPRF(result);
compute_result(b);
}
else if (b == 0.0)
{
SetFPException(FPSCR_ZX);
if (FPSCR.ZE == 0)
PowerPC::UpdateFPRF(result);
compute_result(b);
}
else if (Common::IsSNAN(b))
{
SetFPException(FPSCR_VXSNAN);
if (FPSCR.VE == 0)
PowerPC::UpdateFPRF(result);
compute_result(b);
}
else
{
PowerPC::UpdateFPRF(result);
compute_result(b);
}
rPS0(inst.FD) = result;
if (inst.Rc)
Helper_UpdateCR1();
}

0 comments on commit b71a9e6

Please sign in to comment.