Added optimizations to ClassifyFloat/Double functions in Mathutil.cpp and to PPCCache.cpp
This commit is contained in:
parent
80b09c074e
commit
7aae9ccbc0
|
@ -13,61 +13,54 @@ namespace MathUtil
|
||||||
{
|
{
|
||||||
|
|
||||||
u32 ClassifyDouble(double dvalue)
|
u32 ClassifyDouble(double dvalue)
|
||||||
{
|
{
|
||||||
// TODO: Optimize the below to be as fast as possible.
|
// TODO: Optimize the below to be as fast as possible.
|
||||||
IntDouble value;
|
u64 exp = *(u64*)(&dvalue) & DOUBLE_EXP;
|
||||||
value.d = dvalue;
|
if (exp != DOUBLE_ZERO && exp != DOUBLE_EXP)
|
||||||
u64 sign = value.i & DOUBLE_SIGN;
|
{
|
||||||
u64 exp = value.i & DOUBLE_EXP;
|
// Nice normalized number.
|
||||||
if (exp > DOUBLE_ZERO && exp < DOUBLE_EXP)
|
return *(u64*)(&dvalue)&DOUBLE_SIGN ? PPC_FPCLASS_NN : PPC_FPCLASS_PN;
|
||||||
{
|
}
|
||||||
// Nice normalized number.
|
else
|
||||||
return sign ? PPC_FPCLASS_NN : PPC_FPCLASS_PN;
|
{
|
||||||
}
|
if (*(u64*)(&dvalue) & DOUBLE_FRAC)
|
||||||
else
|
{
|
||||||
{
|
if (exp)
|
||||||
u64 mantissa = value.i & DOUBLE_FRAC;
|
{
|
||||||
if (mantissa)
|
return PPC_FPCLASS_QNAN;
|
||||||
{
|
}
|
||||||
if (exp)
|
else
|
||||||
{
|
{
|
||||||
return PPC_FPCLASS_QNAN;
|
// Denormalized number.
|
||||||
}
|
return *(u64*)(&dvalue)&DOUBLE_SIGN ? PPC_FPCLASS_ND : PPC_FPCLASS_PD;
|
||||||
else
|
}
|
||||||
{
|
}
|
||||||
// Denormalized number.
|
else if (exp)
|
||||||
return sign ? PPC_FPCLASS_ND : PPC_FPCLASS_PD;
|
{
|
||||||
}
|
//Infinite
|
||||||
}
|
return *(u64*)(&dvalue)&DOUBLE_SIGN ? PPC_FPCLASS_NINF : PPC_FPCLASS_PINF;
|
||||||
else if (exp)
|
}
|
||||||
{
|
else
|
||||||
//Infinite
|
{
|
||||||
return sign ? PPC_FPCLASS_NINF : PPC_FPCLASS_PINF;
|
//Zero
|
||||||
}
|
return *(u64*)(&dvalue)&DOUBLE_SIGN ? PPC_FPCLASS_NZ : PPC_FPCLASS_PZ;
|
||||||
else
|
}
|
||||||
{
|
}
|
||||||
//Zero
|
}
|
||||||
return sign ? PPC_FPCLASS_NZ : PPC_FPCLASS_PZ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 ClassifyFloat(float fvalue)
|
u32 ClassifyFloat(float fvalue)
|
||||||
{
|
{
|
||||||
// TODO: Optimize the below to be as fast as possible.
|
// TODO: Optimize the below to be as fast as possible.
|
||||||
IntFloat value;
|
u32 exp = *(u32*)(&fvalue) & FLOAT_EXP;
|
||||||
value.f = fvalue;
|
|
||||||
u32 sign = value.i & FLOAT_SIGN;
|
|
||||||
u32 exp = value.i & FLOAT_EXP;
|
|
||||||
if (exp > FLOAT_ZERO && exp < FLOAT_EXP)
|
if (exp > FLOAT_ZERO && exp < FLOAT_EXP)
|
||||||
{
|
{
|
||||||
// Nice normalized number.
|
// Nice normalized number.
|
||||||
return sign ? PPC_FPCLASS_NN : PPC_FPCLASS_PN;
|
return *(u32*)(&fvalue) & FLOAT_SIGN ? PPC_FPCLASS_NN : PPC_FPCLASS_PN;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
u32 mantissa = value.i & FLOAT_FRAC;
|
if (*(u32*)(&fvalue) & FLOAT_FRAC)
|
||||||
if (mantissa)
|
|
||||||
{
|
{
|
||||||
if (exp)
|
if (exp)
|
||||||
{
|
{
|
||||||
|
@ -76,18 +69,18 @@ u32 ClassifyFloat(float fvalue)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Denormalized number.
|
// Denormalized number.
|
||||||
return sign ? PPC_FPCLASS_ND : PPC_FPCLASS_PD;
|
return *(u32*)(&fvalue) & FLOAT_SIGN ? PPC_FPCLASS_ND : PPC_FPCLASS_PD;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (exp)
|
else if (exp)
|
||||||
{
|
{
|
||||||
// Infinite
|
// Infinite
|
||||||
return sign ? PPC_FPCLASS_NINF : PPC_FPCLASS_PINF;
|
return *(u32*)(&fvalue) & FLOAT_SIGN ? PPC_FPCLASS_NINF : PPC_FPCLASS_PINF;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//Zero
|
//Zero
|
||||||
return sign ? PPC_FPCLASS_NZ : PPC_FPCLASS_PZ;
|
return *(u32*)(&fvalue) & FLOAT_SIGN ? PPC_FPCLASS_NZ : PPC_FPCLASS_PZ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,31 +26,29 @@ namespace PowerPC
|
||||||
|
|
||||||
for (u32 m = 0; m < 128; m++)
|
for (u32 m = 0; m < 128; m++)
|
||||||
{
|
{
|
||||||
u32 b[7];
|
u32 w;
|
||||||
for (int i = 0; i < 7; i++) b[i] = m & (1<<i);
|
if(m & (1<<0))
|
||||||
u32 w;
|
if(m & (1<<2))
|
||||||
if (b[0])
|
if(m & (1<<6))
|
||||||
if (b[2])
|
w=7;
|
||||||
if (b[6])
|
else
|
||||||
w = 7;
|
w=6;
|
||||||
else
|
else
|
||||||
w = 6;
|
if(m & (1<<5))
|
||||||
else
|
w=5;
|
||||||
if (b[5])
|
else
|
||||||
w = 5;
|
w=4;
|
||||||
else
|
else
|
||||||
w = 4;
|
if(m & (1<<1))
|
||||||
else
|
if(m & (1<<4))
|
||||||
if (b[1])
|
w=3;
|
||||||
if (b[4])
|
else
|
||||||
w = 3;
|
w=2;
|
||||||
else
|
else
|
||||||
w = 2;
|
if(m & (1<<3))
|
||||||
else
|
w=1;
|
||||||
if (b[3])
|
else
|
||||||
w = 1;
|
w=0;
|
||||||
else
|
|
||||||
w = 0;
|
|
||||||
way_from_plru[m] = w;
|
way_from_plru[m] = w;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue