[libclc] [libclc] Move conversion builtins to the CLC library (PR #124727)

Fraser Cormack via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 28 02:44:23 PST 2025


https://github.com/frasercrmck updated https://github.com/llvm/llvm-project/pull/124727

>From c87a1e7c0bd087241f4c9d16d9d115654e2bd85f Mon Sep 17 00:00:00 2001
From: Fraser Cormack <fraser at codeplay.com>
Date: Thu, 7 Nov 2024 12:40:56 +0000
Subject: [PATCH 1/6] [libclc] Move sign to the CLC builtins library

This patch necessitates some changes to how CLSPV and SPIR-V targets are
built. This is the first patch in this series in which an OpenCL
function declaration has been called from the CLC library for these
targets. Since libclc's OpenCL headers aren't being included at this
stage, the OpenCL sign function isn't available. To fix this, these two
libclc targets now have clang declare OpenCL builtins when building the
internal CLC library.

The __CLC_INTERNAL preprocessor definition has been repurposed (without
the leading underscores) to be passed when building the internal CLC
library. It was only used in one other place to guard an extra maths
preprocessor definition, which we can do unconditionally.

There are no changes (with llvm-diff) to any libclc target other than
SPIR-V, which now has OpenCL sign call __clc_sign.
---
 libclc/CMakeLists.txt                         | 11 ++-
 libclc/clc/include/clc/common/clc_sign.h      | 17 ++++
 libclc/clc/include/clc/common/floatn.inc      | 85 +++++++++++++++++++
 libclc/clc/include/clc/common/unary_def.inc   |  7 ++
 libclc/clc/lib/generic/SOURCES                |  1 +
 libclc/clc/lib/generic/common/clc_sign.cl     | 38 +++++++++
 libclc/clc/lib/spirv/SOURCES                  |  1 +
 libclc/clc/lib/spirv64/SOURCES                |  1 +
 .../generic/include/clc/float/definitions.h   |  4 +-
 libclc/generic/lib/common/sign.cl             | 37 +-------
 10 files changed, 164 insertions(+), 38 deletions(-)
 create mode 100644 libclc/clc/include/clc/common/clc_sign.h
 create mode 100644 libclc/clc/include/clc/common/floatn.inc
 create mode 100644 libclc/clc/include/clc/common/unary_def.inc
 create mode 100644 libclc/clc/lib/generic/common/clc_sign.cl

diff --git a/libclc/CMakeLists.txt b/libclc/CMakeLists.txt
index 2c2c7f16e29442..68ce43605b8dd6 100644
--- a/libclc/CMakeLists.txt
+++ b/libclc/CMakeLists.txt
@@ -347,7 +347,6 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
     string( TOUPPER "CLC_${MACRO_ARCH}" CLC_TARGET_DEFINE )
 
     list( APPEND build_flags
-      -D__CLC_INTERNAL
       -D${CLC_TARGET_DEFINE}
       # All libclc builtin libraries see CLC headers
       -I${CMAKE_CURRENT_SOURCE_DIR}/clc/include
@@ -359,12 +358,20 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
       list( APPEND build_flags -mcpu=${cpu} )
     endif()
 
+    set( clc_build_flags ${build_flags} -DCLC_INTERNAL )
+
+    # clspv and spir-v targets remap some CLC functions to OpenCL builtins.
+    # Automatically provide those declarations to the compiler for CLC builtins.
+    if ( ARCH STREQUAL spirv OR ARCH STREQUAL spirv64 OR ARCH STREQUAL clspv OR ARCH STREQUAL clspv64 )
+      list( APPEND clc_build_flags -Xclang -fdeclare-opencl-builtins )
+    endif()
+
     add_libclc_builtin_set(
       CLC_INTERNAL
       ARCH ${ARCH}
       ARCH_SUFFIX clc-${arch_suffix}
       TRIPLE ${clang_triple}
-      COMPILE_FLAGS ${build_flags}
+      COMPILE_FLAGS ${clc_build_flags}
       OPT_FLAGS ${opt_flags}
       LIB_FILES ${clc_lib_files}
     )
diff --git a/libclc/clc/include/clc/common/clc_sign.h b/libclc/clc/include/clc/common/clc_sign.h
new file mode 100644
index 00000000000000..bda4fa65dfa890
--- /dev/null
+++ b/libclc/clc/include/clc/common/clc_sign.h
@@ -0,0 +1,17 @@
+#ifndef __CLC_COMMON_CLC_SIGN_H__
+#define __CLC_COMMON_CLC_SIGN_H__
+
+#if defined(CLC_CLSPV)
+// clspv targets provide their own OpenCL-compatible sign
+#define __clc_sign sign
+#else
+
+#define __CLC_FUNCTION __clc_sign
+#define __CLC_BODY <clc/math/unary_decl.inc>
+#include <clc/math/gentype.inc>
+#undef __CLC_FUNCTION
+#undef __CLC_BODY
+
+#endif
+
+#endif // __CLC_COMMON_CLC_SIGN_H__
diff --git a/libclc/clc/include/clc/common/floatn.inc b/libclc/clc/include/clc/common/floatn.inc
new file mode 100644
index 00000000000000..2c4285d5bcbc58
--- /dev/null
+++ b/libclc/clc/include/clc/common/floatn.inc
@@ -0,0 +1,85 @@
+#define __CLC_FLOATN float
+#include __CLC_BODY
+#undef __CLC_FLOATN
+
+#define __CLC_FLOATN float2
+#include __CLC_BODY
+#undef __CLC_FLOATN
+
+#define __CLC_FLOATN float3
+#include __CLC_BODY
+#undef __CLC_FLOATN
+
+#define __CLC_FLOATN float4
+#include __CLC_BODY
+#undef __CLC_FLOATN
+
+#define __CLC_FLOATN float8
+#include __CLC_BODY
+#undef __CLC_FLOATN
+
+#define __CLC_FLOATN float16
+#include __CLC_BODY
+#undef __CLC_FLOATN
+
+#undef __CLC_FLOAT
+#undef __CLC_INT
+
+#ifdef cl_khr_fp64
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+#define __CLC_FLOATN double
+#include __CLC_BODY
+#undef __CLC_FLOATN
+
+#define __CLC_FLOATN double2
+#include __CLC_BODY
+#undef __CLC_FLOATN
+
+#define __CLC_FLOATN double3
+#include __CLC_BODY
+#undef __CLC_FLOATN
+
+#define __CLC_FLOATN double4
+#include __CLC_BODY
+#undef __CLC_FLOATN
+
+#define __CLC_FLOATN double8
+#include __CLC_BODY
+#undef __CLC_FLOATN
+
+#define __CLC_FLOATN double16
+#include __CLC_BODY
+#undef __CLC_FLOATN
+
+#endif
+#ifdef cl_khr_fp16
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+#define __CLC_FLOATN half
+#include __CLC_BODY
+#undef __CLC_FLOATN
+
+#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
+
+#define __CLC_FLOATN half8
+#include __CLC_BODY
+#undef __CLC_FLOATN
+
+#define __CLC_FLOATN half16
+#include __CLC_BODY
+#undef __CLC_FLOATN
+
+#endif
+
+#undef __CLC_BODY
diff --git a/libclc/clc/include/clc/common/unary_def.inc b/libclc/clc/include/clc/common/unary_def.inc
new file mode 100644
index 00000000000000..d4a3bf80775f0e
--- /dev/null
+++ b/libclc/clc/include/clc/common/unary_def.inc
@@ -0,0 +1,7 @@
+#include <clc/utils.h>
+
+#define __CLC_FUNCTION(x) __CLC_CONCAT(__clc_, x)
+
+_CLC_OVERLOAD _CLC_DEF __CLC_FLOATN FUNCTION(__CLC_FLOATN a) {
+  return __CLC_FUNCTION(FUNCTION)(a);
+}
diff --git a/libclc/clc/lib/generic/SOURCES b/libclc/clc/lib/generic/SOURCES
index 9feda65c45f4bf..e46766bfe1e25a 100644
--- a/libclc/clc/lib/generic/SOURCES
+++ b/libclc/clc/lib/generic/SOURCES
@@ -1,5 +1,6 @@
 common/clc_degrees.cl
 common/clc_radians.cl
+common/clc_sign.cl
 common/clc_smoothstep.cl
 geometric/clc_dot.cl
 integer/clc_abs.cl
diff --git a/libclc/clc/lib/generic/common/clc_sign.cl b/libclc/clc/lib/generic/common/clc_sign.cl
new file mode 100644
index 00000000000000..6c4db4af3f4c57
--- /dev/null
+++ b/libclc/clc/lib/generic/common/clc_sign.cl
@@ -0,0 +1,38 @@
+#include <clc/clcmacro.h>
+#include <clc/internal/clc.h>
+#include <clc/relational/clc_isnan.h>
+
+#define CLC_SIGN(TYPE, F)                                                      \
+  _CLC_DEF _CLC_OVERLOAD TYPE __clc_sign(TYPE x) {                             \
+    if (__clc_isnan(x)) {                                                      \
+      return 0.0F;                                                             \
+    }                                                                          \
+    if (x > 0.0F) {                                                            \
+      return 1.0F;                                                             \
+    }                                                                          \
+    if (x < 0.0F) {                                                            \
+      return -1.0F;                                                            \
+    }                                                                          \
+    return x; /* -0.0 or +0.0 */                                               \
+  }
+
+CLC_SIGN(float, f)
+_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, __clc_sign, float)
+
+#ifdef cl_khr_fp64
+
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+CLC_SIGN(double, )
+_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, __clc_sign, double)
+
+#endif
+
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+CLC_SIGN(half, )
+_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, half, __clc_sign, half)
+
+#endif
diff --git a/libclc/clc/lib/spirv/SOURCES b/libclc/clc/lib/spirv/SOURCES
index 509236d587cd01..0177131903d592 100644
--- a/libclc/clc/lib/spirv/SOURCES
+++ b/libclc/clc/lib/spirv/SOURCES
@@ -1,5 +1,6 @@
 ../generic/common/clc_degrees.cl
 ../generic/common/clc_radians.cl
+../generic/common/clc_sign.cl
 ../generic/common/clc_smoothstep.cl
 ../generic/geometric/clc_dot.cl
 ../generic/math/clc_ceil.cl
diff --git a/libclc/clc/lib/spirv64/SOURCES b/libclc/clc/lib/spirv64/SOURCES
index 509236d587cd01..0177131903d592 100644
--- a/libclc/clc/lib/spirv64/SOURCES
+++ b/libclc/clc/lib/spirv64/SOURCES
@@ -1,5 +1,6 @@
 ../generic/common/clc_degrees.cl
 ../generic/common/clc_radians.cl
+../generic/common/clc_sign.cl
 ../generic/common/clc_smoothstep.cl
 ../generic/geometric/clc_dot.cl
 ../generic/math/clc_ceil.cl
diff --git a/libclc/generic/include/clc/float/definitions.h b/libclc/generic/include/clc/float/definitions.h
index 62501230c92de2..be3d0130f3e614 100644
--- a/libclc/generic/include/clc/float/definitions.h
+++ b/libclc/generic/include/clc/float/definitions.h
@@ -31,9 +31,7 @@
 #define M_SQRT2_F       0x1.6a09e6p+0f
 #define M_SQRT1_2_F     0x1.6a09e6p-1f
 
-#ifdef __CLC_INTERNAL
-#define M_LOG210_F      0x1.a934f0p+1f
-#endif
+#define M_LOG210_F 0x1.a934f0p+1f
 
 #ifdef cl_khr_fp64
 
diff --git a/libclc/generic/lib/common/sign.cl b/libclc/generic/lib/common/sign.cl
index ad8f7405e0cb30..5e70ef73f3f45c 100644
--- a/libclc/generic/lib/common/sign.cl
+++ b/libclc/generic/lib/common/sign.cl
@@ -1,37 +1,8 @@
 #include <clc/clc.h>
 #include <clc/clcmacro.h>
+#include <clc/common/clc_sign.h>
 
-#define SIGN(TYPE, F) \
-_CLC_DEF _CLC_OVERLOAD TYPE sign(TYPE x) { \
-  if (isnan(x)) { \
-    return 0.0F;   \
-  }               \
-  if (x > 0.0F) { \
-    return 1.0F;  \
-  }               \
-  if (x < 0.0F) { \
-    return -1.0F; \
-  }               \
-  return x; /* -0.0 or +0.0 */  \
-}
+#define FUNCTION sign
+#define __CLC_BODY <clc/common/unary_def.inc>
 
-SIGN(float, f)
-_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, sign, float)
-
-#ifdef cl_khr_fp64
-
-#pragma OPENCL EXTENSION cl_khr_fp64 : enable
-
-SIGN(double, )
-_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, sign, double)
-
-#endif
-
-#ifdef cl_khr_fp16
-
-#pragma OPENCL EXTENSION cl_khr_fp16 : enable
-
-SIGN(half,)
-_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, half, sign, half)
-
-#endif
+#include <clc/common/floatn.inc>

>From 11746028b50538b15cf345a58240ef2359ad6c52 Mon Sep 17 00:00:00 2001
From: Fraser Cormack <fraser at codeplay.com>
Date: Mon, 20 Jan 2025 18:42:37 +0000
Subject: [PATCH 2/6] optimize via vectors

---
 libclc/clc/include/clc/math/gentype.inc    | 42 ++++++++++++++++++++++
 libclc/clc/lib/generic/common/clc_sign.cl  | 39 ++------------------
 libclc/clc/lib/generic/common/clc_sign.inc | 21 +++++++++++
 libclc/generic/lib/common/sign.cl          | 17 +++++++--
 4 files changed, 80 insertions(+), 39 deletions(-)
 create mode 100644 libclc/clc/lib/generic/common/clc_sign.inc

diff --git a/libclc/clc/include/clc/math/gentype.inc b/libclc/clc/include/clc/math/gentype.inc
index 87719f2d9bc0e7..3c80f1c6172ad0 100644
--- a/libclc/clc/include/clc/math/gentype.inc
+++ b/libclc/clc/include/clc/math/gentype.inc
@@ -3,55 +3,69 @@
 
 #define __CLC_SCALAR_GENTYPE float
 #define __CLC_FPSIZE 32
+#define __CLC_FP_LIT(x) x##F
 
 #define __CLC_GENTYPE float
 #define __CLC_INTN int
+#define __CLC_BIT_INTN int
 #define __CLC_SCALAR
 #include __CLC_BODY
 #undef __CLC_GENTYPE
+#undef __CLC_BIT_INTN
 #undef __CLC_INTN
 #undef __CLC_SCALAR
 
 #define __CLC_GENTYPE float2
 #define __CLC_INTN int2
+#define __CLC_BIT_INTN int2
 #define __CLC_VECSIZE 2
 #include __CLC_BODY
 #undef __CLC_VECSIZE
 #undef __CLC_GENTYPE
+#undef __CLC_BIT_INTN
 #undef __CLC_INTN
 
 #define __CLC_GENTYPE float3
 #define __CLC_INTN int3
+#define __CLC_BIT_INTN int3
 #define __CLC_VECSIZE 3
 #include __CLC_BODY
 #undef __CLC_VECSIZE
 #undef __CLC_GENTYPE
+#undef __CLC_BIT_INTN
 #undef __CLC_INTN
 
 #define __CLC_GENTYPE float4
 #define __CLC_INTN int4
+#define __CLC_BIT_INTN int4
 #define __CLC_VECSIZE 4
 #include __CLC_BODY
 #undef __CLC_VECSIZE
 #undef __CLC_GENTYPE
+#undef __CLC_BIT_INTN
 #undef __CLC_INTN
 
 #define __CLC_GENTYPE float8
 #define __CLC_INTN int8
+#define __CLC_BIT_INTN int8
 #define __CLC_VECSIZE 8
 #include __CLC_BODY
 #undef __CLC_VECSIZE
 #undef __CLC_GENTYPE
+#undef __CLC_BIT_INTN
 #undef __CLC_INTN
 
 #define __CLC_GENTYPE float16
 #define __CLC_INTN int16
+#define __CLC_BIT_INTN int16
 #define __CLC_VECSIZE 16
 #include __CLC_BODY
 #undef __CLC_VECSIZE
 #undef __CLC_GENTYPE
+#undef __CLC_BIT_INTN
 #undef __CLC_INTN
 
+#undef __CLC_FP_LIT
 #undef __CLC_FPSIZE
 #undef __CLC_SCALAR_GENTYPE
 
@@ -61,55 +75,69 @@
 
 #define __CLC_SCALAR_GENTYPE double
 #define __CLC_FPSIZE 64
+#define __CLC_FP_LIT(x) (x)
 
 #define __CLC_SCALAR
 #define __CLC_GENTYPE double
 #define __CLC_INTN int
+#define __CLC_BIT_INTN long
 #include __CLC_BODY
 #undef __CLC_GENTYPE
+#undef __CLC_BIT_INTN
 #undef __CLC_INTN
 #undef __CLC_SCALAR
 
 #define __CLC_GENTYPE double2
 #define __CLC_INTN int2
+#define __CLC_BIT_INTN long2
 #define __CLC_VECSIZE 2
 #include __CLC_BODY
 #undef __CLC_VECSIZE
 #undef __CLC_GENTYPE
+#undef __CLC_BIT_INTN
 #undef __CLC_INTN
 
 #define __CLC_GENTYPE double3
 #define __CLC_INTN int3
+#define __CLC_BIT_INTN long3
 #define __CLC_VECSIZE 3
 #include __CLC_BODY
 #undef __CLC_VECSIZE
 #undef __CLC_GENTYPE
+#undef __CLC_BIT_INTN
 #undef __CLC_INTN
 
 #define __CLC_GENTYPE double4
 #define __CLC_INTN int4
+#define __CLC_BIT_INTN long4
 #define __CLC_VECSIZE 4
 #include __CLC_BODY
 #undef __CLC_VECSIZE
 #undef __CLC_GENTYPE
+#undef __CLC_BIT_INTN
 #undef __CLC_INTN
 
 #define __CLC_GENTYPE double8
 #define __CLC_INTN int8
+#define __CLC_BIT_INTN long8
 #define __CLC_VECSIZE 8
 #include __CLC_BODY
 #undef __CLC_VECSIZE
 #undef __CLC_GENTYPE
+#undef __CLC_BIT_INTN
 #undef __CLC_INTN
 
 #define __CLC_GENTYPE double16
 #define __CLC_INTN int16
+#define __CLC_BIT_INTN long16
 #define __CLC_VECSIZE 16
 #include __CLC_BODY
 #undef __CLC_VECSIZE
 #undef __CLC_GENTYPE
+#undef __CLC_BIT_INTN
 #undef __CLC_INTN
 
+#undef __CLC_FP_LIT
 #undef __CLC_FPSIZE
 #undef __CLC_SCALAR_GENTYPE
 #endif
@@ -121,55 +149,69 @@
 
 #define __CLC_SCALAR_GENTYPE half
 #define __CLC_FPSIZE 16
+#define __CLC_FP_LIT(x) x##H
 
 #define __CLC_SCALAR
 #define __CLC_GENTYPE half
 #define __CLC_INTN int
+#define __CLC_BIT_INTN short
 #include __CLC_BODY
 #undef __CLC_GENTYPE
+#undef __CLC_BIT_INTN
 #undef __CLC_INTN
 #undef __CLC_SCALAR
 
 #define __CLC_GENTYPE half2
 #define __CLC_INTN int2
+#define __CLC_BIT_INTN short2
 #define __CLC_VECSIZE 2
 #include __CLC_BODY
 #undef __CLC_VECSIZE
 #undef __CLC_GENTYPE
+#undef __CLC_BIT_INTN
 #undef __CLC_INTN
 
 #define __CLC_GENTYPE half3
 #define __CLC_INTN int3
+#define __CLC_BIT_INTN short3
 #define __CLC_VECSIZE 3
 #include __CLC_BODY
 #undef __CLC_VECSIZE
 #undef __CLC_GENTYPE
+#undef __CLC_BIT_INTN
 #undef __CLC_INTN
 
 #define __CLC_GENTYPE half4
 #define __CLC_INTN int4
+#define __CLC_BIT_INTN short4
 #define __CLC_VECSIZE 4
 #include __CLC_BODY
 #undef __CLC_VECSIZE
 #undef __CLC_GENTYPE
+#undef __CLC_BIT_INTN
 #undef __CLC_INTN
 
 #define __CLC_GENTYPE half8
 #define __CLC_INTN int8
+#define __CLC_BIT_INTN short8
 #define __CLC_VECSIZE 8
 #include __CLC_BODY
 #undef __CLC_VECSIZE
 #undef __CLC_GENTYPE
+#undef __CLC_BIT_INTN
 #undef __CLC_INTN
 
 #define __CLC_GENTYPE half16
 #define __CLC_INTN int16
+#define __CLC_BIT_INTN short16
 #define __CLC_VECSIZE 16
 #include __CLC_BODY
 #undef __CLC_VECSIZE
 #undef __CLC_GENTYPE
+#undef __CLC_BIT_INTN
 #undef __CLC_INTN
 
+#undef __CLC_FP_LIT
 #undef __CLC_FPSIZE
 #undef __CLC_SCALAR_GENTYPE
 #endif
diff --git a/libclc/clc/lib/generic/common/clc_sign.cl b/libclc/clc/lib/generic/common/clc_sign.cl
index 6c4db4af3f4c57..752808b0d84d63 100644
--- a/libclc/clc/lib/generic/common/clc_sign.cl
+++ b/libclc/clc/lib/generic/common/clc_sign.cl
@@ -1,38 +1,5 @@
-#include <clc/clcmacro.h>
-#include <clc/internal/clc.h>
 #include <clc/relational/clc_isnan.h>
+#include <clc/relational/clc_select.h>
 
-#define CLC_SIGN(TYPE, F)                                                      \
-  _CLC_DEF _CLC_OVERLOAD TYPE __clc_sign(TYPE x) {                             \
-    if (__clc_isnan(x)) {                                                      \
-      return 0.0F;                                                             \
-    }                                                                          \
-    if (x > 0.0F) {                                                            \
-      return 1.0F;                                                             \
-    }                                                                          \
-    if (x < 0.0F) {                                                            \
-      return -1.0F;                                                            \
-    }                                                                          \
-    return x; /* -0.0 or +0.0 */                                               \
-  }
-
-CLC_SIGN(float, f)
-_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, __clc_sign, float)
-
-#ifdef cl_khr_fp64
-
-#pragma OPENCL EXTENSION cl_khr_fp64 : enable
-
-CLC_SIGN(double, )
-_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, __clc_sign, double)
-
-#endif
-
-#ifdef cl_khr_fp16
-
-#pragma OPENCL EXTENSION cl_khr_fp16 : enable
-
-CLC_SIGN(half, )
-_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, half, __clc_sign, half)
-
-#endif
+#define __CLC_BODY <clc_sign.inc>
+#include <clc/math/gentype.inc>
diff --git a/libclc/clc/lib/generic/common/clc_sign.inc b/libclc/clc/lib/generic/common/clc_sign.inc
new file mode 100644
index 00000000000000..b28b371bb44a98
--- /dev/null
+++ b/libclc/clc/lib/generic/common/clc_sign.inc
@@ -0,0 +1,21 @@
+// TYPE sign(TYPE x) {
+//   if (isnan(x)) {
+//     return 0.0F;
+//   }
+//   if (x > 0.0F) {
+//     return 1.0F;
+//   }
+//   if (x < 0.0F) {
+//     return -1.0F;
+//   }
+//   return x; /* -0.0 or +0.0 */
+// }
+_CLC_DEF _CLC_OVERLOAD __CLC_GENTYPE __clc_sign(__CLC_GENTYPE x) {
+  __CLC_BIT_INTN x_isnan = __clc_isnan(x);
+  __CLC_BIT_INTN x_isgreater_zero = x > __CLC_FP_LIT(0.0);
+  __CLC_BIT_INTN x_isless_zero = x < __CLC_FP_LIT(0.0);
+  __CLC_GENTYPE sel0 = __clc_select(x, __CLC_FP_LIT(1.0), x_isgreater_zero);
+  __CLC_GENTYPE sel1 = __clc_select(sel0, __CLC_FP_LIT(-1.0), x_isless_zero);
+  __CLC_GENTYPE sel2 = __clc_select(sel1, __CLC_FP_LIT(0.0), x_isnan);
+  return sel2;
+}
diff --git a/libclc/generic/lib/common/sign.cl b/libclc/generic/lib/common/sign.cl
index 5e70ef73f3f45c..91b21ae437632f 100644
--- a/libclc/generic/lib/common/sign.cl
+++ b/libclc/generic/lib/common/sign.cl
@@ -2,7 +2,18 @@
 #include <clc/clcmacro.h>
 #include <clc/common/clc_sign.h>
 
-#define FUNCTION sign
-#define __CLC_BODY <clc/common/unary_def.inc>
+_CLC_DEFINE_UNARY_BUILTIN(float, sign, __clc_sign, float)
 
-#include <clc/common/floatn.inc>
+#ifdef cl_khr_fp64
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+_CLC_DEFINE_UNARY_BUILTIN(double, sign, __clc_sign, double)
+
+#endif
+
+#ifdef cl_khr_fp16
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+_CLC_DEFINE_UNARY_BUILTIN(half, sign, __clc_sign, half)
+
+#endif

>From 05bffe5373bd6fab43a79d324e3a21eb86a7376a Mon Sep 17 00:00:00 2001
From: Fraser Cormack <fraser at codeplay.com>
Date: Mon, 20 Jan 2025 18:53:33 +0000
Subject: [PATCH 3/6] simplify

---
 libclc/clc/include/clc/common/unary_def.inc |  2 ++
 libclc/generic/lib/common/sign.cl           | 17 +++--------------
 2 files changed, 5 insertions(+), 14 deletions(-)

diff --git a/libclc/clc/include/clc/common/unary_def.inc b/libclc/clc/include/clc/common/unary_def.inc
index d4a3bf80775f0e..a59e5d7203aee8 100644
--- a/libclc/clc/include/clc/common/unary_def.inc
+++ b/libclc/clc/include/clc/common/unary_def.inc
@@ -1,6 +1,8 @@
 #include <clc/utils.h>
 
+#ifndef __CLC_FUNCTION
 #define __CLC_FUNCTION(x) __CLC_CONCAT(__clc_, x)
+#endif
 
 _CLC_OVERLOAD _CLC_DEF __CLC_FLOATN FUNCTION(__CLC_FLOATN a) {
   return __CLC_FUNCTION(FUNCTION)(a);
diff --git a/libclc/generic/lib/common/sign.cl b/libclc/generic/lib/common/sign.cl
index 91b21ae437632f..77006bb28df4c2 100644
--- a/libclc/generic/lib/common/sign.cl
+++ b/libclc/generic/lib/common/sign.cl
@@ -2,18 +2,7 @@
 #include <clc/clcmacro.h>
 #include <clc/common/clc_sign.h>
 
-_CLC_DEFINE_UNARY_BUILTIN(float, sign, __clc_sign, float)
+#define FUNCTION sign
+#define __CLC_BODY "unary_def.inc"
 
-#ifdef cl_khr_fp64
-#pragma OPENCL EXTENSION cl_khr_fp64 : enable
-
-_CLC_DEFINE_UNARY_BUILTIN(double, sign, __clc_sign, double)
-
-#endif
-
-#ifdef cl_khr_fp16
-#pragma OPENCL EXTENSION cl_khr_fp16 : enable
-
-_CLC_DEFINE_UNARY_BUILTIN(half, sign, __clc_sign, half)
-
-#endif
+#include <clc/common/floatn.inc>

>From 2af4a64c31e55c0be9c4770027338005c3bd7afb Mon Sep 17 00:00:00 2001
From: Fraser Cormack <fraser at codeplay.com>
Date: Wed, 22 Jan 2025 16:29:39 +0000
Subject: [PATCH 4/6] undo spir-v changes

---
 libclc/CMakeLists.txt                         |  6 --
 libclc/clc/include/clc/common/clc_sign.h      |  7 --
 libclc/clc/include/clc/common/floatn.inc      | 85 -------------------
 .../clc/{common => shared}/unary_def.inc      |  2 +-
 libclc/clc/lib/clspv/SOURCES                  |  2 +
 libclc/clc/lib/spirv/SOURCES                  |  1 +
 libclc/clc/lib/spirv64/SOURCES                |  1 +
 libclc/generic/lib/common/sign.cl             |  4 +-
 8 files changed, 7 insertions(+), 101 deletions(-)
 delete mode 100644 libclc/clc/include/clc/common/floatn.inc
 rename libclc/clc/include/clc/{common => shared}/unary_def.inc (69%)

diff --git a/libclc/CMakeLists.txt b/libclc/CMakeLists.txt
index 68ce43605b8dd6..624bbe68514ef3 100644
--- a/libclc/CMakeLists.txt
+++ b/libclc/CMakeLists.txt
@@ -360,12 +360,6 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
 
     set( clc_build_flags ${build_flags} -DCLC_INTERNAL )
 
-    # clspv and spir-v targets remap some CLC functions to OpenCL builtins.
-    # Automatically provide those declarations to the compiler for CLC builtins.
-    if ( ARCH STREQUAL spirv OR ARCH STREQUAL spirv64 OR ARCH STREQUAL clspv OR ARCH STREQUAL clspv64 )
-      list( APPEND clc_build_flags -Xclang -fdeclare-opencl-builtins )
-    endif()
-
     add_libclc_builtin_set(
       CLC_INTERNAL
       ARCH ${ARCH}
diff --git a/libclc/clc/include/clc/common/clc_sign.h b/libclc/clc/include/clc/common/clc_sign.h
index bda4fa65dfa890..1847fbf69bf60c 100644
--- a/libclc/clc/include/clc/common/clc_sign.h
+++ b/libclc/clc/include/clc/common/clc_sign.h
@@ -1,17 +1,10 @@
 #ifndef __CLC_COMMON_CLC_SIGN_H__
 #define __CLC_COMMON_CLC_SIGN_H__
 
-#if defined(CLC_CLSPV)
-// clspv targets provide their own OpenCL-compatible sign
-#define __clc_sign sign
-#else
-
 #define __CLC_FUNCTION __clc_sign
 #define __CLC_BODY <clc/math/unary_decl.inc>
 #include <clc/math/gentype.inc>
 #undef __CLC_FUNCTION
 #undef __CLC_BODY
 
-#endif
-
 #endif // __CLC_COMMON_CLC_SIGN_H__
diff --git a/libclc/clc/include/clc/common/floatn.inc b/libclc/clc/include/clc/common/floatn.inc
deleted file mode 100644
index 2c4285d5bcbc58..00000000000000
--- a/libclc/clc/include/clc/common/floatn.inc
+++ /dev/null
@@ -1,85 +0,0 @@
-#define __CLC_FLOATN float
-#include __CLC_BODY
-#undef __CLC_FLOATN
-
-#define __CLC_FLOATN float2
-#include __CLC_BODY
-#undef __CLC_FLOATN
-
-#define __CLC_FLOATN float3
-#include __CLC_BODY
-#undef __CLC_FLOATN
-
-#define __CLC_FLOATN float4
-#include __CLC_BODY
-#undef __CLC_FLOATN
-
-#define __CLC_FLOATN float8
-#include __CLC_BODY
-#undef __CLC_FLOATN
-
-#define __CLC_FLOATN float16
-#include __CLC_BODY
-#undef __CLC_FLOATN
-
-#undef __CLC_FLOAT
-#undef __CLC_INT
-
-#ifdef cl_khr_fp64
-#pragma OPENCL EXTENSION cl_khr_fp64 : enable
-
-#define __CLC_FLOATN double
-#include __CLC_BODY
-#undef __CLC_FLOATN
-
-#define __CLC_FLOATN double2
-#include __CLC_BODY
-#undef __CLC_FLOATN
-
-#define __CLC_FLOATN double3
-#include __CLC_BODY
-#undef __CLC_FLOATN
-
-#define __CLC_FLOATN double4
-#include __CLC_BODY
-#undef __CLC_FLOATN
-
-#define __CLC_FLOATN double8
-#include __CLC_BODY
-#undef __CLC_FLOATN
-
-#define __CLC_FLOATN double16
-#include __CLC_BODY
-#undef __CLC_FLOATN
-
-#endif
-#ifdef cl_khr_fp16
-#pragma OPENCL EXTENSION cl_khr_fp16 : enable
-
-#define __CLC_FLOATN half
-#include __CLC_BODY
-#undef __CLC_FLOATN
-
-#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
-
-#define __CLC_FLOATN half8
-#include __CLC_BODY
-#undef __CLC_FLOATN
-
-#define __CLC_FLOATN half16
-#include __CLC_BODY
-#undef __CLC_FLOATN
-
-#endif
-
-#undef __CLC_BODY
diff --git a/libclc/clc/include/clc/common/unary_def.inc b/libclc/clc/include/clc/shared/unary_def.inc
similarity index 69%
rename from libclc/clc/include/clc/common/unary_def.inc
rename to libclc/clc/include/clc/shared/unary_def.inc
index a59e5d7203aee8..e0f34ad817e8b0 100644
--- a/libclc/clc/include/clc/common/unary_def.inc
+++ b/libclc/clc/include/clc/shared/unary_def.inc
@@ -4,6 +4,6 @@
 #define __CLC_FUNCTION(x) __CLC_CONCAT(__clc_, x)
 #endif
 
-_CLC_OVERLOAD _CLC_DEF __CLC_FLOATN FUNCTION(__CLC_FLOATN a) {
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE FUNCTION(__CLC_GENTYPE a) {
   return __CLC_FUNCTION(FUNCTION)(a);
 }
diff --git a/libclc/clc/lib/clspv/SOURCES b/libclc/clc/lib/clspv/SOURCES
index d5f5c68fd7ebfa..7efa6cf690349f 100644
--- a/libclc/clc/lib/clspv/SOURCES
+++ b/libclc/clc/lib/clspv/SOURCES
@@ -1,3 +1,4 @@
+../generic/common/clc_sign.cl
 ../generic/math/clc_ceil.cl
 ../generic/math/clc_copysign.cl
 ../generic/math/clc_fabs.cl
@@ -6,5 +7,6 @@
 ../generic/math/clc_nextafter.cl
 ../generic/math/clc_rint.cl
 ../generic/math/clc_trunc.cl
+../generic/relational/clc_isnan.cl
 ../generic/relational/clc_select.cl
 ../generic/shared/clc_clamp.cl
diff --git a/libclc/clc/lib/spirv/SOURCES b/libclc/clc/lib/spirv/SOURCES
index 0177131903d592..7cfde52c655de4 100644
--- a/libclc/clc/lib/spirv/SOURCES
+++ b/libclc/clc/lib/spirv/SOURCES
@@ -11,5 +11,6 @@
 ../generic/math/clc_nextafter.cl
 ../generic/math/clc_rint.cl
 ../generic/math/clc_trunc.cl
+../generic/relational/clc_isnan.cl
 ../generic/relational/clc_select.cl
 ../generic/shared/clc_clamp.cl
diff --git a/libclc/clc/lib/spirv64/SOURCES b/libclc/clc/lib/spirv64/SOURCES
index 0177131903d592..7cfde52c655de4 100644
--- a/libclc/clc/lib/spirv64/SOURCES
+++ b/libclc/clc/lib/spirv64/SOURCES
@@ -11,5 +11,6 @@
 ../generic/math/clc_nextafter.cl
 ../generic/math/clc_rint.cl
 ../generic/math/clc_trunc.cl
+../generic/relational/clc_isnan.cl
 ../generic/relational/clc_select.cl
 ../generic/shared/clc_clamp.cl
diff --git a/libclc/generic/lib/common/sign.cl b/libclc/generic/lib/common/sign.cl
index 77006bb28df4c2..2f04d93b3e47e9 100644
--- a/libclc/generic/lib/common/sign.cl
+++ b/libclc/generic/lib/common/sign.cl
@@ -3,6 +3,6 @@
 #include <clc/common/clc_sign.h>
 
 #define FUNCTION sign
-#define __CLC_BODY "unary_def.inc"
+#define __CLC_BODY <clc/shared/unary_def.inc>
 
-#include <clc/common/floatn.inc>
+#include <clc/math/gentype.inc>

>From 4d5e786aa5c769e751d062662897a9882b607344 Mon Sep 17 00:00:00 2001
From: Fraser Cormack <fraser at codeplay.com>
Date: Mon, 11 Nov 2024 15:46:56 +0000
Subject: [PATCH 5/6] [libclc] Move conversion builtins to the CLC library

This commit moves the implementations of conversion builtins to the CLC
library. It keeps the dichotomy of regular vs. clspv implementations of
the conversions. However, for the sake of a consistent interface all CLC
conversion routines are built, even the ones that clspv opts out of in
the user-facing OpenCL layer.

It simultaneously updates the python script to use f-strings for
formatting.
---
 libclc/CMakeLists.txt                         |  30 +-
 libclc/clc/include/clc/clc_convert.h          |  98 +++++
 libclc/clc/include/clc/float/definitions.h    |  88 +++++
 libclc/clc/include/clc/integer/clc_abs.h      |   7 -
 .../include/clc/integer/definitions.h         |   2 +-
 libclc/clc/include/clc/shared/clc_max.h       |   7 -
 libclc/clc/include/clc/shared/clc_min.h       |   7 -
 libclc/generic/include/clc/convert.h          |  83 +++--
 .../generic/include/clc/float/definitions.h   |  88 -----
 libclc/generic/lib/gen_convert.py             | 337 ++++++++----------
 10 files changed, 419 insertions(+), 328 deletions(-)
 create mode 100644 libclc/clc/include/clc/clc_convert.h
 create mode 100644 libclc/clc/include/clc/float/definitions.h
 rename libclc/{generic => clc}/include/clc/integer/definitions.h (91%)
 delete mode 100644 libclc/generic/include/clc/float/definitions.h

diff --git a/libclc/CMakeLists.txt b/libclc/CMakeLists.txt
index 624bbe68514ef3..77658c28e3d07f 100644
--- a/libclc/CMakeLists.txt
+++ b/libclc/CMakeLists.txt
@@ -251,11 +251,27 @@ add_custom_target( "generate_convert.cl" DEPENDS convert.cl )
 set_target_properties( "generate_convert.cl" PROPERTIES FOLDER "libclc/Sourcegenning" )
 
 add_custom_command(
-  OUTPUT clspv-convert.cl
-  COMMAND ${Python3_EXECUTABLE} ${script_loc} --clspv > clspv-convert.cl
+  OUTPUT clc-convert.cl
+  COMMAND ${Python3_EXECUTABLE} ${script_loc} --clc > clc-convert.cl
   DEPENDS ${script_loc} )
-add_custom_target( "clspv-generate_convert.cl" DEPENDS clspv-convert.cl )
-set_target_properties( "clspv-generate_convert.cl" PROPERTIES FOLDER "libclc/Sourcegenning" )
+add_custom_target( "clc-generate_convert.cl" DEPENDS clc-convert.cl )
+set_target_properties( "clc-generate_convert.cl" PROPERTIES FOLDER "libclc/Sourcegenning" )
+
+if ( clspv-- IN_LIST LIBCLC_TARGETS_TO_BUILD OR clspv64-- IN_LIST LIBCLC_TARGETS_TO_BUILD )
+  add_custom_command(
+    OUTPUT clspv-convert.cl
+    COMMAND ${Python3_EXECUTABLE} ${script_loc} --clspv > clspv-convert.cl
+    DEPENDS ${script_loc} )
+  add_custom_target( "clspv-generate_convert.cl" DEPENDS clspv-convert.cl )
+  set_target_properties( "clspv-generate_convert.cl" PROPERTIES FOLDER "libclc/Sourcegenning" )
+
+  add_custom_command(
+    OUTPUT clc-clspv-convert.cl
+    COMMAND ${Python3_EXECUTABLE} ${script_loc} --clc --clspv > clc-clspv-convert.cl
+    DEPENDS ${script_loc} )
+  add_custom_target( "clc-clspv-generate_convert.cl" DEPENDS clc-clspv-convert.cl )
+  set_target_properties( "clc-clspv-generate_convert.cl" PROPERTIES FOLDER "libclc/Sourcegenning" )
+endif()
 
 enable_testing()
 
@@ -285,6 +301,11 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
   endif()
 
   set( clc_lib_files )
+  if( ARCH STREQUAL clspv OR ARCH STREQUAL clspv64 )
+    set( clc_gen_files clc-clspv-convert.cl )
+  else()
+    set( clc_gen_files clc-convert.cl )
+  endif()
   libclc_configure_lib_source(
     clc_lib_files
     CLC_INTERNAL
@@ -368,6 +389,7 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
       COMPILE_FLAGS ${clc_build_flags}
       OPT_FLAGS ${opt_flags}
       LIB_FILES ${clc_lib_files}
+      GEN_FILES ${clc_gen_files}
     )
 
     list( APPEND build_flags
diff --git a/libclc/clc/include/clc/clc_convert.h b/libclc/clc/include/clc/clc_convert.h
new file mode 100644
index 00000000000000..20bbd57540b306
--- /dev/null
+++ b/libclc/clc/include/clc/clc_convert.h
@@ -0,0 +1,98 @@
+#ifndef __CLC_CLC_CONVERT_H__
+#define __CLC_CLC_CONVERT_H__
+
+#define _CLC_CONVERT_DECL(FROM_TYPE, TO_TYPE, SUFFIX)                          \
+  _CLC_OVERLOAD _CLC_DECL TO_TYPE __clc_convert_##TO_TYPE##SUFFIX(FROM_TYPE x);
+
+#define _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, TO_TYPE, SUFFIX)                   \
+  _CLC_CONVERT_DECL(FROM_TYPE, TO_TYPE, SUFFIX)                                \
+  _CLC_CONVERT_DECL(FROM_TYPE##2, TO_TYPE##2, SUFFIX)                          \
+  _CLC_CONVERT_DECL(FROM_TYPE##3, TO_TYPE##3, SUFFIX)                          \
+  _CLC_CONVERT_DECL(FROM_TYPE##4, TO_TYPE##4, SUFFIX)                          \
+  _CLC_CONVERT_DECL(FROM_TYPE##8, TO_TYPE##8, SUFFIX)                          \
+  _CLC_CONVERT_DECL(FROM_TYPE##16, TO_TYPE##16, SUFFIX)
+
+#define _CLC_VECTOR_CONVERT_FROM1(FROM_TYPE, SUFFIX)                           \
+  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, char, SUFFIX)                            \
+  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, uchar, SUFFIX)                           \
+  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, int, SUFFIX)                             \
+  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, uint, SUFFIX)                            \
+  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, short, SUFFIX)                           \
+  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, ushort, SUFFIX)                          \
+  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, long, SUFFIX)                            \
+  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, ulong, SUFFIX)                           \
+  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, float, SUFFIX)
+
+#if defined(cl_khr_fp64) && defined(cl_khr_fp16)
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+#define _CLC_VECTOR_CONVERT_FROM(FROM_TYPE, SUFFIX)                            \
+  _CLC_VECTOR_CONVERT_FROM1(FROM_TYPE, SUFFIX)                                 \
+  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, double, SUFFIX)                          \
+  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, half, SUFFIX)
+#elif defined(cl_khr_fp64)
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+#define _CLC_VECTOR_CONVERT_FROM(FROM_TYPE, SUFFIX)                            \
+  _CLC_VECTOR_CONVERT_FROM1(FROM_TYPE, SUFFIX)                                 \
+  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, double, SUFFIX)
+#elif defined(cl_khr_fp16)
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+#define _CLC_VECTOR_CONVERT_FROM(FROM_TYPE, SUFFIX)                            \
+  _CLC_VECTOR_CONVERT_FROM1(FROM_TYPE, SUFFIX)                                 \
+  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, half, SUFFIX)
+#else
+#define _CLC_VECTOR_CONVERT_FROM(FROM_TYPE, SUFFIX)                            \
+  _CLC_VECTOR_CONVERT_FROM1(FROM_TYPE, SUFFIX)
+#endif
+
+#define _CLC_VECTOR_CONVERT_TO1(SUFFIX)                                        \
+  _CLC_VECTOR_CONVERT_FROM(char, SUFFIX)                                       \
+  _CLC_VECTOR_CONVERT_FROM(uchar, SUFFIX)                                      \
+  _CLC_VECTOR_CONVERT_FROM(int, SUFFIX)                                        \
+  _CLC_VECTOR_CONVERT_FROM(uint, SUFFIX)                                       \
+  _CLC_VECTOR_CONVERT_FROM(short, SUFFIX)                                      \
+  _CLC_VECTOR_CONVERT_FROM(ushort, SUFFIX)                                     \
+  _CLC_VECTOR_CONVERT_FROM(long, SUFFIX)                                       \
+  _CLC_VECTOR_CONVERT_FROM(ulong, SUFFIX)                                      \
+  _CLC_VECTOR_CONVERT_FROM(float, SUFFIX)
+
+#if defined(cl_khr_fp64) && defined(cl_khr_fp16)
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+#define _CLC_VECTOR_CONVERT_TO(SUFFIX)                                         \
+  _CLC_VECTOR_CONVERT_TO1(SUFFIX)                                              \
+  _CLC_VECTOR_CONVERT_FROM(double, SUFFIX)                                     \
+  _CLC_VECTOR_CONVERT_FROM(half, SUFFIX)
+#elif defined(cl_khr_fp64)
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+#define _CLC_VECTOR_CONVERT_TO(SUFFIX)                                         \
+  _CLC_VECTOR_CONVERT_TO1(SUFFIX)                                              \
+  _CLC_VECTOR_CONVERT_FROM(double, SUFFIX)
+#elif defined(cl_khr_fp16)
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+#define _CLC_VECTOR_CONVERT_TO(SUFFIX)                                         \
+  _CLC_VECTOR_CONVERT_TO1(SUFFIX)                                              \
+  _CLC_VECTOR_CONVERT_FROM(half, SUFFIX)
+#else
+#define _CLC_VECTOR_CONVERT_TO(SUFFIX) _CLC_VECTOR_CONVERT_TO1(SUFFIX)
+#endif
+
+#define _CLC_VECTOR_CONVERT_TO_SUFFIX(ROUND)                                   \
+  _CLC_VECTOR_CONVERT_TO(_sat##ROUND)                                          \
+  _CLC_VECTOR_CONVERT_TO(ROUND)
+
+_CLC_VECTOR_CONVERT_TO_SUFFIX(_rtn)
+_CLC_VECTOR_CONVERT_TO_SUFFIX(_rte)
+_CLC_VECTOR_CONVERT_TO_SUFFIX(_rtz)
+_CLC_VECTOR_CONVERT_TO_SUFFIX(_rtp)
+_CLC_VECTOR_CONVERT_TO_SUFFIX()
+
+#undef _CLC_VECTOR_CONVERT_TO_SUFFIX
+#undef _CLC_VECTOR_CONVERT_TO
+#undef _CLC_VECTOR_CONVERT_TO1
+#undef _CLC_VECTOR_CONVERT_FROM
+#undef _CLC_VECTOR_CONVERT_FROM1
+#undef _CLC_VECTOR_CONVERT_DECL
+#undef _CLC_CONVERT_DECL
+
+#endif // __CLC_CLC_CONVERT_H__
diff --git a/libclc/clc/include/clc/float/definitions.h b/libclc/clc/include/clc/float/definitions.h
new file mode 100644
index 00000000000000..6fea19a1cae98b
--- /dev/null
+++ b/libclc/clc/include/clc/float/definitions.h
@@ -0,0 +1,88 @@
+#define MAXFLOAT 0x1.fffffep127f
+#define HUGE_VALF __builtin_huge_valf()
+#define INFINITY __builtin_inff()
+#define NAN __builtin_nanf("")
+
+#define FLT_DIG 6
+#define FLT_MANT_DIG 24
+#define FLT_MAX_10_EXP +38
+#define FLT_MAX_EXP +128
+#define FLT_MIN_10_EXP -37
+#define FLT_MIN_EXP -125
+#define FLT_RADIX 2
+#define FLT_MAX MAXFLOAT
+#define FLT_MIN 0x1.0p-126f
+#define FLT_EPSILON 0x1.0p-23f
+
+#define FP_ILOGB0 (-2147483647 - 1)
+#define FP_ILOGBNAN 2147483647
+
+#define M_E_F 0x1.5bf0a8p+1f
+#define M_LOG2E_F 0x1.715476p+0f
+#define M_LOG10E_F 0x1.bcb7b2p-2f
+#define M_LN2_F 0x1.62e430p-1f
+#define M_LN10_F 0x1.26bb1cp+1f
+#define M_PI_F 0x1.921fb6p+1f
+#define M_PI_2_F 0x1.921fb6p+0f
+#define M_PI_4_F 0x1.921fb6p-1f
+#define M_1_PI_F 0x1.45f306p-2f
+#define M_2_PI_F 0x1.45f306p-1f
+#define M_2_SQRTPI_F 0x1.20dd76p+0f
+#define M_SQRT2_F 0x1.6a09e6p+0f
+#define M_SQRT1_2_F 0x1.6a09e6p-1f
+
+#define M_LOG210_F 0x1.a934f0p+1f
+
+#ifdef cl_khr_fp64
+
+#define HUGE_VAL __builtin_huge_val()
+
+#define DBL_DIG 15
+#define DBL_MANT_DIG 53
+#define DBL_MAX_10_EXP +308
+#define DBL_MAX_EXP +1024
+#define DBL_MIN_10_EXP -307
+#define DBL_MIN_EXP -1021
+#define DBL_MAX 0x1.fffffffffffffp1023
+#define DBL_MIN 0x1.0p-1022
+#define DBL_EPSILON 0x1.0p-52
+
+#define M_E 0x1.5bf0a8b145769p+1
+#define M_LOG2E 0x1.71547652b82fep+0
+#define M_LOG10E 0x1.bcb7b1526e50ep-2
+#define M_LN2 0x1.62e42fefa39efp-1
+#define M_LN10 0x1.26bb1bbb55516p+1
+#define M_PI 0x1.921fb54442d18p+1
+#define M_PI_2 0x1.921fb54442d18p+0
+#define M_PI_4 0x1.921fb54442d18p-1
+#define M_1_PI 0x1.45f306dc9c883p-2
+#define M_2_PI 0x1.45f306dc9c883p-1
+#define M_2_SQRTPI 0x1.20dd750429b6dp+0
+#define M_SQRT2 0x1.6a09e667f3bcdp+0
+#define M_SQRT1_2 0x1.6a09e667f3bcdp-1
+
+#ifdef __CLC_INTERNAL
+#define M_LOG210 0x1.a934f0979a371p+1
+#endif
+
+#endif
+
+#ifdef cl_khr_fp16
+
+#if __OPENCL_VERSION__ >= 120
+
+#define HALF_DIG 3
+#define HALF_MANT_DIG 11
+#define HALF_MAX_10_EXP +4
+#define HALF_MAX_EXP +16
+#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/clc/include/clc/integer/clc_abs.h b/libclc/clc/include/clc/integer/clc_abs.h
index 31c62d311a006e..59bd807b96060e 100644
--- a/libclc/clc/include/clc/integer/clc_abs.h
+++ b/libclc/clc/include/clc/integer/clc_abs.h
@@ -1,14 +1,7 @@
 #ifndef __CLC_INTEGER_CLC_ABS_H__
 #define __CLC_INTEGER_CLC_ABS_H__
 
-#if defined(CLC_CLSPV) || defined(CLC_SPIRV)
-// clspv and spir-v targets provide their own OpenCL-compatible abs
-#define __clc_abs abs
-#else
-
 #define __CLC_BODY <clc/integer/clc_abs.inc>
 #include <clc/integer/gentype.inc>
 
-#endif
-
 #endif // __CLC_INTEGER_CLC_ABS_H__
diff --git a/libclc/generic/include/clc/integer/definitions.h b/libclc/clc/include/clc/integer/definitions.h
similarity index 91%
rename from libclc/generic/include/clc/integer/definitions.h
rename to libclc/clc/include/clc/integer/definitions.h
index 0079c30123db80..bce9b84d52e960 100644
--- a/libclc/generic/include/clc/integer/definitions.h
+++ b/libclc/clc/include/clc/integer/definitions.h
@@ -1,7 +1,7 @@
 #define CHAR_BIT 8
 #define INT_MAX 2147483647
 #define INT_MIN (-2147483647 - 1)
-#define LONG_MAX  0x7fffffffffffffffL
+#define LONG_MAX 0x7fffffffffffffffL
 #define LONG_MIN (-0x7fffffffffffffffL - 1)
 #define CHAR_MAX SCHAR_MAX
 #define CHAR_MIN SCHAR_MIN
diff --git a/libclc/clc/include/clc/shared/clc_max.h b/libclc/clc/include/clc/shared/clc_max.h
index 388f001a277823..9bfa05552a3990 100644
--- a/libclc/clc/include/clc/shared/clc_max.h
+++ b/libclc/clc/include/clc/shared/clc_max.h
@@ -1,17 +1,10 @@
 #ifndef __CLC_SHARED_CLC_MAX_H__
 #define __CLC_SHARED_CLC_MAX_H__
 
-#if defined(CLC_CLSPV) || defined(CLC_SPIRV)
-// clspv and spir-v targets provide their own OpenCL-compatible max
-#define __clc_max max
-#else
-
 #define __CLC_BODY <clc/shared/clc_max.inc>
 #include <clc/integer/gentype.inc>
 
 #define __CLC_BODY <clc/shared/clc_max.inc>
 #include <clc/math/gentype.inc>
 
-#endif
-
 #endif // __CLC_SHARED_CLC_MAX_H__
diff --git a/libclc/clc/include/clc/shared/clc_min.h b/libclc/clc/include/clc/shared/clc_min.h
index c8d920e1b4eb88..a10193885328fa 100644
--- a/libclc/clc/include/clc/shared/clc_min.h
+++ b/libclc/clc/include/clc/shared/clc_min.h
@@ -1,17 +1,10 @@
 #ifndef __CLC_SHARED_CLC_MIN_H__
 #define __CLC_SHARED_CLC_MIN_H__
 
-#if defined(CLC_CLSPV) || defined(CLC_SPIRV)
-// clspv and spir-v targets provide their own OpenCL-compatible min
-#define __clc_min min
-#else
-
 #define __CLC_BODY <clc/shared/clc_min.inc>
 #include <clc/integer/gentype.inc>
 
 #define __CLC_BODY <clc/shared/clc_min.inc>
 #include <clc/math/gentype.inc>
 
-#endif
-
 #endif // __CLC_SHARED_CLC_MIN_H__
diff --git a/libclc/generic/include/clc/convert.h b/libclc/generic/include/clc/convert.h
index 8219df47ad2c68..4e96c874b5cd85 100644
--- a/libclc/generic/include/clc/convert.h
+++ b/libclc/generic/include/clc/convert.h
@@ -1,74 +1,81 @@
-#define _CLC_CONVERT_DECL(FROM_TYPE, TO_TYPE, SUFFIX) \
+#define _CLC_CONVERT_DECL(FROM_TYPE, TO_TYPE, SUFFIX)                          \
   _CLC_OVERLOAD _CLC_DECL TO_TYPE convert_##TO_TYPE##SUFFIX(FROM_TYPE x);
 
-#define _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, TO_TYPE, SUFFIX) \
-  _CLC_CONVERT_DECL(FROM_TYPE, TO_TYPE, SUFFIX) \
-  _CLC_CONVERT_DECL(FROM_TYPE##2, TO_TYPE##2, SUFFIX) \
-  _CLC_CONVERT_DECL(FROM_TYPE##3, TO_TYPE##3, SUFFIX) \
-  _CLC_CONVERT_DECL(FROM_TYPE##4, TO_TYPE##4, SUFFIX) \
-  _CLC_CONVERT_DECL(FROM_TYPE##8, TO_TYPE##8, SUFFIX) \
+#define _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, TO_TYPE, SUFFIX)                   \
+  _CLC_CONVERT_DECL(FROM_TYPE, TO_TYPE, SUFFIX)                                \
+  _CLC_CONVERT_DECL(FROM_TYPE##2, TO_TYPE##2, SUFFIX)                          \
+  _CLC_CONVERT_DECL(FROM_TYPE##3, TO_TYPE##3, SUFFIX)                          \
+  _CLC_CONVERT_DECL(FROM_TYPE##4, TO_TYPE##4, SUFFIX)                          \
+  _CLC_CONVERT_DECL(FROM_TYPE##8, TO_TYPE##8, SUFFIX)                          \
   _CLC_CONVERT_DECL(FROM_TYPE##16, TO_TYPE##16, SUFFIX)
 
-#define _CLC_VECTOR_CONVERT_FROM1(FROM_TYPE, SUFFIX) \
-  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, char, SUFFIX) \
-  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, uchar, SUFFIX) \
-  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, int, SUFFIX) \
-  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, uint, SUFFIX) \
-  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, short, SUFFIX) \
-  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, ushort, SUFFIX) \
-  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, long, SUFFIX) \
-  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, ulong, SUFFIX) \
+#define _CLC_VECTOR_CONVERT_FROM1(FROM_TYPE, SUFFIX)                           \
+  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, char, SUFFIX)                            \
+  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, uchar, SUFFIX)                           \
+  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, int, SUFFIX)                             \
+  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, uint, SUFFIX)                            \
+  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, short, SUFFIX)                           \
+  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, ushort, SUFFIX)                          \
+  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, long, SUFFIX)                            \
+  _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, ulong, SUFFIX)                           \
   _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, float, SUFFIX)
 
 #if defined(cl_khr_fp64) && defined(cl_khr_fp16)
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
 #define _CLC_VECTOR_CONVERT_FROM(FROM_TYPE, SUFFIX)                            \
   _CLC_VECTOR_CONVERT_FROM1(FROM_TYPE, SUFFIX)                                 \
   _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, double, SUFFIX)                          \
   _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, half, SUFFIX)
 #elif defined(cl_khr_fp64)
-#define _CLC_VECTOR_CONVERT_FROM(FROM_TYPE, SUFFIX) \
-  _CLC_VECTOR_CONVERT_FROM1(FROM_TYPE, SUFFIX) \
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+#define _CLC_VECTOR_CONVERT_FROM(FROM_TYPE, SUFFIX)                            \
+  _CLC_VECTOR_CONVERT_FROM1(FROM_TYPE, SUFFIX)                                 \
   _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, double, SUFFIX)
 #elif defined(cl_khr_fp16)
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
 #define _CLC_VECTOR_CONVERT_FROM(FROM_TYPE, SUFFIX)                            \
   _CLC_VECTOR_CONVERT_FROM1(FROM_TYPE, SUFFIX)                                 \
   _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, half, SUFFIX)
 #else
-#define _CLC_VECTOR_CONVERT_FROM(FROM_TYPE, SUFFIX) \
+#define _CLC_VECTOR_CONVERT_FROM(FROM_TYPE, SUFFIX)                            \
   _CLC_VECTOR_CONVERT_FROM1(FROM_TYPE, SUFFIX)
 #endif
 
-#define _CLC_VECTOR_CONVERT_TO1(SUFFIX) \
-  _CLC_VECTOR_CONVERT_FROM(char, SUFFIX) \
-  _CLC_VECTOR_CONVERT_FROM(uchar, SUFFIX) \
-  _CLC_VECTOR_CONVERT_FROM(int, SUFFIX) \
-  _CLC_VECTOR_CONVERT_FROM(uint, SUFFIX) \
-  _CLC_VECTOR_CONVERT_FROM(short, SUFFIX) \
-  _CLC_VECTOR_CONVERT_FROM(ushort, SUFFIX) \
-  _CLC_VECTOR_CONVERT_FROM(long, SUFFIX) \
-  _CLC_VECTOR_CONVERT_FROM(ulong, SUFFIX) \
+#define _CLC_VECTOR_CONVERT_TO1(SUFFIX)                                        \
+  _CLC_VECTOR_CONVERT_FROM(char, SUFFIX)                                       \
+  _CLC_VECTOR_CONVERT_FROM(uchar, SUFFIX)                                      \
+  _CLC_VECTOR_CONVERT_FROM(int, SUFFIX)                                        \
+  _CLC_VECTOR_CONVERT_FROM(uint, SUFFIX)                                       \
+  _CLC_VECTOR_CONVERT_FROM(short, SUFFIX)                                      \
+  _CLC_VECTOR_CONVERT_FROM(ushort, SUFFIX)                                     \
+  _CLC_VECTOR_CONVERT_FROM(long, SUFFIX)                                       \
+  _CLC_VECTOR_CONVERT_FROM(ulong, SUFFIX)                                      \
   _CLC_VECTOR_CONVERT_FROM(float, SUFFIX)
 
 #if defined(cl_khr_fp64) && defined(cl_khr_fp16)
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
 #define _CLC_VECTOR_CONVERT_TO(SUFFIX)                                         \
   _CLC_VECTOR_CONVERT_TO1(SUFFIX)                                              \
   _CLC_VECTOR_CONVERT_FROM(double, SUFFIX)                                     \
   _CLC_VECTOR_CONVERT_FROM(half, SUFFIX)
 #elif defined(cl_khr_fp64)
-#define _CLC_VECTOR_CONVERT_TO(SUFFIX) \
-  _CLC_VECTOR_CONVERT_TO1(SUFFIX) \
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+#define _CLC_VECTOR_CONVERT_TO(SUFFIX)                                         \
+  _CLC_VECTOR_CONVERT_TO1(SUFFIX)                                              \
   _CLC_VECTOR_CONVERT_FROM(double, SUFFIX)
 #elif defined(cl_khr_fp16)
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
 #define _CLC_VECTOR_CONVERT_TO(SUFFIX)                                         \
   _CLC_VECTOR_CONVERT_TO1(SUFFIX)                                              \
   _CLC_VECTOR_CONVERT_FROM(half, SUFFIX)
 #else
-#define _CLC_VECTOR_CONVERT_TO(SUFFIX) \
-  _CLC_VECTOR_CONVERT_TO1(SUFFIX)
+#define _CLC_VECTOR_CONVERT_TO(SUFFIX) _CLC_VECTOR_CONVERT_TO1(SUFFIX)
 #endif
 
-#define _CLC_VECTOR_CONVERT_TO_SUFFIX(ROUND) \
-  _CLC_VECTOR_CONVERT_TO(_sat##ROUND) \
+#define _CLC_VECTOR_CONVERT_TO_SUFFIX(ROUND)                                   \
+  _CLC_VECTOR_CONVERT_TO(_sat##ROUND)                                          \
   _CLC_VECTOR_CONVERT_TO(ROUND)
 
 _CLC_VECTOR_CONVERT_TO_SUFFIX(_rtn)
@@ -76,3 +83,11 @@ _CLC_VECTOR_CONVERT_TO_SUFFIX(_rte)
 _CLC_VECTOR_CONVERT_TO_SUFFIX(_rtz)
 _CLC_VECTOR_CONVERT_TO_SUFFIX(_rtp)
 _CLC_VECTOR_CONVERT_TO_SUFFIX()
+
+#undef _CLC_VECTOR_CONVERT_TO_SUFFIX
+#undef _CLC_VECTOR_CONVERT_TO
+#undef _CLC_VECTOR_CONVERT_TO1
+#undef _CLC_VECTOR_CONVERT_FROM
+#undef _CLC_VECTOR_CONVERT_FROM1
+#undef _CLC_VECTOR_CONVERT_DECL
+#undef _CLC_CONVERT_DECL
diff --git a/libclc/generic/include/clc/float/definitions.h b/libclc/generic/include/clc/float/definitions.h
deleted file mode 100644
index be3d0130f3e614..00000000000000
--- a/libclc/generic/include/clc/float/definitions.h
+++ /dev/null
@@ -1,88 +0,0 @@
-#define MAXFLOAT        0x1.fffffep127f
-#define HUGE_VALF       __builtin_huge_valf()
-#define INFINITY        __builtin_inff()
-#define NAN             __builtin_nanf("")
-
-#define FLT_DIG         6
-#define FLT_MANT_DIG    24
-#define FLT_MAX_10_EXP  +38
-#define FLT_MAX_EXP     +128
-#define FLT_MIN_10_EXP  -37
-#define FLT_MIN_EXP     -125
-#define FLT_RADIX       2
-#define FLT_MAX         MAXFLOAT
-#define FLT_MIN         0x1.0p-126f
-#define FLT_EPSILON     0x1.0p-23f
-
-#define FP_ILOGB0 (-2147483647 - 1)
-#define FP_ILOGBNAN 2147483647
-
-#define M_E_F           0x1.5bf0a8p+1f
-#define M_LOG2E_F       0x1.715476p+0f
-#define M_LOG10E_F      0x1.bcb7b2p-2f
-#define M_LN2_F         0x1.62e430p-1f
-#define M_LN10_F        0x1.26bb1cp+1f
-#define M_PI_F          0x1.921fb6p+1f
-#define M_PI_2_F        0x1.921fb6p+0f
-#define M_PI_4_F        0x1.921fb6p-1f
-#define M_1_PI_F        0x1.45f306p-2f
-#define M_2_PI_F        0x1.45f306p-1f
-#define M_2_SQRTPI_F    0x1.20dd76p+0f
-#define M_SQRT2_F       0x1.6a09e6p+0f
-#define M_SQRT1_2_F     0x1.6a09e6p-1f
-
-#define M_LOG210_F 0x1.a934f0p+1f
-
-#ifdef cl_khr_fp64
-
-#define HUGE_VAL        __builtin_huge_val()
-
-#define DBL_DIG         15
-#define DBL_MANT_DIG    53
-#define DBL_MAX_10_EXP  +308
-#define DBL_MAX_EXP     +1024
-#define DBL_MIN_10_EXP  -307
-#define DBL_MIN_EXP     -1021
-#define DBL_MAX         0x1.fffffffffffffp1023
-#define DBL_MIN         0x1.0p-1022
-#define DBL_EPSILON     0x1.0p-52
-
-#define M_E             0x1.5bf0a8b145769p+1
-#define M_LOG2E         0x1.71547652b82fep+0
-#define M_LOG10E        0x1.bcb7b1526e50ep-2
-#define M_LN2           0x1.62e42fefa39efp-1
-#define M_LN10          0x1.26bb1bbb55516p+1
-#define M_PI            0x1.921fb54442d18p+1
-#define M_PI_2          0x1.921fb54442d18p+0
-#define M_PI_4          0x1.921fb54442d18p-1
-#define M_1_PI          0x1.45f306dc9c883p-2
-#define M_2_PI          0x1.45f306dc9c883p-1
-#define M_2_SQRTPI      0x1.20dd750429b6dp+0
-#define M_SQRT2         0x1.6a09e667f3bcdp+0
-#define M_SQRT1_2       0x1.6a09e667f3bcdp-1
-
-#ifdef __CLC_INTERNAL
-#define M_LOG210        0x1.a934f0979a371p+1
-#endif
-
-#endif
-
-#ifdef cl_khr_fp16
-
-#if __OPENCL_VERSION__ >= 120
-
-#define HALF_DIG        3
-#define HALF_MANT_DIG   11
-#define HALF_MAX_10_EXP +4
-#define HALF_MAX_EXP    +16
-#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/lib/gen_convert.py b/libclc/generic/lib/gen_convert.py
index d2f69e602a29da..d90678f83ea48c 100644
--- a/libclc/generic/lib/gen_convert.py
+++ b/libclc/generic/lib/gen_convert.py
@@ -30,11 +30,15 @@
 import argparse
 
 parser = argparse.ArgumentParser()
+parser.add_argument(
+    "--clc", action="store_true", help="Generate clc internal conversions"
+)
 parser.add_argument(
     "--clspv", action="store_true", help="Generate the clspv variant of the code"
 )
 args = parser.parse_args()
 
+clc = args.clc
 clspv = args.clspv
 
 types = [
@@ -158,8 +162,30 @@ def conditional_guard(src, dst):
     return False
 
 
+nl = "\n"
+includes = []
+if not clc:
+    includes = ["<clc/clc.h>"]
+else:
+    includes = sorted([
+        "<clc/internal/clc.h>",
+        "<clc/integer/definitions.h>",
+        "<clc/float/definitions.h>",
+        "<clc/integer/clc_abs.h>",
+        "<clc/common/clc_sign.h>",
+        "<clc/shared/clc_clamp.h>",
+        "<clc/shared/clc_min.h>",
+        "<clc/shared/clc_max.h>",
+        "<clc/math/clc_fabs.h>",
+        "<clc/math/clc_rint.h>",
+        "<clc/math/clc_ceil.h>",
+        "<clc/math/clc_floor.h>",
+        "<clc/math/clc_nextafter.h>",
+        "<clc/relational/clc_select.h>",
+    ])
+
 print(
-    """/* !!!! AUTOGENERATED FILE generated by convert_type.py !!!!!
+    f"""/* !!!! AUTOGENERATED FILE generated by convert_type.py !!!!!
 
    DON'T CHANGE THIS FILE. MAKE YOUR CHANGES TO convert_type.py AND RUN:
    $ ./generate-conversion-type-cl.sh
@@ -188,7 +214,8 @@ def conditional_guard(src, dst):
    THE SOFTWARE.
 */
 
-#include <clc/clc.h>
+{nl.join(['#include ' + f for f in includes])}
+#include <clc/clc_convert.h>
 
 #ifdef cl_khr_fp16
 #pragma OPENCL EXTENSION cl_khr_fp16 : enable
@@ -210,6 +237,7 @@ def conditional_guard(src, dst):
 """
 )
 
+
 #
 # Default Conversions
 #
@@ -236,6 +264,13 @@ def conditional_guard(src, dst):
 # even for integer-to-integer conversions. When such a conversion
 # is used, the rounding mode is ignored.
 #
+def print_passthru_conversion(src_ty, dst_ty, fn_name):
+    print(
+        f"""_CLC_DEF _CLC_OVERLOAD {dst_ty} {fn_name}({src_ty} x) {{
+  return __clc_{fn_name}(x);
+}}
+"""
+    )
 
 
 def generate_default_conversion(src, dst, mode):
@@ -243,26 +278,35 @@ def generate_default_conversion(src, dst, mode):
 
     for size in vector_sizes:
         if not size:
-            print(
-                f"""_CLC_DEF _CLC_OVERLOAD {dst} convert_{dst}{mode}({src} x) {{
+            if clc:
+                print(
+                    f"""_CLC_DEF _CLC_OVERLOAD {dst} __clc_convert_{dst}{mode}({src} x) {{
   return ({dst})x;
 }}
 """
-            )
+                )
+            else:
+                print_passthru_conversion(src, dst, f"convert_{dst}{mode}")
         else:
-            print(
-                f"""_CLC_DEF _CLC_OVERLOAD {dst}{size} convert_{dst}{size}{mode}({src}{size} x) {{
+            if clc:
+                print(
+                    f"""_CLC_DEF _CLC_OVERLOAD {dst}{size} __clc_convert_{dst}{size}{mode}({src}{size} x) {{
   return __builtin_convertvector(x, {dst}{size});
 }}
 """
-            )
+                )
+            else:
+                print_passthru_conversion(
+                    f"{src}{size}", f"{dst}{size}", f"convert_{dst}{size}{mode}"
+                )
 
     if close_conditional:
         print("#endif")
 
 
-# Do not generate default conversion for clspv as they are handled natively
-if not clspv:
+# Do not generate user-facing default conversions for clspv as they are handled
+# natively
+if clc or not clspv:
     for src in types:
         for dst in types:
             generate_default_conversion(src, dst, "")
@@ -270,15 +314,16 @@ def generate_default_conversion(src, dst, mode):
 for src in int_types:
     for dst in int_types:
         for mode in rounding_modes:
-            # Do not generate "_rte" conversion for clspv as they are handled
-            # natively
-            if clspv and mode == "_rte":
+            # Do not generate user-facing "_rte" conversions for clspv as they
+            # are handled natively
+            if clspv and not clc and mode == "_rte":
                 continue
             generate_default_conversion(src, dst, mode)
 
 #
 # Saturated Conversions To Integers
-#
+
+
 # These functions are dependent on the unsaturated conversion functions
 # generated above, and use clamp, max, min, and select to eliminate
 # branching and vectorize the conversions.
@@ -286,35 +331,37 @@ def generate_default_conversion(src, dst, mode):
 # Again, as above, we allow all rounding modes for integer-to-integer
 # conversions with saturation.
 #
-
-
 def generate_saturated_conversion(src, dst, size):
     # Header
     close_conditional = conditional_guard(src, dst)
-    print(
-        """_CLC_DEF _CLC_OVERLOAD
-{DST}{N} convert_{DST}{N}_sat({SRC}{N} x)
-{{""".format(
-            DST=dst, SRC=src, N=size
-        )
-    )
 
-    # FIXME: This is a work around for lack of select function with
-    # signed third argument when the first two arguments are unsigned types.
-    # We cast to the signed type for sign-extension, then do a bitcast to
-    # the unsigned type.
+    dstn = f"{dst}{size}"
+    srcn = f"{src}{size}"
+
+    if not clc:
+        print_passthru_conversion(f"{srcn}", f"{dstn}", f"convert_{dstn}_sat")
+        if close_conditional:
+            print("#endif")
+        return
+
+    print(f"_CLC_DEF _CLC_OVERLOAD {dstn} __clc_convert_{dstn}_sat({srcn} x) {{")
+
+    # FIXME: This is a work around for lack of select function with signed
+    # third argument when the first two arguments are unsigned types. We cast
+    # to the signed type for sign-extension, then do a bitcast to the unsigned
+    # type.
     if dst in unsigned_types:
-        bool_prefix = "as_{DST}{N}(convert_{BOOL}{N}".format(
-            DST=dst, BOOL=bool_type[dst], N=size
-        )
+        bool_prefix = f"__clc_as_{dstn}(__clc_convert_{bool_type[dst]}{size}"
         bool_suffix = ")"
     else:
-        bool_prefix = "convert_{BOOL}{N}".format(BOOL=bool_type[dst], N=size)
+        bool_prefix = f"__clc_convert_{bool_type[dst]}{size}"
         bool_suffix = ""
 
+    dst_max = limit_max[dst]
+    dst_min = limit_min[dst]
+
     # Body
     if src == dst:
-
         # Conversion between same types
         print("  return x;")
 
@@ -323,69 +370,40 @@ def generate_saturated_conversion(src, dst, size):
         if clspv:
             # Conversion from float to int
             print(
-                """  {DST}{N} y = convert_{DST}{N}(x);
-                y = select(y, ({DST}{N}){DST_MIN}, {BP}(x <= ({SRC}{N}){DST_MIN}){BS});
-                y = select(y, ({DST}{N}){DST_MAX}, {BP}(x >= ({SRC}{N}){DST_MAX}){BS});
-                return y;""".format(
-                    SRC=src,
-                    DST=dst,
-                    N=size,
-                    DST_MIN=limit_min[dst],
-                    DST_MAX=limit_max[dst],
-                    BP=bool_prefix,
-                    BS=bool_suffix,
-                )
+                f"""  {dstn} y = __clc_convert_{dstn}(x);
+  y = __clc_select(y, ({dstn}){dst_min}, {bool_prefix}(x <= ({srcn}){dst_min}){bool_suffix});
+  y = __clc_select(y, ({dstn}){dst_max}, {bool_prefix}(x >= ({srcn}){dst_max}){bool_suffix});
+  return y;"""
             )
         else:
             # Conversion from float to int
             print(
-                """  {DST}{N} y = convert_{DST}{N}(x);
-                y = select(y, ({DST}{N}){DST_MIN}, {BP}(x < ({SRC}{N}){DST_MIN}){BS});
-                y = select(y, ({DST}{N}){DST_MAX}, {BP}(x > ({SRC}{N}){DST_MAX}){BS});
-                return y;""".format(
-                    SRC=src,
-                    DST=dst,
-                    N=size,
-                    DST_MIN=limit_min[dst],
-                    DST_MAX=limit_max[dst],
-                    BP=bool_prefix,
-                    BS=bool_suffix,
-                )
+                f"""  {dstn} y = __clc_convert_{dstn}(x);
+  y = __clc_select(y, ({dstn}){dst_min}, {bool_prefix}(x < ({srcn}){dst_min}){bool_suffix});
+  y = __clc_select(y, ({dstn}){dst_max}, {bool_prefix}(x > ({srcn}){dst_max}){bool_suffix});
+  return y;"""
             )
-
     else:
 
         # Integer to integer convesion with sizeof(src) == sizeof(dst)
         if sizeof_type[src] == sizeof_type[dst]:
             if src in unsigned_types:
-                print(
-                    "  x = min(x, ({SRC}){DST_MAX});".format(
-                        SRC=src, DST_MAX=limit_max[dst]
-                    )
-                )
+                print(f"  x = __clc_min(x, ({src}){dst_max});")
             else:
-                print("  x = max(x, ({SRC})0);".format(SRC=src))
+                print(f"  x = __clc_max(x, ({src})0);")
 
         # Integer to integer conversion where sizeof(src) > sizeof(dst)
         elif sizeof_type[src] > sizeof_type[dst]:
             if src in unsigned_types:
-                print(
-                    "  x = min(x, ({SRC}){DST_MAX});".format(
-                        SRC=src, DST_MAX=limit_max[dst]
-                    )
-                )
+                print(f"  x = __clc_min(x, ({src}){dst_max});")
             else:
-                print(
-                    "  x = clamp(x, ({SRC}){DST_MIN}, ({SRC}){DST_MAX});".format(
-                        SRC=src, DST_MIN=limit_min[dst], DST_MAX=limit_max[dst]
-                    )
-                )
+                print(f"  x = __clc_clamp(x, ({src}){dst_min}, ({src}){dst_max});")
 
         # Integer to integer conversion where sizeof(src) < sizeof(dst)
         elif src not in unsigned_types and dst in unsigned_types:
-            print("  x = max(x, ({SRC})0);".format(SRC=src))
+            print(f"  x = __clc_max(x, ({src})0);")
 
-        print("  return convert_{DST}{N}(x);".format(DST=dst, N=size))
+        print(f"  return __clc_convert_{dstn}(x);")
 
     # Footer
     print("}")
@@ -403,17 +421,19 @@ def generate_saturated_conversion_with_rounding(src, dst, size, mode):
     # Header
     close_conditional = conditional_guard(src, dst)
 
-    # Body
-    print(
-        """_CLC_DEF _CLC_OVERLOAD
-{DST}{N} convert_{DST}{N}_sat{M}({SRC}{N} x)
-{{
-  return convert_{DST}{N}_sat(x);
+    dstn = f"{dst}{size}"
+    srcn = f"{src}{size}"
+
+    if not clc:
+        print_passthru_conversion(f"{srcn}", f"{dstn}", f"convert_{dstn}_sat{mode}")
+    else:
+        # Body
+        print(
+            f"""_CLC_DEF _CLC_OVERLOAD {dstn} __clc_convert_{dstn}_sat{mode}({srcn} x) {{
+  return __clc_convert_{dstn}_sat(x);
 }}
-""".format(
-            DST=dst, SRC=src, N=size, M=mode
+"""
         )
-    )
 
     # Footer
     if close_conditional:
@@ -426,6 +446,7 @@ def generate_saturated_conversion_with_rounding(src, dst, size, mode):
             for mode in rounding_modes:
                 generate_saturated_conversion_with_rounding(src, dst, size, mode)
 
+
 #
 # Conversions To/From Floating-Point With Rounding
 #
@@ -439,134 +460,90 @@ def generate_saturated_conversion_with_rounding(src, dst, size, mode):
 #
 # Only conversions to integers can have saturation.
 #
-
-
 def generate_float_conversion(src, dst, size, mode, sat):
     # Header
     close_conditional = conditional_guard(src, dst)
-    print(
-        """_CLC_DEF _CLC_OVERLOAD
-{DST}{N} convert_{DST}{N}{S}{M}({SRC}{N} x)
-{{""".format(
-            SRC=src, DST=dst, N=size, M=mode, S=sat
-        )
-    )
+
+    dstn = f"{dst}{size}"
+    srcn = f"{src}{size}"
+    booln = f"{bool_type[dst]}{size}"
+    src_max = limit_max[src] if src in limit_max else ""
+    dst_min = limit_min[dst] if dst in limit_min else ""
+
+    if not clc:
+        print_passthru_conversion(f"{srcn}", f"{dstn}", f"convert_{dstn}{sat}{mode}")
+        # Footer
+        if close_conditional:
+            print("#endif")
+        return
+
+    print(f"_CLC_DEF _CLC_OVERLOAD {dstn} __clc_convert_{dstn}{sat}{mode}({srcn} x) {{")
 
     # Perform conversion
     if dst in int_types:
         if mode == "_rte":
-            print("  x = rint(x);")
+            print("  x = __clc_rint(x);")
         elif mode == "_rtp":
-            print("  x = ceil(x);")
+            print("  x = __clc_ceil(x);")
         elif mode == "_rtn":
-            print("  x = floor(x);")
-        print("  return convert_{DST}{N}{S}(x);".format(DST=dst, N=size, S=sat))
+            print("  x = __clc_floor(x);")
+        print(f"  return __clc_convert_{dstn}{sat}(x);")
     elif mode == "_rte":
-        print("  return convert_{DST}{N}(x);".format(DST=dst, N=size))
+        print(f"  return __clc_convert_{dstn}(x);")
     else:
-        print("  {DST}{N} r = convert_{DST}{N}(x);".format(DST=dst, N=size))
+        print(f"  {dstn} r = __clc_convert_{dstn}(x);")
         if clspv:
-            print("  {SRC}{N} y = convert_{SRC}{N}_sat(r);".format(SRC=src, N=size))
+            print(f"  {srcn} y = __clc_convert_{srcn}_sat(r);")
         else:
-            print("  {SRC}{N} y = convert_{SRC}{N}(r);".format(SRC=src, N=size))
+            print(f"  {srcn} y = __clc_convert_{srcn}(r);")
         if mode == "_rtz":
             if src in int_types:
-                print(
-                    "  {USRC}{N} abs_x = abs(x);".format(
-                        USRC=unsigned_type[src], N=size
-                    )
-                )
-                print(
-                    "  {USRC}{N} abs_y = abs(y);".format(
-                        USRC=unsigned_type[src], N=size
-                    )
-                )
-            else:
-                print("  {SRC}{N} abs_x = fabs(x);".format(SRC=src, N=size))
-                print("  {SRC}{N} abs_y = fabs(y);".format(SRC=src, N=size))
-            if clspv:
-                print(
-                    "  {BOOL}{N} c = convert_{BOOL}{N}(abs_y > abs_x);".format(
-                        BOOL=bool_type[dst], N=size
-                    )
-                )
-                if sizeof_type[src] >= 4 and src in int_types:
-                    print(
-                        "  c = c || convert_{BOOL}{N}(({SRC}{N}){SRC_MAX} == x);".format(
-                            BOOL=bool_type[dst], N=size, SRC=src, SRC_MAX=limit_max[src]
-                        )
-                    )
-                print(
-                    "  {DST}{N} sel = select(r, nextafter(r, sign(r) * ({DST}{N})-INFINITY), c);".format(
-                        DST=dst, N=size, BOOL=bool_type[dst], SRC=src
-                    )
-                )
+                usrcn = f"{unsigned_type[src]}{size}"
+                print(f"  {usrcn} abs_x = __clc_abs(x);")
+                print(f"  {usrcn} abs_y = __clc_abs(y);")
             else:
-                print(
-                    "  {DST}{N} sel = select(r, nextafter(r, sign(r) * ({DST}{N})-INFINITY), convert_{BOOL}{N}(abs_y > abs_x));".format(
-                        DST=dst, N=size, BOOL=bool_type[dst]
-                    )
-                )
+                print(f"  {srcn} abs_x = __clc_fabs(x);")
+                print(f"  {srcn} abs_y = __clc_fabs(y);")
+            print(f"  {booln} c = __clc_convert_{booln}(abs_y > abs_x);")
+            if clspv and sizeof_type[src] >= 4 and src in int_types:
+                print(f"  c = c || __clc_convert_{booln}(({srcn}){src_max} == x);")
+            print(
+                f"  {dstn} sel = __clc_select(r, __clc_nextafter(r, __clc_sign(r) * ({dstn})-INFINITY), c);"
+            )
             if dst == "half" and src in int_types and sizeof_type[src] >= 2:
                 dst_max = limit_max[dst]
-                # short is 16 bits signed, so the maximum value rounded to zero is 0x1.ffcp+14 (0x1p+15 == 32768 > 0x7fff == 32767)
+                # short is 16 bits signed, so the maximum value rounded to zero
+                # is 0x1.ffcp+14 (0x1p+15 == 32768 > 0x7fff == 32767)
                 if src == "short":
                     dst_max = "0x1.ffcp+14"
                 print(
-                    "  return clamp(sel, ({DST}{N}){DST_MIN}, ({DST}{N}){DST_MAX});".format(
-                        DST=dst, N=size, DST_MIN=limit_min[dst], DST_MAX=dst_max
-                    )
+                    f"  return __clc_clamp(sel, ({dstn}){dst_min}, ({dstn}){dst_max});"
                 )
             else:
                 print("  return sel;")
         if mode == "_rtp":
             print(
-                "  {DST}{N} sel = select(r, nextafter(r, ({DST}{N})INFINITY), convert_{BOOL}{N}(y < x));".format(
-                    DST=dst, N=size, BOOL=bool_type[dst]
-                )
+                f"  {dstn} sel = __clc_select(r, __clc_nextafter(r, ({dstn})INFINITY), __clc_convert_{booln}(y < x));"
             )
             if dst == "half" and src in int_types and sizeof_type[src] >= 2:
-                print(
-                    "  return max(sel, ({DST}{N}){DST_MIN});".format(
-                        DST=dst, N=size, DST_MIN=limit_min[dst]
-                    )
-                )
+                print(f"  return __clc_max(sel, ({dstn}){dst_min});")
             else:
                 print("  return sel;")
         if mode == "_rtn":
-            if clspv:
-                print(
-                    "  {BOOL}{N} c = convert_{BOOL}{N}(y > x);".format(
-                        BOOL=bool_type[dst], N=size
-                    )
-                )
-                if sizeof_type[src] >= 4 and src in int_types:
-                    print(
-                        "  c = c || convert_{BOOL}{N}(({SRC}{N}){SRC_MAX} == x);".format(
-                            BOOL=bool_type[dst], N=size, SRC=src, SRC_MAX=limit_max[src]
-                        )
-                    )
-                print(
-                    "  {DST}{N} sel = select(r, nextafter(r, ({DST}{N})-INFINITY), c);".format(
-                        DST=dst, N=size, BOOL=bool_type[dst], SRC=src
-                    )
-                )
-            else:
-                print(
-                    "  {DST}{N} sel = select(r, nextafter(r, ({DST}{N})-INFINITY), convert_{BOOL}{N}(y > x));".format(
-                        DST=dst, N=size, BOOL=bool_type[dst]
-                    )
-                )
+            print(f"  {booln} c = __clc_convert_{booln}(y > x);")
+            if clspv and sizeof_type[src] >= 4 and src in int_types:
+                print(f"  c = c || __clc_convert_{booln}(({srcn}){src_max} == x);")
+            print(
+                f"  {dstn} sel = __clc_select(r, __clc_nextafter(r, ({dstn})-INFINITY), c);"
+            )
             if dst == "half" and src in int_types and sizeof_type[src] >= 2:
                 dst_max = limit_max[dst]
-                # short is 16 bits signed, so the maximum value rounded to negative infinity is 0x1.ffcp+14 (0x1p+15 == 32768 > 0x7fff == 32767)
+                # short is 16 bits signed, so the maximum value rounded to
+                # negative infinity is 0x1.ffcp+14 (0x1p+15 == 32768 > 0x7fff
+                # == 32767)
                 if src == "short":
                     dst_max = "0x1.ffcp+14"
-                print(
-                    "  return min(sel, ({DST}{N}){DST_MAX});".format(
-                        DST=dst, N=size, DST_MAX=dst_max
-                    )
-                )
+                print(f"  return __clc_min(sel, ({dstn}){dst_max});")
             else:
                 print("  return sel;")
 
@@ -588,8 +565,8 @@ def generate_float_conversion(src, dst, size, mode, sat):
     for dst in float_types:
         for size in vector_sizes:
             for mode in rounding_modes:
-                # Do not generate "_rte" conversion for clspv as they are
-                # handled natively
-                if clspv and mode == "_rte":
+                # Do not generate user-facing "_rte" conversions for clspv as
+                # they are handled natively
+                if clspv and not clc and mode == "_rte":
                     continue
                 generate_float_conversion(src, dst, size, mode, "")

>From 3945d49780b27fc204a09695debc4cb2d6df8c4c Mon Sep 17 00:00:00 2001
From: Fraser Cormack <fraser at codeplay.com>
Date: Tue, 28 Jan 2025 10:44:09 +0000
Subject: [PATCH 6/6] fix formatting

---
 libclc/generic/lib/gen_convert.py | 34 ++++++++++++++++---------------
 1 file changed, 18 insertions(+), 16 deletions(-)

diff --git a/libclc/generic/lib/gen_convert.py b/libclc/generic/lib/gen_convert.py
index d90678f83ea48c..92f32694a52afd 100644
--- a/libclc/generic/lib/gen_convert.py
+++ b/libclc/generic/lib/gen_convert.py
@@ -167,22 +167,24 @@ def conditional_guard(src, dst):
 if not clc:
     includes = ["<clc/clc.h>"]
 else:
-    includes = sorted([
-        "<clc/internal/clc.h>",
-        "<clc/integer/definitions.h>",
-        "<clc/float/definitions.h>",
-        "<clc/integer/clc_abs.h>",
-        "<clc/common/clc_sign.h>",
-        "<clc/shared/clc_clamp.h>",
-        "<clc/shared/clc_min.h>",
-        "<clc/shared/clc_max.h>",
-        "<clc/math/clc_fabs.h>",
-        "<clc/math/clc_rint.h>",
-        "<clc/math/clc_ceil.h>",
-        "<clc/math/clc_floor.h>",
-        "<clc/math/clc_nextafter.h>",
-        "<clc/relational/clc_select.h>",
-    ])
+    includes = sorted(
+        [
+            "<clc/internal/clc.h>",
+            "<clc/integer/definitions.h>",
+            "<clc/float/definitions.h>",
+            "<clc/integer/clc_abs.h>",
+            "<clc/common/clc_sign.h>",
+            "<clc/shared/clc_clamp.h>",
+            "<clc/shared/clc_min.h>",
+            "<clc/shared/clc_max.h>",
+            "<clc/math/clc_fabs.h>",
+            "<clc/math/clc_rint.h>",
+            "<clc/math/clc_ceil.h>",
+            "<clc/math/clc_floor.h>",
+            "<clc/math/clc_nextafter.h>",
+            "<clc/relational/clc_select.h>",
+        ]
+    )
 
 print(
     f"""/* !!!! AUTOGENERATED FILE generated by convert_type.py !!!!!



More information about the cfe-commits mailing list