[Beignet] [PATCH] backend: add double support to frexp

rander rander.wang at intel.com
Tue Mar 28 01:36:19 UTC 2017


	 gotten from fdlibm, and refine it for OpenCL

Signed-off-by: rander <rander.wang at intel.com>
---
 backend/src/libocl/tmpl/ocl_math.tmpl.cl    | 24 ++++++++++++++++++++++++
 backend/src/libocl/tmpl/ocl_math.tmpl.h     |  3 +++
 backend/src/libocl/tmpl/ocl_math_20.tmpl.cl | 23 +++++++++++++++++++++++
 backend/src/libocl/tmpl/ocl_math_20.tmpl.h  |  3 +++
 4 files changed, 53 insertions(+)

diff --git a/backend/src/libocl/tmpl/ocl_math.tmpl.cl b/backend/src/libocl/tmpl/ocl_math.tmpl.cl
index c781e5a..fec5a38 100644
--- a/backend/src/libocl/tmpl/ocl_math.tmpl.cl
+++ b/backend/src/libocl/tmpl/ocl_math.tmpl.cl
@@ -4027,6 +4027,30 @@ OVERLOADABLE double fract(double x, private double *p)
     return x -ret;
 }
 
+#define BODY \
+double two54 =  1.80143985094819840000e+16; /* 0x43500000, 0x00000000 */ \
+int  hx, ix, lx; \
+hx = __HI(x); \
+ix = 0x7fffffff&hx; \
+lx = __LO(x); \
+*exp = 0; \
+if(ix>=0x7ff00000||((ix|lx)==0)) return x;  /* 0,inf,nan */ \
+if (ix<0x00100000) {        /* subnormal */ \
+    x *= two54; \
+    hx = __HI(x); \
+    ix = hx&0x7fffffff; \
+    *exp = -54; \
+} \
+*exp += (ix>>20)-1022; \
+hx = (hx&0x800fffff)|0x3fe00000; \
+__setHigh(&x, hx); \
+return x;
+
+OVERLOADABLE double frexp(double x, global int *exp){BODY;}
+OVERLOADABLE double frexp(double x, local int *exp){BODY;}
+OVERLOADABLE double frexp(double x, private int *exp){BODY;}
+#undef BODY
+
 /* @(#)e_log.c 1.3 95/01/18 */
 /*
  * ====================================================
diff --git a/backend/src/libocl/tmpl/ocl_math.tmpl.h b/backend/src/libocl/tmpl/ocl_math.tmpl.h
index 2eb4a2a..dca7f62 100644
--- a/backend/src/libocl/tmpl/ocl_math.tmpl.h
+++ b/backend/src/libocl/tmpl/ocl_math.tmpl.h
@@ -243,6 +243,9 @@ OVERLOADABLE double fmin(double a, double b);
 OVERLOADABLE double fract(double x, global double *p);
 OVERLOADABLE double fract(double x, local double *p);
 OVERLOADABLE double fract(double x, private double *p);
+OVERLOADABLE double frexp(double x, global int *exp);
+OVERLOADABLE double frexp(double x, local int *exp);
+OVERLOADABLE double frexp(double x, private int *exp);
 OVERLOADABLE double log(double x);
 OVERLOADABLE double log2(double x);
 OVERLOADABLE double log10(double x);
diff --git a/backend/src/libocl/tmpl/ocl_math_20.tmpl.cl b/backend/src/libocl/tmpl/ocl_math_20.tmpl.cl
index d410a14..c43f817 100644
--- a/backend/src/libocl/tmpl/ocl_math_20.tmpl.cl
+++ b/backend/src/libocl/tmpl/ocl_math_20.tmpl.cl
@@ -3903,6 +3903,29 @@ OVERLOADABLE double fract(double x, private double *p)
     return x -ret;
 }
 
+#define BODY \
+double two54 =  1.80143985094819840000e+16; /* 0x43500000, 0x00000000 */ \
+int  hx, ix, lx; \
+hx = __HI(x); \
+ix = 0x7fffffff&hx; \
+lx = __LO(x); \
+*exp = 0; \
+if(ix>=0x7ff00000||((ix|lx)==0)) return x;  /* 0,inf,nan */ \
+if (ix<0x00100000) {        /* subnormal */ \
+    x *= two54; \
+    hx = __HI(x); \
+    ix = hx&0x7fffffff; \
+    *exp = -54; \
+} \
+*exp += (ix>>20)-1022; \
+hx = (hx&0x800fffff)|0x3fe00000; \
+__setHigh(&x, hx); \
+return x;
+
+OVERLOADABLE double frexp(double x, global int *exp){BODY;}
+OVERLOADABLE double frexp(double x, local int *exp){BODY;}
+OVERLOADABLE double frexp(double x, private int *exp){BODY;}
+#undef BODY
 
 /* @(#)e_log.c 1.3 95/01/18 */
 /*
diff --git a/backend/src/libocl/tmpl/ocl_math_20.tmpl.h b/backend/src/libocl/tmpl/ocl_math_20.tmpl.h
index 8072fa0..1d7434a 100644
--- a/backend/src/libocl/tmpl/ocl_math_20.tmpl.h
+++ b/backend/src/libocl/tmpl/ocl_math_20.tmpl.h
@@ -220,6 +220,9 @@ OVERLOADABLE double floor(double x);
 OVERLOADABLE double fract(double x, global double *p);
 OVERLOADABLE double fract(double x, local double *p);
 OVERLOADABLE double fract(double x, private double *p);
+OVERLOADABLE double frexp(double x, global int *exp);
+OVERLOADABLE double frexp(double x, local int *exp);
+OVERLOADABLE double frexp(double x, private int *exp);
 OVERLOADABLE double log(double x);
 OVERLOADABLE double log2(double x);
 OVERLOADABLE double log10(double x);
-- 
2.7.4



More information about the Beignet mailing list