Interpreter_FloatingPoint: Don't update FPRF in frsqrte in certain exceptional cases

If the FPSCR.VE bit is set and an invalid operand is passed in, then the FPRF
shouldn't be updated. Similarly this is also the case when the FPSCR.ZE bit
is set and negative or positive zero is passed in as the operand.
This commit is contained in:
Lioncash 2018-05-24 14:31:21 -04:00
parent 5ac05725c8
commit 31504f85a7
1 changed files with 13 additions and 3 deletions

View File

@ -410,19 +410,29 @@ void Interpreter::fresx(UGeckoInstruction inst)
void Interpreter::frsqrtex(UGeckoInstruction inst) void Interpreter::frsqrtex(UGeckoInstruction inst)
{ {
double b = rPS0(inst.FB); const double b = rPS0(inst.FB);
const double result = Common::ApproximateReciprocalSquareRoot(b);
if (b < 0.0) if (b < 0.0)
{ {
SetFPException(FPSCR_VXSQRT); SetFPException(FPSCR_VXSQRT);
if (FPSCR.VE == 0)
PowerPC::UpdateFPRF(result);
} }
else if (b == 0.0) else if (b == 0.0)
{ {
SetFPException(FPSCR_ZX); SetFPException(FPSCR_ZX);
if (FPSCR.ZE == 0)
PowerPC::UpdateFPRF(result);
}
else
{
PowerPC::UpdateFPRF(result);
} }
rPS0(inst.FD) = Common::ApproximateReciprocalSquareRoot(b); rPS0(inst.FD) = result;
PowerPC::UpdateFPRF(rPS0(inst.FD));
if (inst.Rc) if (inst.Rc)
Helper_UpdateCR1(); Helper_UpdateCR1();