summaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
authorrander <rander.wang@intel.com>2017-03-31 14:18:21 +0800
committerYang Rong <rong.r.yang@intel.com>2017-04-17 16:08:49 +0800
commite3b4bd1874376bd9cf58b3615b526f6841deb9ba (patch)
tree2b5b52f79b60482f4f3de44c1218799e9d54018e /backend
parentb222119ae4ddc4921f69fc7af9a7eb44546016b1 (diff)
downloadbeignet-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.cl41
-rw-r--r--backend/src/libocl/tmpl/ocl_math_common.tmpl.h1
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);