diff options
author | rander <rander.wang@intel.com> | 2017-03-31 10:59:30 +0800 |
---|---|---|
committer | Yang Rong <rong.r.yang@intel.com> | 2017-04-17 16:08:49 +0800 |
commit | fcfe9fbbf33d4b5588bf3b61a7c2d815496f3ec7 (patch) | |
tree | e994c0d802c098992d21f434537a73e9e2639421 | |
parent | de496bfbefe9e57ee7df06a74729283ffdd5a038 (diff) |
backend: add double version of remainder
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>
-rw-r--r-- | backend/src/libocl/tmpl/ocl_math_common.tmpl.cl | 42 | ||||
-rw-r--r-- | backend/src/libocl/tmpl/ocl_math_common.tmpl.h | 1 |
2 files changed, 43 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 52253fbb..31cb1bad 100644 --- a/backend/src/libocl/tmpl/ocl_math_common.tmpl.cl +++ b/backend/src/libocl/tmpl/ocl_math_common.tmpl.cl @@ -2089,6 +2089,48 @@ OVERLOADABLE double fmod (double x, double y) } +OVERLOADABLE double remainder(double x, double p) +{ + int hx,hp; + unsigned sx,lx,lp; + double p_half, zero = 0.0; + + hx = __HI(x); /* high word of x */ + lx = __LO(x); /* low word of x */ + hp = __HI(p); /* high word of p */ + lp = __LO(p); /* low word of p */ + sx = hx&0x80000000; + hp &= 0x7fffffff; + hx &= 0x7fffffff; + + /* purge off exception values */ + if((hp|lp)==0) return (x*p)/(x*p); /* p = 0 */ + if((hx>=0x7ff00000)|| /* x not finite */ + ((hp>=0x7ff00000)&& /* p is NaN */ + (((hp-0x7ff00000)|lp)!=0))) + return (x*p)/(x*p); + + + if (hp<=0x7fdfffff) x = fmod(x,p+p); /* now x < 2p */ + if (((hx-hp)|(lx-lp))==0) return zero*x; + x = fabs(x); + p = fabs(p); + if (hp<0x00200000) { + if(x+x>p) { + x-=p; + if(x+x>=p) x -= p; + } + } else { + p_half = 0.5*p; + if(x>p_half) { + x-=p; + if(x>=p_half) x -= p; + } + } + __setHigh(&x, __HI(x) ^sx); + return x; +} + OVERLOADABLE double rint(double x) { long ret; diff --git a/backend/src/libocl/tmpl/ocl_math_common.tmpl.h b/backend/src/libocl/tmpl/ocl_math_common.tmpl.h index de459465..6b6a741b 100644 --- a/backend/src/libocl/tmpl/ocl_math_common.tmpl.h +++ b/backend/src/libocl/tmpl/ocl_math_common.tmpl.h @@ -57,6 +57,7 @@ OVERLOADABLE double lgamma(double x); OVERLOADABLE double mad(double a, double b, double c); OVERLOADABLE double nan(ulong code); OVERLOADABLE double nextafter(double x, double y); +OVERLOADABLE double remainder(double x, double p); OVERLOADABLE double rint(double x); OVERLOADABLE double round(double x); OVERLOADABLE double sin(double x); |