diff options
author | rander <rander.wang@intel.com> | 2017-03-30 15:11:43 +0800 |
---|---|---|
committer | Yang Rong <rong.r.yang@intel.com> | 2017-04-17 16:08:48 +0800 |
commit | 61318e59c1e9075a76e5abdefb65bd461616afc0 (patch) | |
tree | d32b8f8b31c97c9e127f91827a0b0e7fc38f46f9 | |
parent | bdd7e423dbf0b4481d9d635104f1dd2ca496808f (diff) |
backend: add double version of sin
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 | 28 | ||||
-rw-r--r-- | backend/src/libocl/tmpl/ocl_math_common.tmpl.h | 1 |
2 files changed, 29 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 ee1cf0b0..290ec6b6 100644 --- a/backend/src/libocl/tmpl/ocl_math_common.tmpl.cl +++ b/backend/src/libocl/tmpl/ocl_math_common.tmpl.cl @@ -1704,6 +1704,34 @@ OVERLOADABLE double round(double x) return dp; } +OVERLOADABLE double sin(double x) +{ + double y[2],z=0.0; + int n, ix; + + /* High word of x. */ + ix = __HI(x); + + /* |x| ~< pi/4 */ + ix &= 0x7fffffff; + if(ix <= 0x3fe921fb) return __kernel_sin(x,z,0); + + /* sin(Inf or NaN) is NaN */ + else if (ix>=0x7ff00000) return x-x; + + /* argument reduction needed */ + else { + n = __ieee754_rem_pio2(x,y); + switch(n&3) { + case 0: return __kernel_sin(y[0],y[1],1); + case 1: return __kernel_cos(y[0],y[1]); + case 2: return -__kernel_sin(y[0],y[1],1); + default: + return -__kernel_cos(y[0],y[1]); + } + } +} + OVERLOADABLE double sqrt(double x) { double z; diff --git a/backend/src/libocl/tmpl/ocl_math_common.tmpl.h b/backend/src/libocl/tmpl/ocl_math_common.tmpl.h index d1c7fd0e..ba246cc0 100644 --- a/backend/src/libocl/tmpl/ocl_math_common.tmpl.h +++ b/backend/src/libocl/tmpl/ocl_math_common.tmpl.h @@ -54,6 +54,7 @@ OVERLOADABLE double nan(ulong code); OVERLOADABLE double nextafter(double x, double y); OVERLOADABLE double rint(double x); OVERLOADABLE double round(double x); +OVERLOADABLE double sin(double x); OVERLOADABLE double sqrt(double x); OVERLOADABLE double trunc(double x); |