[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