Expand Up
@@ -126,10 +126,10 @@ void Interpreter::ps_div(Interpreter& interpreter, UGeckoInstruction inst)
const auto & a = ppc_state.ps [inst.FA ];
const auto & b = ppc_state.ps [inst.FB ];
const float ps0 = ForceSingle (ppc_state. fpscr ,
NI_div (& ppc_state.fpscr , a.PS0AsDouble (), b.PS0AsDouble ()).value );
const float ps1 = ForceSingle (ppc_state. fpscr ,
NI_div (& ppc_state.fpscr , a.PS1AsDouble (), b.PS1AsDouble ()).value );
const float ps0 =
ForceSingle ( ppc_state.fpscr , NI_div (ppc_state , a.PS0AsDouble (), b.PS0AsDouble ()).value );
const float ps1 =
ForceSingle ( ppc_state.fpscr , NI_div (ppc_state , a.PS1AsDouble (), b.PS1AsDouble ()).value );
ppc_state.ps [inst.FD ].SetBoth (ps0, ps1);
ppc_state.UpdateFPRFSingle (ps0);
Expand All
@@ -147,15 +147,15 @@ void Interpreter::ps_res(Interpreter& interpreter, UGeckoInstruction inst)
if (a == 0.0 || b == 0.0 )
{
SetFPException (& ppc_state. fpscr , FPSCR_ZX);
SetFPException (ppc_state, FPSCR_ZX);
ppc_state.fpscr .ClearFIFR ();
}
if (std::isnan (a) || std::isinf (a) || std::isnan (b) || std::isinf (b))
ppc_state.fpscr .ClearFIFR ();
if (Common::IsSNAN (a) || Common::IsSNAN (b))
SetFPException (& ppc_state. fpscr , FPSCR_VXSNAN);
SetFPException (ppc_state, FPSCR_VXSNAN);
const double ps0 = Common::ApproximateReciprocal (a);
const double ps1 = Common::ApproximateReciprocal (b);
Expand All
@@ -175,21 +175,21 @@ void Interpreter::ps_rsqrte(Interpreter& interpreter, UGeckoInstruction inst)
if (ps0 == 0.0 || ps1 == 0.0 )
{
SetFPException (& ppc_state. fpscr , FPSCR_ZX);
SetFPException (ppc_state, FPSCR_ZX);
ppc_state.fpscr .ClearFIFR ();
}
if (ps0 < 0.0 || ps1 < 0.0 )
{
SetFPException (& ppc_state. fpscr , FPSCR_VXSQRT);
SetFPException (ppc_state, FPSCR_VXSQRT);
ppc_state.fpscr .ClearFIFR ();
}
if (std::isnan (ps0) || std::isinf (ps0) || std::isnan (ps1) || std::isinf (ps1))
ppc_state.fpscr .ClearFIFR ();
if (Common::IsSNAN (ps0) || Common::IsSNAN (ps1))
SetFPException (& ppc_state. fpscr , FPSCR_VXSNAN);
SetFPException (ppc_state, FPSCR_VXSNAN);
const float dst_ps0 = ForceSingle (ppc_state.fpscr , Common::ApproximateReciprocalSquareRoot (ps0));
const float dst_ps1 = ForceSingle (ppc_state.fpscr , Common::ApproximateReciprocalSquareRoot (ps1));
Expand All
@@ -207,10 +207,10 @@ void Interpreter::ps_sub(Interpreter& interpreter, UGeckoInstruction inst)
const auto & a = ppc_state.ps [inst.FA ];
const auto & b = ppc_state.ps [inst.FB ];
const float ps0 = ForceSingle (ppc_state. fpscr ,
NI_sub (& ppc_state.fpscr , a.PS0AsDouble (), b.PS0AsDouble ()).value );
const float ps1 = ForceSingle (ppc_state. fpscr ,
NI_sub (& ppc_state.fpscr , a.PS1AsDouble (), b.PS1AsDouble ()).value );
const float ps0 =
ForceSingle ( ppc_state.fpscr , NI_sub (ppc_state , a.PS0AsDouble (), b.PS0AsDouble ()).value );
const float ps1 =
ForceSingle ( ppc_state.fpscr , NI_sub (ppc_state , a.PS1AsDouble (), b.PS1AsDouble ()).value );
ppc_state.ps [inst.FD ].SetBoth (ps0, ps1);
ppc_state.UpdateFPRFSingle (ps0);
Expand All
@@ -225,10 +225,10 @@ void Interpreter::ps_add(Interpreter& interpreter, UGeckoInstruction inst)
const auto & a = ppc_state.ps [inst.FA ];
const auto & b = ppc_state.ps [inst.FB ];
const float ps0 = ForceSingle (ppc_state. fpscr ,
NI_add (& ppc_state.fpscr , a.PS0AsDouble (), b.PS0AsDouble ()).value );
const float ps1 = ForceSingle (ppc_state. fpscr ,
NI_add (& ppc_state.fpscr , a.PS1AsDouble (), b.PS1AsDouble ()).value );
const float ps0 =
ForceSingle ( ppc_state.fpscr , NI_add (ppc_state , a.PS0AsDouble (), b.PS0AsDouble ()).value );
const float ps1 =
ForceSingle ( ppc_state.fpscr , NI_add (ppc_state , a.PS1AsDouble (), b.PS1AsDouble ()).value );
ppc_state.ps [inst.FD ].SetBoth (ps0, ps1);
ppc_state.UpdateFPRFSingle (ps0);
Expand All
@@ -246,10 +246,8 @@ void Interpreter::ps_mul(Interpreter& interpreter, UGeckoInstruction inst)
const double c0 = Force25Bit (c.PS0AsDouble ());
const double c1 = Force25Bit (c.PS1AsDouble ());
const float ps0 =
ForceSingle (ppc_state.fpscr , NI_mul (&ppc_state.fpscr , a.PS0AsDouble (), c0).value );
const float ps1 =
ForceSingle (ppc_state.fpscr , NI_mul (&ppc_state.fpscr , a.PS1AsDouble (), c1).value );
const float ps0 = ForceSingle (ppc_state.fpscr , NI_mul (ppc_state, a.PS0AsDouble (), c0).value );
const float ps1 = ForceSingle (ppc_state.fpscr , NI_mul (ppc_state, a.PS1AsDouble (), c1).value );
ppc_state.ps [inst.FD ].SetBoth (ps0, ps1);
ppc_state.UpdateFPRFSingle (ps0);
Expand All
@@ -268,10 +266,10 @@ void Interpreter::ps_msub(Interpreter& interpreter, UGeckoInstruction inst)
const double c0 = Force25Bit (c.PS0AsDouble ());
const double c1 = Force25Bit (c.PS1AsDouble ());
const float ps0 = ForceSingle (
ppc_state.fpscr , NI_msub (& ppc_state. fpscr , a.PS0AsDouble (), c0, b.PS0AsDouble ()).value );
const float ps1 = ForceSingle (
ppc_state.fpscr , NI_msub (& ppc_state. fpscr , a.PS1AsDouble (), c1, b.PS1AsDouble ()).value );
const float ps0 =
ForceSingle ( ppc_state.fpscr , NI_msub (ppc_state, a.PS0AsDouble (), c0, b.PS0AsDouble ()).value );
const float ps1 =
ForceSingle ( ppc_state.fpscr , NI_msub (ppc_state, a.PS1AsDouble (), c1, b.PS1AsDouble ()).value );
ppc_state.ps [inst.FD ].SetBoth (ps0, ps1);
ppc_state.UpdateFPRFSingle (ps0);
Expand All
@@ -290,10 +288,10 @@ void Interpreter::ps_madd(Interpreter& interpreter, UGeckoInstruction inst)
const double c0 = Force25Bit (c.PS0AsDouble ());
const double c1 = Force25Bit (c.PS1AsDouble ());
const float ps0 = ForceSingle (
ppc_state.fpscr , NI_madd (& ppc_state. fpscr , a.PS0AsDouble (), c0, b.PS0AsDouble ()).value );
const float ps1 = ForceSingle (
ppc_state.fpscr , NI_madd (& ppc_state. fpscr , a.PS1AsDouble (), c1, b.PS1AsDouble ()).value );
const float ps0 =
ForceSingle ( ppc_state.fpscr , NI_madd (ppc_state, a.PS0AsDouble (), c0, b.PS0AsDouble ()).value );
const float ps1 =
ForceSingle ( ppc_state.fpscr , NI_madd (ppc_state, a.PS1AsDouble (), c1, b.PS1AsDouble ()).value );
ppc_state.ps [inst.FD ].SetBoth (ps0, ps1);
ppc_state.UpdateFPRFSingle (ps0);
Expand All
@@ -312,10 +310,10 @@ void Interpreter::ps_nmsub(Interpreter& interpreter, UGeckoInstruction inst)
const double c0 = Force25Bit (c.PS0AsDouble ());
const double c1 = Force25Bit (c.PS1AsDouble ());
const float tmp0 = ForceSingle (
ppc_state.fpscr , NI_msub (& ppc_state. fpscr , a.PS0AsDouble (), c0, b.PS0AsDouble ()).value );
const float tmp1 = ForceSingle (
ppc_state.fpscr , NI_msub (& ppc_state. fpscr , a.PS1AsDouble (), c1, b.PS1AsDouble ()).value );
const float tmp0 =
ForceSingle ( ppc_state.fpscr , NI_msub (ppc_state, a.PS0AsDouble (), c0, b.PS0AsDouble ()).value );
const float tmp1 =
ForceSingle ( ppc_state.fpscr , NI_msub (ppc_state, a.PS1AsDouble (), c1, b.PS1AsDouble ()).value );
const float ps0 = std::isnan (tmp0) ? tmp0 : -tmp0;
const float ps1 = std::isnan (tmp1) ? tmp1 : -tmp1;
Expand All
@@ -337,10 +335,10 @@ void Interpreter::ps_nmadd(Interpreter& interpreter, UGeckoInstruction inst)
const double c0 = Force25Bit (c.PS0AsDouble ());
const double c1 = Force25Bit (c.PS1AsDouble ());
const float tmp0 = ForceSingle (
ppc_state.fpscr , NI_madd (& ppc_state. fpscr , a.PS0AsDouble (), c0, b.PS0AsDouble ()).value );
const float tmp1 = ForceSingle (
ppc_state.fpscr , NI_madd (& ppc_state. fpscr , a.PS1AsDouble (), c1, b.PS1AsDouble ()).value );
const float tmp0 =
ForceSingle ( ppc_state.fpscr , NI_madd (ppc_state, a.PS0AsDouble (), c0, b.PS0AsDouble ()).value );
const float tmp1 =
ForceSingle ( ppc_state.fpscr , NI_madd (ppc_state, a.PS1AsDouble (), c1, b.PS1AsDouble ()).value );
const float ps0 = std::isnan (tmp0) ? tmp0 : -tmp0;
const float ps1 = std::isnan (tmp1) ? tmp1 : -tmp1;
Expand All
@@ -359,8 +357,8 @@ void Interpreter::ps_sum0(Interpreter& interpreter, UGeckoInstruction inst)
const auto & b = ppc_state.ps [inst.FB ];
const auto & c = ppc_state.ps [inst.FC ];
const float ps0 = ForceSingle (ppc_state. fpscr ,
NI_add (& ppc_state.fpscr , a.PS0AsDouble (), b.PS1AsDouble ()).value );
const float ps0 =
ForceSingle ( ppc_state.fpscr , NI_add (ppc_state , a.PS0AsDouble (), b.PS1AsDouble ()).value );
const float ps1 = ForceSingle (ppc_state.fpscr , c.PS1AsDouble ());
ppc_state.ps [inst.FD ].SetBoth (ps0, ps1);
Expand All
@@ -378,8 +376,8 @@ void Interpreter::ps_sum1(Interpreter& interpreter, UGeckoInstruction inst)
const auto & c = ppc_state.ps [inst.FC ];
const float ps0 = ForceSingle (ppc_state.fpscr , c.PS0AsDouble ());
const float ps1 = ForceSingle (ppc_state. fpscr ,
NI_add (& ppc_state.fpscr , a.PS0AsDouble (), b.PS1AsDouble ()).value );
const float ps1 =
ForceSingle ( ppc_state.fpscr , NI_add (ppc_state , a.PS0AsDouble (), b.PS1AsDouble ()).value );
ppc_state.ps [inst.FD ].SetBoth (ps0, ps1);
ppc_state.UpdateFPRFSingle (ps1);
Expand All
@@ -395,10 +393,8 @@ void Interpreter::ps_muls0(Interpreter& interpreter, UGeckoInstruction inst)
const auto & c = ppc_state.ps [inst.FC ];
const double c0 = Force25Bit (c.PS0AsDouble ());
const float ps0 =
ForceSingle (ppc_state.fpscr , NI_mul (&ppc_state.fpscr , a.PS0AsDouble (), c0).value );
const float ps1 =
ForceSingle (ppc_state.fpscr , NI_mul (&ppc_state.fpscr , a.PS1AsDouble (), c0).value );
const float ps0 = ForceSingle (ppc_state.fpscr , NI_mul (ppc_state, a.PS0AsDouble (), c0).value );
const float ps1 = ForceSingle (ppc_state.fpscr , NI_mul (ppc_state, a.PS1AsDouble (), c0).value );
ppc_state.ps [inst.FD ].SetBoth (ps0, ps1);
ppc_state.UpdateFPRFSingle (ps0);
Expand All
@@ -414,10 +410,8 @@ void Interpreter::ps_muls1(Interpreter& interpreter, UGeckoInstruction inst)
const auto & c = ppc_state.ps [inst.FC ];
const double c1 = Force25Bit (c.PS1AsDouble ());
const float ps0 =
ForceSingle (ppc_state.fpscr , NI_mul (&ppc_state.fpscr , a.PS0AsDouble (), c1).value );
const float ps1 =
ForceSingle (ppc_state.fpscr , NI_mul (&ppc_state.fpscr , a.PS1AsDouble (), c1).value );
const float ps0 = ForceSingle (ppc_state.fpscr , NI_mul (ppc_state, a.PS0AsDouble (), c1).value );
const float ps1 = ForceSingle (ppc_state.fpscr , NI_mul (ppc_state, a.PS1AsDouble (), c1).value );
ppc_state.ps [inst.FD ].SetBoth (ps0, ps1);
ppc_state.UpdateFPRFSingle (ps0);
Expand All
@@ -434,10 +428,10 @@ void Interpreter::ps_madds0(Interpreter& interpreter, UGeckoInstruction inst)
const auto & c = ppc_state.ps [inst.FC ];
const double c0 = Force25Bit (c.PS0AsDouble ());
const float ps0 = ForceSingle (
ppc_state.fpscr , NI_madd (& ppc_state. fpscr , a.PS0AsDouble (), c0, b.PS0AsDouble ()).value );
const float ps1 = ForceSingle (
ppc_state.fpscr , NI_madd (& ppc_state. fpscr , a.PS1AsDouble (), c0, b.PS1AsDouble ()).value );
const float ps0 =
ForceSingle ( ppc_state.fpscr , NI_madd (ppc_state, a.PS0AsDouble (), c0, b.PS0AsDouble ()).value );
const float ps1 =
ForceSingle ( ppc_state.fpscr , NI_madd (ppc_state, a.PS1AsDouble (), c0, b.PS1AsDouble ()).value );
ppc_state.ps [inst.FD ].SetBoth (ps0, ps1);
ppc_state.UpdateFPRFSingle (ps0);
Expand All
@@ -454,10 +448,10 @@ void Interpreter::ps_madds1(Interpreter& interpreter, UGeckoInstruction inst)
const auto & c = ppc_state.ps [inst.FC ];
const double c1 = Force25Bit (c.PS1AsDouble ());
const float ps0 = ForceSingle (
ppc_state.fpscr , NI_madd (& ppc_state. fpscr , a.PS0AsDouble (), c1, b.PS0AsDouble ()).value );
const float ps1 = ForceSingle (
ppc_state.fpscr , NI_madd (& ppc_state. fpscr , a.PS1AsDouble (), c1, b.PS1AsDouble ()).value );
const float ps0 =
ForceSingle ( ppc_state.fpscr , NI_madd (ppc_state, a.PS0AsDouble (), c1, b.PS0AsDouble ()).value );
const float ps1 =
ForceSingle ( ppc_state.fpscr , NI_madd (ppc_state, a.PS1AsDouble (), c1, b.PS1AsDouble ()).value );
ppc_state.ps [inst.FD ].SetBoth (ps0, ps1);
ppc_state.UpdateFPRFSingle (ps0);
Expand Down