[libclc] 25c0554 - [libclc] Move conversion builtins to the CLC library (#124727)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Feb 12 00:55:05 PST 2025
Author: Fraser Cormack
Date: 2025-02-12T08:55:02Z
New Revision: 25c055416643f3291dfaa8136cb3a17b00656779
URL: https://github.com/llvm/llvm-project/commit/25c055416643f3291dfaa8136cb3a17b00656779
DIFF: https://github.com/llvm/llvm-project/commit/25c055416643f3291dfaa8136cb3a17b00656779.diff
LOG: [libclc] Move conversion builtins to the CLC library (#124727)
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.
Added:
libclc/clc/include/clc/clc_convert.h
libclc/clc/include/clc/float/definitions.h
Modified:
libclc/CMakeLists.txt
libclc/generic/include/clc/convert.h
libclc/generic/lib/gen_convert.py
Removed:
libclc/generic/include/clc/float/definitions.h
################################################################################
diff --git a/libclc/CMakeLists.txt b/libclc/CMakeLists.txt
index 2978fadc2c29f..c88ea9700d100 100644
--- a/libclc/CMakeLists.txt
+++ b/libclc/CMakeLists.txt
@@ -247,11 +247,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()
@@ -289,6 +305,12 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
set( clc_lib_files )
set( clc_dirs ${dirs} generic )
+ 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
@@ -372,6 +394,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 0000000000000..20bbd57540b30
--- /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 0000000000000..6fea19a1cae98
--- /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/generic/include/clc/convert.h b/libclc/generic/include/clc/convert.h
index 8219df47ad2c6..4e96c874b5cd8 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 be3d0130f3e61..0000000000000
--- 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 d2f69e602a29d..92f32694a52af 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,32 @@ 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 +216,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 +239,7 @@ def conditional_guard(src, dst):
"""
)
+
#
# Default Conversions
#
@@ -236,6 +266,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 +280,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 +316,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 +333,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 +372,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 +423,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 +448,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 +462,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 +567,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, "")
More information about the cfe-commits
mailing list