@@ -113,11 +113,11 @@ void Interpreter::ps_div(UGeckoInstruction inst)
const auto & a = rPS (inst.FA );
const auto & b = rPS (inst.FB );
const double ps0 = ForceSingle (FPSCR, NI_div (&FPSCR, a.PS0AsDouble (), b.PS0AsDouble ()).value );
const double ps1 = ForceSingle (FPSCR, NI_div (&FPSCR, a.PS1AsDouble (), b.PS1AsDouble ()).value );
const float ps0 = ForceSingle (FPSCR, NI_div (&FPSCR, a.PS0AsDouble (), b.PS0AsDouble ()).value );
const float ps1 = ForceSingle (FPSCR, NI_div (&FPSCR, a.PS1AsDouble (), b.PS1AsDouble ()).value );
rPS (inst.FD ).SetBoth (ps0, ps1);
PowerPC::UpdateFPRF (ps0);
PowerPC::UpdateFPRFSingle (ps0);
if (inst.Rc )
PowerPC::ppcState.UpdateCR1 ();
@@ -145,7 +145,7 @@ void Interpreter::ps_res(UGeckoInstruction inst)
const double ps1 = Common::ApproximateReciprocal (b);
rPS (inst.FD ).SetBoth (ps0, ps1);
PowerPC::UpdateFPRF (ps0);
PowerPC::UpdateFPRFSingle (ps0);
if (inst.Rc )
PowerPC::ppcState.UpdateCR1 ();
@@ -174,11 +174,11 @@ void Interpreter::ps_rsqrte(UGeckoInstruction inst)
if (Common::IsSNAN (ps0) || Common::IsSNAN (ps1))
SetFPException (&FPSCR, FPSCR_VXSNAN);
const double dst_ps0 = ForceSingle (FPSCR, Common::ApproximateReciprocalSquareRoot (ps0));
const double dst_ps1 = ForceSingle (FPSCR, Common::ApproximateReciprocalSquareRoot (ps1));
const float dst_ps0 = ForceSingle (FPSCR, Common::ApproximateReciprocalSquareRoot (ps0));
const float dst_ps1 = ForceSingle (FPSCR, Common::ApproximateReciprocalSquareRoot (ps1));
rPS (inst.FD ).SetBoth (dst_ps0, dst_ps1);
PowerPC::UpdateFPRF (dst_ps0);
PowerPC::UpdateFPRFSingle (dst_ps0);
if (inst.Rc )
PowerPC::ppcState.UpdateCR1 ();
@@ -189,11 +189,11 @@ void Interpreter::ps_sub(UGeckoInstruction inst)
const auto & a = rPS (inst.FA );
const auto & b = rPS (inst.FB );
const double ps0 = ForceSingle (FPSCR, NI_sub (&FPSCR, a.PS0AsDouble (), b.PS0AsDouble ()).value );
const double ps1 = ForceSingle (FPSCR, NI_sub (&FPSCR, a.PS1AsDouble (), b.PS1AsDouble ()).value );
const float ps0 = ForceSingle (FPSCR, NI_sub (&FPSCR, a.PS0AsDouble (), b.PS0AsDouble ()).value );
const float ps1 = ForceSingle (FPSCR, NI_sub (&FPSCR, a.PS1AsDouble (), b.PS1AsDouble ()).value );
rPS (inst.FD ).SetBoth (ps0, ps1);
PowerPC::UpdateFPRF (ps0);
PowerPC::UpdateFPRFSingle (ps0);
if (inst.Rc )
PowerPC::ppcState.UpdateCR1 ();
@@ -204,11 +204,11 @@ void Interpreter::ps_add(UGeckoInstruction inst)
const auto & a = rPS (inst.FA );
const auto & b = rPS (inst.FB );
const double ps0 = ForceSingle (FPSCR, NI_add (&FPSCR, a.PS0AsDouble (), b.PS0AsDouble ()).value );
const double ps1 = ForceSingle (FPSCR, NI_add (&FPSCR, a.PS1AsDouble (), b.PS1AsDouble ()).value );
const float ps0 = ForceSingle (FPSCR, NI_add (&FPSCR, a.PS0AsDouble (), b.PS0AsDouble ()).value );
const float ps1 = ForceSingle (FPSCR, NI_add (&FPSCR, a.PS1AsDouble (), b.PS1AsDouble ()).value );
rPS (inst.FD ).SetBoth (ps0, ps1);
PowerPC::UpdateFPRF (ps0);
PowerPC::UpdateFPRFSingle (ps0);
if (inst.Rc )
PowerPC::ppcState.UpdateCR1 ();
@@ -222,11 +222,11 @@ void Interpreter::ps_mul(UGeckoInstruction inst)
const double c0 = Force25Bit (c.PS0AsDouble ());
const double c1 = Force25Bit (c.PS1AsDouble ());
const double ps0 = ForceSingle (FPSCR, NI_mul (&FPSCR, a.PS0AsDouble (), c0).value );
const double ps1 = ForceSingle (FPSCR, NI_mul (&FPSCR, a.PS1AsDouble (), c1).value );
const float ps0 = ForceSingle (FPSCR, NI_mul (&FPSCR, a.PS0AsDouble (), c0).value );
const float ps1 = ForceSingle (FPSCR, NI_mul (&FPSCR, a.PS1AsDouble (), c1).value );
rPS (inst.FD ).SetBoth (ps0, ps1);
PowerPC::UpdateFPRF (ps0);
PowerPC::UpdateFPRFSingle (ps0);
if (inst.Rc )
PowerPC::ppcState.UpdateCR1 ();
@@ -241,13 +241,11 @@ void Interpreter::ps_msub(UGeckoInstruction inst)
const double c0 = Force25Bit (c.PS0AsDouble ());
const double c1 = Force25Bit (c.PS1AsDouble ());
const double ps0 =
ForceSingle (FPSCR, NI_msub (&FPSCR, a.PS0AsDouble (), c0, b.PS0AsDouble ()).value );
const double ps1 =
ForceSingle (FPSCR, NI_msub (&FPSCR, a.PS1AsDouble (), c1, b.PS1AsDouble ()).value );
const float ps0 = ForceSingle (FPSCR, NI_msub (&FPSCR, a.PS0AsDouble (), c0, b.PS0AsDouble ()).value );
const float ps1 = ForceSingle (FPSCR, NI_msub (&FPSCR, a.PS1AsDouble (), c1, b.PS1AsDouble ()).value );
rPS (inst.FD ).SetBoth (ps0, ps1);
PowerPC::UpdateFPRF (ps0);
PowerPC::UpdateFPRFSingle (ps0);
if (inst.Rc )
PowerPC::ppcState.UpdateCR1 ();
@@ -262,13 +260,11 @@ void Interpreter::ps_madd(UGeckoInstruction inst)
const double c0 = Force25Bit (c.PS0AsDouble ());
const double c1 = Force25Bit (c.PS1AsDouble ());
const double ps0 =
ForceSingle (FPSCR, NI_madd (&FPSCR, a.PS0AsDouble (), c0, b.PS0AsDouble ()).value );
const double ps1 =
ForceSingle (FPSCR, NI_madd (&FPSCR, a.PS1AsDouble (), c1, b.PS1AsDouble ()).value );
const float ps0 = ForceSingle (FPSCR, NI_madd (&FPSCR, a.PS0AsDouble (), c0, b.PS0AsDouble ()).value );
const float ps1 = ForceSingle (FPSCR, NI_madd (&FPSCR, a.PS1AsDouble (), c1, b.PS1AsDouble ()).value );
rPS (inst.FD ).SetBoth (ps0, ps1);
PowerPC::UpdateFPRF (ps0);
PowerPC::UpdateFPRFSingle (ps0);
if (inst.Rc )
PowerPC::ppcState.UpdateCR1 ();
@@ -283,16 +279,16 @@ void Interpreter::ps_nmsub(UGeckoInstruction inst)
const double c0 = Force25Bit (c.PS0AsDouble ());
const double c1 = Force25Bit (c.PS1AsDouble ());
const double tmp0 =
const float tmp0 =
ForceSingle (FPSCR, NI_msub (&FPSCR, a.PS0AsDouble (), c0, b.PS0AsDouble ()).value );
const double tmp1 =
const float tmp1 =
ForceSingle (FPSCR, NI_msub (&FPSCR, a.PS1AsDouble (), c1, b.PS1AsDouble ()).value );
const double ps0 = std::isnan (tmp0) ? tmp0 : -tmp0;
const double ps1 = std::isnan (tmp1) ? tmp1 : -tmp1;
const float ps0 = std::isnan (tmp0) ? tmp0 : -tmp0;
const float ps1 = std::isnan (tmp1) ? tmp1 : -tmp1;
rPS (inst.FD ).SetBoth (ps0, ps1);
PowerPC::UpdateFPRF (ps0);
PowerPC::UpdateFPRFSingle (ps0);
if (inst.Rc )
PowerPC::ppcState.UpdateCR1 ();
@@ -307,16 +303,16 @@ void Interpreter::ps_nmadd(UGeckoInstruction inst)
const double c0 = Force25Bit (c.PS0AsDouble ());
const double c1 = Force25Bit (c.PS1AsDouble ());
const double tmp0 =
const float tmp0 =
ForceSingle (FPSCR, NI_madd (&FPSCR, a.PS0AsDouble (), c0, b.PS0AsDouble ()).value );
const double tmp1 =
const float tmp1 =
ForceSingle (FPSCR, NI_madd (&FPSCR, a.PS1AsDouble (), c1, b.PS1AsDouble ()).value );
const double ps0 = std::isnan (tmp0) ? tmp0 : -tmp0;
const double ps1 = std::isnan (tmp1) ? tmp1 : -tmp1;
const float ps0 = std::isnan (tmp0) ? tmp0 : -tmp0;
const float ps1 = std::isnan (tmp1) ? tmp1 : -tmp1;
rPS (inst.FD ).SetBoth (ps0, ps1);
PowerPC::UpdateFPRF (ps0);
PowerPC::UpdateFPRFSingle (ps0);
if (inst.Rc )
PowerPC::ppcState.UpdateCR1 ();
@@ -328,11 +324,11 @@ void Interpreter::ps_sum0(UGeckoInstruction inst)
const auto & b = rPS (inst.FB );
const auto & c = rPS (inst.FC );
const double ps0 = ForceSingle (FPSCR, NI_add (&FPSCR, a.PS0AsDouble (), b.PS1AsDouble ()).value );
const double ps1 = ForceSingle (FPSCR, c.PS1AsDouble ());
const float ps0 = ForceSingle (FPSCR, NI_add (&FPSCR, a.PS0AsDouble (), b.PS1AsDouble ()).value );
const float ps1 = ForceSingle (FPSCR, c.PS1AsDouble ());
rPS (inst.FD ).SetBoth (ps0, ps1);
PowerPC::UpdateFPRF (ps0);
PowerPC::UpdateFPRFSingle (ps0);
if (inst.Rc )
PowerPC::ppcState.UpdateCR1 ();
@@ -344,11 +340,11 @@ void Interpreter::ps_sum1(UGeckoInstruction inst)
const auto & b = rPS (inst.FB );
const auto & c = rPS (inst.FC );
const double ps0 = ForceSingle (FPSCR, c.PS0AsDouble ());
const double ps1 = ForceSingle (FPSCR, NI_add (&FPSCR, a.PS0AsDouble (), b.PS1AsDouble ()).value );
const float ps0 = ForceSingle (FPSCR, c.PS0AsDouble ());
const float ps1 = ForceSingle (FPSCR, NI_add (&FPSCR, a.PS0AsDouble (), b.PS1AsDouble ()).value );
rPS (inst.FD ).SetBoth (ps0, ps1);
PowerPC::UpdateFPRF (ps1);
PowerPC::UpdateFPRFSingle (ps1);
if (inst.Rc )
PowerPC::ppcState.UpdateCR1 ();
@@ -360,11 +356,11 @@ void Interpreter::ps_muls0(UGeckoInstruction inst)
const auto & c = rPS (inst.FC );
const double c0 = Force25Bit (c.PS0AsDouble ());
const double ps0 = ForceSingle (FPSCR, NI_mul (&FPSCR, a.PS0AsDouble (), c0).value );
const double ps1 = ForceSingle (FPSCR, NI_mul (&FPSCR, a.PS1AsDouble (), c0).value );
const float ps0 = ForceSingle (FPSCR, NI_mul (&FPSCR, a.PS0AsDouble (), c0).value );
const float ps1 = ForceSingle (FPSCR, NI_mul (&FPSCR, a.PS1AsDouble (), c0).value );
rPS (inst.FD ).SetBoth (ps0, ps1);
PowerPC::UpdateFPRF (ps0);
PowerPC::UpdateFPRFSingle (ps0);
if (inst.Rc )
PowerPC::ppcState.UpdateCR1 ();
@@ -376,11 +372,11 @@ void Interpreter::ps_muls1(UGeckoInstruction inst)
const auto & c = rPS (inst.FC );
const double c1 = Force25Bit (c.PS1AsDouble ());
const double ps0 = ForceSingle (FPSCR, NI_mul (&FPSCR, a.PS0AsDouble (), c1).value );
const double ps1 = ForceSingle (FPSCR, NI_mul (&FPSCR, a.PS1AsDouble (), c1).value );
const float ps0 = ForceSingle (FPSCR, NI_mul (&FPSCR, a.PS0AsDouble (), c1).value );
const float ps1 = ForceSingle (FPSCR, NI_mul (&FPSCR, a.PS1AsDouble (), c1).value );
rPS (inst.FD ).SetBoth (ps0, ps1);
PowerPC::UpdateFPRF (ps0);
PowerPC::UpdateFPRFSingle (ps0);
if (inst.Rc )
PowerPC::ppcState.UpdateCR1 ();
@@ -393,13 +389,11 @@ void Interpreter::ps_madds0(UGeckoInstruction inst)
const auto & c = rPS (inst.FC );
const double c0 = Force25Bit (c.PS0AsDouble ());
const double ps0 =
ForceSingle (FPSCR, NI_madd (&FPSCR, a.PS0AsDouble (), c0, b.PS0AsDouble ()).value );
const double ps1 =
ForceSingle (FPSCR, NI_madd (&FPSCR, a.PS1AsDouble (), c0, b.PS1AsDouble ()).value );
const float ps0 = ForceSingle (FPSCR, NI_madd (&FPSCR, a.PS0AsDouble (), c0, b.PS0AsDouble ()).value );
const float ps1 = ForceSingle (FPSCR, NI_madd (&FPSCR, a.PS1AsDouble (), c0, b.PS1AsDouble ()).value );
rPS (inst.FD ).SetBoth (ps0, ps1);
PowerPC::UpdateFPRF (ps0);
PowerPC::UpdateFPRFSingle (ps0);
if (inst.Rc )
PowerPC::ppcState.UpdateCR1 ();
@@ -412,13 +406,11 @@ void Interpreter::ps_madds1(UGeckoInstruction inst)
const auto & c = rPS (inst.FC );
const double c1 = Force25Bit (c.PS1AsDouble ());
const double ps0 =
ForceSingle (FPSCR, NI_madd (&FPSCR, a.PS0AsDouble (), c1, b.PS0AsDouble ()).value );
const double ps1 =
ForceSingle (FPSCR, NI_madd (&FPSCR, a.PS1AsDouble (), c1, b.PS1AsDouble ()).value );
const float ps0 = ForceSingle (FPSCR, NI_madd (&FPSCR, a.PS0AsDouble (), c1, b.PS0AsDouble ()).value );
const float ps1 = ForceSingle (FPSCR, NI_madd (&FPSCR, a.PS1AsDouble (), c1, b.PS1AsDouble ()).value );
rPS (inst.FD ).SetBoth (ps0, ps1);
PowerPC::UpdateFPRF (ps0);
PowerPC::UpdateFPRFSingle (ps0);
if (inst.Rc )
PowerPC::ppcState.UpdateCR1 ();