1/*========================== begin_copyright_notice ============================
2
3Copyright (C) 2017-2021 Intel Corporation
4
5SPDX-License-Identifier: MIT
6
7============================= end_copyright_notice ===========================*/
8
9#include "../include/BiF_Definitions.cl"
10#include "../../Headers/spirv.h"
11
12
13INLINE
14uchar2 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v2i8, )( char2 x )
15{
16    uchar2 temp;
17    temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s0);
18    temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s1);
19    return temp;
20}
21
22INLINE
23uchar3 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v3i8, )( char3 x )
24{
25    uchar3 temp;
26    temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s0);
27    temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s1);
28    temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s2);
29    return temp;
30}
31
32INLINE
33uchar4 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v4i8, )( char4 x )
34{
35    uchar4 temp;
36    temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s0);
37    temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s1);
38    temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s2);
39    temp.s3 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s3);
40    return temp;
41}
42
43INLINE
44uchar8 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v8i8, )( char8 x )
45{
46    uchar8 temp;
47    temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s0);
48    temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s1);
49    temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s2);
50    temp.s3 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s3);
51    temp.s4 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s4);
52    temp.s5 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s5);
53    temp.s6 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s6);
54    temp.s7 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s7);
55    return temp;
56}
57
58INLINE
59uchar16 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v16i8, )( char16 x )
60{
61    uchar16 temp;
62    temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s0);
63    temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s1);
64    temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s2);
65    temp.s3 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s3);
66    temp.s4 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s4);
67    temp.s5 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s5);
68    temp.s6 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s6);
69    temp.s7 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s7);
70    temp.s8 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s8);
71    temp.s9 = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.s9);
72    temp.sa = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.sa);
73    temp.sb = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.sb);
74    temp.sc = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.sc);
75    temp.sd = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.sd);
76    temp.se = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.se);
77    temp.sf = SPIRV_OCL_BUILTIN(s_abs, _i8, )(x.sf);
78    return temp;
79}
80
81INLINE
82uchar SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _i8, )( uchar x )
83{
84    return x;
85}
86
87INLINE
88uchar2 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v2i8, )( uchar2 x )
89{
90    return x;
91}
92
93INLINE
94uchar3 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v3i8, )( uchar3 x )
95{
96    return x;
97}
98
99INLINE
100uchar4 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v4i8, )( uchar4 x )
101{
102    return x;
103}
104
105INLINE
106uchar8 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v8i8, )( uchar8 x )
107{
108    return x;
109}
110
111INLINE
112uchar16 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v16i8, )( uchar16 x )
113{
114    return x;
115}
116
117
118
119INLINE
120ushort2 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v2i16, )( short2 x )
121{
122    ushort2 temp;
123    temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s0);
124    temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s1);
125    return temp;
126}
127
128INLINE
129ushort3 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v3i16, )( short3 x )
130{
131    ushort3 temp;
132    temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s0);
133    temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s1);
134    temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s2);
135    return temp;
136}
137
138INLINE
139ushort4 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v4i16, )( short4 x )
140{
141    ushort4 temp;
142    temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s0);
143    temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s1);
144    temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s2);
145    temp.s3 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s3);
146    return temp;
147}
148
149INLINE
150ushort8 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v8i16, )( short8 x )
151{
152    ushort8 temp;
153    temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s0);
154    temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s1);
155    temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s2);
156    temp.s3 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s3);
157    temp.s4 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s4);
158    temp.s5 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s5);
159    temp.s6 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s6);
160    temp.s7 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s7);
161    return temp;
162}
163
164INLINE
165ushort16 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v16i16, )( short16 x )
166{
167    ushort16 temp;
168    temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s0);
169    temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s1);
170    temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s2);
171    temp.s3 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s3);
172    temp.s4 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s4);
173    temp.s5 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s5);
174    temp.s6 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s6);
175    temp.s7 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s7);
176    temp.s8 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s8);
177    temp.s9 = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.s9);
178    temp.sa = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.sa);
179    temp.sb = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.sb);
180    temp.sc = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.sc);
181    temp.sd = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.sd);
182    temp.se = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.se);
183    temp.sf = SPIRV_OCL_BUILTIN(s_abs, _i16, )(x.sf);
184    return temp;
185}
186
187INLINE
188ushort SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _i16, )( ushort x )
189{
190    return x;
191}
192
193INLINE
194ushort2 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v2i16, )( ushort2 x )
195{
196    return x;
197}
198
199INLINE
200ushort3 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v3i16, )( ushort3 x )
201{
202    return x;
203}
204
205INLINE
206ushort4 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v4i16, )( ushort4 x )
207{
208    return x;
209}
210
211INLINE
212ushort8 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v8i16, )( ushort8 x )
213{
214    return x;
215}
216
217INLINE
218ushort16 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v16i16, )( ushort16 x )
219{
220    return x;
221}
222
223
224
225INLINE
226uint2 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v2i32, )( int2 x )
227{
228    uint2 temp;
229    temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s0);
230    temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s1);
231    return temp;
232}
233
234INLINE
235uint3 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v3i32, )( int3 x )
236{
237    uint3 temp;
238    temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s0);
239    temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s1);
240    temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s2);
241    return temp;
242}
243
244INLINE
245uint4 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v4i32, )( int4 x )
246{
247    uint4 temp;
248    temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s0);
249    temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s1);
250    temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s2);
251    temp.s3 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s3);
252    return temp;
253}
254
255INLINE
256uint8 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v8i32, )( int8 x )
257{
258    uint8 temp;
259    temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s0);
260    temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s1);
261    temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s2);
262    temp.s3 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s3);
263    temp.s4 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s4);
264    temp.s5 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s5);
265    temp.s6 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s6);
266    temp.s7 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s7);
267    return temp;
268}
269
270INLINE
271uint16 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v16i32, )( int16 x )
272{
273    uint16 temp;
274    temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s0);
275    temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s1);
276    temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s2);
277    temp.s3 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s3);
278    temp.s4 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s4);
279    temp.s5 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s5);
280    temp.s6 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s6);
281    temp.s7 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s7);
282    temp.s8 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s8);
283    temp.s9 = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.s9);
284    temp.sa = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.sa);
285    temp.sb = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.sb);
286    temp.sc = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.sc);
287    temp.sd = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.sd);
288    temp.se = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.se);
289    temp.sf = SPIRV_OCL_BUILTIN(s_abs, _i32, )(x.sf);
290    return temp;
291}
292
293INLINE
294uint SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _i32, )( uint x )
295{
296    return x;
297}
298
299INLINE
300uint2 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v2i32, )( uint2 x )
301{
302    return x;
303}
304
305INLINE
306uint3 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v3i32, )( uint3 x )
307{
308    return x;
309}
310
311INLINE
312uint4 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v4i32, )( uint4 x )
313{
314    return x;
315}
316
317INLINE
318uint8 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v8i32, )( uint8 x )
319{
320    return x;
321}
322
323INLINE
324uint16 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v16i32, )( uint16 x )
325{
326    return x;
327}
328
329INLINE
330ulong SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _i64, )( long x )
331{
332    // -x would overflow if x = 0x8000000000000000, resulting undefined behavior
333    // -ux would never overflow and is well-defined.
334    // In llvm, -x could be "sub nsw  0, x", where -ux is "sub 0, ux". "nsw" indicates
335    // the result might be undefined.
336    // With this, this function will always return -INT64_MIN for x = INT64_MIN
337    // Note that the standard lib int abs(int) has undefined behavior when x = MIN.
338    ulong ux = (ulong)x;
339    return (ulong)((x >= 0) ? ux : -ux);
340}
341
342INLINE
343ulong2 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v2i64, )( long2 x )
344{
345    ulong2 temp;
346    temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s0);
347    temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s1);
348    return temp;
349}
350
351INLINE
352ulong3 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v3i64, )( long3 x )
353{
354    ulong3 temp;
355    temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s0);
356    temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s1);
357    temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s2);
358    return temp;
359}
360
361INLINE
362ulong4 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v4i64, )( long4 x )
363{
364    ulong4 temp;
365    temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s0);
366    temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s1);
367    temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s2);
368    temp.s3 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s3);
369    return temp;
370}
371
372INLINE
373ulong8 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v8i64, )( long8 x )
374{
375    ulong8 temp;
376    temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s0);
377    temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s1);
378    temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s2);
379    temp.s3 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s3);
380    temp.s4 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s4);
381    temp.s5 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s5);
382    temp.s6 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s6);
383    temp.s7 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s7);
384    return temp;
385}
386
387INLINE
388ulong16 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs, _v16i64, )( long16 x )
389{
390    ulong16 temp;
391    temp.s0 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s0);
392    temp.s1 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s1);
393    temp.s2 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s2);
394    temp.s3 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s3);
395    temp.s4 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s4);
396    temp.s5 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s5);
397    temp.s6 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s6);
398    temp.s7 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s7);
399    temp.s8 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s8);
400    temp.s9 = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.s9);
401    temp.sa = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.sa);
402    temp.sb = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.sb);
403    temp.sc = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.sc);
404    temp.sd = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.sd);
405    temp.se = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.se);
406    temp.sf = SPIRV_OCL_BUILTIN(s_abs, _i64, )(x.sf);
407    return temp;
408}
409
410INLINE
411ulong SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _i64, )( ulong x )
412{
413    return x;
414}
415
416INLINE
417ulong2 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v2i64, )( ulong2 x )
418{
419    return x;
420}
421
422INLINE
423ulong3 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v3i64, )( ulong3 x )
424{
425    return x;
426}
427
428INLINE
429ulong4 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v4i64, )( ulong4 x )
430{
431    return x;
432}
433
434INLINE
435ulong8 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v8i64, )( ulong8 x )
436{
437    return x;
438}
439
440INLINE
441ulong16 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs, _v16i64, )( ulong16 x )
442{
443    return x;
444}
445
446