diff options
author | rander <rander.wang@intel.com> | 2017-03-31 11:10:41 +0800 |
---|---|---|
committer | Yang Rong <rong.r.yang@intel.com> | 2017-04-17 16:08:49 +0800 |
commit | 6de7ce680af8de5165302a468b1f3b5ebaad7e3b (patch) | |
tree | 42efc0e83ebf02508f4bd8f789f3274c290c1b24 | |
parent | 06ed1ee4e238912a1b8f8c2e87c92875efa40c07 (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.cl | 29 | ||||
-rw-r--r-- | backend/src/libocl/tmpl/ocl_math_common.tmpl.h | 1 |
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); |