diff options
author | rander <rander.wang@intel.com> | 2017-03-31 14:18:21 +0800 |
---|---|---|
committer | Yang Rong <rong.r.yang@intel.com> | 2017-04-17 16:08:49 +0800 |
commit | e3b4bd1874376bd9cf58b3615b526f6841deb9ba (patch) | |
tree | 2b5b52f79b60482f4f3de44c1218799e9d54018e /backend | |
parent | b222119ae4ddc4921f69fc7af9a7eb44546016b1 (diff) | |
download | beignet-e3b4bd1874376bd9cf58b3615b526f6841deb9ba.tar.gz |
backend: add double version of rootn
cp from fdlibm and pass the cft after refined
Signed-off-by: rander <rander.wang@intel.com>
Tested-by: Yang Rong <rong.r.yang@intel.com>
Diffstat (limited to 'backend')
-rw-r--r-- | backend/src/libocl/tmpl/ocl_math_common.tmpl.cl | 41 | ||||
-rw-r--r-- | backend/src/libocl/tmpl/ocl_math_common.tmpl.h | 1 |
2 files changed, 42 insertions, 0 deletions
diff --git a/backend/src/libocl/tmpl/ocl_math_common.tmpl.cl b/backend/src/libocl/tmpl/ocl_math_common.tmpl.cl index 96f2a5f8..0cf58005 100644 --- a/backend/src/libocl/tmpl/ocl_math_common.tmpl.cl +++ b/backend/src/libocl/tmpl/ocl_math_common.tmpl.cl @@ -2521,6 +2521,47 @@ OVERLOADABLE double round(double x) return dp; } +OVERLOADABLE double rootn(double x, int n) +{ + double ax,re; + int sign = 0; + + if( n == 0 )return as_double(DF_POSITIVE_INF+1); + + //rootn ( x, n ) returns a NaN for x < 0 and n is even. + if( x < 0 && 0 == (n&1) ) + return as_double(DF_POSITIVE_INF+1); + if( x == 0.0 ){ + switch( n & 0x80000001 ){ + //rootn ( +-0, n ) is +0 for even n > 0. + case 0: + return 0.0f; + //rootn ( +-0, n ) is +-0 for odd n > 0. + case 1: + return x; + //rootn ( +-0, n ) is +inf for even n < 0. + case 0x80000000: + return as_double(DF_POSITIVE_INF); + + //rootn ( +-0, n ) is +-inf for odd n < 0. + case 0x80000001: + return copysign(as_double(DF_POSITIVE_INF), x); + } + } + + ulong ux = as_ulong(x); + if((ux&DF_ABS_MASK) == DF_POSITIVE_INF) return x; + ax = fabs(x); + if(x <0.0f && (n&1)) + sign = 1; + + re = pow(ax,1.0/n); + if(sign) + re = -re; + return re; + +} + OVERLOADABLE double sin(double x) { double y[2],z=0.0; diff --git a/backend/src/libocl/tmpl/ocl_math_common.tmpl.h b/backend/src/libocl/tmpl/ocl_math_common.tmpl.h index 872641d1..cc94d4e4 100644 --- a/backend/src/libocl/tmpl/ocl_math_common.tmpl.h +++ b/backend/src/libocl/tmpl/ocl_math_common.tmpl.h @@ -64,6 +64,7 @@ OVERLOADABLE double powr(double x, double y); OVERLOADABLE double remainder(double x, double p); OVERLOADABLE double rint(double x); OVERLOADABLE double round(double x); +OVERLOADABLE double rootn(double x, int n); OVERLOADABLE double sin(double x); OVERLOADABLE double sinh(double x); OVERLOADABLE double sinpi(double x); |