diff options
author | Jan Vesely <jan.vesely@rutgers.edu> | 2018-05-17 22:55:30 +0000 |
---|---|---|
committer | Jan Vesely <jan.vesely@rutgers.edu> | 2018-05-17 22:55:30 +0000 |
commit | 70a270da5f4a27b670cba1cb8148fcce5c094f4f (patch) | |
tree | ba5043901fab059f1a5ccfb2578156c62ec4c027 /libclc/generic/include/clc | |
parent | c762666e8747841ab7dd785415e1354a1682e954 (diff) | |
download | bcm5719-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.h | 9 | ||||
-rw-r--r-- | libclc/generic/include/clc/async/gentype.inc | 25 | ||||
-rw-r--r-- | libclc/generic/include/clc/float/definitions.h | 7 | ||||
-rw-r--r-- | libclc/generic/include/clc/geometric/floatn.inc | 31 | ||||
-rw-r--r-- | libclc/generic/include/clc/math/binary_intrin.inc | 10 | ||||
-rw-r--r-- | libclc/generic/include/clc/math/gentype.inc | 62 | ||||
-rw-r--r-- | libclc/generic/include/clc/math/nan.inc | 4 | ||||
-rw-r--r-- | libclc/generic/include/clc/math/ternary_intrin.inc | 11 | ||||
-rw-r--r-- | libclc/generic/include/clc/math/unary_intrin.inc | 10 | ||||
-rw-r--r-- | libclc/generic/include/clc/relational/floatn.inc | 41 | ||||
-rw-r--r-- | libclc/generic/include/clc/relational/isequal.h | 4 | ||||
-rw-r--r-- | libclc/generic/include/clc/relational/isinf.h | 5 | ||||
-rw-r--r-- | libclc/generic/include/clc/relational/isnan.h | 5 |
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 |