diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /mathlib/powsse.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'mathlib/powsse.cpp')
| -rw-r--r-- | mathlib/powsse.cpp | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/mathlib/powsse.cpp b/mathlib/powsse.cpp new file mode 100644 index 0000000..b026c64 --- /dev/null +++ b/mathlib/powsse.cpp @@ -0,0 +1,96 @@ +//========= 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 + * + * + * 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 ); +} + |