mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-11-14 21:37:52 -07:00
Merge pull request #7639 from CrystalGamma/pr-quantize
PowerPC: Thread state through PS (de)quantize helpers
This commit is contained in:
commit
849ede9d0a
@ -291,10 +291,6 @@ private:
|
|||||||
// flag helper
|
// flag helper
|
||||||
static void Helper_UpdateCR0(u32 value);
|
static void Helper_UpdateCR0(u32 value);
|
||||||
|
|
||||||
// paired helper
|
|
||||||
static void Helper_Dequantize(u32 addr, u32 instI, u32 instRD, u32 instW);
|
|
||||||
static void Helper_Quantize(u32 addr, u32 instI, u32 instRS, u32 instW);
|
|
||||||
|
|
||||||
static void Helper_FloatCompareOrdered(UGeckoInstruction inst, double a, double b);
|
static void Helper_FloatCompareOrdered(UGeckoInstruction inst, double a, double b);
|
||||||
static void Helper_FloatCompareUnordered(UGeckoInstruction inst, double a, double b);
|
static void Helper_FloatCompareUnordered(UGeckoInstruction inst, double a, double b);
|
||||||
|
|
||||||
|
@ -170,14 +170,15 @@ void QuantizeAndStore(double ps0, double ps1, u32 addr, u32 instW, u32 stScale)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Interpreter::Helper_Quantize(u32 addr, u32 instI, u32 instRS, u32 instW)
|
static void Helper_Quantize(const PowerPC::PowerPCState* ppcs, u32 addr, u32 instI, u32 instRS,
|
||||||
|
u32 instW)
|
||||||
{
|
{
|
||||||
const UGQR gqr(rSPR(SPR_GQR0 + instI));
|
const UGQR gqr(ppcs->spr[SPR_GQR0 + instI]);
|
||||||
const EQuantizeType stType = gqr.st_type;
|
const EQuantizeType stType = gqr.st_type;
|
||||||
const unsigned int stScale = gqr.st_scale;
|
const unsigned int stScale = gqr.st_scale;
|
||||||
|
|
||||||
const double ps0 = rPS(instRS).PS0AsDouble();
|
const double ps0 = ppcs->ps[instRS].PS0AsDouble();
|
||||||
const double ps1 = rPS(instRS).PS1AsDouble();
|
const double ps1 = ppcs->ps[instRS].PS1AsDouble();
|
||||||
|
|
||||||
switch (stType)
|
switch (stType)
|
||||||
{
|
{
|
||||||
@ -245,9 +246,10 @@ std::pair<float, float> LoadAndDequantize(u32 addr, u32 instW, u32 ldScale)
|
|||||||
return {ps0, ps1};
|
return {ps0, ps1};
|
||||||
}
|
}
|
||||||
|
|
||||||
void Interpreter::Helper_Dequantize(u32 addr, u32 instI, u32 instRD, u32 instW)
|
static void Helper_Dequantize(PowerPC::PowerPCState* ppcs, u32 addr, u32 instI, u32 instRD,
|
||||||
|
u32 instW)
|
||||||
{
|
{
|
||||||
UGQR gqr(rSPR(SPR_GQR0 + instI));
|
UGQR gqr(ppcs->spr[SPR_GQR0 + instI]);
|
||||||
EQuantizeType ldType = gqr.ld_type;
|
EQuantizeType ldType = gqr.ld_type;
|
||||||
unsigned int ldScale = gqr.ld_scale;
|
unsigned int ldScale = gqr.ld_scale;
|
||||||
|
|
||||||
@ -296,12 +298,12 @@ void Interpreter::Helper_Dequantize(u32 addr, u32 instI, u32 instRD, u32 instW)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PowerPC::ppcState.Exceptions & EXCEPTION_DSI)
|
if (ppcs->Exceptions & EXCEPTION_DSI)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
rPS(instRD).SetBoth(ps0, ps1);
|
ppcs->ps[instRD].SetBoth(ps0, ps1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Interpreter::psq_l(UGeckoInstruction inst)
|
void Interpreter::psq_l(UGeckoInstruction inst)
|
||||||
@ -313,7 +315,7 @@ void Interpreter::psq_l(UGeckoInstruction inst)
|
|||||||
}
|
}
|
||||||
|
|
||||||
const u32 EA = inst.RA ? (rGPR[inst.RA] + inst.SIMM_12) : (u32)inst.SIMM_12;
|
const u32 EA = inst.RA ? (rGPR[inst.RA] + inst.SIMM_12) : (u32)inst.SIMM_12;
|
||||||
Helper_Dequantize(EA, inst.I, inst.RD, inst.W);
|
Helper_Dequantize(&PowerPC::ppcState, EA, inst.I, inst.RD, inst.W);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Interpreter::psq_lu(UGeckoInstruction inst)
|
void Interpreter::psq_lu(UGeckoInstruction inst)
|
||||||
@ -325,7 +327,7 @@ void Interpreter::psq_lu(UGeckoInstruction inst)
|
|||||||
}
|
}
|
||||||
|
|
||||||
const u32 EA = rGPR[inst.RA] + inst.SIMM_12;
|
const u32 EA = rGPR[inst.RA] + inst.SIMM_12;
|
||||||
Helper_Dequantize(EA, inst.I, inst.RD, inst.W);
|
Helper_Dequantize(&PowerPC::ppcState, EA, inst.I, inst.RD, inst.W);
|
||||||
|
|
||||||
if (PowerPC::ppcState.Exceptions & EXCEPTION_DSI)
|
if (PowerPC::ppcState.Exceptions & EXCEPTION_DSI)
|
||||||
{
|
{
|
||||||
@ -343,7 +345,7 @@ void Interpreter::psq_st(UGeckoInstruction inst)
|
|||||||
}
|
}
|
||||||
|
|
||||||
const u32 EA = inst.RA ? (rGPR[inst.RA] + inst.SIMM_12) : (u32)inst.SIMM_12;
|
const u32 EA = inst.RA ? (rGPR[inst.RA] + inst.SIMM_12) : (u32)inst.SIMM_12;
|
||||||
Helper_Quantize(EA, inst.I, inst.RS, inst.W);
|
Helper_Quantize(&PowerPC::ppcState, EA, inst.I, inst.RS, inst.W);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Interpreter::psq_stu(UGeckoInstruction inst)
|
void Interpreter::psq_stu(UGeckoInstruction inst)
|
||||||
@ -355,7 +357,7 @@ void Interpreter::psq_stu(UGeckoInstruction inst)
|
|||||||
}
|
}
|
||||||
|
|
||||||
const u32 EA = rGPR[inst.RA] + inst.SIMM_12;
|
const u32 EA = rGPR[inst.RA] + inst.SIMM_12;
|
||||||
Helper_Quantize(EA, inst.I, inst.RS, inst.W);
|
Helper_Quantize(&PowerPC::ppcState, EA, inst.I, inst.RS, inst.W);
|
||||||
|
|
||||||
if (PowerPC::ppcState.Exceptions & EXCEPTION_DSI)
|
if (PowerPC::ppcState.Exceptions & EXCEPTION_DSI)
|
||||||
{
|
{
|
||||||
@ -367,19 +369,19 @@ void Interpreter::psq_stu(UGeckoInstruction inst)
|
|||||||
void Interpreter::psq_lx(UGeckoInstruction inst)
|
void Interpreter::psq_lx(UGeckoInstruction inst)
|
||||||
{
|
{
|
||||||
const u32 EA = inst.RA ? (rGPR[inst.RA] + rGPR[inst.RB]) : rGPR[inst.RB];
|
const u32 EA = inst.RA ? (rGPR[inst.RA] + rGPR[inst.RB]) : rGPR[inst.RB];
|
||||||
Helper_Dequantize(EA, inst.Ix, inst.RD, inst.Wx);
|
Helper_Dequantize(&PowerPC::ppcState, EA, inst.Ix, inst.RD, inst.Wx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Interpreter::psq_stx(UGeckoInstruction inst)
|
void Interpreter::psq_stx(UGeckoInstruction inst)
|
||||||
{
|
{
|
||||||
const u32 EA = inst.RA ? (rGPR[inst.RA] + rGPR[inst.RB]) : rGPR[inst.RB];
|
const u32 EA = inst.RA ? (rGPR[inst.RA] + rGPR[inst.RB]) : rGPR[inst.RB];
|
||||||
Helper_Quantize(EA, inst.Ix, inst.RS, inst.Wx);
|
Helper_Quantize(&PowerPC::ppcState, EA, inst.Ix, inst.RS, inst.Wx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Interpreter::psq_lux(UGeckoInstruction inst)
|
void Interpreter::psq_lux(UGeckoInstruction inst)
|
||||||
{
|
{
|
||||||
const u32 EA = rGPR[inst.RA] + rGPR[inst.RB];
|
const u32 EA = rGPR[inst.RA] + rGPR[inst.RB];
|
||||||
Helper_Dequantize(EA, inst.Ix, inst.RD, inst.Wx);
|
Helper_Dequantize(&PowerPC::ppcState, EA, inst.Ix, inst.RD, inst.Wx);
|
||||||
|
|
||||||
if (PowerPC::ppcState.Exceptions & EXCEPTION_DSI)
|
if (PowerPC::ppcState.Exceptions & EXCEPTION_DSI)
|
||||||
{
|
{
|
||||||
@ -391,7 +393,7 @@ void Interpreter::psq_lux(UGeckoInstruction inst)
|
|||||||
void Interpreter::psq_stux(UGeckoInstruction inst)
|
void Interpreter::psq_stux(UGeckoInstruction inst)
|
||||||
{
|
{
|
||||||
const u32 EA = rGPR[inst.RA] + rGPR[inst.RB];
|
const u32 EA = rGPR[inst.RA] + rGPR[inst.RB];
|
||||||
Helper_Quantize(EA, inst.Ix, inst.RS, inst.Wx);
|
Helper_Quantize(&PowerPC::ppcState, EA, inst.Ix, inst.RS, inst.Wx);
|
||||||
|
|
||||||
if (PowerPC::ppcState.Exceptions & EXCEPTION_DSI)
|
if (PowerPC::ppcState.Exceptions & EXCEPTION_DSI)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user