Skip to content

Commit 4d5e786

Browse files
committed
[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.
1 parent 2af4a64 commit 4d5e786

File tree

10 files changed

+419
-328
lines changed

10 files changed

+419
-328
lines changed

libclc/CMakeLists.txt

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -251,11 +251,27 @@ add_custom_target( "generate_convert.cl" DEPENDS convert.cl )
251251
set_target_properties( "generate_convert.cl" PROPERTIES FOLDER "libclc/Sourcegenning" )
252252

253253
add_custom_command(
254-
OUTPUT clspv-convert.cl
255-
COMMAND ${Python3_EXECUTABLE} ${script_loc} --clspv > clspv-convert.cl
254+
OUTPUT clc-convert.cl
255+
COMMAND ${Python3_EXECUTABLE} ${script_loc} --clc > clc-convert.cl
256256
DEPENDS ${script_loc} )
257-
add_custom_target( "clspv-generate_convert.cl" DEPENDS clspv-convert.cl )
258-
set_target_properties( "clspv-generate_convert.cl" PROPERTIES FOLDER "libclc/Sourcegenning" )
257+
add_custom_target( "clc-generate_convert.cl" DEPENDS clc-convert.cl )
258+
set_target_properties( "clc-generate_convert.cl" PROPERTIES FOLDER "libclc/Sourcegenning" )
259+
260+
if ( clspv-- IN_LIST LIBCLC_TARGETS_TO_BUILD OR clspv64-- IN_LIST LIBCLC_TARGETS_TO_BUILD )
261+
add_custom_command(
262+
OUTPUT clspv-convert.cl
263+
COMMAND ${Python3_EXECUTABLE} ${script_loc} --clspv > clspv-convert.cl
264+
DEPENDS ${script_loc} )
265+
add_custom_target( "clspv-generate_convert.cl" DEPENDS clspv-convert.cl )
266+
set_target_properties( "clspv-generate_convert.cl" PROPERTIES FOLDER "libclc/Sourcegenning" )
267+
268+
add_custom_command(
269+
OUTPUT clc-clspv-convert.cl
270+
COMMAND ${Python3_EXECUTABLE} ${script_loc} --clc --clspv > clc-clspv-convert.cl
271+
DEPENDS ${script_loc} )
272+
add_custom_target( "clc-clspv-generate_convert.cl" DEPENDS clc-clspv-convert.cl )
273+
set_target_properties( "clc-clspv-generate_convert.cl" PROPERTIES FOLDER "libclc/Sourcegenning" )
274+
endif()
259275

260276
enable_testing()
261277

@@ -285,6 +301,11 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
285301
endif()
286302

287303
set( clc_lib_files )
304+
if( ARCH STREQUAL clspv OR ARCH STREQUAL clspv64 )
305+
set( clc_gen_files clc-clspv-convert.cl )
306+
else()
307+
set( clc_gen_files clc-convert.cl )
308+
endif()
288309
libclc_configure_lib_source(
289310
clc_lib_files
290311
CLC_INTERNAL
@@ -368,6 +389,7 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
368389
COMPILE_FLAGS ${clc_build_flags}
369390
OPT_FLAGS ${opt_flags}
370391
LIB_FILES ${clc_lib_files}
392+
GEN_FILES ${clc_gen_files}
371393
)
372394

373395
list( APPEND build_flags

libclc/clc/include/clc/clc_convert.h

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
#ifndef __CLC_CLC_CONVERT_H__
2+
#define __CLC_CLC_CONVERT_H__
3+
4+
#define _CLC_CONVERT_DECL(FROM_TYPE, TO_TYPE, SUFFIX) \
5+
_CLC_OVERLOAD _CLC_DECL TO_TYPE __clc_convert_##TO_TYPE##SUFFIX(FROM_TYPE x);
6+
7+
#define _CLC_VECTOR_CONVERT_DECL(FROM_TYPE, TO_TYPE, SUFFIX) \
8+
_CLC_CONVERT_DECL(FROM_TYPE, TO_TYPE, SUFFIX) \
9+
_CLC_CONVERT_DECL(FROM_TYPE##2, TO_TYPE##2, SUFFIX) \
10+
_CLC_CONVERT_DECL(FROM_TYPE##3, TO_TYPE##3, SUFFIX) \
11+
_CLC_CONVERT_DECL(FROM_TYPE##4, TO_TYPE##4, SUFFIX) \
12+
_CLC_CONVERT_DECL(FROM_TYPE##8, TO_TYPE##8, SUFFIX) \
13+
_CLC_CONVERT_DECL(FROM_TYPE##16, TO_TYPE##16, SUFFIX)
14+
15+
#define _CLC_VECTOR_CONVERT_FROM1(FROM_TYPE, SUFFIX) \
16+
_CLC_VECTOR_CONVERT_DECL(FROM_TYPE, char, SUFFIX) \
17+
_CLC_VECTOR_CONVERT_DECL(FROM_TYPE, uchar, SUFFIX) \
18+
_CLC_VECTOR_CONVERT_DECL(FROM_TYPE, int, SUFFIX) \
19+
_CLC_VECTOR_CONVERT_DECL(FROM_TYPE, uint, SUFFIX) \
20+
_CLC_VECTOR_CONVERT_DECL(FROM_TYPE, short, SUFFIX) \
21+
_CLC_VECTOR_CONVERT_DECL(FROM_TYPE, ushort, SUFFIX) \
22+
_CLC_VECTOR_CONVERT_DECL(FROM_TYPE, long, SUFFIX) \
23+
_CLC_VECTOR_CONVERT_DECL(FROM_TYPE, ulong, SUFFIX) \
24+
_CLC_VECTOR_CONVERT_DECL(FROM_TYPE, float, SUFFIX)
25+
26+
#if defined(cl_khr_fp64) && defined(cl_khr_fp16)
27+
#pragma OPENCL EXTENSION cl_khr_fp16 : enable
28+
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
29+
#define _CLC_VECTOR_CONVERT_FROM(FROM_TYPE, SUFFIX) \
30+
_CLC_VECTOR_CONVERT_FROM1(FROM_TYPE, SUFFIX) \
31+
_CLC_VECTOR_CONVERT_DECL(FROM_TYPE, double, SUFFIX) \
32+
_CLC_VECTOR_CONVERT_DECL(FROM_TYPE, half, SUFFIX)
33+
#elif defined(cl_khr_fp64)
34+
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
35+
#define _CLC_VECTOR_CONVERT_FROM(FROM_TYPE, SUFFIX) \
36+
_CLC_VECTOR_CONVERT_FROM1(FROM_TYPE, SUFFIX) \
37+
_CLC_VECTOR_CONVERT_DECL(FROM_TYPE, double, SUFFIX)
38+
#elif defined(cl_khr_fp16)
39+
#pragma OPENCL EXTENSION cl_khr_fp16 : enable
40+
#define _CLC_VECTOR_CONVERT_FROM(FROM_TYPE, SUFFIX) \
41+
_CLC_VECTOR_CONVERT_FROM1(FROM_TYPE, SUFFIX) \
42+
_CLC_VECTOR_CONVERT_DECL(FROM_TYPE, half, SUFFIX)
43+
#else
44+
#define _CLC_VECTOR_CONVERT_FROM(FROM_TYPE, SUFFIX) \
45+
_CLC_VECTOR_CONVERT_FROM1(FROM_TYPE, SUFFIX)
46+
#endif
47+
48+
#define _CLC_VECTOR_CONVERT_TO1(SUFFIX) \
49+
_CLC_VECTOR_CONVERT_FROM(char, SUFFIX) \
50+
_CLC_VECTOR_CONVERT_FROM(uchar, SUFFIX) \
51+
_CLC_VECTOR_CONVERT_FROM(int, SUFFIX) \
52+
_CLC_VECTOR_CONVERT_FROM(uint, SUFFIX) \
53+
_CLC_VECTOR_CONVERT_FROM(short, SUFFIX) \
54+
_CLC_VECTOR_CONVERT_FROM(ushort, SUFFIX) \
55+
_CLC_VECTOR_CONVERT_FROM(long, SUFFIX) \
56+
_CLC_VECTOR_CONVERT_FROM(ulong, SUFFIX) \
57+
_CLC_VECTOR_CONVERT_FROM(float, SUFFIX)
58+
59+
#if defined(cl_khr_fp64) && defined(cl_khr_fp16)
60+
#pragma OPENCL EXTENSION cl_khr_fp16 : enable
61+
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
62+
#define _CLC_VECTOR_CONVERT_TO(SUFFIX) \
63+
_CLC_VECTOR_CONVERT_TO1(SUFFIX) \
64+
_CLC_VECTOR_CONVERT_FROM(double, SUFFIX) \
65+
_CLC_VECTOR_CONVERT_FROM(half, SUFFIX)
66+
#elif defined(cl_khr_fp64)
67+
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
68+
#define _CLC_VECTOR_CONVERT_TO(SUFFIX) \
69+
_CLC_VECTOR_CONVERT_TO1(SUFFIX) \
70+
_CLC_VECTOR_CONVERT_FROM(double, SUFFIX)
71+
#elif defined(cl_khr_fp16)
72+
#pragma OPENCL EXTENSION cl_khr_fp16 : enable
73+
#define _CLC_VECTOR_CONVERT_TO(SUFFIX) \
74+
_CLC_VECTOR_CONVERT_TO1(SUFFIX) \
75+
_CLC_VECTOR_CONVERT_FROM(half, SUFFIX)
76+
#else
77+
#define _CLC_VECTOR_CONVERT_TO(SUFFIX) _CLC_VECTOR_CONVERT_TO1(SUFFIX)
78+
#endif
79+
80+
#define _CLC_VECTOR_CONVERT_TO_SUFFIX(ROUND) \
81+
_CLC_VECTOR_CONVERT_TO(_sat##ROUND) \
82+
_CLC_VECTOR_CONVERT_TO(ROUND)
83+
84+
_CLC_VECTOR_CONVERT_TO_SUFFIX(_rtn)
85+
_CLC_VECTOR_CONVERT_TO_SUFFIX(_rte)
86+
_CLC_VECTOR_CONVERT_TO_SUFFIX(_rtz)
87+
_CLC_VECTOR_CONVERT_TO_SUFFIX(_rtp)
88+
_CLC_VECTOR_CONVERT_TO_SUFFIX()
89+
90+
#undef _CLC_VECTOR_CONVERT_TO_SUFFIX
91+
#undef _CLC_VECTOR_CONVERT_TO
92+
#undef _CLC_VECTOR_CONVERT_TO1
93+
#undef _CLC_VECTOR_CONVERT_FROM
94+
#undef _CLC_VECTOR_CONVERT_FROM1
95+
#undef _CLC_VECTOR_CONVERT_DECL
96+
#undef _CLC_CONVERT_DECL
97+
98+
#endif // __CLC_CLC_CONVERT_H__
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
#define MAXFLOAT 0x1.fffffep127f
2+
#define HUGE_VALF __builtin_huge_valf()
3+
#define INFINITY __builtin_inff()
4+
#define NAN __builtin_nanf("")
5+
6+
#define FLT_DIG 6
7+
#define FLT_MANT_DIG 24
8+
#define FLT_MAX_10_EXP +38
9+
#define FLT_MAX_EXP +128
10+
#define FLT_MIN_10_EXP -37
11+
#define FLT_MIN_EXP -125
12+
#define FLT_RADIX 2
13+
#define FLT_MAX MAXFLOAT
14+
#define FLT_MIN 0x1.0p-126f
15+
#define FLT_EPSILON 0x1.0p-23f
16+
17+
#define FP_ILOGB0 (-2147483647 - 1)
18+
#define FP_ILOGBNAN 2147483647
19+
20+
#define M_E_F 0x1.5bf0a8p+1f
21+
#define M_LOG2E_F 0x1.715476p+0f
22+
#define M_LOG10E_F 0x1.bcb7b2p-2f
23+
#define M_LN2_F 0x1.62e430p-1f
24+
#define M_LN10_F 0x1.26bb1cp+1f
25+
#define M_PI_F 0x1.921fb6p+1f
26+
#define M_PI_2_F 0x1.921fb6p+0f
27+
#define M_PI_4_F 0x1.921fb6p-1f
28+
#define M_1_PI_F 0x1.45f306p-2f
29+
#define M_2_PI_F 0x1.45f306p-1f
30+
#define M_2_SQRTPI_F 0x1.20dd76p+0f
31+
#define M_SQRT2_F 0x1.6a09e6p+0f
32+
#define M_SQRT1_2_F 0x1.6a09e6p-1f
33+
34+
#define M_LOG210_F 0x1.a934f0p+1f
35+
36+
#ifdef cl_khr_fp64
37+
38+
#define HUGE_VAL __builtin_huge_val()
39+
40+
#define DBL_DIG 15
41+
#define DBL_MANT_DIG 53
42+
#define DBL_MAX_10_EXP +308
43+
#define DBL_MAX_EXP +1024
44+
#define DBL_MIN_10_EXP -307
45+
#define DBL_MIN_EXP -1021
46+
#define DBL_MAX 0x1.fffffffffffffp1023
47+
#define DBL_MIN 0x1.0p-1022
48+
#define DBL_EPSILON 0x1.0p-52
49+
50+
#define M_E 0x1.5bf0a8b145769p+1
51+
#define M_LOG2E 0x1.71547652b82fep+0
52+
#define M_LOG10E 0x1.bcb7b1526e50ep-2
53+
#define M_LN2 0x1.62e42fefa39efp-1
54+
#define M_LN10 0x1.26bb1bbb55516p+1
55+
#define M_PI 0x1.921fb54442d18p+1
56+
#define M_PI_2 0x1.921fb54442d18p+0
57+
#define M_PI_4 0x1.921fb54442d18p-1
58+
#define M_1_PI 0x1.45f306dc9c883p-2
59+
#define M_2_PI 0x1.45f306dc9c883p-1
60+
#define M_2_SQRTPI 0x1.20dd750429b6dp+0
61+
#define M_SQRT2 0x1.6a09e667f3bcdp+0
62+
#define M_SQRT1_2 0x1.6a09e667f3bcdp-1
63+
64+
#ifdef __CLC_INTERNAL
65+
#define M_LOG210 0x1.a934f0979a371p+1
66+
#endif
67+
68+
#endif
69+
70+
#ifdef cl_khr_fp16
71+
72+
#if __OPENCL_VERSION__ >= 120
73+
74+
#define HALF_DIG 3
75+
#define HALF_MANT_DIG 11
76+
#define HALF_MAX_10_EXP +4
77+
#define HALF_MAX_EXP +16
78+
#define HALF_MIN_10_EXP -4
79+
#define HALF_MIN_EXP -13
80+
81+
#define HALF_RADIX 2
82+
#define HALF_MAX 0x1.ffcp15h
83+
#define HALF_MIN 0x1.0p-14h
84+
#define HALF_EPSILON 0x1.0p-10h
85+
86+
#endif
87+
88+
#endif
Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,7 @@
11
#ifndef __CLC_INTEGER_CLC_ABS_H__
22
#define __CLC_INTEGER_CLC_ABS_H__
33

4-
#if defined(CLC_CLSPV) || defined(CLC_SPIRV)
5-
// clspv and spir-v targets provide their own OpenCL-compatible abs
6-
#define __clc_abs abs
7-
#else
8-
94
#define __CLC_BODY <clc/integer/clc_abs.inc>
105
#include <clc/integer/gentype.inc>
116

12-
#endif
13-
147
#endif // __CLC_INTEGER_CLC_ABS_H__

libclc/generic/include/clc/integer/definitions.h renamed to libclc/clc/include/clc/integer/definitions.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#define CHAR_BIT 8
22
#define INT_MAX 2147483647
33
#define INT_MIN (-2147483647 - 1)
4-
#define LONG_MAX 0x7fffffffffffffffL
4+
#define LONG_MAX 0x7fffffffffffffffL
55
#define LONG_MIN (-0x7fffffffffffffffL - 1)
66
#define CHAR_MAX SCHAR_MAX
77
#define CHAR_MIN SCHAR_MIN
Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,10 @@
11
#ifndef __CLC_SHARED_CLC_MAX_H__
22
#define __CLC_SHARED_CLC_MAX_H__
33

4-
#if defined(CLC_CLSPV) || defined(CLC_SPIRV)
5-
// clspv and spir-v targets provide their own OpenCL-compatible max
6-
#define __clc_max max
7-
#else
8-
94
#define __CLC_BODY <clc/shared/clc_max.inc>
105
#include <clc/integer/gentype.inc>
116

127
#define __CLC_BODY <clc/shared/clc_max.inc>
138
#include <clc/math/gentype.inc>
149

15-
#endif
16-
1710
#endif // __CLC_SHARED_CLC_MAX_H__
Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,10 @@
11
#ifndef __CLC_SHARED_CLC_MIN_H__
22
#define __CLC_SHARED_CLC_MIN_H__
33

4-
#if defined(CLC_CLSPV) || defined(CLC_SPIRV)
5-
// clspv and spir-v targets provide their own OpenCL-compatible min
6-
#define __clc_min min
7-
#else
8-
94
#define __CLC_BODY <clc/shared/clc_min.inc>
105
#include <clc/integer/gentype.inc>
116

127
#define __CLC_BODY <clc/shared/clc_min.inc>
138
#include <clc/math/gentype.inc>
149

15-
#endif
16-
1710
#endif // __CLC_SHARED_CLC_MIN_H__

0 commit comments

Comments
 (0)