Skip to content

Commit 4895d1c

Browse files
aratajewigcbot
authored andcommitted
Implement support for KHR SPV-IR for integer math functions from OpenCL Extended Instruction Set
This change includes support for the following functions: abs,abs_diff,add_sat,clamp,clz,ctz,hadd,mad_hi,mad_sat,mad24,max,min, mul_hi,mul24,popcnt,rhadd,rotate,sub_sat,upsample This is a preparation for SPIRV Translator switchover to vanilla version. Vanilla translator produces slightly different form of SPIRV builtins which is described here: https://github.com/KhronosGroup/SPIRV-LLVM-Translator/blob/master/docs/SPIRVRepresentationInLLVM.rst The plan is to support both versions until translator switchover is done. Once vanilla translator is enabled, old version of SPIRV builtins will get cleaned up.
1 parent 2edd583 commit 4895d1c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+4961
-4985
lines changed

IGC/BiFModule/Headers/spirv_math.h

Lines changed: 701 additions & 701 deletions
Large diffs are not rendered by default.

IGC/BiFModule/Implementation/ExternalLibraries/libclc/doubles.cl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ void __clc_remainder_piby2_large(double x, double *r, double *rr, int *regn) {
189189

190190
long ux = as_long(x);
191191
int e = (int)(ux >> 52) - 1023;
192-
int i = __builtin_spirv_OpenCL_s_max_i32_i32(23, (e >> 3) + 17);
192+
int i = SPIRV_OCL_BUILTIN(s_max, _i32_i32, )(23, (e >> 3) + 17);
193193
int j = 150 - i;
194194
int j16 = j & ~0xf;
195195
double fract_temp;

IGC/BiFModule/Implementation/ExternalLibraries/libclc/trig.cl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ int __clc_argReductionLargeS(float *r, float *rr, float x)
232232
p5 = p5 ^ flip;
233233

234234
// Find exponent and shift away leading zeroes and hidden bit
235-
xe = __builtin_spirv_OpenCL_clz_i32(p7) + 1;
235+
xe = SPIRV_OCL_BUILTIN(clz, _i32, )((int)p7) + 1;
236236
shift = 32 - xe;
237237
p7 = bitalign(p7, p6, shift);
238238
p6 = bitalign(p6, p5, shift);
@@ -244,7 +244,7 @@ int __clc_argReductionLargeS(float *r, float *rr, float x)
244244
p7 = bitalign(p7, p6, 32-23);
245245

246246
// Get 24 more bits of fraction in another float, there are not long strings of zeroes here
247-
int xxe = __builtin_spirv_OpenCL_clz_i32(p7) + 1;
247+
int xxe = SPIRV_OCL_BUILTIN(clz, _i32, )((int)p7) + 1;
248248
p7 = bitalign(p7, p6, 32-xxe);
249249
float q0 = as_float(sign | ((127 - (xe + 23 + xxe)) << 23) | (p7 >> 9));
250250

IGC/BiFModule/Implementation/IBiF_Intrinsics_Impl.cl

Lines changed: 53 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -14,100 +14,100 @@ INLINE float SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(fclamp, _f32_f32_f32, )(float
1414
}
1515

1616
INLINE
17-
uchar __builtin_spirv_OpenCL_s_abs_i8(char x ){
17+
uchar SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _i8, )(char x ){
1818
return x > 0 ? x : -x;
1919
}
2020

2121
INLINE
22-
ushort __builtin_spirv_OpenCL_s_abs_i16(short x ){
22+
ushort SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _i16, )(short x ){
2323
return x > 0 ? x : -x;
2424
}
2525

2626
INLINE
27-
uint __builtin_spirv_OpenCL_s_abs_i32(int x ){
27+
uint SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _i32, )(int x ){
2828
// Convert signed to unsigned to have consistent result.
2929
// Also, make abs(INT32_MIN) well defined : abs(INT32_MIN) = (ui32)(-(i64)INT32_MIN)
3030
uint ux = (uint)x;
3131
return x > 0 ? ux : -ux;
3232
}
3333

3434
INLINE
35-
char __builtin_spirv_OpenCL_s_add_sat_i8_i8( char x,
35+
char SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_add_sat, _i8_i8, )( char x,
3636
char y )
3737
{
38-
return (char)SPIRV_OCL_BUILTIN(s_min, _i32_i32, )( __builtin_spirv_OpenCL_s_max_i32_i32( (int)x + (int)y , CHAR_MIN), CHAR_MAX);
38+
return (char)SPIRV_OCL_BUILTIN(s_min, _i32_i32, )( SPIRV_OCL_BUILTIN(s_max, _i32_i32, )( (int)x + (int)y , CHAR_MIN), CHAR_MAX);
3939
}
4040

4141
INLINE
42-
uchar __builtin_spirv_OpenCL_u_add_sat_i8_i8( uchar x,
42+
uchar SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_add_sat, _i8_i8, )( uchar x,
4343
uchar y )
4444
{
45-
return (uchar)SPIRV_OCL_BUILTIN(u_min, _i32_i32, )( __builtin_spirv_OpenCL_u_max_i32_i32( (uint)x + (uint)y , 0), UCHAR_MAX);
45+
return (uchar)SPIRV_OCL_BUILTIN(u_min, _i32_i32, )( SPIRV_OCL_BUILTIN(u_max, _i32_i32, )( (uint)x + (uint)y , 0), UCHAR_MAX);
4646
}
4747

4848
INLINE
49-
short __builtin_spirv_OpenCL_s_add_sat_i16_i16( short x,
49+
short SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_add_sat, _i16_i16, )( short x,
5050
short y )
5151
{
52-
return (short)SPIRV_OCL_BUILTIN(s_min, _i32_i32, )( __builtin_spirv_OpenCL_s_max_i32_i32( (int)x + (int)y , SHRT_MIN), SHRT_MAX);
52+
return (short)SPIRV_OCL_BUILTIN(s_min, _i32_i32, )( SPIRV_OCL_BUILTIN(s_max, _i32_i32, )( (int)x + (int)y , SHRT_MIN), SHRT_MAX);
5353
}
5454

5555
INLINE
56-
ushort __builtin_spirv_OpenCL_u_add_sat_i16_i16( ushort x,
56+
ushort SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_add_sat, _i16_i16, )( ushort x,
5757
ushort y )
5858
{
59-
return (ushort)SPIRV_OCL_BUILTIN(u_min, _i32_i32, )(__builtin_spirv_OpenCL_u_max_i32_i32( (uint)x + (uint)y, 0), USHRT_MAX);
59+
return (ushort)SPIRV_OCL_BUILTIN(u_min, _i32_i32, )(SPIRV_OCL_BUILTIN(u_max, _i32_i32, )( (uint)x + (uint)y, 0), USHRT_MAX);
6060
}
6161

6262
INLINE
63-
int __builtin_spirv_OpenCL_s_add_sat_i32_i32( int x,
63+
int SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_add_sat, _i32_i32, )( int x,
6464
int y )
6565
{
6666
long tmp = (long) x + (long) y;
67-
return (int) __builtin_spirv_OpenCL_s_clamp_i64_i64_i64( tmp, (long)INT_MIN, (long)INT_MAX);
67+
return (int) SPIRV_OCL_BUILTIN(s_clamp, _i64_i64_i64, )( tmp, (long)INT_MIN, (long)INT_MAX);
6868
}
6969

7070
INLINE
71-
uint __builtin_spirv_OpenCL_u_add_sat_i32_i32( uint x,
71+
uint SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_add_sat, _i32_i32, )( uint x,
7272
uint y )
7373
{
7474
long tmp = (long) x + (long) y;
75-
return (uint) __builtin_spirv_OpenCL_s_clamp_i64_i64_i64( tmp, 0L, (long)UINT_MAX);
75+
return (uint) SPIRV_OCL_BUILTIN(s_clamp, _i64_i64_i64, )( tmp, 0L, (long)UINT_MAX);
7676
}
7777

7878
INLINE
79-
uchar __builtin_spirv_OpenCL_ctz_i8(uchar x ){
80-
return (uchar)__builtin_spirv_OpenCL_ctz_i32((uint)x | (1U << sizeof(x) * 8));
79+
char SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(ctz, _i8, )(char x ){
80+
return (char)SPIRV_OCL_BUILTIN(ctz, _i32, )((int)x | (1U << sizeof(x) * 8));
8181
}
8282

8383
INLINE
84-
ushort __builtin_spirv_OpenCL_ctz_i16(ushort x ){
85-
return (ushort)__builtin_spirv_OpenCL_ctz_i32((uint)x | (1U << sizeof(x) * 8));
84+
short SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(ctz, _i16, )(short x ){
85+
return (short)SPIRV_OCL_BUILTIN(ctz, _i32, )((int)x | (1U << sizeof(x) * 8));
8686
}
8787

8888
INLINE
89-
uint __builtin_spirv_OpenCL_ctz_i32(uint x ){
89+
int SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(ctz, _i32, )(int x ){
9090
uint rev = __builtin_IB_bfrev(x);
91-
return __builtin_spirv_OpenCL_clz_i32(rev);
91+
return SPIRV_OCL_BUILTIN(clz, _i32, )(as_int(rev));
9292
}
9393

9494
INLINE
95-
int __builtin_spirv_OpenCL_s_mad24_i32_i32_i32( int x,
95+
int SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_mad24, _i32_i32_i32, )( int x,
9696
int y,
9797
int z )
9898
{
99-
return __builtin_spirv_OpenCL_s_mul24_i32_i32(x, y) + z;
99+
return SPIRV_OCL_BUILTIN(s_mul24, _i32_i32, )(x, y) + z;
100100
}
101101

102102
INLINE
103-
uint __builtin_spirv_OpenCL_u_mad24_i32_i32_i32( uint x,
103+
uint SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_mad24, _i32_i32_i32, )( uint x,
104104
uint y,
105105
uint z )
106106
{
107-
return __builtin_spirv_OpenCL_u_mul24_i32_i32(x, y) + z;
107+
return SPIRV_OCL_BUILTIN(u_mul24, _i32_i32, )(x, y) + z;
108108
}
109109

110-
INLINE char __builtin_spirv_OpenCL_s_mad_sat_i8_i8_i8(
110+
INLINE char SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_mad_sat, _i8_i8_i8, )(
111111
char a,
112112
char b,
113113
char c)
@@ -116,7 +116,7 @@ INLINE char __builtin_spirv_OpenCL_s_mad_sat_i8_i8_i8(
116116
return SPIRV_BUILTIN(SConvert, _Sat_i8_i16, _Rchar_sat)(res);
117117
}
118118

119-
INLINE uchar __builtin_spirv_OpenCL_u_mad_sat_i8_i8_i8(
119+
INLINE uchar SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_mad_sat, _i8_i8_i8, )(
120120
uchar a,
121121
uchar b,
122122
uchar c)
@@ -125,7 +125,7 @@ INLINE uchar __builtin_spirv_OpenCL_u_mad_sat_i8_i8_i8(
125125
return SPIRV_BUILTIN(UConvert, _Sat_i8_i16, _Ruchar_sat)(res);
126126
}
127127

128-
INLINE short __builtin_spirv_OpenCL_s_mad_sat_i16_i16_i16(
128+
INLINE short SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_mad_sat, _i16_i16_i16, )(
129129
short a,
130130
short b,
131131
short c)
@@ -134,7 +134,7 @@ INLINE short __builtin_spirv_OpenCL_s_mad_sat_i16_i16_i16(
134134
return SPIRV_BUILTIN(SConvert, _Sat_i16_i32, _Rshort_sat)(res);
135135
}
136136

137-
INLINE ushort __builtin_spirv_OpenCL_u_mad_sat_i16_i16_i16(
137+
INLINE ushort SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_mad_sat, _i16_i16_i16, )(
138138
ushort a,
139139
ushort b,
140140
ushort c)
@@ -143,7 +143,7 @@ INLINE ushort __builtin_spirv_OpenCL_u_mad_sat_i16_i16_i16(
143143
return SPIRV_BUILTIN(UConvert, _Sat_i16_i32, _Rushort_sat)(res);
144144
}
145145

146-
INLINE int __builtin_spirv_OpenCL_s_mad_sat_i32_i32_i32(
146+
INLINE int SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_mad_sat, _i32_i32_i32, )(
147147
int a,
148148
int b,
149149
int c)
@@ -153,7 +153,7 @@ INLINE int __builtin_spirv_OpenCL_s_mad_sat_i32_i32_i32(
153153
}
154154

155155
INLINE
156-
uint __builtin_spirv_OpenCL_u_mad_sat_i32_i32_i32( uint a,
156+
uint SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_mad_sat, _i32_i32_i32, )( uint a,
157157
uint b,
158158
uint c )
159159
{
@@ -162,42 +162,42 @@ uint __builtin_spirv_OpenCL_u_mad_sat_i32_i32_i32( uint a,
162162
}
163163

164164
INLINE
165-
char __builtin_spirv_OpenCL_s_max_i8_i8(char x, char y ){
165+
char SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_max, _i8_i8, )(char x, char y ){
166166
return (x >= y) ? x : y;
167167
}
168168

169169
INLINE
170-
uchar __builtin_spirv_OpenCL_u_max_i8_i8(uchar x, uchar y ){
170+
uchar SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_max, _i8_i8, )(uchar x, uchar y ){
171171
return (x >= y) ? x : y;
172172
}
173173

174174
INLINE
175-
short __builtin_spirv_OpenCL_s_max_i16_i16(short x, short y ){
175+
short SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_max, _i16_i16, )(short x, short y ){
176176
return (x >= y) ? x : y;
177177
}
178178

179179
INLINE
180-
ushort __builtin_spirv_OpenCL_u_max_i16_i16(ushort x, ushort y ){
180+
ushort SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_max, _i16_i16, )(ushort x, ushort y ){
181181
return (x >= y) ? x : y;
182182
}
183183

184184
INLINE
185-
int __builtin_spirv_OpenCL_s_max_i32_i32(int x, int y ){
185+
int SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_max, _i32_i32, )(int x, int y ){
186186
return (x >= y) ? x : y;
187187
}
188188

189189
INLINE
190-
uint __builtin_spirv_OpenCL_u_max_i32_i32(uint x, uint y ){
190+
uint SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_max, _i32_i32, )(uint x, uint y ){
191191
return (x >= y) ? x : y;
192192
}
193193

194194
INLINE
195-
long __builtin_spirv_OpenCL_s_max_i64_i64(long x, long y ){
195+
long SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_max, _i64_i64, )(long x, long y ){
196196
return (x >= y) ? x : y;
197197
}
198198

199199
INLINE
200-
ulong __builtin_spirv_OpenCL_u_max_i64_i64(ulong x, ulong y ){
200+
ulong SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_max, _i64_i64, )(ulong x, ulong y ){
201201
return (x >= y) ? x : y;
202202
}
203203

@@ -242,74 +242,74 @@ ulong SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_min, _i64_i64, )(ulong x, ulong y )
242242
}
243243

244244
INLINE
245-
uint __builtin_spirv_OpenCL_u_mul_hi_i32_i32( uint x,
245+
uint SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_mul_hi, _i32_i32, )( uint x,
246246
uint y )
247247
{
248248
return ((ulong)x * (ulong)y) >> 32;
249249
}
250250

251251
INLINE
252-
int __builtin_spirv_OpenCL_s_mul_hi_i32_i32( int x,
252+
int SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_mul_hi, _i32_i32, )( int x,
253253
int y )
254254
{
255255
return ((long)x * (long)y) >> 32;
256256
}
257257

258258
INLINE
259-
uchar __builtin_spirv_OpenCL_popcount_i8(uchar x ){
259+
char SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(popcount, _i8, )(char x ){
260260
return __builtin_IB_popcount_1u8(x);
261261
}
262262

263263
INLINE
264-
ushort __builtin_spirv_OpenCL_popcount_i16(ushort x ){
264+
short SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(popcount, _i16, )(short x ){
265265
return __builtin_IB_popcount_1u16(x);
266266
}
267267

268268
INLINE
269-
uint __builtin_spirv_OpenCL_popcount_i32(uint x ){
269+
int SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(popcount, _i32, )(int x ){
270270
return __builtin_IB_popcount_1u32(x);
271271
}
272272

273273
INLINE
274-
char __builtin_spirv_OpenCL_s_sub_sat_i8_i8( char x,
274+
char SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_sub_sat, _i8_i8, )( char x,
275275
char y )
276276
{
277277
short tmp = (short)x - (short)y;
278-
return (char) __builtin_spirv_OpenCL_s_clamp_i16_i16_i16(tmp, (short)CHAR_MIN, (short)CHAR_MAX);
278+
return (char) SPIRV_OCL_BUILTIN(s_clamp, _i16_i16_i16, )(tmp, (short)CHAR_MIN, (short)CHAR_MAX);
279279
}
280280

281281
INLINE
282-
uchar __builtin_spirv_OpenCL_u_sub_sat_i8_i8( uchar x,
282+
uchar SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_sub_sat, _i8_i8, )( uchar x,
283283
uchar y )
284284
{
285285
return ( x <= y ) ? 0 : x - y;
286286
}
287287

288288
INLINE
289-
short __builtin_spirv_OpenCL_s_sub_sat_i16_i16( short x,
289+
short SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_sub_sat, _i16_i16, )( short x,
290290
short y )
291291
{
292292
int tmp = (int)x - (int)y;
293-
return (short) __builtin_spirv_OpenCL_s_clamp_i32_i32_i32( tmp, (int)SHRT_MIN, (int)SHRT_MAX);
293+
return (short) SPIRV_OCL_BUILTIN(s_clamp, _i32_i32_i32, )( tmp, (int)SHRT_MIN, (int)SHRT_MAX);
294294
}
295295

296296
INLINE
297-
ushort __builtin_spirv_OpenCL_u_sub_sat_i16_i16( ushort x,
297+
ushort SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_sub_sat, _i16_i16, )( ushort x,
298298
ushort y )
299299
{
300300
return ( x <= y ) ? 0 : x - y;
301301
}
302302

303303
INLINE
304-
int __builtin_spirv_OpenCL_s_sub_sat_i32_i32( int x,
304+
int SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_sub_sat, _i32_i32, )( int x,
305305
int y )
306306
{
307307
long tmp = (long)x - (long)y;
308-
return (int) __builtin_spirv_OpenCL_s_clamp_i64_i64_i64( tmp, (long)INT_MIN, (long)INT_MAX);
308+
return (int) SPIRV_OCL_BUILTIN(s_clamp, _i64_i64_i64, )( tmp, (long)INT_MIN, (long)INT_MAX);
309309
}
310310

311311
INLINE
312-
uint __builtin_spirv_OpenCL_u_sub_sat_i32_i32( uint x,
312+
uint SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_sub_sat, _i32_i32, )( uint x,
313313
uint y )
314314
{
315315
return ( x <= y ) ? 0 : x - y;

IGC/BiFModule/Implementation/IGCBiF_Math_64bitDiv.cl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ INLINE ulong16 OVERLOADABLE __builtin_IB_umod( ulong16 N, ulong16 D )
158158
// ----------------------------------------------------------------------------
159159
INLINE long OVERLOADABLE __builtin_IB_sdiv( long N, long D )
160160
{
161-
ulong Q = __builtin_IB_emulate_udiv( __builtin_spirv_OpenCL_s_abs_i64(N), __builtin_spirv_OpenCL_s_abs_i64(D), 0 );
161+
ulong Q = __builtin_IB_emulate_udiv( SPIRV_OCL_BUILTIN(s_abs, _i64, )(N), SPIRV_OCL_BUILTIN(s_abs, _i64, )(D), 0 );
162162

163163
ulong SIGN = ( N ^ D ) & 0x8000000000000000;
164164

@@ -227,7 +227,7 @@ INLINE long16 OVERLOADABLE __builtin_IB_sdiv( long16 N, long16 D )
227227
INLINE long OVERLOADABLE __builtin_IB_smod( long N, long D )
228228
{
229229
ulong R = 0;
230-
__builtin_IB_emulate_udiv(__builtin_spirv_OpenCL_s_abs_i64(N), __builtin_spirv_OpenCL_s_abs_i64(D), &R);
230+
__builtin_IB_emulate_udiv(SPIRV_OCL_BUILTIN(s_abs, _i64, )(N), SPIRV_OCL_BUILTIN(s_abs, _i64, )(D), &R);
231231

232232
uchar SIGN = (N < 0);
233233
return SIGN ? -R : R;

0 commit comments

Comments
 (0)