[Beignet] [PATCH] backend: add double version of acosh

rander rander.wang at intel.com
Thu Mar 30 06:00:24 UTC 2017


	copy from fdlibm and pass the cft after refined

Signed-off-by: rander <rander.wang at intel.com>
---
 backend/src/libocl/tmpl/ocl_math_common.tmpl.cl | 26 +++++++++++++++++++++++++
 backend/src/libocl/tmpl/ocl_math_common.tmpl.h  |  1 +
 2 files changed, 27 insertions(+)

diff --git a/backend/src/libocl/tmpl/ocl_math_common.tmpl.cl b/backend/src/libocl/tmpl/ocl_math_common.tmpl.cl
index 3a3e708..611c2e3 100644
--- a/backend/src/libocl/tmpl/ocl_math_common.tmpl.cl
+++ b/backend/src/libocl/tmpl/ocl_math_common.tmpl.cl
@@ -120,6 +120,32 @@ OVERLOADABLE double acospi(double x)
 	return acos(x)/M_PI;
 }
 
+OVERLOADABLE double acosh(double x)
+{
+	double one = 1.0,
+	ln2 = 6.93147180559945286227e-01;  /* 0x3FE62E42, 0xFEFA39EF */
+
+	double t;
+	int hx;
+	hx = __HI(x);
+	if(hx<0x3ff00000) {		/* x < 1 */
+		return (x-x)/(x-x);
+	} else if(hx >=0x41b00000) {	/* x > 2**28 */
+		if(hx >=0x7ff00000) {	/* x is inf of NaN */
+			return x+x;
+		} else
+		return log(x)+ln2;	/* acosh(huge)=log(2x) */
+	} else if(((hx-0x3ff00000)|__LO(x))==0) {
+		return 0.0;			/* acosh(1) = 0 */
+	} else if (hx > 0x40000000) {	/* 2**28 > x > 2 */
+		t=x*x;
+		return log(2.0*x-one/(x+sqrt(t-one)));
+	} else {			/* 1<x<2 */
+		t = x-one;
+		return log1p(t+sqrt(2.0*t+t*t));
+	}
+}
+
 OVERLOADABLE double ceil(double x)
 {
     double ret;
diff --git a/backend/src/libocl/tmpl/ocl_math_common.tmpl.h b/backend/src/libocl/tmpl/ocl_math_common.tmpl.h
index 6d2f678..5bd5b36 100644
--- a/backend/src/libocl/tmpl/ocl_math_common.tmpl.h
+++ b/backend/src/libocl/tmpl/ocl_math_common.tmpl.h
@@ -22,6 +22,7 @@
 
 OVERLOADABLE double acos(double x);
 OVERLOADABLE double acospi(double x);
+OVERLOADABLE double acosh(double x);
 OVERLOADABLE double ceil(double x);
 OVERLOADABLE double copysign(double x, double y);
 OVERLOADABLE double fabs(double x);
-- 
2.7.4



More information about the Beignet mailing list