Permalink
Browse files

Interpreter_FPUtils: Set FPSCR.VXSNAN if any operand to NI_msub is a …

…signaling NaN

If any operand is a signaling NaN, we need to signify this by setting
the VXSNAN bit.

Fixes NaN flag setting for fmsub, fmsubs, fnmsub, fnmsubs, ps_msub, and
ps_nmsub instructions.
  • Loading branch information...
lioncash committed May 27, 2018
1 parent 3ebd713 commit a4cc8543513f9835b0c4f9c7e47e65d6c9cdd8dd
Showing with 11 additions and 0 deletions.
  1. +11 −0 Source/Core/Core/PowerPC/Interpreter/Interpreter_FPUtils.h
@@ -227,26 +227,37 @@ inline double NI_madd(double a, double c, double b)
inline double NI_msub(double a, double c, double b)
{
double t = a * c;
if (std::isnan(t))
{
if (Common::IsSNAN(a) || Common::IsSNAN(b) || Common::IsSNAN(c))
SetFPException(FPSCR_VXSNAN);
if (std::isnan(a))
return MakeQuiet(a);
if (std::isnan(b))
return MakeQuiet(b); // !
if (std::isnan(c))
return MakeQuiet(c);
SetFPException(FPSCR_VXIMZ);
return PPC_NAN;
}
t -= b;
if (std::isnan(t))
{
if (Common::IsSNAN(b))
SetFPException(FPSCR_VXSNAN);
if (std::isnan(b))
return MakeQuiet(b);
SetFPException(FPSCR_VXISI);
return PPC_NAN;
}
return t;
}

0 comments on commit a4cc854

Please sign in to comment.