Author: jvesely
Date: Thu May 17 15:55:30 2018
New Revision: 332677

URL: http://llvm.org/viewvc/llvm-project?rev=332677&view=rev
Log:
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.ves...@rutgers.edu>
reviewer: Jeroen Ketema <j.ket...@xs4all.nl>
Reviewed-by: Aaron Watry <awa...@gmail.com>
Tested-by: Aaron Watry <awa...@gmail.com>

Modified:
    libclc/trunk/amdgcn/lib/math/fmax.cl
    libclc/trunk/amdgcn/lib/math/fmin.cl
    libclc/trunk/amdgpu/lib/math/nextafter.cl
    libclc/trunk/amdgpu/lib/math/sqrt.cl
    libclc/trunk/generic/include/clc/as_type.h
    libclc/trunk/generic/include/clc/async/gentype.inc
    libclc/trunk/generic/include/clc/float/definitions.h
    libclc/trunk/generic/include/clc/geometric/floatn.inc
    libclc/trunk/generic/include/clc/math/binary_intrin.inc
    libclc/trunk/generic/include/clc/math/gentype.inc
    libclc/trunk/generic/include/clc/math/nan.inc
    libclc/trunk/generic/include/clc/math/ternary_intrin.inc
    libclc/trunk/generic/include/clc/math/unary_intrin.inc
    libclc/trunk/generic/include/clc/relational/floatn.inc
    libclc/trunk/generic/include/clc/relational/isequal.h
    libclc/trunk/generic/include/clc/relational/isinf.h
    libclc/trunk/generic/include/clc/relational/isnan.h
    libclc/trunk/generic/include/math/clc_ldexp.h
    libclc/trunk/generic/lib/geometric/dot.cl
    libclc/trunk/generic/lib/geometric/length.cl
    libclc/trunk/generic/lib/math/acos.inc
    libclc/trunk/generic/lib/math/asin.inc
    libclc/trunk/generic/lib/math/clc_nextafter.cl
    libclc/trunk/generic/lib/math/clc_sqrt_impl.inc
    libclc/trunk/generic/lib/math/clc_sw_binary.inc
    libclc/trunk/generic/lib/math/clc_sw_unary.inc
    libclc/trunk/generic/lib/math/copysign.cl
    libclc/trunk/generic/lib/math/fmax.cl
    libclc/trunk/generic/lib/math/fmax.inc
    libclc/trunk/generic/lib/math/fmin.cl
    libclc/trunk/generic/lib/math/fmin.inc
    libclc/trunk/generic/lib/math/fract.inc
    libclc/trunk/generic/lib/math/ldexp.cl
    libclc/trunk/generic/lib/math/ldexp.inc
    libclc/trunk/generic/lib/math/lgamma_r.inc
    libclc/trunk/generic/lib/math/modf.inc
    libclc/trunk/generic/lib/math/nan.inc
    libclc/trunk/generic/lib/math/pown.inc
    libclc/trunk/generic/lib/math/remquo.inc
    libclc/trunk/generic/lib/math/rootn.inc
    libclc/trunk/generic/lib/math/sincos.inc
    libclc/trunk/generic/lib/math/sqrt.cl
    libclc/trunk/generic/lib/relational/isequal.cl
    libclc/trunk/generic/lib/relational/isfinite.cl
    libclc/trunk/generic/lib/relational/isgreater.cl
    libclc/trunk/generic/lib/relational/isgreaterequal.cl
    libclc/trunk/generic/lib/relational/isinf.cl
    libclc/trunk/generic/lib/relational/isless.cl
    libclc/trunk/generic/lib/relational/islessequal.cl
    libclc/trunk/generic/lib/relational/islessgreater.cl
    libclc/trunk/generic/lib/relational/isnan.cl
    libclc/trunk/generic/lib/relational/isnormal.cl
    libclc/trunk/generic/lib/relational/isnotequal.cl
    libclc/trunk/generic/lib/relational/isordered.cl
    libclc/trunk/generic/lib/relational/isunordered.cl
    libclc/trunk/generic/lib/relational/signbit.cl
    libclc/trunk/generic/lib/shared/vstore_half.inc

Modified: libclc/trunk/amdgcn/lib/math/fmax.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/amdgcn/lib/math/fmax.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/amdgcn/lib/math/fmax.cl (original)
+++ libclc/trunk/amdgcn/lib/math/fmax.cl Thu May 17 15:55:30 2018
@@ -26,6 +26,21 @@ _CLC_DEF _CLC_OVERLOAD double fmax(doubl
 _CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, fmax, double, double)
 
 #endif
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+_CLC_DEF _CLC_OVERLOAD half fmax(half x, half y)
+{
+   if (isnan(x))
+      return y;
+   if (isnan(y))
+      return x;
+   return (y < x) ? x : y;
+}
+_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, half, fmax, half, half)
+
+#endif
 
 #define __CLC_BODY <../../../generic/lib/math/fmax.inc>
 #include <clc/math/gentype.inc>

Modified: libclc/trunk/amdgcn/lib/math/fmin.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/amdgcn/lib/math/fmin.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/amdgcn/lib/math/fmin.cl (original)
+++ libclc/trunk/amdgcn/lib/math/fmin.cl Thu May 17 15:55:30 2018
@@ -26,6 +26,21 @@ _CLC_DEF _CLC_OVERLOAD double fmin(doubl
 _CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, fmin, double, double)
 
 #endif
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+_CLC_DEF _CLC_OVERLOAD half fmin(half x, half y)
+{
+   if (isnan(x))
+      return y;
+   if (isnan(y))
+      return x;
+   return (y < x) ? y : x;
+}
+_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, half, fmin, half, half)
+
+#endif
 
 #define __CLC_BODY <../../../generic/lib/math/fmin.inc>
 #include <clc/math/gentype.inc>

Modified: libclc/trunk/amdgpu/lib/math/nextafter.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/amdgpu/lib/math/nextafter.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/amdgpu/lib/math/nextafter.cl (original)
+++ libclc/trunk/amdgpu/lib/math/nextafter.cl Thu May 17 15:55:30 2018
@@ -8,3 +8,8 @@ _CLC_DEFINE_BINARY_BUILTIN(float, nextaf
 #pragma OPENCL EXTENSION cl_khr_fp64 : enable
 _CLC_DEFINE_BINARY_BUILTIN(double, nextafter, __clc_nextafter, double, double)
 #endif
+
+#ifdef cl_khr_fp16
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+_CLC_DEFINE_BINARY_BUILTIN(half, nextafter, __clc_nextafter, half, half)
+#endif

Modified: libclc/trunk/amdgpu/lib/math/sqrt.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/amdgpu/lib/math/sqrt.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/amdgpu/lib/math/sqrt.cl (original)
+++ libclc/trunk/amdgpu/lib/math/sqrt.cl Thu May 17 15:55:30 2018
@@ -26,6 +26,13 @@
 
 _CLC_DEFINE_UNARY_BUILTIN(float, sqrt, __clc_sqrt, float)
 
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+_CLC_DEFINE_UNARY_BUILTIN(half, sqrt, __clc_sqrt, half)
+
+#endif
+
 #ifdef cl_khr_fp64
 
 #pragma OPENCL EXTENSION cl_khr_fp64 : enable

Modified: libclc/trunk/generic/include/clc/as_type.h
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/include/clc/as_type.h?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/include/clc/as_type.h (original)
+++ libclc/trunk/generic/include/clc/as_type.h Thu May 17 15:55:30 2018
@@ -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

Modified: libclc/trunk/generic/include/clc/async/gentype.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/include/clc/async/gentype.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/include/clc/async/gentype.inc (original)
+++ libclc/trunk/generic/include/clc/async/gentype.inc Thu May 17 15:55:30 2018
@@ -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

Modified: libclc/trunk/generic/include/clc/float/definitions.h
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/include/clc/float/definitions.h?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/include/clc/float/definitions.h (original)
+++ libclc/trunk/generic/include/clc/float/definitions.h Thu May 17 15:55:30 
2018
@@ -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

Modified: libclc/trunk/generic/include/clc/geometric/floatn.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/include/clc/geometric/floatn.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/include/clc/geometric/floatn.inc (original)
+++ libclc/trunk/generic/include/clc/geometric/floatn.inc Thu May 17 15:55:30 
2018
@@ -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

Modified: libclc/trunk/generic/include/clc/math/binary_intrin.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/include/clc/math/binary_intrin.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/include/clc/math/binary_intrin.inc (original)
+++ libclc/trunk/generic/include/clc/math/binary_intrin.inc Thu May 17 15:55:30 
2018
@@ -15,5 +15,15 @@ _CLC_OVERLOAD double8 __CLC_FUNCTION(dou
 _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

Modified: libclc/trunk/generic/include/clc/math/gentype.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/include/clc/math/gentype.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/include/clc/math/gentype.inc (original)
+++ libclc/trunk/generic/include/clc/math/gentype.inc Thu May 17 15:55:30 2018
@@ -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

Modified: libclc/trunk/generic/include/clc/math/nan.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/include/clc/math/nan.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/include/clc/math/nan.inc (original)
+++ libclc/trunk/generic/include/clc/math/nan.inc Thu May 17 15:55:30 2018
@@ -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);

Modified: libclc/trunk/generic/include/clc/math/ternary_intrin.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/include/clc/math/ternary_intrin.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/include/clc/math/ternary_intrin.inc (original)
+++ libclc/trunk/generic/include/clc/math/ternary_intrin.inc Thu May 17 
15:55:30 2018
@@ -15,5 +15,16 @@ _CLC_OVERLOAD double8 __CLC_FUNCTION(dou
 _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

Modified: libclc/trunk/generic/include/clc/math/unary_intrin.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/include/clc/math/unary_intrin.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/include/clc/math/unary_intrin.inc (original)
+++ libclc/trunk/generic/include/clc/math/unary_intrin.inc Thu May 17 15:55:30 
2018
@@ -15,5 +15,15 @@ _CLC_OVERLOAD double8 __CLC_FUNCTION(dou
 _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

Modified: libclc/trunk/generic/include/clc/relational/floatn.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/include/clc/relational/floatn.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/include/clc/relational/floatn.inc (original)
+++ libclc/trunk/generic/include/clc/relational/floatn.inc Thu May 17 15:55:30 
2018
@@ -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
@@ -75,6 +76,46 @@
 #include __CLC_BODY
 #undef __CLC_INTN
 #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
 

Modified: libclc/trunk/generic/include/clc/relational/isequal.h
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/include/clc/relational/isequal.h?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/include/clc/relational/isequal.h (original)
+++ libclc/trunk/generic/include/clc/relational/isequal.h Thu May 17 15:55:30 
2018
@@ -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

Modified: libclc/trunk/generic/include/clc/relational/isinf.h
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/include/clc/relational/isinf.h?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/include/clc/relational/isinf.h (original)
+++ libclc/trunk/generic/include/clc/relational/isinf.h Thu May 17 15:55:30 2018
@@ -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

Modified: libclc/trunk/generic/include/clc/relational/isnan.h
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/include/clc/relational/isnan.h?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/include/clc/relational/isnan.h (original)
+++ libclc/trunk/generic/include/clc/relational/isnan.h Thu May 17 15:55:30 2018
@@ -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

Modified: libclc/trunk/generic/include/math/clc_ldexp.h
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/include/math/clc_ldexp.h?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/include/math/clc_ldexp.h (original)
+++ libclc/trunk/generic/include/math/clc_ldexp.h Thu May 17 15:55:30 2018
@@ -1,6 +1,11 @@
 _CLC_DEF _CLC_OVERLOAD float __clc_ldexp(float, int);
 
 #ifdef cl_khr_fp64
-  #pragma OPENCL EXTENSION cl_khr_fp64 : enable
-  _CLC_DEF _CLC_OVERLOAD double __clc_ldexp(double, int);
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+_CLC_DEF _CLC_OVERLOAD double __clc_ldexp(double, int);
+#endif
+
+#ifdef cl_khr_fp16
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+_CLC_DEF _CLC_OVERLOAD float __clc_ldexp(half, int);
 #endif

Modified: libclc/trunk/generic/lib/geometric/dot.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/geometric/dot.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/geometric/dot.cl (original)
+++ libclc/trunk/generic/lib/geometric/dot.cl Thu May 17 15:55:30 2018
@@ -37,3 +37,25 @@ _CLC_OVERLOAD _CLC_DEF double dot(double
 }
 
 #endif
+
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+_CLC_OVERLOAD _CLC_DEF half dot(half p0, half p1) {
+  return p0*p1;
+}
+
+_CLC_OVERLOAD _CLC_DEF half dot(half2 p0, half2 p1) {
+  return p0.x*p1.x + p0.y*p1.y;
+}
+
+_CLC_OVERLOAD _CLC_DEF half dot(half3 p0, half3 p1) {
+  return p0.x*p1.x + p0.y*p1.y + p0.z*p1.z;
+}
+
+_CLC_OVERLOAD _CLC_DEF half dot(half4 p0, half4 p1) {
+  return p0.x*p1.x + p0.y*p1.y + p0.z*p1.z + p0.w*p1.w;
+}
+
+#endif

Modified: libclc/trunk/generic/lib/geometric/length.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/geometric/length.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/geometric/length.cl (original)
+++ libclc/trunk/generic/lib/geometric/length.cl Thu May 17 15:55:30 2018
@@ -79,9 +79,47 @@ _CLC_OVERLOAD _CLC_DEF double length(dou
   V_DLENGTH(p);
 }
 
-_CLC_OVERLOAD _CLC_DEF double
-length(double4 p) {
+_CLC_OVERLOAD _CLC_DEF double length(double4 p) {
   V_DLENGTH(p);
 }
 
 #endif
+
+#ifdef cl_khr_fp16
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+_CLC_OVERLOAD _CLC_DEF half length(half p){
+  return fabs(p);
+}
+
+// Only available in CLC1.2
+#ifndef HALF_MIN
+#define HALF_MIN   0x1.0p-14h
+#endif
+
+#define V_HLENGTH(p)                       \
+  half l2 = dot(p, p);                     \
+                                           \
+  if (l2 < HALF_MIN) {                     \
+      p *= 0x1.0p+12h;                     \
+      return sqrt(dot(p, p)) * 0x1.0p-12h; \
+  } else if (l2 == INFINITY) {             \
+      p *= 0x1.0p-7h;                      \
+      return sqrt(dot(p, p)) * 0x1.0p+7h;  \
+  }                                        \
+                                           \
+  return sqrt(l2);
+
+_CLC_OVERLOAD _CLC_DEF half length(half2 p) {
+  V_HLENGTH(p);
+}
+
+_CLC_OVERLOAD _CLC_DEF half length(half3 p) {
+  V_HLENGTH(p);
+}
+
+_CLC_OVERLOAD _CLC_DEF half length(half4 p) {
+  V_HLENGTH(p);
+}
+
+#endif

Modified: libclc/trunk/generic/lib/math/acos.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/math/acos.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/math/acos.inc (original)
+++ libclc/trunk/generic/lib/math/acos.inc Thu May 17 15:55:30 2018
@@ -11,10 +11,15 @@
  * precision of #4 may be better.
  */
 
-#if __CLC_FPSIZE == 32
-#define __CLC_CONST(x) x ## f
-#else
+// TODO: Enable half precision when atan2 is implemented
+#if __CLC_FPSIZE > 16
+
+#if __CLC_FPSIZE == 64
 #define __CLC_CONST(x) x
+#elif __CLC_FPSIZE == 32
+#define __CLC_CONST(x) x ## f
+#elif __CLC_FPSIZE == 16
+#define __CLC_CONST(x) x ## h
 #endif
 
 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE acos(__CLC_GENTYPE x) {
@@ -27,3 +32,5 @@ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE aco
 }
 
 #undef __CLC_CONST
+
+#endif

Modified: libclc/trunk/generic/lib/math/asin.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/math/asin.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/math/asin.inc (original)
+++ libclc/trunk/generic/lib/math/asin.inc Thu May 17 15:55:30 2018
@@ -1,12 +1,18 @@
+// TODO: Enable half precision when atan2 is implemented
+#if __CLC_FPSIZE > 16
 
-#if __CLC_FPSIZE == 32
-#define __CLC_CONST(x) x ## f
-#else
+#if __CLC_FPSIZE == 64
 #define __CLC_CONST(x) x
+#elif __CLC_FPSIZE == 32
+#define __CLC_CONST(x) x ## f
+#elif __CLC_FPSIZE == 16
+#define __CLC_CONST(x) x ## h
 #endif
 
 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE asin(__CLC_GENTYPE x) {
-  return atan2(x, sqrt( (__CLC_GENTYPE)__CLC_CONST(1.0) -(x*x) ));
+  return atan2(x, sqrt( (__CLC_GENTYPE)__CLC_CONST(1.0) - (x*x) ));
 }
 
 #undef __CLC_CONST
+
+#endif

Modified: libclc/trunk/generic/lib/math/clc_nextafter.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/math/clc_nextafter.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/math/clc_nextafter.cl (original)
+++ libclc/trunk/generic/lib/math/clc_nextafter.cl Thu May 17 15:55:30 2018
@@ -37,3 +37,10 @@ _CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC
 NEXTAFTER(double, ulong, long)
 _CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, __clc_nextafter, double, 
double)
 #endif
+
+#ifdef cl_khr_fp16
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+NEXTAFTER(half, ushort, short)
+_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, half, __clc_nextafter, half, 
half)
+#endif

Modified: libclc/trunk/generic/lib/math/clc_sqrt_impl.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/math/clc_sqrt_impl.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/math/clc_sqrt_impl.inc (original)
+++ libclc/trunk/generic/lib/math/clc_sqrt_impl.inc Thu May 17 15:55:30 2018
@@ -20,14 +20,15 @@
  * THE SOFTWARE.
  */
 
-#if __CLC_FPSIZE == 32
-#define __CLC_NAN NAN
-#define ZERO 0.0f
-#elif __CLC_FPSIZE == 64
+#if __CLC_FPSIZE == 64
 #define __CLC_NAN __builtin_nan("")
 #define ZERO 0.0
-#else
-#error "Invalid value for __CLC_FPSIZE"
+#elif __CLC_FPSIZE == 32
+#define __CLC_NAN NAN
+#define ZERO 0.0f
+#elif __CLC_FPSIZE == 16
+#define __CLC_NAN (half)NAN
+#define ZERO 0.0h
 #endif
 
 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_sqrt(__CLC_GENTYPE val) {

Modified: libclc/trunk/generic/lib/math/clc_sw_binary.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/math/clc_sw_binary.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/math/clc_sw_binary.inc (original)
+++ libclc/trunk/generic/lib/math/clc_sw_binary.inc Thu May 17 15:55:30 2018
@@ -2,8 +2,11 @@
 
 #define __CLC_SW_FUNC(x) __CLC_CONCAT(__clc_, x)
 
+// TODO: Enable half precision when the sw routine is implemented
+#if __CLC_FPSIZE > 16
 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __CLC_FUNC(__CLC_GENTYPE x, __CLC_GENTYPE 
y) {
   return __CLC_SW_FUNC(__CLC_FUNC)(x, y);
 }
+#endif
 
 #undef __CLC_SW_FUNC

Modified: libclc/trunk/generic/lib/math/clc_sw_unary.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/math/clc_sw_unary.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/math/clc_sw_unary.inc (original)
+++ libclc/trunk/generic/lib/math/clc_sw_unary.inc Thu May 17 15:55:30 2018
@@ -2,8 +2,11 @@
 
 #define __CLC_SW_FUNC(x) __CLC_CONCAT(__clc_, x)
 
+// TODO: Enable half precision when the sw routine is implemented
+#if __CLC_FPSIZE > 16
 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __CLC_FUNC(__CLC_GENTYPE x) {
   return __CLC_SW_FUNC(__CLC_FUNC)(x);
 }
+#endif
 
 #undef __CLC_SW_FUNC

Modified: libclc/trunk/generic/lib/math/copysign.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/math/copysign.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/math/copysign.cl (original)
+++ libclc/trunk/generic/lib/math/copysign.cl Thu May 17 15:55:30 2018
@@ -10,3 +10,18 @@ _CLC_DEFINE_BINARY_BUILTIN(float, copysi
 _CLC_DEFINE_BINARY_BUILTIN(double, copysign, __builtin_copysign, double, 
double)
 
 #endif
+
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+_CLC_DEF _CLC_OVERLOAD half copysign(half x, half y)
+{
+   ushort sign_x = as_ushort(x) & 0x8000u;
+   ushort unsigned_y = as_ushort(y) & 0x7ffffu;
+
+   return as_half((ushort)(sign_x | unsigned_y));
+}
+_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, half, copysign, half, half)
+
+#endif

Modified: libclc/trunk/generic/lib/math/fmax.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/math/fmax.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/math/fmax.cl (original)
+++ libclc/trunk/generic/lib/math/fmax.cl Thu May 17 15:55:30 2018
@@ -12,5 +12,21 @@ _CLC_DEFINE_BINARY_BUILTIN(double, fmax,
 
 #endif
 
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+_CLC_DEF _CLC_OVERLOAD half fmax(half x, half y)
+{
+   if (isnan(x))
+      return y;
+   if (isnan(y))
+      return x;
+   return (x < y) ? y : x;
+}
+_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, half, fmax, half, half)
+
+#endif
+
 #define __CLC_BODY <fmax.inc>
 #include <clc/math/gentype.inc>

Modified: libclc/trunk/generic/lib/math/fmax.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/math/fmax.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/math/fmax.inc (original)
+++ libclc/trunk/generic/lib/math/fmax.inc Thu May 17 15:55:30 2018
@@ -15,4 +15,14 @@ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE fma
 
 #endif // ifdef cl_khr_fp64
 
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE fmax(__CLC_GENTYPE x, half y) {
+  return fmax(x, (__CLC_GENTYPE)((__CLC_SCALAR_GENTYPE)y));
+}
+
+#endif // ifdef cl_khr_fp16
+
 #endif // !defined(__CLC_SCALAR)

Modified: libclc/trunk/generic/lib/math/fmin.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/math/fmin.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/math/fmin.cl (original)
+++ libclc/trunk/generic/lib/math/fmin.cl Thu May 17 15:55:30 2018
@@ -11,6 +11,21 @@ _CLC_DEFINE_BINARY_BUILTIN(float, fmin,
 _CLC_DEFINE_BINARY_BUILTIN(double, fmin, __builtin_fmin, double, double);
 
 #endif
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+_CLC_DEF _CLC_OVERLOAD half fmin(half x, half y)
+{
+   if (isnan(x))
+      return y;
+   if (isnan(y))
+      return x;
+   return (y < x) ? y : x;
+}
+_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, half, fmin, half, half)
+
+#endif
 
 #define __CLC_BODY <fmin.inc>
 #include <clc/math/gentype.inc>

Modified: libclc/trunk/generic/lib/math/fmin.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/math/fmin.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/math/fmin.inc (original)
+++ libclc/trunk/generic/lib/math/fmin.inc Thu May 17 15:55:30 2018
@@ -15,4 +15,14 @@ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE fmi
 
 #endif // ifdef cl_khr_fp64
 
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE fmin(__CLC_GENTYPE x, half y) {
+  return fmin(x, (__CLC_GENTYPE)((__CLC_SCALAR_GENTYPE)y));
+}
+
+#endif // ifdef cl_khr_fp16
+
 #endif // !defined(__CLC_SCALAR)

Modified: libclc/trunk/generic/lib/math/fract.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/math/fract.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/math/fract.inc (original)
+++ libclc/trunk/generic/lib/math/fract.inc Thu May 17 15:55:30 2018
@@ -20,16 +20,21 @@
  * THE SOFTWARE.
  */
 
-#if __CLC_FPSIZE == 32
-#define MIN_CONSTANT 0x1.fffffep-1f
-#else
+#if __CLC_FPSIZE == 64
 #define MIN_CONSTANT 0x1.fffffffffffffp-1
+#define ZERO 0.0
+#elif __CLC_FPSIZE == 32
+#define MIN_CONSTANT 0x1.fffffep-1f
+#define ZERO 0.0f
+#elif __CLC_FPSIZE == 16
+#define MIN_CONSTANT 0x1.ffcp-1h
+#define ZERO 0.0h
 #endif
 
 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE fract(__CLC_GENTYPE x, private 
__CLC_GENTYPE *iptr) {
   *iptr = floor(x);
   __CLC_GENTYPE r = fmin(x - *iptr, MIN_CONSTANT);
-  r = isinf(x) ? 0.0f : r;
+  r = isinf(x) ? ZERO : r;
   r = isnan(x) ? x : r;
   return r;
 }
@@ -47,3 +52,4 @@ FRACT_DEF(local);
 FRACT_DEF(global);
 
 #undef MIN_CONSTANT
+#undef ZERO

Modified: libclc/trunk/generic/lib/math/ldexp.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/math/ldexp.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/math/ldexp.cl (original)
+++ libclc/trunk/generic/lib/math/ldexp.cl Thu May 17 15:55:30 2018
@@ -33,7 +33,13 @@ _CLC_DEFINE_BINARY_BUILTIN(float, ldexp,
 #pragma OPENCL EXTENSION cl_khr_fp64 : enable
 
 _CLC_DEFINE_BINARY_BUILTIN(double, ldexp, __clc_ldexp, double, int)
+#endif
+
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
 
+_CLC_DEFINE_BINARY_BUILTIN(half, ldexp, __clc_ldexp, half, int)
 #endif
 
 // This defines all the ldexp(GENTYPE, int) variants

Modified: libclc/trunk/generic/lib/math/ldexp.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/math/ldexp.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/math/ldexp.inc (original)
+++ libclc/trunk/generic/lib/math/ldexp.inc Thu May 17 15:55:30 2018
@@ -20,6 +20,9 @@
  * THE SOFTWARE.
  */
 
+// TODO: Enable half precision when ldexp is implemented.
+#if __CLC_FPSIZE > 16
+
 #ifndef __CLC_SCALAR
 
 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE ldexp(__CLC_GENTYPE x, int n) {
@@ -27,3 +30,5 @@ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE lde
 }
 
 #endif
+
+#endif

Modified: libclc/trunk/generic/lib/math/lgamma_r.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/math/lgamma_r.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/math/lgamma_r.inc (original)
+++ libclc/trunk/generic/lib/math/lgamma_r.inc Thu May 17 15:55:30 2018
@@ -21,10 +21,12 @@
  * THE SOFTWARE.
  */
 
-
+// TODO: Enable half precision when the base version is implemented.
+#if __CLC_FPSIZE > 16
 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE lgamma_r(__CLC_GENTYPE x, __CLC_ADDRSPACE 
__CLC_INTN *iptr) {
     __CLC_INTN private_iptr;
     __CLC_GENTYPE ret = lgamma_r(x, &private_iptr);
     *iptr = private_iptr;
     return ret;
 }
+#endif

Modified: libclc/trunk/generic/lib/math/modf.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/math/modf.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/math/modf.inc (original)
+++ libclc/trunk/generic/lib/math/modf.inc Thu May 17 15:55:30 2018
@@ -20,9 +20,17 @@
  * THE SOFTWARE.
  */
 
+#if __CLC_FPSIZE == 64
+#define ZERO 0.0
+#elif __CLC_FPSIZE == 32
+#define ZERO 0.0f
+#elif __CLC_FPSIZE == 16
+#define ZERO 0.0h
+#endif
+
 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE modf(__CLC_GENTYPE x, __CLC_GENTYPE 
*iptr) {
   *iptr = trunc(x);
-  return copysign(isinf(x) ? 0.0f : x - *iptr, x);
+  return copysign(isinf(x) ? ZERO : x - *iptr, x);
 }
 
 #define MODF_DEF(addrspace) \
@@ -35,3 +43,5 @@ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE mod
 
 MODF_DEF(local);
 MODF_DEF(global);
+
+#undef ZERO

Modified: libclc/trunk/generic/lib/math/nan.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/math/nan.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/math/nan.inc (original)
+++ libclc/trunk/generic/lib/math/nan.inc Thu May 17 15:55:30 2018
@@ -7,11 +7,18 @@ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE nan
 {
        return __CLC_AS_GENTYPE(code | 0x7ff0000000000000ul);
 }
-#else
+#elif __CLC_FPSIZE == 32
 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE nan(__CLC_XCONCAT(uint, __CLC_VECSIZE) 
code)
 {
        return __CLC_AS_GENTYPE(code | 0x7fc00000);
 }
+#elif __CLC_FPSIZE == 16
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE nan(__CLC_XCONCAT(ushort, __CLC_VECSIZE) 
code)
+{
+       const ushort mask = 0x7e00;
+       const __CLC_XCONCAT(ushort, __CLC_VECSIZE) res = code | mask;
+       return __CLC_AS_GENTYPE(res);
+}
 #endif
 
 

Modified: libclc/trunk/generic/lib/math/pown.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/math/pown.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/math/pown.inc (original)
+++ libclc/trunk/generic/lib/math/pown.inc Thu May 17 15:55:30 2018
@@ -1,3 +1,6 @@
+// TODO: Enable half precision when the sw routine is implemented
+#if __CLC_FPSIZE > 16
 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE pown(__CLC_GENTYPE x, __CLC_INTN y) {
   return __clc_pown(x, y);
 }
+#endif

Modified: libclc/trunk/generic/lib/math/remquo.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/math/remquo.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/math/remquo.inc (original)
+++ libclc/trunk/generic/lib/math/remquo.inc Thu May 17 15:55:30 2018
@@ -1,6 +1,9 @@
+// TODO: Enable half precision when the sw routine is implemented
+#if __CLC_FPSIZE > 16
 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE remquo(__CLC_GENTYPE x, __CLC_GENTYPE y, 
__CLC_ADDRESS_SPACE __CLC_INTN *q) {
   __CLC_INTN local_q;
   __CLC_GENTYPE ret = __clc_remquo(x, y, &local_q);
   *q = local_q;
   return ret;
 }
+#endif

Modified: libclc/trunk/generic/lib/math/rootn.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/math/rootn.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/math/rootn.inc (original)
+++ libclc/trunk/generic/lib/math/rootn.inc Thu May 17 15:55:30 2018
@@ -1,3 +1,6 @@
+// TODO: Enable half precision when the sw routine is implemented
+#if __CLC_FPSIZE > 16
 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE rootn(__CLC_GENTYPE x, __CLC_INTN y) {
   return __clc_rootn(x, y);
 }
+#endif

Modified: libclc/trunk/generic/lib/math/sincos.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/math/sincos.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/math/sincos.inc (original)
+++ libclc/trunk/generic/lib/math/sincos.inc Thu May 17 15:55:30 2018
@@ -1,3 +1,5 @@
+// TODO: Enable half precision when sin/cos is implemented
+#if __CLC_FPSIZE > 16
 #define __CLC_DECLARE_SINCOS(ADDRSPACE, TYPE) \
   _CLC_OVERLOAD _CLC_DEF TYPE sincos (TYPE x, ADDRSPACE TYPE * cosval) { \
     *cosval = cos(x); \
@@ -9,3 +11,4 @@ __CLC_DECLARE_SINCOS(local, __CLC_GENTYP
 __CLC_DECLARE_SINCOS(private, __CLC_GENTYPE)
 
 #undef __CLC_DECLARE_SINCOS
+#endif

Modified: libclc/trunk/generic/lib/math/sqrt.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/math/sqrt.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/math/sqrt.cl (original)
+++ libclc/trunk/generic/lib/math/sqrt.cl Thu May 17 15:55:30 2018
@@ -33,3 +33,11 @@ _CLC_DEFINE_UNARY_BUILTIN(float, sqrt, _
 _CLC_DEFINE_UNARY_BUILTIN(double, sqrt, __clc_sqrt, double)
 
 #endif
+
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+_CLC_DEFINE_UNARY_BUILTIN(half, sqrt, __clc_sqrt, half)
+
+#endif

Modified: libclc/trunk/generic/lib/relational/isequal.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/relational/isequal.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/relational/isequal.cl (original)
+++ libclc/trunk/generic/lib/relational/isequal.cl Thu May 17 15:55:30 2018
@@ -26,5 +26,19 @@ _CLC_DEFINE_ISEQUAL(long8, isequal, doub
 _CLC_DEFINE_ISEQUAL(long16, isequal, double16, double16)
 
 #endif
+#ifdef cl_khr_fp16
 
-#undef _CLC_DEFINE_ISEQUAL
\ No newline at end of file
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+// The scalar version of isequal(half) returns an int, but the vector versions
+// return short.
+_CLC_DEFINE_ISEQUAL(int, isequal, half, half)
+_CLC_DEFINE_ISEQUAL(short2, isequal, half2, half2)
+_CLC_DEFINE_ISEQUAL(short3, isequal, half3, half3)
+_CLC_DEFINE_ISEQUAL(short4, isequal, half4, half4)
+_CLC_DEFINE_ISEQUAL(short8, isequal, half8, half8)
+_CLC_DEFINE_ISEQUAL(short16, isequal, half16, half16)
+
+#endif
+
+#undef _CLC_DEFINE_ISEQUAL

Modified: libclc/trunk/generic/lib/relational/isfinite.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/relational/isfinite.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/relational/isfinite.cl (original)
+++ libclc/trunk/generic/lib/relational/isfinite.cl Thu May 17 15:55:30 2018
@@ -16,3 +16,16 @@ _CLC_DEF _CLC_OVERLOAD int isfinite(doub
 _CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(long, isfinite, double)
 
 #endif
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+// The scalar version of isfinite(half) returns an int, but the vector versions
+// return short.
+_CLC_DEF _CLC_OVERLOAD int isfinite(half x) {
+  return __builtin_isfinite(x);
+}
+
+_CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(short, isfinite, half)
+
+#endif

Modified: libclc/trunk/generic/lib/relational/isgreater.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/relational/isgreater.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/relational/isgreater.cl (original)
+++ libclc/trunk/generic/lib/relational/isgreater.cl Thu May 17 15:55:30 2018
@@ -20,3 +20,18 @@ _CLC_DEF _CLC_OVERLOAD int isgreater(dou
 _CLC_DEFINE_RELATIONAL_BINARY_VEC_ALL(long, isgreater, double, double)
 
 #endif
+
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+// The scalar version of isgreater(half, half) returns an int, but the vector 
versions
+// return short.
+
+_CLC_DEF _CLC_OVERLOAD int isgreater(half x, half y){
+       return __builtin_isgreater(x, y);
+}
+
+_CLC_DEFINE_RELATIONAL_BINARY_VEC_ALL(short, isgreater, half, half)
+
+#endif

Modified: libclc/trunk/generic/lib/relational/isgreaterequal.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/relational/isgreaterequal.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/relational/isgreaterequal.cl (original)
+++ libclc/trunk/generic/lib/relational/isgreaterequal.cl Thu May 17 15:55:30 
2018
@@ -20,3 +20,17 @@ _CLC_DEF _CLC_OVERLOAD int isgreaterequa
 _CLC_DEFINE_RELATIONAL_BINARY_VEC_ALL(long, isgreaterequal, double, double)
 
 #endif
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+// The scalar version of isgreaterequal(half, half) returns an int, but the 
vector versions
+// return short.
+
+_CLC_DEF _CLC_OVERLOAD int isgreaterequal(half x, half y){
+       return __builtin_isgreaterequal(x, y);
+}
+
+_CLC_DEFINE_RELATIONAL_BINARY_VEC_ALL(short, isgreaterequal, half, half)
+
+#endif

Modified: libclc/trunk/generic/lib/relational/isinf.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/relational/isinf.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/relational/isinf.cl (original)
+++ libclc/trunk/generic/lib/relational/isinf.cl Thu May 17 15:55:30 2018
@@ -14,5 +14,17 @@ _CLC_DEF _CLC_OVERLOAD int isinf(double
 }
 
 _CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(long, isinf, double)
+#endif
+
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+// The scalar version of isinf(half) returns an int, but the vector versions
+// return short.
+_CLC_DEF _CLC_OVERLOAD int isinf(half x) {
+  return __builtin_isinf(x);
+}
 
+_CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(short, isinf, half)
 #endif

Modified: libclc/trunk/generic/lib/relational/isless.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/relational/isless.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/relational/isless.cl (original)
+++ libclc/trunk/generic/lib/relational/isless.cl Thu May 17 15:55:30 2018
@@ -20,3 +20,17 @@ _CLC_DEF _CLC_OVERLOAD int isless(double
 _CLC_DEFINE_RELATIONAL_BINARY_VEC_ALL(long, isless, double, double)
 
 #endif
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+// The scalar version of isless(half, half) returns an int, but the vector 
versions
+// return short.
+
+_CLC_DEF _CLC_OVERLOAD int isless(half x, half y){
+       return __builtin_isless(x, y);
+}
+
+_CLC_DEFINE_RELATIONAL_BINARY_VEC_ALL(short, isless, half, half)
+
+#endif

Modified: libclc/trunk/generic/lib/relational/islessequal.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/relational/islessequal.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/relational/islessequal.cl (original)
+++ libclc/trunk/generic/lib/relational/islessequal.cl Thu May 17 15:55:30 2018
@@ -20,3 +20,17 @@ _CLC_DEF _CLC_OVERLOAD int islessequal(d
 _CLC_DEFINE_RELATIONAL_BINARY_VEC_ALL(long, islessequal, double, double)
 
 #endif
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+// The scalar version of islessequal(half, half) returns an int, but the 
vector versions
+// return short.
+
+_CLC_DEF _CLC_OVERLOAD int islessequal(half x, half y){
+       return __builtin_islessequal(x, y);
+}
+
+_CLC_DEFINE_RELATIONAL_BINARY_VEC_ALL(short, islessequal, half, half)
+
+#endif

Modified: libclc/trunk/generic/lib/relational/islessgreater.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/relational/islessgreater.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/relational/islessgreater.cl (original)
+++ libclc/trunk/generic/lib/relational/islessgreater.cl Thu May 17 15:55:30 
2018
@@ -20,3 +20,17 @@ _CLC_DEF _CLC_OVERLOAD int islessgreater
 _CLC_DEFINE_RELATIONAL_BINARY_VEC_ALL(long, islessgreater, double, double)
 
 #endif
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+// The scalar version of islessgreater(half, half) returns an int, but the 
vector versions
+// return short.
+
+_CLC_DEF _CLC_OVERLOAD int islessgreater(half x, half y){
+       return __builtin_islessgreater(x, y);
+}
+
+_CLC_DEFINE_RELATIONAL_BINARY_VEC_ALL(short, islessgreater, half, half)
+
+#endif

Modified: libclc/trunk/generic/lib/relational/isnan.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/relational/isnan.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/relational/isnan.cl (original)
+++ libclc/trunk/generic/lib/relational/isnan.cl Thu May 17 15:55:30 2018
@@ -16,3 +16,17 @@ _CLC_DEF _CLC_OVERLOAD int isnan(double
 _CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(long, isnan, double)
 
 #endif
+
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+// The scalar version of isnan(half) returns an int, but the vector versions
+// return short.
+_CLC_DEF _CLC_OVERLOAD int isnan(half x) {
+  return __builtin_isnan(x);
+}
+
+_CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(short, isnan, half)
+
+#endif

Modified: libclc/trunk/generic/lib/relational/isnormal.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/relational/isnormal.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/relational/isnormal.cl (original)
+++ libclc/trunk/generic/lib/relational/isnormal.cl Thu May 17 15:55:30 2018
@@ -16,3 +16,16 @@ _CLC_DEF _CLC_OVERLOAD int isnormal(doub
 _CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(long, isnormal, double)
 
 #endif
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+// The scalar version of isnormal(half) returns an int, but the vector versions
+// return short.
+_CLC_DEF _CLC_OVERLOAD int isnormal(half x) {
+  return __builtin_isnormal(x);
+}
+
+_CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(short, isnormal, half)
+
+#endif

Modified: libclc/trunk/generic/lib/relational/isnotequal.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/relational/isnotequal.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/relational/isnotequal.cl (original)
+++ libclc/trunk/generic/lib/relational/isnotequal.cl Thu May 17 15:55:30 2018
@@ -19,5 +19,15 @@ _CLC_DEFINE_ISNOTEQUAL(int, isnotequal,
 _CLC_DEFINE_RELATIONAL_BINARY_VEC_ALL(long, isnotequal, double, double)
 
 #endif
+#ifdef cl_khr_fp16
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+// The scalar version of isnotequal(half, half) returns an int, but the vector 
versions
+// return short.
+
+_CLC_DEFINE_ISNOTEQUAL(int, isnotequal, half, half)
+_CLC_DEFINE_RELATIONAL_BINARY_VEC_ALL(short, isnotequal, half, half)
+
+#endif
 
 #undef _CLC_DEFINE_ISNOTEQUAL

Modified: libclc/trunk/generic/lib/relational/isordered.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/relational/isordered.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/relational/isordered.cl (original)
+++ libclc/trunk/generic/lib/relational/isordered.cl Thu May 17 15:55:30 2018
@@ -19,5 +19,15 @@ _CLC_DEFINE_ISORDERED(int, isordered, do
 _CLC_DEFINE_RELATIONAL_BINARY_VEC_ALL(long, isordered, double, double)
 
 #endif
+#ifdef cl_khr_fp16
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+// The scalar version of isordered(half, half) returns an int, but the vector 
versions
+// return short.
+
+_CLC_DEFINE_ISORDERED(int, isordered, half, half)
+_CLC_DEFINE_RELATIONAL_BINARY_VEC_ALL(short, isordered, half, half)
+
+#endif
 
 #undef _CLC_DEFINE_ISORDERED

Modified: libclc/trunk/generic/lib/relational/isunordered.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/relational/isunordered.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/relational/isunordered.cl (original)
+++ libclc/trunk/generic/lib/relational/isunordered.cl Thu May 17 15:55:30 2018
@@ -20,3 +20,17 @@ _CLC_DEF _CLC_OVERLOAD int isunordered(d
 _CLC_DEFINE_RELATIONAL_BINARY_VEC_ALL(long, isunordered, double, double)
 
 #endif
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+// The scalar version of isunordered(half, half) returns an int, but the 
vector versions
+// return short.
+
+_CLC_DEF _CLC_OVERLOAD int isunordered(half x, half y){
+       return __builtin_isunordered(x, y);
+}
+
+_CLC_DEFINE_RELATIONAL_BINARY_VEC_ALL(short, isunordered, half, half)
+
+#endif

Modified: libclc/trunk/generic/lib/relational/signbit.cl
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/relational/signbit.cl?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/relational/signbit.cl (original)
+++ libclc/trunk/generic/lib/relational/signbit.cl Thu May 17 15:55:30 2018
@@ -17,3 +17,17 @@ _CLC_DEF _CLC_OVERLOAD int signbit(doubl
 _CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(long, signbit, double)
 
 #endif
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+// The scalar version of signbit(half) returns an int, but the vector versions
+// return short.
+
+_CLC_DEF _CLC_OVERLOAD int signbit(half x){
+       return __builtin_signbit(x);
+}
+
+_CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(short, signbit, half)
+
+#endif

Modified: libclc/trunk/generic/lib/shared/vstore_half.inc
URL: 
http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/shared/vstore_half.inc?rev=332677&r1=332676&r2=332677&view=diff
==============================================================================
--- libclc/trunk/generic/lib/shared/vstore_half.inc (original)
+++ libclc/trunk/generic/lib/shared/vstore_half.inc Thu May 17 15:55:30 2018
@@ -1,4 +1,5 @@
-
+// This does not exist for fp16
+#if __CLC_FPSIZE > 16
 #ifdef __CLC_VECSIZE
 
 #if __CLC_VECSIZE == 3
@@ -17,3 +18,4 @@
   FUNC(, 1, 1, __CLC_GENTYPE, __CLC_SCALAR_GENTYPE, __local);
   FUNC(, 1, 1, __CLC_GENTYPE, __CLC_SCALAR_GENTYPE, __global);
 #endif
+#endif


_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to