Skip to content

Commit ae57854

Browse files
authored
[libclc] Define macros for users of gentype.inc (#128012)
Several users of (mostly math/) gentype.inc rely on types other than the 'gentype'. This is commonly intN as several maths builtins expose this as a return or paramter type. We were previously explicitly defining this type for every gentype. Other implementations rely on integer types of the same size and element width as the gentype, such as short/ushort for half, long/ulong for double, etc. Users might also rely on as_type or convert_type builtins to/from these types. The previous method we used to define intN was unscalable if we wanted to expose more types and helpers. This commit introduces a simpler system whereby several macros are defined at the beginning of gentype.inc. These rely on concatenating with the vector size. To facilitate this system, scalar gentypes now define an empty vector size. It was previously undefined, which was dangerous. An added benefit is that it matches how the integer gentype.inc vector size has been working. These macros will be especially helpful for the definitions of logb/ilogb in an upcoming patch.
1 parent 6eba277 commit ae57854

File tree

15 files changed

+158
-176
lines changed

15 files changed

+158
-176
lines changed

libclc/clc/include/clc/integer/gentype.inc

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
#include <clc/clcfunc.h>
22
#include <clc/clctypes.h>
3+
#include <clc/utils.h>
4+
5+
#define __CLC_AS_GENTYPE __CLC_XCONCAT(__clc_as_, __CLC_GENTYPE)
6+
#define __CLC_CONVERT_GENTYPE __CLC_XCONCAT(__clc_convert_, __CLC_GENTYPE)
7+
8+
#define __CLC_AS_U_GENTYPE __CLC_XCONCAT(__clc_as_, __CLC_U_GENTYPE)
9+
#define __CLC_CONVERT_U_GENTYPE __CLC_XCONCAT(__clc_convert_, __CLC_U_GENTYPE)
10+
11+
#define __CLC_AS_S_GENTYPE __CLC_XCONCAT(__clc_as_, __CLC_S_GENTYPE)
12+
#define __CLC_CONVERT_S_GENTYPE __CLC_XCONCAT(__clc_convert_, __CLC_S_GENTYPE)
313

414
// These 2 defines only change when switching between data sizes or base types
515
// to keep this file manageable.
@@ -532,3 +542,12 @@
532542
#undef __CLC_GENSIZE
533543
#undef __CLC_SCALAR_GENTYPE
534544
#undef __CLC_BODY
545+
546+
#undef __CLC_CONVERT_S_GENTYPE
547+
#undef __CLC_AS_S_GENTYPE
548+
549+
#undef __CLC_CONVERT_U_GENTYPE
550+
#undef __CLC_AS_U_GENTYPE
551+
552+
#undef __CLC_CONVERT_GENTYPE
553+
#undef __CLC_AS_GENTYPE
Lines changed: 123 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,120 @@
11
#include <clc/clcfunc.h>
22
#include <clc/clctypes.h>
3+
#include <clc/utils.h>
4+
5+
// Define some useful macros for type conversions.
6+
#define __CLC_AS_GENTYPE __CLC_XCONCAT(__clc_as_, __CLC_GENTYPE)
7+
#define __CLC_CONVERT_GENTYPE __CLC_XCONCAT(__clc_convert_, __CLC_GENTYPE)
8+
9+
// Define some macros for types matching the same vector size as __CLC_GENTYPE.
10+
#define __CLC_HALFN __CLC_XCONCAT(half, __CLC_VECSIZE)
11+
#define __CLC_FLOATN __CLC_XCONCAT(float, __CLC_VECSIZE)
12+
#define __CLC_DOUBLEN __CLC_XCONCAT(double, __CLC_VECSIZE)
13+
14+
#define __CLC_CHARN __CLC_XCONCAT(char, __CLC_VECSIZE)
15+
#define __CLC_SHORTN __CLC_XCONCAT(short, __CLC_VECSIZE)
16+
#define __CLC_INTN __CLC_XCONCAT(int, __CLC_VECSIZE)
17+
#define __CLC_LONGN __CLC_XCONCAT(long, __CLC_VECSIZE)
18+
19+
#define __CLC_UCHARN __CLC_XCONCAT(uchar, __CLC_VECSIZE)
20+
#define __CLC_USHORTN __CLC_XCONCAT(ushort, __CLC_VECSIZE)
21+
#define __CLC_UINTN __CLC_XCONCAT(uint, __CLC_VECSIZE)
22+
#define __CLC_ULONGN __CLC_XCONCAT(ulong, __CLC_VECSIZE)
23+
24+
#define __CLC_AS_CHARN __CLC_XCONCAT(__clc_as_, __CLC_CHARN)
25+
#define __CLC_AS_SHORTN __CLC_XCONCAT(__clc_as_, __CLC_SHORTN)
26+
#define __CLC_AS_INTN __CLC_XCONCAT(__clc_as_, __CLC_INTN)
27+
#define __CLC_AS_LONGN __CLC_XCONCAT(__clc_as_, __CLC_LONGN)
28+
29+
#define __CLC_AS_UCHARN __CLC_XCONCAT(__clc_as_, __CLC_UCHARN)
30+
#define __CLC_AS_USHORTN __CLC_XCONCAT(__clc_as_, __CLC_USHORTN)
31+
#define __CLC_AS_UINTN __CLC_XCONCAT(__clc_as_, __CLC_UINTN)
32+
#define __CLC_AS_ULONGN __CLC_XCONCAT(__clc_as_, __CLC_ULONGN)
33+
34+
#define __CLC_CONVERT_HALFN __CLC_XCONCAT(__clc_convert_half, __CLC_VECSIZE)
35+
#define __CLC_CONVERT_FLOATN __CLC_XCONCAT(__clc_convert_float, __CLC_VECSIZE)
36+
#define __CLC_CONVERT_DOUBLEN __CLC_XCONCAT(__clc_convert_double, __CLC_VECSIZE)
37+
38+
#define __CLC_CONVERT_CHARN __CLC_XCONCAT(__clc_convert_, __CLC_CHARN)
39+
#define __CLC_CONVERT_SHORTN __CLC_XCONCAT(__clc_convert_, __CLC_SHORTN)
40+
#define __CLC_CONVERT_INTN __CLC_XCONCAT(__clc_convert_, __CLC_INTN)
41+
#define __CLC_CONVERT_LONGN __CLC_XCONCAT(__clc_convert_, __CLC_LONGN)
42+
43+
#define __CLC_CONVERT_UCHARN __CLC_XCONCAT(__clc_convert_, __CLC_UCHARN)
44+
#define __CLC_CONVERT_USHORTN __CLC_XCONCAT(__clc_convert_, __CLC_USHORTN)
45+
#define __CLC_CONVERT_UINTN __CLC_XCONCAT(__clc_convert_, __CLC_UINTN)
46+
#define __CLC_CONVERT_ULONGN __CLC_XCONCAT(__clc_convert_, __CLC_ULONGN)
47+
48+
// See definitions of __CLC_S_GENTYPE/__CLC_U_GENTYPE below, which depend on the
49+
// specific size of floating-point type. These are the signed and unsigned
50+
// integers of the same bitwidth and element count as the GENTYPE. They match
51+
// the naming conventions in the integer version gentype.inc, for
52+
// convenience.
53+
#define __CLC_AS_S_GENTYPE __CLC_XCONCAT(__clc_as_, __CLC_S_GENTYPE)
54+
#define __CLC_AS_U_GENTYPE __CLC_XCONCAT(__clc_as_, __CLC_U_GENTYPE)
55+
56+
#define __CLC_CONVERT_S_GENTYPE __CLC_XCONCAT(__clc_convert_, __CLC_S_GENTYPE)
57+
#define __CLC_CONVERT_U_GENTYPE __CLC_XCONCAT(__clc_convert_, __CLC_U_GENTYPE)
358

459
#define __CLC_SCALAR_GENTYPE float
560
#define __CLC_FPSIZE 32
661
#define __CLC_FP_LIT(x) x##F
762

63+
#define __CLC_S_GENTYPE __CLC_XCONCAT(int, __CLC_VECSIZE)
64+
#define __CLC_U_GENTYPE __CLC_XCONCAT(uint, __CLC_VECSIZE)
65+
866
#define __CLC_GENTYPE float
9-
#define __CLC_INTN int
1067
#define __CLC_BIT_INTN int
1168
#define __CLC_SCALAR
69+
#define __CLC_VECSIZE
1270
#include __CLC_BODY
71+
#undef __CLC_VECSIZE
1372
#undef __CLC_GENTYPE
1473
#undef __CLC_BIT_INTN
15-
#undef __CLC_INTN
1674
#undef __CLC_SCALAR
1775

1876
#define __CLC_GENTYPE float2
19-
#define __CLC_INTN int2
2077
#define __CLC_BIT_INTN int2
2178
#define __CLC_VECSIZE 2
2279
#include __CLC_BODY
2380
#undef __CLC_VECSIZE
2481
#undef __CLC_GENTYPE
2582
#undef __CLC_BIT_INTN
26-
#undef __CLC_INTN
2783

2884
#define __CLC_GENTYPE float3
29-
#define __CLC_INTN int3
3085
#define __CLC_BIT_INTN int3
3186
#define __CLC_VECSIZE 3
3287
#include __CLC_BODY
3388
#undef __CLC_VECSIZE
3489
#undef __CLC_GENTYPE
3590
#undef __CLC_BIT_INTN
36-
#undef __CLC_INTN
3791

3892
#define __CLC_GENTYPE float4
39-
#define __CLC_INTN int4
4093
#define __CLC_BIT_INTN int4
4194
#define __CLC_VECSIZE 4
4295
#include __CLC_BODY
4396
#undef __CLC_VECSIZE
4497
#undef __CLC_GENTYPE
4598
#undef __CLC_BIT_INTN
46-
#undef __CLC_INTN
4799

48100
#define __CLC_GENTYPE float8
49-
#define __CLC_INTN int8
50101
#define __CLC_BIT_INTN int8
51102
#define __CLC_VECSIZE 8
52103
#include __CLC_BODY
53104
#undef __CLC_VECSIZE
54105
#undef __CLC_GENTYPE
55106
#undef __CLC_BIT_INTN
56-
#undef __CLC_INTN
57107

58108
#define __CLC_GENTYPE float16
59-
#define __CLC_INTN int16
60109
#define __CLC_BIT_INTN int16
61110
#define __CLC_VECSIZE 16
62111
#include __CLC_BODY
63112
#undef __CLC_VECSIZE
64113
#undef __CLC_GENTYPE
65114
#undef __CLC_BIT_INTN
66-
#undef __CLC_INTN
67115

116+
#undef __CLC_U_GENTYPE
117+
#undef __CLC_S_GENTYPE
68118
#undef __CLC_FP_LIT
69119
#undef __CLC_FPSIZE
70120
#undef __CLC_SCALAR_GENTYPE
@@ -77,66 +127,61 @@
77127
#define __CLC_FPSIZE 64
78128
#define __CLC_FP_LIT(x) (x)
79129

130+
#define __CLC_S_GENTYPE __CLC_XCONCAT(long, __CLC_VECSIZE)
131+
#define __CLC_U_GENTYPE __CLC_XCONCAT(ulong, __CLC_VECSIZE)
132+
80133
#define __CLC_SCALAR
134+
#define __CLC_VECSIZE
81135
#define __CLC_GENTYPE double
82-
#define __CLC_INTN int
83136
#define __CLC_BIT_INTN long
84137
#include __CLC_BODY
85138
#undef __CLC_GENTYPE
86139
#undef __CLC_BIT_INTN
87-
#undef __CLC_INTN
140+
#undef __CLC_VECSIZE
88141
#undef __CLC_SCALAR
89142

90143
#define __CLC_GENTYPE double2
91-
#define __CLC_INTN int2
92144
#define __CLC_BIT_INTN long2
93145
#define __CLC_VECSIZE 2
94146
#include __CLC_BODY
95147
#undef __CLC_VECSIZE
96148
#undef __CLC_GENTYPE
97149
#undef __CLC_BIT_INTN
98-
#undef __CLC_INTN
99150

100151
#define __CLC_GENTYPE double3
101-
#define __CLC_INTN int3
102152
#define __CLC_BIT_INTN long3
103153
#define __CLC_VECSIZE 3
104154
#include __CLC_BODY
105155
#undef __CLC_VECSIZE
106156
#undef __CLC_GENTYPE
107157
#undef __CLC_BIT_INTN
108-
#undef __CLC_INTN
109158

110159
#define __CLC_GENTYPE double4
111-
#define __CLC_INTN int4
112160
#define __CLC_BIT_INTN long4
113161
#define __CLC_VECSIZE 4
114162
#include __CLC_BODY
115163
#undef __CLC_VECSIZE
116164
#undef __CLC_GENTYPE
117165
#undef __CLC_BIT_INTN
118-
#undef __CLC_INTN
119166

120167
#define __CLC_GENTYPE double8
121-
#define __CLC_INTN int8
122168
#define __CLC_BIT_INTN long8
123169
#define __CLC_VECSIZE 8
124170
#include __CLC_BODY
125171
#undef __CLC_VECSIZE
126172
#undef __CLC_GENTYPE
127173
#undef __CLC_BIT_INTN
128-
#undef __CLC_INTN
129174

130175
#define __CLC_GENTYPE double16
131-
#define __CLC_INTN int16
132176
#define __CLC_BIT_INTN long16
133177
#define __CLC_VECSIZE 16
134178
#include __CLC_BODY
135179
#undef __CLC_VECSIZE
136180
#undef __CLC_GENTYPE
137181
#undef __CLC_BIT_INTN
138-
#undef __CLC_INTN
139182

183+
#undef __CLC_U_GENTYPE
184+
#undef __CLC_S_GENTYPE
140185
#undef __CLC_FP_LIT
141186
#undef __CLC_FPSIZE
142187
#undef __CLC_SCALAR_GENTYPE
@@ -151,70 +196,112 @@
151196
#define __CLC_FPSIZE 16
152197
#define __CLC_FP_LIT(x) x##H
153198

199+
#define __CLC_S_GENTYPE __CLC_XCONCAT(short, __CLC_VECSIZE)
200+
#define __CLC_U_GENTYPE __CLC_XCONCAT(ushort, __CLC_VECSIZE)
201+
154202
#define __CLC_SCALAR
203+
#define __CLC_VECSIZE
155204
#define __CLC_GENTYPE half
156-
#define __CLC_INTN int
157205
#define __CLC_BIT_INTN short
158206
#include __CLC_BODY
159207
#undef __CLC_GENTYPE
160208
#undef __CLC_BIT_INTN
161-
#undef __CLC_INTN
209+
#undef __CLC_VECSIZE
162210
#undef __CLC_SCALAR
163211

164212
#define __CLC_GENTYPE half2
165-
#define __CLC_INTN int2
166213
#define __CLC_BIT_INTN short2
167214
#define __CLC_VECSIZE 2
168215
#include __CLC_BODY
169216
#undef __CLC_VECSIZE
170217
#undef __CLC_GENTYPE
171218
#undef __CLC_BIT_INTN
172-
#undef __CLC_INTN
173219

174220
#define __CLC_GENTYPE half3
175-
#define __CLC_INTN int3
176221
#define __CLC_BIT_INTN short3
177222
#define __CLC_VECSIZE 3
178223
#include __CLC_BODY
179224
#undef __CLC_VECSIZE
180225
#undef __CLC_GENTYPE
181226
#undef __CLC_BIT_INTN
182-
#undef __CLC_INTN
183227

184228
#define __CLC_GENTYPE half4
185-
#define __CLC_INTN int4
186229
#define __CLC_BIT_INTN short4
187230
#define __CLC_VECSIZE 4
188231
#include __CLC_BODY
189232
#undef __CLC_VECSIZE
190233
#undef __CLC_GENTYPE
191234
#undef __CLC_BIT_INTN
192-
#undef __CLC_INTN
193235

194236
#define __CLC_GENTYPE half8
195-
#define __CLC_INTN int8
196237
#define __CLC_BIT_INTN short8
197238
#define __CLC_VECSIZE 8
198239
#include __CLC_BODY
199240
#undef __CLC_VECSIZE
200241
#undef __CLC_GENTYPE
201242
#undef __CLC_BIT_INTN
202-
#undef __CLC_INTN
203243

204244
#define __CLC_GENTYPE half16
205-
#define __CLC_INTN int16
206245
#define __CLC_BIT_INTN short16
207246
#define __CLC_VECSIZE 16
208247
#include __CLC_BODY
209248
#undef __CLC_VECSIZE
210249
#undef __CLC_GENTYPE
211250
#undef __CLC_BIT_INTN
212-
#undef __CLC_INTN
213251

252+
#undef __CLC_U_GENTYPE
253+
#undef __CLC_S_GENTYPE
214254
#undef __CLC_FP_LIT
215255
#undef __CLC_FPSIZE
216256
#undef __CLC_SCALAR_GENTYPE
217257
#endif
218258
#endif
219259

220260
#undef __CLC_BODY
261+
262+
#undef __CLC_AS_U_GENTYPE
263+
#undef __CLC_AS_S_GENTYPE
264+
265+
#undef __CLC_CONVERT_U_GENTYPE
266+
#undef __CLC_CONVERT_S_GENTYPE
267+
268+
#undef __CLC_AS_CHARN
269+
#undef __CLC_AS_SHORTN
270+
#undef __CLC_AS_INTN
271+
#undef __CLC_AS_LONGN
272+
273+
#undef __CLC_AS_UCHARN
274+
#undef __CLC_AS_USHORTN
275+
#undef __CLC_AS_UINTN
276+
#undef __CLC_AS_ULONGN
277+
278+
#undef __CLC_CONVERT_HALFN
279+
#undef __CLC_CONVERT_FLOATN
280+
#undef __CLC_CONVERT_DOUBLEN
281+
282+
#undef __CLC_CONVERT_CHARN
283+
#undef __CLC_CONVERT_SHORTN
284+
#undef __CLC_CONVERT_INTN
285+
#undef __CLC_CONVERT_LONGN
286+
287+
#undef __CLC_CONVERT_UCHARN
288+
#undef __CLC_CONVERT_USHORTN
289+
#undef __CLC_CONVERT_UINTN
290+
#undef __CLC_CONVERT_ULONGN
291+
292+
#undef __CLC_ULONGN
293+
#undef __CLC_UINTN
294+
#undef __CLC_USHORTN
295+
#undef __CLC_UCHARN
296+
297+
#undef __CLC_LONGN
298+
#undef __CLC_INTN
299+
#undef __CLC_SHORTN
300+
#undef __CLC_CHARN
301+
302+
#undef __CLC_DOUBLEN
303+
#undef __CLC_FLOATN
304+
#undef __CLC_HALFN
305+
306+
#undef __CLC_AS_GENTYPE
307+
#undef __CLC_CONVERT_GENTYPE
Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,6 @@
1-
#ifdef __CLC_SCALAR
2-
#define __CLC_VECSIZE
3-
#endif
4-
5-
#if __CLC_FPSIZE == 64
6-
#define __CLC_S_GENTYPE __CLC_XCONCAT(long, __CLC_VECSIZE)
7-
#define __CLC_U_GENTYPE __CLC_XCONCAT(ulong, __CLC_VECSIZE)
8-
#elif __CLC_FPSIZE == 32
9-
#define __CLC_S_GENTYPE __CLC_XCONCAT(int, __CLC_VECSIZE)
10-
#define __CLC_U_GENTYPE __CLC_XCONCAT(uint, __CLC_VECSIZE)
11-
#elif __CLC_FPSIZE == 16
12-
#define __CLC_S_GENTYPE __CLC_XCONCAT(short, __CLC_VECSIZE)
13-
#define __CLC_U_GENTYPE __CLC_XCONCAT(ushort, __CLC_VECSIZE)
14-
#endif
15-
161
_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE __CLC_SELECT_FN(__CLC_GENTYPE x,
172
__CLC_GENTYPE y,
183
__CLC_S_GENTYPE z);
194
_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE __CLC_SELECT_FN(__CLC_GENTYPE x,
205
__CLC_GENTYPE y,
216
__CLC_U_GENTYPE z);
22-
23-
#ifdef __CLC_FPSIZE
24-
#undef __CLC_S_GENTYPE
25-
#undef __CLC_U_GENTYPE
26-
#endif
27-
#ifdef __CLC_SCALAR
28-
#undef __CLC_VECSIZE
29-
#endif

0 commit comments

Comments
 (0)