summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrander <rander.wang@intel.com>2017-03-31 11:10:41 +0800
committerYang Rong <rong.r.yang@intel.com>2017-04-17 16:08:49 +0800
commit6de7ce680af8de5165302a468b1f3b5ebaad7e3b (patch)
tree42efc0e83ebf02508f4bd8f789f3274c290c1b24
parent06ed1ee4e238912a1b8f8c2e87c92875efa40c07 (diff)
backend: add double version of powr
convert powr to pow and pass the cft. for powr is the subset of pow, some optimizations can be done later Signed-off-by: rander <rander.wang@intel.com> Tested-by: Yang Rong <rong.r.yang@intel.com>
-rw-r--r--backend/src/libocl/tmpl/ocl_math_common.tmpl.cl29
-rw-r--r--backend/src/libocl/tmpl/ocl_math_common.tmpl.h1
2 files changed, 30 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 d55b972d..37f72625 100644
--- a/backend/src/libocl/tmpl/ocl_math_common.tmpl.cl
+++ b/backend/src/libocl/tmpl/ocl_math_common.tmpl.cl
@@ -2366,6 +2366,35 @@ OVERLOADABLE double pown(double x, int n)
return __ocl_internal_pow(x, n);
}
+OVERLOADABLE double powr(double x, double y)
+{
+ int hx,hy,ix,iy;
+ unsigned lx,ly;
+
+ hx = __HI(x); lx = __LO(x);
+ hy = __HI(y); ly = __LO(y);
+ ix = hx&0x7fffffff; iy = hy&0x7fffffff;
+
+ /* y==zero: x**0 = 1 */
+ if((iy|ly)==0) return 1.0;
+
+ if(x < 0)return as_double(DF_ABS_MASK);
+
+ /* +-NaN return x+y */
+ if(ix > 0x7ff00000 || ((ix==0x7ff00000)&&(lx!=0)))
+ return x+y;
+
+ if(iy > 0x7ff00000 || ((iy==0x7ff00000)&&(ly!=0)))
+ {
+ return x + y;
+ }
+
+ if(((ix==0x7ff00000)&&(lx==0)) && ((iy==0x7ff00000)&&(ly==0)))
+ return as_double(DF_ABS_MASK);
+
+ return __ocl_internal_pow(x, y);
+}
+
OVERLOADABLE double remainder(double x, double p)
{
int hx,hp;
diff --git a/backend/src/libocl/tmpl/ocl_math_common.tmpl.h b/backend/src/libocl/tmpl/ocl_math_common.tmpl.h
index f5fa2897..f73abfc8 100644
--- a/backend/src/libocl/tmpl/ocl_math_common.tmpl.h
+++ b/backend/src/libocl/tmpl/ocl_math_common.tmpl.h
@@ -59,6 +59,7 @@ OVERLOADABLE double nan(ulong code);
OVERLOADABLE double nextafter(double x, double y);
OVERLOADABLE double pow(double x, double y);
OVERLOADABLE double pown(double x, int n);
+OVERLOADABLE double powr(double x, double y);
OVERLOADABLE double remainder(double x, double p);
OVERLOADABLE double rint(double x);
OVERLOADABLE double round(double x);