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

rander rander.wang at intel.com
Fri Mar 24 06:40:07 UTC 2017


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     |  1 +
 backend/src/libocl/tmpl/ocl_math_20.tmpl.cl | 25 +++++++++++++++++++++++++
 backend/src/libocl/tmpl/ocl_math_20.tmpl.h  |  1 +
 4 files changed, 51 insertions(+)

diff --git a/backend/src/libocl/tmpl/ocl_math.tmpl.cl b/backend/src/libocl/tmpl/ocl_math.tmpl.cl
index 7e05b8f..9ab1f00 100644
--- a/backend/src/libocl/tmpl/ocl_math.tmpl.cl
+++ b/backend/src/libocl/tmpl/ocl_math.tmpl.cl
@@ -4305,3 +4305,27 @@ OVERLOADABLE double logb(double x)
 		return (double) (ix-1023);
 }
 
+OVERLOADABLE int ilogb(double x)
+{
+	int hx,lx,ix;
+
+	hx  = (__HI(x))&0x7fffffff;	/* high word of x */
+	if(hx == 0x7ff00000 && __LO(x) == 0) return 0x7fffffff;
+
+	if(hx<0x00100000) {
+		lx = __LO(x);
+		if((hx|lx)==0)
+		return 0x80000000;	/* ilogb(0) = 0x80000000 */
+		else			/* subnormal x */
+		if(hx==0) {
+			for (ix = -1043; lx>0; lx<<=1) ix -=1;
+		} else {
+			for (ix = -1022,hx<<=11; hx>0; hx<<=1) ix -=1;
+		}
+		return ix;
+	}
+	else if (hx<0x7ff00000) return (hx>>20)-1023;
+	else return 0x80000000;
+}
+
+
diff --git a/backend/src/libocl/tmpl/ocl_math.tmpl.h b/backend/src/libocl/tmpl/ocl_math.tmpl.h
index bea8335..c72d7ed 100644
--- a/backend/src/libocl/tmpl/ocl_math.tmpl.h
+++ b/backend/src/libocl/tmpl/ocl_math.tmpl.h
@@ -244,4 +244,5 @@ OVERLOADABLE double log2(double x);
 OVERLOADABLE double log10(double x);
 OVERLOADABLE double log1p(double x);
 OVERLOADABLE double logb(double x);
+OVERLOADABLE int ilogb(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 a7ec3aa..0a408ce 100644
--- a/backend/src/libocl/tmpl/ocl_math_20.tmpl.cl
+++ b/backend/src/libocl/tmpl/ocl_math_20.tmpl.cl
@@ -4181,3 +4181,28 @@ OVERLOADABLE double logb(double x)
 		return (double) (ix-1023);
 }
 
+OVERLOADABLE int ilogb(double x)
+{
+	int hx,lx,ix;
+
+	hx  = (__HI(x))&0x7fffffff;	/* high word of x */
+	if(hx == 0x7ff00000 && __LO(x) == 0) return 0x7fffffff;
+
+	if(hx<0x00100000) {
+		lx = __LO(x);
+		if((hx|lx)==0)
+		return 0x80000000;	/* ilogb(0) = 0x80000000 */
+		else			/* subnormal x */
+		if(hx==0) {
+			for (ix = -1043; lx>0; lx<<=1) ix -=1;
+		} else {
+			for (ix = -1022,hx<<=11; hx>0; hx<<=1) ix -=1;
+		}
+		return ix;
+	}
+	else if (hx<0x7ff00000) return (hx>>20)-1023;
+	else return 0x80000000;
+}
+
+
+
diff --git a/backend/src/libocl/tmpl/ocl_math_20.tmpl.h b/backend/src/libocl/tmpl/ocl_math_20.tmpl.h
index 48dda70..107d25c 100644
--- a/backend/src/libocl/tmpl/ocl_math_20.tmpl.h
+++ b/backend/src/libocl/tmpl/ocl_math_20.tmpl.h
@@ -221,5 +221,6 @@ OVERLOADABLE double log2(double x);
 OVERLOADABLE double log10(double x);
 OVERLOADABLE double log1p(double x);
 OVERLOADABLE double logb(double x);
+OVERLOADABLE int ilogb(double x);
 
 
-- 
2.7.4



More information about the Beignet mailing list