it is a simple implementation and need to be refined to pass cft

Signed-off-by: rander <[email protected]>
---
 backend/src/libocl/tmpl/ocl_math_common.tmpl.cl | 49 +++++++++++++++++++++++++
 backend/src/libocl/tmpl/ocl_math_common.tmpl.h  |  1 +
 2 files changed, 50 insertions(+)

diff --git a/backend/src/libocl/tmpl/ocl_math_common.tmpl.cl 
b/backend/src/libocl/tmpl/ocl_math_common.tmpl.cl
index e645238..9f36e70 100644
--- a/backend/src/libocl/tmpl/ocl_math_common.tmpl.cl
+++ b/backend/src/libocl/tmpl/ocl_math_common.tmpl.cl
@@ -1777,6 +1777,55 @@ OVERLOADABLE double sinh(double x)
        return x*shuge;
 }
 
+OVERLOADABLE double sinpi(double x)
+{
+       double zero=  0.00000000000000000000e+00,
+                two52=  4.50359962737049600000e+15, /* 0x43300000, 0x00000000 
*/
+       halfD=  5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
+       one =  1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
+       pi  =  3.141592653589793238462e+00; /* 0x400921FB, 0x54442D18 */
+
+       double y,z;
+       int n,ix;
+
+       ix = 0x7fffffff&__HI(x);
+
+       if(ix<0x3fd00000) return __kernel_sin(pi*x,zero,0);
+       y = -x;         /* x is assume negative */
+
+       if(ix >=0x7ff00000)return NAN;
+       /*
+        * argument reduction, make sure inexact flag not raised if input
+        * is an integer
+        */
+       z = floor(y);
+       if(z!=y) {                              /* inexact anyway */
+               y  *= 0.5;
+               y   = 2.0*(y - floor(y));               /* y = |x| mod 2.0 */
+               n   = (int) (y*4.0);
+       } else {
+                       if(ix>=0x43400000) {
+                               y = zero; n = 0;                                
 /* y must be even */
+                       } else {
+                               if(ix<0x43300000) z = y+two52;  /* exact */
+                               n   = __LO(z)&1;                /* lower word 
of z */
+                               y  = n;
+                               n<<= 2;
+                       }
+               }
+       switch (n) {
+               case 0:   y =  __kernel_sin(pi*y,zero,0); break;
+               case 1:
+               case 2:   y =  __kernel_cos(pi*(0.5-y),zero); break;
+               case 3:
+               case 4:   y =  __kernel_sin(pi*(one-y),zero,0); break;
+               case 5:
+               case 6:   y = -__kernel_cos(pi*(y-1.5),zero); break;
+               default:  y =  __kernel_sin(pi*(y-2.0),zero,0); break;
+               }
+       return -y;
+}
+
 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 5f703f3..4401308 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 rint(double x);
 OVERLOADABLE double round(double x);
 OVERLOADABLE double sin(double x);
 OVERLOADABLE double sinh(double x);
+OVERLOADABLE double sinpi(double x);
 OVERLOADABLE double sqrt(double x);
 OVERLOADABLE double tan(double x);
 OVERLOADABLE double tanh(double x);
-- 
2.7.4

_______________________________________________
Beignet mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/beignet

Reply via email to