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:
parent
5ac05725c8
commit
31504f85a7
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue