@@ -57,13 +57,13 @@ const float m_quantizeTable[] = {
};
template <typename SType>
SType ScaleAndClamp (double ps, u32 stScale )
SType ScaleAndClamp (double ps, u32 st_scale )
{
float convPS = ( float )ps * m_quantizeTable[stScale ];
constexpr float min = ( float ) std::numeric_limits<SType>::min ();
constexpr float max = ( float ) std::numeric_limits<SType>::max ();
const float conv_ps = float (ps) * m_quantizeTable[st_scale ];
constexpr float min = float ( std::numeric_limits<SType>::min () );
constexpr float max = float ( std::numeric_limits<SType>::max () );
return ( SType) std::clamp (convPS , min, max);
return SType ( std::clamp (conv_ps , min, max) );
}
template <typename T>
@@ -93,22 +93,22 @@ static std::pair<T, T> ReadPair(u32 addr);
template <>
std::pair<u8, u8> ReadPair<u8>(u32 addr)
{
u16 val = PowerPC::Read_U16 (addr);
return {(u8) (val >> 8 ), (u8) val};
const u16 val = PowerPC::Read_U16 (addr);
return {u8 (val >> 8 ), u8 ( val) };
}
template <>
std::pair<u16, u16> ReadPair<u16>(u32 addr)
{
u32 val = PowerPC::Read_U32 (addr);
return {( u16) (val >> 16 ), ( u16) val};
const u32 val = PowerPC::Read_U32 (addr);
return {u16 (val >> 16 ), u16 ( val) };
}
template <>
std::pair<u32, u32> ReadPair<u32>(u32 addr)
{
u64 val = PowerPC::Read_U64 (addr);
return {( u32) (val >> 32 ), ( u32) val};
const u64 val = PowerPC::Read_U64 (addr);
return {u32 (val >> 32 ), u32 ( val) };
}
template <typename T>
@@ -138,56 +138,56 @@ static void WritePair(T val1, T val2, u32 addr);
template <>
void WritePair<u8>(u8 val1, u8 val2, u32 addr)
{
PowerPC::Write_U16 ((( u16) val1 << 8 ) | ( u16) val2, addr);
PowerPC::Write_U16 ((u16{ val1} << 8 ) | u16{ val2} , addr);
}
template <>
void WritePair<u16>(u16 val1, u16 val2, u32 addr)
{
PowerPC::Write_U32 ((( u32) val1 << 16 ) | ( u32) val2, addr);
PowerPC::Write_U32 ((u32{ val1} << 16 ) | u32{ val2} , addr);
}
template <>
void WritePair<u32>(u32 val1, u32 val2, u32 addr)
{
PowerPC::Write_U64 ((( u64) val1 << 32 ) | ( u64) val2, addr);
PowerPC::Write_U64 ((u64{ val1} << 32 ) | u64{ val2} , addr);
}
template <typename T>
void QuantizeAndStore (double ps0, double ps1, u32 addr, u32 instW, u32 stScale )
void QuantizeAndStore (double ps0, double ps1, u32 addr, u32 instW, u32 st_scale )
{
using U = std::make_unsigned_t <T>;
U convPS0 = (U) ScaleAndClamp<T>(ps0, stScale );
const U conv_ps0 = U ( ScaleAndClamp<T>(ps0, st_scale) );
if (instW)
{
WriteUnpaired<U>(convPS0 , addr);
WriteUnpaired<U>(conv_ps0 , addr);
}
else
{
U convPS1 = (U) ScaleAndClamp<T>(ps1, stScale );
WritePair<U>(convPS0, convPS1 , addr);
const U conv_ps1 = U ( ScaleAndClamp<T>(ps1, st_scale) );
WritePair<U>(conv_ps0, conv_ps1 , addr);
}
}
static void Helper_Quantize (const PowerPC::PowerPCState* ppcs, u32 addr, u32 instI, u32 instRS,
u32 instW)
{
const UGQR gqr (ppcs->spr [SPR_GQR0 + instI]);
const EQuantizeType stType = gqr.st_type ;
const unsigned int stScale = gqr.st_scale ;
const EQuantizeType st_type = gqr.st_type ;
const u32 st_scale = gqr.st_scale ;
const double ps0 = ppcs->ps [instRS].PS0AsDouble ();
const double ps1 = ppcs->ps [instRS].PS1AsDouble ();
switch (stType )
switch (st_type )
{
case QUANTIZE_FLOAT:
{
const u64 integral_ps0 = Common::BitCast<u64>(ps0);
const u32 conv_ps0 = ConvertToSingleFTZ (integral_ps0);
if (instW)
if (instW != 0 )
{
WriteUnpaired<u32>(conv_ps0, addr);
}
@@ -202,19 +202,19 @@ static void Helper_Quantize(const PowerPC::PowerPCState* ppcs, u32 addr, u32 ins
}
case QUANTIZE_U8:
QuantizeAndStore<u8>(ps0, ps1, addr, instW, stScale );
QuantizeAndStore<u8>(ps0, ps1, addr, instW, st_scale );
break ;
case QUANTIZE_U16:
QuantizeAndStore<u16>(ps0, ps1, addr, instW, stScale );
QuantizeAndStore<u16>(ps0, ps1, addr, instW, st_scale );
break ;
case QUANTIZE_S8:
QuantizeAndStore<s8>(ps0, ps1, addr, instW, stScale );
QuantizeAndStore<s8>(ps0, ps1, addr, instW, st_scale );
break ;
case QUANTIZE_S16:
QuantizeAndStore<s16>(ps0, ps1, addr, instW, stScale );
QuantizeAndStore<s16>(ps0, ps1, addr, instW, st_scale );
break ;
case QUANTIZE_INVALID1:
@@ -226,22 +226,22 @@ static void Helper_Quantize(const PowerPC::PowerPCState* ppcs, u32 addr, u32 ins
}
template <typename T>
std::pair<double , double > LoadAndDequantize (u32 addr, u32 instW, u32 ldScale )
std::pair<double , double > LoadAndDequantize (u32 addr, u32 instW, u32 ld_scale )
{
using U = std::make_unsigned_t <T>;
float ps0, ps1;
if (instW)
if (instW != 0 )
{
U value = ReadUnpaired<U>(addr);
ps0 = ( float )(T) (value)* m_dequantizeTable[ldScale ];
const U value = ReadUnpaired<U>(addr);
ps0 = float ( T (value)) * m_dequantizeTable[ld_scale ];
ps1 = 1 .0f ;
}
else
{
std::pair<U, U> value = ReadPair<U>(addr);
ps0 = ( float )(T)(value. first ) * m_dequantizeTable[ldScale ];
ps1 = ( float )(T)(value. second ) * m_dequantizeTable[ldScale ];
const auto [first, second] = ReadPair<U>(addr);
ps0 = float ( T ( first)) * m_dequantizeTable[ld_scale ];
ps1 = float ( T ( second)) * m_dequantizeTable[ld_scale ];
}
// ps0 and ps1 always contain finite and normal numbers. So we can just cast them to double
return {static_cast <double >(ps0), static_cast <double >(ps1)};
@@ -250,44 +250,44 @@ std::pair<double, double> LoadAndDequantize(u32 addr, u32 instW, u32 ldScale)
static void Helper_Dequantize (PowerPC::PowerPCState* ppcs, u32 addr, u32 instI, u32 instRD,
u32 instW)
{
UGQR gqr (ppcs->spr [SPR_GQR0 + instI]);
EQuantizeType ldType = gqr.ld_type ;
unsigned int ldScale = gqr.ld_scale ;
const UGQR gqr (ppcs->spr [SPR_GQR0 + instI]);
const EQuantizeType ld_type = gqr.ld_type ;
const u32 ld_scale = gqr.ld_scale ;
double ps0 = 0.0 ;
double ps1 = 0.0 ;
switch (ldType )
switch (ld_type )
{
case QUANTIZE_FLOAT:
if (instW)
if (instW != 0 )
{
const u32 value = ReadUnpaired<u32>(addr);
ps0 = Common::BitCast<double >(ConvertToDouble (value));
ps1 = 1.0 ;
}
else
{
const std::pair<u32, u32> value = ReadPair<u32>(addr);
ps0 = Common::BitCast<double >(ConvertToDouble (value. first ));
ps1 = Common::BitCast<double >(ConvertToDouble (value. second ));
const auto [first, second] = ReadPair<u32>(addr);
ps0 = Common::BitCast<double >(ConvertToDouble (first));
ps1 = Common::BitCast<double >(ConvertToDouble (second));
}
break ;
case QUANTIZE_U8:
std::tie (ps0, ps1) = LoadAndDequantize<u8>(addr, instW, ldScale );
std::tie (ps0, ps1) = LoadAndDequantize<u8>(addr, instW, ld_scale );
break ;
case QUANTIZE_U16:
std::tie (ps0, ps1) = LoadAndDequantize<u16>(addr, instW, ldScale );
std::tie (ps0, ps1) = LoadAndDequantize<u16>(addr, instW, ld_scale );
break ;
case QUANTIZE_S8:
std::tie (ps0, ps1) = LoadAndDequantize<s8>(addr, instW, ldScale );
std::tie (ps0, ps1) = LoadAndDequantize<s8>(addr, instW, ld_scale );
break ;
case QUANTIZE_S16:
std::tie (ps0, ps1) = LoadAndDequantize<s16>(addr, instW, ldScale );
std::tie (ps0, ps1) = LoadAndDequantize<s16>(addr, instW, ld_scale );
break ;
case QUANTIZE_INVALID1:
@@ -299,7 +299,7 @@ static void Helper_Dequantize(PowerPC::PowerPCState* ppcs, u32 addr, u32 instI,
break ;
}
if (ppcs->Exceptions & EXCEPTION_DSI)
if (( ppcs->Exceptions & EXCEPTION_DSI) != 0 )
{
return ;
}
@@ -315,7 +315,7 @@ void Interpreter::psq_l(UGeckoInstruction inst)
return ;
}
const u32 EA = inst.RA ? (rGPR[inst.RA ] + inst.SIMM_12 ) : ( u32) inst.SIMM_12 ;
const u32 EA = inst.RA ? (rGPR[inst.RA ] + u32 ( inst.SIMM_12 )) : u32 ( inst.SIMM_12 ) ;
Helper_Dequantize (&PowerPC::ppcState, EA, inst.I , inst.RD , inst.W );
}
@@ -327,13 +327,14 @@ void Interpreter::psq_lu(UGeckoInstruction inst)
return ;
}
const u32 EA = rGPR[inst.RA ] + inst.SIMM_12 ;
const u32 EA = rGPR[inst.RA ] + u32 ( inst.SIMM_12 ) ;
Helper_Dequantize (&PowerPC::ppcState, EA, inst.I , inst.RD , inst.W );
if (PowerPC::ppcState.Exceptions & EXCEPTION_DSI)
if (( PowerPC::ppcState.Exceptions & EXCEPTION_DSI) != 0 )
{
return ;
}
rGPR[inst.RA ] = EA;
}
@@ -345,7 +346,7 @@ void Interpreter::psq_st(UGeckoInstruction inst)
return ;
}
const u32 EA = inst.RA ? (rGPR[inst.RA ] + inst.SIMM_12 ) : ( u32) inst.SIMM_12 ;
const u32 EA = inst.RA ? (rGPR[inst.RA ] + u32 ( inst.SIMM_12 )) : u32 ( inst.SIMM_12 ) ;
Helper_Quantize (&PowerPC::ppcState, EA, inst.I , inst.RS , inst.W );
}
@@ -357,13 +358,14 @@ void Interpreter::psq_stu(UGeckoInstruction inst)
return ;
}
const u32 EA = rGPR[inst.RA ] + inst.SIMM_12 ;
const u32 EA = rGPR[inst.RA ] + u32 ( inst.SIMM_12 ) ;
Helper_Quantize (&PowerPC::ppcState, EA, inst.I , inst.RS , inst.W );
if (PowerPC::ppcState.Exceptions & EXCEPTION_DSI)
if (( PowerPC::ppcState.Exceptions & EXCEPTION_DSI) != 0 )
{
return ;
}
rGPR[inst.RA ] = EA;
}
@@ -384,10 +386,11 @@ void Interpreter::psq_lux(UGeckoInstruction inst)
const u32 EA = rGPR[inst.RA ] + rGPR[inst.RB ];
Helper_Dequantize (&PowerPC::ppcState, EA, inst.Ix , inst.RD , inst.Wx );
if (PowerPC::ppcState.Exceptions & EXCEPTION_DSI)
if (( PowerPC::ppcState.Exceptions & EXCEPTION_DSI) != 0 )
{
return ;
}
rGPR[inst.RA ] = EA;
}
@@ -396,9 +399,10 @@ void Interpreter::psq_stux(UGeckoInstruction inst)
const u32 EA = rGPR[inst.RA ] + rGPR[inst.RB ];
Helper_Quantize (&PowerPC::ppcState, EA, inst.Ix , inst.RS , inst.Wx );
if (PowerPC::ppcState.Exceptions & EXCEPTION_DSI)
if (( PowerPC::ppcState.Exceptions & EXCEPTION_DSI) != 0 )
{
return ;
}
rGPR[inst.RA ] = EA;
}