[Beignet] [PATCH 4/4] Backend:add double support for some relation function

rander rander.wang at intel.com
Mon Mar 6 09:48:24 UTC 2017


Signed-off-by: rander <rander.wang at intel.com>
---
 backend/src/libocl/include/ocl_float.h         |  7 +++
 backend/src/libocl/tmpl/ocl_relational.tmpl.cl | 65 ++++++++++++++++++++++++++
 backend/src/libocl/tmpl/ocl_relational.tmpl.h  | 15 ++++++
 3 files changed, 87 insertions(+)

diff --git a/backend/src/libocl/include/ocl_float.h b/backend/src/libocl/include/ocl_float.h
index 6be6c7c..ff8bfed 100644
--- a/backend/src/libocl/include/ocl_float.h
+++ b/backend/src/libocl/include/ocl_float.h
@@ -96,4 +96,11 @@ INLINE_OVERLOADABLE int __ocl_finitef (float x){
 #define FP_ILOGB0    (-0x7FFFFFFF-1)
 #define FP_ILOGBNAN  FP_ILOGB0
 
+#define DF_EXP_MASK 0x7FF0000000000000UL
+#define DF_MAX_NORMAL 0x7FF0000000000000UL
+#define DF_MAN_MASK 0xFFFFFFFFFFFFFUL
+#define DF_MIN_NORMAL 0x10000000000000UL
+#define DF_ABS_MASK 0x7FFFFFFFFFFFFFFFUL
+#define DF_POSITIVE_INF 0x7FF0000000000000UL
+
 #endif /* __OCL_FLOAT_H__ */
diff --git a/backend/src/libocl/tmpl/ocl_relational.tmpl.cl b/backend/src/libocl/tmpl/ocl_relational.tmpl.cl
index f66b6c1..eb3ec7c 100644
--- a/backend/src/libocl/tmpl/ocl_relational.tmpl.cl
+++ b/backend/src/libocl/tmpl/ocl_relational.tmpl.cl
@@ -16,6 +16,7 @@
  *
  */
 #include "ocl_relational.h"
+#include "ocl_float.h"
 
 OVERLOADABLE int isequal(float x, float y) {
   return x == y;
@@ -145,6 +146,70 @@ OVERLOADABLE int signbit(half x) {
   return u.u >> 15;
 }
 
+OVERLOADABLE int isequal(double x, double y) {
+  return x == y;
+}
+
+OVERLOADABLE int isnotequal(double x, double y) {
+  return x != y;
+}
+
+OVERLOADABLE int isgreater(double x, double y) {
+  return x > y;
+}
+
+OVERLOADABLE int isgreaterequal(double x, double y) {
+  return x >= y;
+}
+
+OVERLOADABLE int isless(double x, double y) {
+  return x < y;
+}
+
+OVERLOADABLE int islessequal(double x, double y) {
+  return x <= y;
+}
+
+OVERLOADABLE int islessgreater(double x, double y) {
+   return (x < y) || (x > y);
+}
+
+OVERLOADABLE int isfinite(double x) {
+  union { ulong u; double f; } u;
+  u.f = x;
+  return (u.u & DF_ABS_MASK) < DF_POSITIVE_INF;
+}
+
+OVERLOADABLE int isinf(double x) {
+  union { ulong u; double f; } u;
+  u.f = x;
+  return (u.u & DF_ABS_MASK) == DF_POSITIVE_INF;
+}
+
+OVERLOADABLE int isnan(double x) {
+  long lx = as_long(x);
+  return ((lx & DF_EXP_MASK) == DF_POSITIVE_INF) && (lx & DF_MAN_MASK);
+}
+
+OVERLOADABLE int isnormal(double x) {
+  union { ulong u; double f; } u;
+  u.f = x;
+  u.u &= DF_ABS_MASK;
+  return (u.u < DF_POSITIVE_INF) && (u.u >= DF_MIN_NORMAL);
+}
+
+OVERLOADABLE int isordered(double x, double y) {
+  return isequal(x, x) && isequal(y, y);
+}
+OVERLOADABLE int isunordered(double x, double y) {
+  return isnan(x) || isnan(y);
+}
+OVERLOADABLE int signbit(double x) {
+  union { ulong u; double f; } u;
+  u.f = x;
+  return u.u >> 63;
+}
+
 
 // any
 #define DEC1(type) OVERLOADABLE int any(type a) { return a<0; }
diff --git a/backend/src/libocl/tmpl/ocl_relational.tmpl.h b/backend/src/libocl/tmpl/ocl_relational.tmpl.h
index 0ec0cbe..a4d67aa 100644
--- a/backend/src/libocl/tmpl/ocl_relational.tmpl.h
+++ b/backend/src/libocl/tmpl/ocl_relational.tmpl.h
@@ -56,6 +56,21 @@ OVERLOADABLE int isordered(half x, half y);
 OVERLOADABLE int isunordered(half x, half y);
 OVERLOADABLE int signbit(half x);
 
+OVERLOADABLE int isequal(double x, double y);
+OVERLOADABLE int isnotequal(double x, double y);
+OVERLOADABLE int isgreater(double x, double y);
+OVERLOADABLE int isgreaterequal(double x, double y);
+OVERLOADABLE int isless(double x, double y);
+OVERLOADABLE int islessequal(double x, double y);
+OVERLOADABLE int islessgreater(double x, double y);
+
+OVERLOADABLE int isfinite(double x);
+OVERLOADABLE int isinf(double x);
+OVERLOADABLE int isnan(double x);
+OVERLOADABLE int isnormal(double x);
+
+OVERLOADABLE int isordered(double x, double y);
+OVERLOADABLE int isunordered(double x, double y);
 
 // any
 #define DEC1(type) OVERLOADABLE int any(type a);
-- 
2.7.4



More information about the Beignet mailing list