You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
1.7 KiB
96 lines
1.7 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//=====================================================================================// |
|
|
|
#include "mathlib/ssemath.h" |
|
|
|
// NOTE: This has to be the last file included! |
|
#include "tier0/memdbgon.h" |
|
|
|
|
|
fltx4 Pow_FixedPoint_Exponent_SIMD( const fltx4 & x, int exponent) |
|
{ |
|
fltx4 rslt=Four_Ones; // x^0=1.0 |
|
int xp=abs(exponent); |
|
if (xp & 3) // fraction present? |
|
{ |
|
fltx4 sq_rt=SqrtEstSIMD(x); |
|
if (xp & 1) // .25? |
|
rslt=SqrtEstSIMD(sq_rt); // x^.25 |
|
if (xp & 2) |
|
rslt=MulSIMD(rslt,sq_rt); |
|
} |
|
xp>>=2; // strip fraction |
|
fltx4 curpower=x; // curpower iterates through x,x^2,x^4,x^8,x^16... |
|
|
|
while(1) |
|
{ |
|
if (xp & 1) |
|
rslt=MulSIMD(rslt,curpower); |
|
xp>>=1; |
|
if (xp) |
|
curpower=MulSIMD(curpower,curpower); |
|
else |
|
break; |
|
} |
|
if (exponent<0) |
|
return ReciprocalEstSaturateSIMD(rslt); // pow(x,-b)=1/pow(x,b) |
|
else |
|
return rslt; |
|
} |
|
|
|
|
|
|
|
|
|
/* |
|
* (c) Ian Stephenson |
|
* |
|
* ian@dctsystems.co.uk |
|
* |
|
* Fast pow() reference implementation |
|
*/ |
|
|
|
|
|
static float shift23=(1<<23); |
|
static float OOshift23=1.0/(1<<23); |
|
|
|
float FastLog2(float i) |
|
{ |
|
float LogBodge=0.346607f; |
|
float x; |
|
float y; |
|
x=*(int *)&i; |
|
x*= OOshift23; //1/pow(2,23); |
|
x=x-127; |
|
|
|
y=x-floorf(x); |
|
y=(y-y*y)*LogBodge; |
|
return x+y; |
|
} |
|
float FastPow2(float i) |
|
{ |
|
float PowBodge=0.33971f; |
|
float x; |
|
float y=i-floorf(i); |
|
y=(y-y*y)*PowBodge; |
|
|
|
x=i+127-y; |
|
x*= shift23; //pow(2,23); |
|
*(int*)&x=(int)x; |
|
return x; |
|
} |
|
float FastPow(float a, float b) |
|
{ |
|
if (a <= OOshift23) |
|
{ |
|
return 0.0f; |
|
} |
|
return FastPow2(b*FastLog2(a)); |
|
} |
|
float FastPow10( float i ) |
|
{ |
|
return FastPow2( i * 3.321928f ); |
|
} |
|
|
|
|