summaryrefslogtreecommitdiffstats
path: root/libclc/generic/include/clc
diff options
context:
space:
mode:
authorJan Vesely <jan.vesely@rutgers.edu>2018-05-17 22:55:30 +0000
committerJan Vesely <jan.vesely@rutgers.edu>2018-05-17 22:55:30 +0000
commit70a270da5f4a27b670cba1cb8148fcce5c094f4f (patch)
treeba5043901fab059f1a5ccfb2578156c62ec4c027 /libclc/generic/include/clc
parentc762666e8747841ab7dd785415e1354a1682e954 (diff)
downloadbcm5719-llvm-70a270da5f4a27b670cba1cb8148fcce5c094f4f.tar.gz
bcm5719-llvm-70a270da5f4a27b670cba1cb8148fcce5c094f4f.zip
Add initial support for half precision builtins
v2: fix fmax implementation use consistent checks for __CLC_FP_SIZE add missing TODOs fix whitespace in definitions.h v3: undef ZERO in modf.inc Signed-off-by: Jan Vesely <jan.vesely@rutgers.edu> reviewer: Jeroen Ketema <j.ketema@xs4all.nl> Reviewed-by: Aaron Watry <awatry@gmail.com> Tested-by: Aaron Watry <awatry@gmail.com> llvm-svn: 332677
Diffstat (limited to 'libclc/generic/include/clc')
-rw-r--r--libclc/generic/include/clc/as_type.h9
-rw-r--r--libclc/generic/include/clc/async/gentype.inc25
-rw-r--r--libclc/generic/include/clc/float/definitions.h7
-rw-r--r--libclc/generic/include/clc/geometric/floatn.inc31
-rw-r--r--libclc/generic/include/clc/math/binary_intrin.inc10
-rw-r--r--libclc/generic/include/clc/math/gentype.inc62
-rw-r--r--libclc/generic/include/clc/math/nan.inc4
-rw-r--r--libclc/generic/include/clc/math/ternary_intrin.inc11
-rw-r--r--libclc/generic/include/clc/math/unary_intrin.inc10
-rw-r--r--libclc/generic/include/clc/relational/floatn.inc41
-rw-r--r--libclc/generic/include/clc/relational/isequal.h4
-rw-r--r--libclc/generic/include/clc/relational/isinf.h5
-rw-r--r--libclc/generic/include/clc/relational/isnan.h5
13 files changed, 221 insertions, 3 deletions
diff --git a/libclc/generic/include/clc/as_type.h b/libclc/generic/include/clc/as_type.h
index 0bb9ee2e831..1bc76b0ec9a 100644
--- a/libclc/generic/include/clc/as_type.h
+++ b/libclc/generic/include/clc/as_type.h
@@ -66,3 +66,12 @@
#define as_double8(x) __builtin_astype(x, double8)
#define as_double16(x) __builtin_astype(x, double16)
#endif
+
+#ifdef cl_khr_fp16
+#define as_half(x) __builtin_astype(x, half)
+#define as_half2(x) __builtin_astype(x, half2)
+#define as_half3(x) __builtin_astype(x, half3)
+#define as_half4(x) __builtin_astype(x, half4)
+#define as_half8(x) __builtin_astype(x, half8)
+#define as_half16(x) __builtin_astype(x, half16)
+#endif
diff --git a/libclc/generic/include/clc/async/gentype.inc b/libclc/generic/include/clc/async/gentype.inc
index c08bb6fa6eb..09d465f859b 100644
--- a/libclc/generic/include/clc/async/gentype.inc
+++ b/libclc/generic/include/clc/async/gentype.inc
@@ -204,4 +204,29 @@
#endif
+#ifdef cl_khr_fp16
+#pragma OPENCL EXTENSION cl_khr_fp16: enable
+
+#define __CLC_GENTYPE half
+#include __CLC_BODY
+#undef __CLC_GENTYPE
+
+#define __CLC_GENTYPE half2
+#include __CLC_BODY
+#undef __CLC_GENTYPE
+
+#define __CLC_GENTYPE half4
+#include __CLC_BODY
+#undef __CLC_GENTYPE
+
+#define __CLC_GENTYPE half8
+#include __CLC_BODY
+#undef __CLC_GENTYPE
+
+#define __CLC_GENTYPE half16
+#include __CLC_BODY
+#undef __CLC_GENTYPE
+
+#endif
+
#undef __CLC_BODY
diff --git a/libclc/generic/include/clc/float/definitions.h b/libclc/generic/include/clc/float/definitions.h
index 84a102e58e7..43335a78740 100644
--- a/libclc/generic/include/clc/float/definitions.h
+++ b/libclc/generic/include/clc/float/definitions.h
@@ -64,7 +64,7 @@
#define M_SQRT1_2 0x1.6a09e667f3bcdp-1
#ifdef __CLC_INTERNAL
-#define M_LOG210 0x1.a934f0979a371p+1
+#define M_LOG210 0x1.a934f0979a371p+1
#endif
#endif
@@ -80,6 +80,11 @@
#define HALF_MIN_10_EXP -4
#define HALF_MIN_EXP -13
+#define HALF_RADIX 2
+#define HALF_MAX 0x1.ffcp15h
+#define HALF_MIN 0x1.0p-14h
+#define HALF_EPSILON 0x1.0p-10h
+
#endif
#endif
diff --git a/libclc/generic/include/clc/geometric/floatn.inc b/libclc/generic/include/clc/geometric/floatn.inc
index f1ec38cc3c1..49c797f9f18 100644
--- a/libclc/generic/include/clc/geometric/floatn.inc
+++ b/libclc/generic/include/clc/geometric/floatn.inc
@@ -53,4 +53,35 @@
#endif
#endif
+#ifndef __FLOAT_ONLY
+#ifdef cl_khr_fp16
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+#define __CLC_FLOAT half
+#define __CLC_FPSIZE 16
+
+#define __CLC_FLOATN half
+#define __CLC_SCALAR
+#include __CLC_BODY
+#undef __CLC_FLOATN
+#undef __CLC_SCALAR
+
+#define __CLC_FLOATN half2
+#include __CLC_BODY
+#undef __CLC_FLOATN
+
+#define __CLC_FLOATN half3
+#include __CLC_BODY
+#undef __CLC_FLOATN
+
+#define __CLC_FLOATN half4
+#include __CLC_BODY
+#undef __CLC_FLOATN
+
+#undef __CLC_FLOAT
+#undef __CLC_FPSIZE
+
+#endif
+#endif
+
#undef __CLC_BODY
diff --git a/libclc/generic/include/clc/math/binary_intrin.inc b/libclc/generic/include/clc/math/binary_intrin.inc
index dd4440af124..d1a3caedcbe 100644
--- a/libclc/generic/include/clc/math/binary_intrin.inc
+++ b/libclc/generic/include/clc/math/binary_intrin.inc
@@ -15,5 +15,15 @@ _CLC_OVERLOAD double8 __CLC_FUNCTION(double8, double8) __asm(__CLC_INTRINSIC ".v
_CLC_OVERLOAD double16 __CLC_FUNCTION(double16, double16) __asm(__CLC_INTRINSIC ".v16f64");
#endif
+#ifdef cl_khr_fp16
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+_CLC_OVERLOAD half __CLC_FUNCTION(half, half) __asm(__CLC_INTRINSIC ".f16");
+_CLC_OVERLOAD half2 __CLC_FUNCTION(half2, half2) __asm(__CLC_INTRINSIC ".v2f16");
+_CLC_OVERLOAD half3 __CLC_FUNCTION(half3, half3) __asm(__CLC_INTRINSIC ".v3f16");
+_CLC_OVERLOAD half4 __CLC_FUNCTION(half4, half4) __asm(__CLC_INTRINSIC ".v4f16");
+_CLC_OVERLOAD half8 __CLC_FUNCTION(half8, half8) __asm(__CLC_INTRINSIC ".v8f16");
+_CLC_OVERLOAD half16 __CLC_FUNCTION(half16, half16) __asm(__CLC_INTRINSIC ".v16f16");
+#endif
+
#undef __CLC_FUNCTION
#undef __CLC_INTRINSIC
diff --git a/libclc/generic/include/clc/math/gentype.inc b/libclc/generic/include/clc/math/gentype.inc
index 954cd000502..966b4269f66 100644
--- a/libclc/generic/include/clc/math/gentype.inc
+++ b/libclc/generic/include/clc/math/gentype.inc
@@ -110,6 +110,66 @@
#undef __CLC_FPSIZE
#undef __CLC_SCALAR_GENTYPE
#endif
+#endif
-#undef __CLC_BODY
+#ifndef __FLOAT_ONLY
+#ifdef cl_khr_fp16
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+#define __CLC_SCALAR_GENTYPE half
+#define __CLC_FPSIZE 16
+
+#define __CLC_SCALAR
+#define __CLC_GENTYPE half
+#define __CLC_INTN int
+#include __CLC_BODY
+#undef __CLC_GENTYPE
+#undef __CLC_INTN
+#undef __CLC_SCALAR
+
+#define __CLC_GENTYPE half2
+#define __CLC_INTN int2
+#define __CLC_VECSIZE 2
+#include __CLC_BODY
+#undef __CLC_VECSIZE
+#undef __CLC_GENTYPE
+#undef __CLC_INTN
+
+#define __CLC_GENTYPE half3
+#define __CLC_INTN int3
+#define __CLC_VECSIZE 3
+#include __CLC_BODY
+#undef __CLC_VECSIZE
+#undef __CLC_GENTYPE
+#undef __CLC_INTN
+
+#define __CLC_GENTYPE half4
+#define __CLC_INTN int4
+#define __CLC_VECSIZE 4
+#include __CLC_BODY
+#undef __CLC_VECSIZE
+#undef __CLC_GENTYPE
+#undef __CLC_INTN
+
+#define __CLC_GENTYPE half8
+#define __CLC_INTN int8
+#define __CLC_VECSIZE 8
+#include __CLC_BODY
+#undef __CLC_VECSIZE
+#undef __CLC_GENTYPE
+#undef __CLC_INTN
+
+#define __CLC_GENTYPE half16
+#define __CLC_INTN int16
+#define __CLC_VECSIZE 16
+#include __CLC_BODY
+#undef __CLC_VECSIZE
+#undef __CLC_GENTYPE
+#undef __CLC_INTN
+
+#undef __CLC_FPSIZE
+#undef __CLC_SCALAR_GENTYPE
#endif
+#endif
+
+#undef __CLC_BODY
diff --git a/libclc/generic/include/clc/math/nan.inc b/libclc/generic/include/clc/math/nan.inc
index bf36ed24620..970dca7dae8 100644
--- a/libclc/generic/include/clc/math/nan.inc
+++ b/libclc/generic/include/clc/math/nan.inc
@@ -4,8 +4,10 @@
#if __CLC_FPSIZE == 64
#define __CLC_NATN __CLC_XCONCAT(ulong, __CLC_VECSIZE)
-#else
+#elif __CLC_FPSIZE == 32
#define __CLC_NATN __CLC_XCONCAT(uint, __CLC_VECSIZE)
+#elif __CLC_FPSIZE == 16
+#define __CLC_NATN __CLC_XCONCAT(ushort, __CLC_VECSIZE)
#endif
_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE nan(__CLC_NATN code);
diff --git a/libclc/generic/include/clc/math/ternary_intrin.inc b/libclc/generic/include/clc/math/ternary_intrin.inc
index 58ce36b0ed8..b384b266cfd 100644
--- a/libclc/generic/include/clc/math/ternary_intrin.inc
+++ b/libclc/generic/include/clc/math/ternary_intrin.inc
@@ -15,5 +15,16 @@ _CLC_OVERLOAD double8 __CLC_FUNCTION(double8, double8, double8) __asm(__CLC_INTR
_CLC_OVERLOAD double16 __CLC_FUNCTION(double16, double16, double16) __asm(__CLC_INTRINSIC ".v16f64");
#endif
+#ifdef cl_khr_fp16
+#pragma OPENCL EXTENSION cl_khr_fp16: enable
+_CLC_OVERLOAD half __CLC_FUNCTION(half, half, half) __asm(__CLC_INTRINSIC ".f16");
+_CLC_OVERLOAD half2 __CLC_FUNCTION(half2, half2, half2) __asm(__CLC_INTRINSIC ".v2f16");
+_CLC_OVERLOAD half3 __CLC_FUNCTION(half3, half3, half3) __asm(__CLC_INTRINSIC ".v3f16");
+_CLC_OVERLOAD half4 __CLC_FUNCTION(half4, half4, half4) __asm(__CLC_INTRINSIC ".v4f16");
+_CLC_OVERLOAD half8 __CLC_FUNCTION(half8, half8, half8) __asm(__CLC_INTRINSIC ".v8f16");
+_CLC_OVERLOAD half16 __CLC_FUNCTION(half16, half16, half16) __asm(__CLC_INTRINSIC ".v16f16");
+#endif
+
+
#undef __CLC_FUNCTION
#undef __CLC_INTRINSIC
diff --git a/libclc/generic/include/clc/math/unary_intrin.inc b/libclc/generic/include/clc/math/unary_intrin.inc
index 8e42109d938..532bb1f9d26 100644
--- a/libclc/generic/include/clc/math/unary_intrin.inc
+++ b/libclc/generic/include/clc/math/unary_intrin.inc
@@ -15,5 +15,15 @@ _CLC_OVERLOAD double8 __CLC_FUNCTION(double8 d) __asm(__CLC_INTRINSIC ".v8f64");
_CLC_OVERLOAD double16 __CLC_FUNCTION(double16 d) __asm(__CLC_INTRINSIC ".v16f64");
#endif
+#ifdef cl_khr_fp16
+#pragma OPENCL EXTENSION cl_khr_fp16: enable
+_CLC_OVERLOAD half __CLC_FUNCTION(half d) __asm(__CLC_INTRINSIC ".f16");
+_CLC_OVERLOAD half2 __CLC_FUNCTION(half2 d) __asm(__CLC_INTRINSIC ".v2f16");
+_CLC_OVERLOAD half3 __CLC_FUNCTION(half3 d) __asm(__CLC_INTRINSIC ".v3f16");
+_CLC_OVERLOAD half4 __CLC_FUNCTION(half4 d) __asm(__CLC_INTRINSIC ".v4f16");
+_CLC_OVERLOAD half8 __CLC_FUNCTION(half8 d) __asm(__CLC_INTRINSIC ".v8f16");
+_CLC_OVERLOAD half16 __CLC_FUNCTION(half16 d) __asm(__CLC_INTRINSIC ".v16f16");
+#endif
+
#undef __CLC_FUNCTION
#undef __CLC_INTRINSIC
diff --git a/libclc/generic/include/clc/relational/floatn.inc b/libclc/generic/include/clc/relational/floatn.inc
index 8d7fd52cc7d..fc0d6878b4a 100644
--- a/libclc/generic/include/clc/relational/floatn.inc
+++ b/libclc/generic/include/clc/relational/floatn.inc
@@ -39,6 +39,7 @@
#undef __CLC_INT
#ifdef cl_khr_fp64
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
#define __CLC_FLOATN double
#define __CLC_INTN int
@@ -77,5 +78,45 @@
#undef __CLC_FLOATN
#endif
+#ifdef cl_khr_fp16
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+#define __CLC_FLOATN half
+#define __CLC_INTN int
+#include __CLC_BODY
+#undef __CLC_INTN
+#undef __CLC_FLOATN
+
+#define __CLC_FLOATN half2
+#define __CLC_INTN short2
+#include __CLC_BODY
+#undef __CLC_INTN
+#undef __CLC_FLOATN
+
+#define __CLC_FLOATN half3
+#define __CLC_INTN short3
+#include __CLC_BODY
+#undef __CLC_INTN
+#undef __CLC_FLOATN
+
+#define __CLC_FLOATN half4
+#define __CLC_INTN short4
+#include __CLC_BODY
+#undef __CLC_INTN
+#undef __CLC_FLOATN
+
+#define __CLC_FLOATN half8
+#define __CLC_INTN short8
+#include __CLC_BODY
+#undef __CLC_INTN
+#undef __CLC_FLOATN
+
+#define __CLC_FLOATN half16
+#define __CLC_INTN short16
+#include __CLC_BODY
+#undef __CLC_INTN
+#undef __CLC_FLOATN
+
+#endif
#undef __CLC_BODY
diff --git a/libclc/generic/include/clc/relational/isequal.h b/libclc/generic/include/clc/relational/isequal.h
index c28a98565ee..23d3d7e4c81 100644
--- a/libclc/generic/include/clc/relational/isequal.h
+++ b/libclc/generic/include/clc/relational/isequal.h
@@ -15,6 +15,10 @@ _CLC_VECTOR_ISEQUAL_DECL(float, int)
_CLC_ISEQUAL_DECL(double, int)
_CLC_VECTOR_ISEQUAL_DECL(double, long)
#endif
+#ifdef cl_khr_fp16
+_CLC_ISEQUAL_DECL(half, int)
+_CLC_VECTOR_ISEQUAL_DECL(half, short)
+#endif
#undef _CLC_ISEQUAL_DECL
#undef _CLC_VECTOR_ISEQUAL_DEC
diff --git a/libclc/generic/include/clc/relational/isinf.h b/libclc/generic/include/clc/relational/isinf.h
index 869f0c8a9ac..751132db47a 100644
--- a/libclc/generic/include/clc/relational/isinf.h
+++ b/libclc/generic/include/clc/relational/isinf.h
@@ -17,5 +17,10 @@ _CLC_ISINF_DECL(int, double)
_CLC_VECTOR_ISINF_DECL(long, double)
#endif
+#ifdef cl_khr_fp16
+_CLC_ISINF_DECL(int, half)
+_CLC_VECTOR_ISINF_DECL(short, half)
+#endif
+
#undef _CLC_ISINF_DECL
#undef _CLC_VECTOR_ISINF_DECL
diff --git a/libclc/generic/include/clc/relational/isnan.h b/libclc/generic/include/clc/relational/isnan.h
index 93eb9dffb42..f193be40498 100644
--- a/libclc/generic/include/clc/relational/isnan.h
+++ b/libclc/generic/include/clc/relational/isnan.h
@@ -17,5 +17,10 @@ _CLC_ISNAN_DECL(int, double)
_CLC_VECTOR_ISNAN_DECL(long, double)
#endif
+#ifdef cl_khr_fp16
+_CLC_ISNAN_DECL(int, half)
+_CLC_VECTOR_ISNAN_DECL(short, half)
+#endif
+
#undef _CLC_ISNAN_DECL
#undef _CLC_VECTOR_ISNAN_DECL
OpenPOWER on IntegriCloud