Merge pull request #6634 from lioncash/frsp

Interpreter_FloatingPoint: Handle SNaNs and QNaNs properly in frsp
This commit is contained in:
Markus Wick 2018-05-17 10:43:14 +02:00 committed by GitHub
commit 6ed3f8b474
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 28 additions and 6 deletions

View File

@ -276,12 +276,34 @@ void Interpreter::fselx(UGeckoInstruction inst)
// PS1 is said to be undefined // PS1 is said to be undefined
void Interpreter::frspx(UGeckoInstruction inst) // round to single void Interpreter::frspx(UGeckoInstruction inst) // round to single
{ {
double b = rPS0(inst.FB); const double b = rPS0(inst.FB);
double rounded = ForceSingle(b); const double rounded = ForceSingle(b);
SetFI(b != rounded);
FPSCR.FR = fabs(rounded) > fabs(b); if (std::isnan(b))
PowerPC::UpdateFPRF(rounded); {
rPS0(inst.FD) = rPS1(inst.FD) = rounded; const bool is_snan = MathUtil::IsSNAN(b);
if (is_snan)
SetFPException(FPSCR_VXSNAN);
if (!is_snan || FPSCR.VE == 0)
{
rPS0(inst.FD) = rounded;
rPS1(inst.FD) = rounded;
PowerPC::UpdateFPRF(b);
}
SetFI(0);
FPSCR.FR = 0;
}
else
{
SetFI(b != rounded);
FPSCR.FR = fabs(rounded) > fabs(b);
PowerPC::UpdateFPRF(rounded);
rPS0(inst.FD) = rounded;
rPS1(inst.FD) = rounded;
}
if (inst.Rc) if (inst.Rc)
Helper_UpdateCR1(); Helper_UpdateCR1();