summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xlibclc/configure.py1
-rw-r--r--libclc/generic/include/clc/clc.h6
-rw-r--r--libclc/generic/include/clc/clcmacro.h6
-rw-r--r--libclc/generic/include/clc/math/clc_nextafter.h11
-rw-r--r--libclc/generic/include/clc/math/nextafter.h5
-rw-r--r--libclc/generic/include/math/clc_nextafter.h7
-rw-r--r--libclc/generic/lib/SOURCES2
-rw-r--r--libclc/generic/lib/math/clc_nextafter.cl42
-rw-r--r--libclc/generic/lib/math/nextafter.cl11
-rw-r--r--libclc/r600/lib/SOURCES1
-rw-r--r--libclc/r600/lib/math/nextafter.cl3
11 files changed, 95 insertions, 0 deletions
diff --git a/libclc/configure.py b/libclc/configure.py
index 1a986475ab2..dbb578bbdb6 100755
--- a/libclc/configure.py
+++ b/libclc/configure.py
@@ -145,6 +145,7 @@ for target in targets:
clang_bc_flags = "-target %s -I`dirname $in` %s " \
"-Dcl_clang_storage_class_specifiers " \
"-Dcl_khr_fp64 " \
+ "-D__CLC_INTERNAL " \
"-emit-llvm" % (target, clang_cl_includes)
if device['gpu'] != '':
clang_bc_flags += ' -mcpu=' + device['gpu']
diff --git a/libclc/generic/include/clc/clc.h b/libclc/generic/include/clc/clc.h
index fce9f6edc80..0e87ec78f09 100644
--- a/libclc/generic/include/clc/clc.h
+++ b/libclc/generic/include/clc/clc.h
@@ -45,6 +45,7 @@
#include <clc/math/log.h>
#include <clc/math/log2.h>
#include <clc/math/mad.h>
+#include <clc/math/nextafter.h>
#include <clc/math/pow.h>
#include <clc/math/rint.h>
#include <clc/math/sin.h>
@@ -107,4 +108,9 @@
#include <clc/atomic/atomic_inc.h>
#include <clc/atomic/atomic_sub.h>
+/* libclc internal defintions */
+#ifdef __CLC_INTERNAL
+#include <math/clc_nextafter.h>
+#endif
+
#pragma OPENCL EXTENSION all : disable
diff --git a/libclc/generic/include/clc/clcmacro.h b/libclc/generic/include/clc/clcmacro.h
index ece0d3b67d5..730073ae1f9 100644
--- a/libclc/generic/include/clc/clcmacro.h
+++ b/libclc/generic/include/clc/clcmacro.h
@@ -41,6 +41,12 @@
return (RET_TYPE##16)(FUNCTION(x.lo, y.lo), FUNCTION(x.hi, y.hi)); \
}
+#define _CLC_DEFINE_BINARY_BUILTIN(RET_TYPE, FUNCTION, BUILTIN, ARG1_TYPE, ARG2_TYPE) \
+_CLC_DEF _CLC_OVERLOAD RET_TYPE FUNCTION(ARG1_TYPE x, ARG2_TYPE y) { \
+ return BUILTIN(x, y); \
+} \
+_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, RET_TYPE, FUNCTION, ARG1_TYPE, ARG2_TYPE)
+
#define _CLC_DEFINE_UNARY_BUILTIN(RET_TYPE, FUNCTION, BUILTIN, ARG1_TYPE) \
_CLC_DEF _CLC_OVERLOAD RET_TYPE FUNCTION(ARG1_TYPE x) { \
return BUILTIN(x); \
diff --git a/libclc/generic/include/clc/math/clc_nextafter.h b/libclc/generic/include/clc/math/clc_nextafter.h
new file mode 100644
index 00000000000..81c8f369c3b
--- /dev/null
+++ b/libclc/generic/include/clc/math/clc_nextafter.h
@@ -0,0 +1,11 @@
+#define __CLC_BODY <clc/math/binary_decl.inc>
+
+#define __CLC_FUNCTION nextafter
+#include <clc/math/gentype.inc>
+#undef __CLC_FUNCTION
+
+#define __CLC_FUNCTION __clc_nextafter
+#include <clc/math/gentype.inc>
+#undef __CLC_FUNCTION
+
+#undef __CLC_BODY
diff --git a/libclc/generic/include/clc/math/nextafter.h b/libclc/generic/include/clc/math/nextafter.h
new file mode 100644
index 00000000000..06e1b2a53c5
--- /dev/null
+++ b/libclc/generic/include/clc/math/nextafter.h
@@ -0,0 +1,5 @@
+#define __CLC_BODY <clc/math/binary_decl.inc>
+#define __CLC_FUNCTION nextafter
+#include <clc/math/gentype.inc>
+#undef __CLC_FUNCTION
+#undef __CLC_BODY
diff --git a/libclc/generic/include/math/clc_nextafter.h b/libclc/generic/include/math/clc_nextafter.h
new file mode 100644
index 00000000000..2b674b70795
--- /dev/null
+++ b/libclc/generic/include/math/clc_nextafter.h
@@ -0,0 +1,7 @@
+#define __CLC_BODY <clc/math/binary_decl.inc>
+#define __CLC_FUNCTION __clc_nextafter
+
+#include <clc/math/gentype.inc>
+
+#undef __CLC_BODY
+#undef __CLC_FUNCTION
diff --git a/libclc/generic/lib/SOURCES b/libclc/generic/lib/SOURCES
index 383a66e8ad3..e1a29729776 100644
--- a/libclc/generic/lib/SOURCES
+++ b/libclc/generic/lib/SOURCES
@@ -26,6 +26,8 @@ math/fmax.cl
math/fmin.cl
math/hypot.cl
math/mad.cl
+math/clc_nextafter.cl
+math/nextafter.cl
relational/any.cl
relational/isnan.cl
shared/clamp.cl
diff --git a/libclc/generic/lib/math/clc_nextafter.cl b/libclc/generic/lib/math/clc_nextafter.cl
new file mode 100644
index 00000000000..92b990d1383
--- /dev/null
+++ b/libclc/generic/lib/math/clc_nextafter.cl
@@ -0,0 +1,42 @@
+#include <clc/clc.h>
+
+// This file provides OpenCL C implementations of nextafter for targets that
+// don't support the clang builtin.
+
+#define FLT_NAN 0.0f/0.0f
+
+#define NEXTAFTER(FLOAT_TYPE, UINT_TYPE, NAN, ZERO, NEXTAFTER_ZERO) \
+_CLC_OVERLOAD _CLC_DEF FLOAT_TYPE __clc_nextafter(FLOAT_TYPE x, FLOAT_TYPE y) { \
+ union { \
+ FLOAT_TYPE f; \
+ UINT_TYPE i; \
+ } next; \
+ if (isnan(x) || isnan(y)) { \
+ return NAN; \
+ } \
+ if (x == y) { \
+ return y; \
+ } \
+ next.f = x; \
+ if (x < y) { \
+ next.i++; \
+ } else { \
+ if (next.f == ZERO) { \
+ next.i = NEXTAFTER_ZERO; \
+ } else { \
+ next.i--; \
+ } \
+ } \
+ return next.f; \
+}
+
+NEXTAFTER(float, uint, FLT_NAN, 0.0f, 0x80000001)
+_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, __clc_nextafter, float, float)
+
+#ifdef cl_khr_fp64
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+#define DBL_NAN 0.0/0.0
+
+NEXTAFTER(double, ulong, DBL_NAN, 0.0, 0x8000000000000001)
+_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, __clc_nextafter, double, double)
+#endif
diff --git a/libclc/generic/lib/math/nextafter.cl b/libclc/generic/lib/math/nextafter.cl
new file mode 100644
index 00000000000..1a7f1699bdc
--- /dev/null
+++ b/libclc/generic/lib/math/nextafter.cl
@@ -0,0 +1,11 @@
+#include <clc/clc.h>
+
+_CLC_DEFINE_BINARY_BUILTIN(float, nextafter, __builtin_nextafterf, float, float)
+
+#ifdef cl_khr_fp64
+
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+_CLC_DEFINE_BINARY_BUILTIN(double, nextafter, __builtin_nextafter, double, double)
+
+#endif
diff --git a/libclc/r600/lib/SOURCES b/libclc/r600/lib/SOURCES
index de30f6e0038..aac6d8f9a74 100644
--- a/libclc/r600/lib/SOURCES
+++ b/libclc/r600/lib/SOURCES
@@ -1,4 +1,5 @@
atomic/atomic.cl
+math/nextafter.cl
workitem/get_num_groups.ll
workitem/get_group_id.ll
workitem/get_local_size.ll
diff --git a/libclc/r600/lib/math/nextafter.cl b/libclc/r600/lib/math/nextafter.cl
new file mode 100644
index 00000000000..54bed5f04a0
--- /dev/null
+++ b/libclc/r600/lib/math/nextafter.cl
@@ -0,0 +1,3 @@
+#include <clc/clc.h>
+
+_CLC_DEFINE_BINARY_BUILTIN(float, nextafter, __clc_nextafter, float, float)
OpenPOWER on IntegriCloud