Skip to content

Commit

Permalink
Added optimizations to ClassifyFloat/Double functions in Mathutil.cpp…
Browse files Browse the repository at this point in the history
… and to PPCCache.cpp
  • Loading branch information
eli173 committed Jun 2, 2013
1 parent 80b09c0 commit 7aae9cc
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 73 deletions.
89 changes: 41 additions & 48 deletions Source/Core/Common/Src/MathUtil.cpp
Expand Up @@ -13,61 +13,54 @@ namespace MathUtil
{

u32 ClassifyDouble(double dvalue)
{
// TODO: Optimize the below to be as fast as possible.
IntDouble value;
value.d = dvalue;
u64 sign = value.i & DOUBLE_SIGN;
u64 exp = value.i & DOUBLE_EXP;
if (exp > DOUBLE_ZERO && exp < DOUBLE_EXP)
{
// Nice normalized number.
return sign ? PPC_FPCLASS_NN : PPC_FPCLASS_PN;
}
else
{
u64 mantissa = value.i & DOUBLE_FRAC;
if (mantissa)
{
if (exp)
{
return PPC_FPCLASS_QNAN;
}
else
{
// Denormalized number.
return sign ? PPC_FPCLASS_ND : PPC_FPCLASS_PD;
}
}
else if (exp)
{
//Infinite
return sign ? PPC_FPCLASS_NINF : PPC_FPCLASS_PINF;
}
else
{
//Zero
return sign ? PPC_FPCLASS_NZ : PPC_FPCLASS_PZ;
}
}
}
{
// TODO: Optimize the below to be as fast as possible.
u64 exp = *(u64*)(&dvalue) & DOUBLE_EXP;
if (exp != DOUBLE_ZERO && exp != DOUBLE_EXP)
{
// Nice normalized number.
return *(u64*)(&dvalue)&DOUBLE_SIGN ? PPC_FPCLASS_NN : PPC_FPCLASS_PN;
}
else
{
if (*(u64*)(&dvalue) & DOUBLE_FRAC)
{
if (exp)
{
return PPC_FPCLASS_QNAN;
}
else
{
// Denormalized number.
return *(u64*)(&dvalue)&DOUBLE_SIGN ? PPC_FPCLASS_ND : PPC_FPCLASS_PD;
}
}
else if (exp)
{
//Infinite
return *(u64*)(&dvalue)&DOUBLE_SIGN ? PPC_FPCLASS_NINF : PPC_FPCLASS_PINF;
}
else
{
//Zero
return *(u64*)(&dvalue)&DOUBLE_SIGN ? PPC_FPCLASS_NZ : PPC_FPCLASS_PZ;
}
}
}


u32 ClassifyFloat(float fvalue)
{
// TODO: Optimize the below to be as fast as possible.
IntFloat value;
value.f = fvalue;
u32 sign = value.i & FLOAT_SIGN;
u32 exp = value.i & FLOAT_EXP;
u32 exp = *(u32*)(&fvalue) & FLOAT_EXP;
if (exp > FLOAT_ZERO && exp < FLOAT_EXP)
{
// Nice normalized number.
return sign ? PPC_FPCLASS_NN : PPC_FPCLASS_PN;
return *(u32*)(&fvalue) & FLOAT_SIGN ? PPC_FPCLASS_NN : PPC_FPCLASS_PN;
}
else
{
u32 mantissa = value.i & FLOAT_FRAC;
if (mantissa)
if (*(u32*)(&fvalue) & FLOAT_FRAC)
{
if (exp)
{
Expand All @@ -76,18 +69,18 @@ u32 ClassifyFloat(float fvalue)
else
{
// Denormalized number.
return sign ? PPC_FPCLASS_ND : PPC_FPCLASS_PD;
return *(u32*)(&fvalue) & FLOAT_SIGN ? PPC_FPCLASS_ND : PPC_FPCLASS_PD;
}
}
else if (exp)
{
// Infinite
return sign ? PPC_FPCLASS_NINF : PPC_FPCLASS_PINF;
return *(u32*)(&fvalue) & FLOAT_SIGN ? PPC_FPCLASS_NINF : PPC_FPCLASS_PINF;
}
else
{
//Zero
return sign ? PPC_FPCLASS_NZ : PPC_FPCLASS_PZ;
return *(u32*)(&fvalue) & FLOAT_SIGN ? PPC_FPCLASS_NZ : PPC_FPCLASS_PZ;
}
}
}
Expand Down
48 changes: 23 additions & 25 deletions Source/Core/Core/Src/PowerPC/PPCCache.cpp
Expand Up @@ -26,31 +26,29 @@ namespace PowerPC

for (u32 m = 0; m < 128; m++)
{
u32 b[7];
for (int i = 0; i < 7; i++) b[i] = m & (1<<i);
u32 w;
if (b[0])
if (b[2])
if (b[6])
w = 7;
else
w = 6;
else
if (b[5])
w = 5;
else
w = 4;
else
if (b[1])
if (b[4])
w = 3;
else
w = 2;
else
if (b[3])
w = 1;
else
w = 0;
u32 w;
if(m & (1<<0))
if(m & (1<<2))
if(m & (1<<6))
w=7;
else
w=6;
else
if(m & (1<<5))
w=5;
else
w=4;
else
if(m & (1<<1))
if(m & (1<<4))
w=3;
else
w=2;
else
if(m & (1<<3))
w=1;
else
w=0;
way_from_plru[m] = w;
}
}
Expand Down

0 comments on commit 7aae9cc

Please sign in to comment.