Signed-off-by: rander <rander.w...@intel.com> --- backend/src/libocl/tmpl/ocl_math.tmpl.cl | 38 +++++++++++++++++++++++++++++ backend/src/libocl/tmpl/ocl_math_20.tmpl.cl | 37 ++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+)
diff --git a/backend/src/libocl/tmpl/ocl_math.tmpl.cl b/backend/src/libocl/tmpl/ocl_math.tmpl.cl index f0c40fc..0adf49f 100644 --- a/backend/src/libocl/tmpl/ocl_math.tmpl.cl +++ b/backend/src/libocl/tmpl/ocl_math.tmpl.cl @@ -4171,3 +4171,41 @@ OVERLOADABLE double log2(double x) } } +OVERLOADABLE double log10(double x) +{ + double zero = 0.0, + two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */ + ivln10 = 4.34294481903251816668e-01, /* 0x3FDBCB7B, 0x1526E50E */ + log10_2hi = 3.01029995663611771306e-01, /* 0x3FD34413, 0x509F6000 */ + log10_2lo = 3.69423907715893078616e-13; /* 0x3D59FEF3, 0x11F12B36 */ + + double y,z; + int i,k,hx; + unsigned lx; + + hx = __HI(x); /* high word of x */ + lx = __LO(x); /* low word of x */ + + k=0; + if (hx < 0x00100000) + { /* x < 2**-1022 */ + if (((hx&0x7fffffff)|lx)==0) + return -two54/zero; /* log(+-0)=-inf */ + + if (hx<0) + return (x-x)/zero;/* log(-#) = NaN */ + + k -= 54; x *= two54; /* subnormal number, scale up x */ + hx = __HI(x);/* high word of x */ + } + + if (hx >= 0x7ff00000) return x+x; + k += (hx>>20)-1023; + i = ((unsigned)k&0x80000000)>>31; + hx = (hx&0x000fffff)|((0x3ff-i)<<20); + y = (double)(k+i); + __setHigh(&x, hx); + z = y*log10_2lo + ivln10*log(x); + return z+y*log10_2hi; +} + diff --git a/backend/src/libocl/tmpl/ocl_math_20.tmpl.cl b/backend/src/libocl/tmpl/ocl_math_20.tmpl.cl index ea2ee37..38d5820 100644 --- a/backend/src/libocl/tmpl/ocl_math_20.tmpl.cl +++ b/backend/src/libocl/tmpl/ocl_math_20.tmpl.cl @@ -4047,5 +4047,42 @@ OVERLOADABLE double log2(double x) } } +OVERLOADABLE double log10(double x) +{ + double zero = 0.0, + two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */ + ivln10 = 4.34294481903251816668e-01, /* 0x3FDBCB7B, 0x1526E50E */ + log10_2hi = 3.01029995663611771306e-01, /* 0x3FD34413, 0x509F6000 */ + log10_2lo = 3.69423907715893078616e-13; /* 0x3D59FEF3, 0x11F12B36 */ + + double y,z; + int i,k,hx; + unsigned lx; + + hx = __HI(x); /* high word of x */ + lx = __LO(x); /* low word of x */ + + k=0; + if (hx < 0x00100000) + { /* x < 2**-1022 */ + if (((hx&0x7fffffff)|lx)==0) + return -two54/zero; /* log(+-0)=-inf */ + + if (hx<0) + return (x-x)/zero;/* log(-#) = NaN */ + + k -= 54; x *= two54; /* subnormal number, scale up x */ + hx = __HI(x);/* high word of x */ + } + + if (hx >= 0x7ff00000) return x+x; + k += (hx>>20)-1023; + i = ((unsigned)k&0x80000000)>>31; + hx = (hx&0x000fffff)|((0x3ff-i)<<20); + y = (double)(k+i); + __setHigh(&x, hx); + z = y*log10_2lo + ivln10*log(x); + return z+y*log10_2hi; +} -- 2.7.4 _______________________________________________ Beignet mailing list Beignet@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/beignet