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
14uchar SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )( char x,
15                                        char y )
16{
17    uchar result;
18    if (x > y)
19    {
20        result = (uchar)(x - y);
21    }
22    else
23    {
24        result = (uchar)(y - x);
25    }
26    return result;
27}
28
29INLINE
30uchar2 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs_diff, _v2i8_v2i8, )( char2 x,
31                                             char2 y )
32{
33    uchar2 temp;
34    temp.s0 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s0, y.s0);
35    temp.s1 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s1, y.s1);
36    return temp;
37}
38
39INLINE
40uchar3 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs_diff, _v3i8_v3i8, )( char3 x,
41                                             char3 y )
42{
43    uchar3 temp;
44    temp.s0 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s0, y.s0);
45    temp.s1 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s1, y.s1);
46    temp.s2 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s2, y.s2);
47    return temp;
48}
49
50INLINE
51uchar4 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs_diff, _v4i8_v4i8, )( char4 x,
52                                             char4 y )
53{
54    uchar4 temp;
55    temp.s0 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s0, y.s0);
56    temp.s1 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s1, y.s1);
57    temp.s2 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s2, y.s2);
58    temp.s3 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s3, y.s3);
59    return temp;
60}
61
62INLINE
63uchar8 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs_diff, _v8i8_v8i8, )( char8 x,
64                                             char8 y )
65{
66    uchar8 temp;
67    temp.s0 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s0, y.s0);
68    temp.s1 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s1, y.s1);
69    temp.s2 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s2, y.s2);
70    temp.s3 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s3, y.s3);
71    temp.s4 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s4, y.s4);
72    temp.s5 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s5, y.s5);
73    temp.s6 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s6, y.s6);
74    temp.s7 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s7, y.s7);
75    return temp;
76}
77
78INLINE
79uchar16 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs_diff, _v16i8_v16i8, )( char16 x,
80                                                char16 y )
81{
82    uchar16 temp;
83    temp.s0 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s0, y.s0);
84    temp.s1 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s1, y.s1);
85    temp.s2 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s2, y.s2);
86    temp.s3 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s3, y.s3);
87    temp.s4 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s4, y.s4);
88    temp.s5 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s5, y.s5);
89    temp.s6 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s6, y.s6);
90    temp.s7 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s7, y.s7);
91    temp.s8 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s8, y.s8);
92    temp.s9 = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.s9, y.s9);
93    temp.sa = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.sa, y.sa);
94    temp.sb = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.sb, y.sb);
95    temp.sc = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.sc, y.sc);
96    temp.sd = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.sd, y.sd);
97    temp.se = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.se, y.se);
98    temp.sf = SPIRV_OCL_BUILTIN(s_abs_diff, _i8_i8, )(x.sf, y.sf);
99    return temp;
100}
101
102INLINE
103uchar SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )( uchar x,
104                                        uchar y )
105{
106    uchar result;
107    if (x > y)
108    {
109        result = x - y;
110    }
111    else
112    {
113        result = y - x;
114    }
115    return result;
116}
117
118INLINE
119uchar2 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs_diff, _v2i8_v2i8, )( uchar2 x,
120                                             uchar2 y )
121{
122    uchar2 temp;
123    temp.s0 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s0, y.s0);
124    temp.s1 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s1, y.s1);
125    return temp;
126}
127
128INLINE
129uchar3 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs_diff, _v3i8_v3i8, )( uchar3 x,
130                                             uchar3 y )
131{
132    uchar3 temp;
133    temp.s0 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s0, y.s0);
134    temp.s1 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s1, y.s1);
135    temp.s2 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s2, y.s2);
136    return temp;
137}
138
139INLINE
140uchar4 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs_diff, _v4i8_v4i8, )( uchar4 x,
141                                             uchar4 y )
142{
143    uchar4 temp;
144    temp.s0 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s0, y.s0);
145    temp.s1 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s1, y.s1);
146    temp.s2 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s2, y.s2);
147    temp.s3 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s3, y.s3);
148    return temp;
149}
150
151INLINE
152uchar8 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs_diff, _v8i8_v8i8, )( uchar8 x,
153                                             uchar8 y )
154{
155    uchar8 temp;
156    temp.s0 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s0, y.s0);
157    temp.s1 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s1, y.s1);
158    temp.s2 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s2, y.s2);
159    temp.s3 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s3, y.s3);
160    temp.s4 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s4, y.s4);
161    temp.s5 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s5, y.s5);
162    temp.s6 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s6, y.s6);
163    temp.s7 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s7, y.s7);
164    return temp;
165}
166
167INLINE
168uchar16 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs_diff, _v16i8_v16i8, )( uchar16 x,
169                                                uchar16 y )
170{
171    uchar16 temp;
172    temp.s0 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s0, y.s0);
173    temp.s1 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s1, y.s1);
174    temp.s2 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s2, y.s2);
175    temp.s3 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s3, y.s3);
176    temp.s4 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s4, y.s4);
177    temp.s5 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s5, y.s5);
178    temp.s6 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s6, y.s6);
179    temp.s7 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s7, y.s7);
180    temp.s8 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s8, y.s8);
181    temp.s9 = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.s9, y.s9);
182    temp.sa = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.sa, y.sa);
183    temp.sb = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.sb, y.sb);
184    temp.sc = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.sc, y.sc);
185    temp.sd = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.sd, y.sd);
186    temp.se = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.se, y.se);
187    temp.sf = SPIRV_OCL_BUILTIN(u_abs_diff, _i8_i8, )(x.sf, y.sf);
188    return temp;
189}
190
191INLINE
192ushort SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )( short x,
193                                           short y )
194{
195    ushort result;
196    if (x > y)
197    {
198        result = (ushort)(x - y);
199    }
200    else
201    {
202        result = (ushort)(y - x);
203    }
204    return result;
205}
206
207INLINE
208ushort2 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs_diff, _v2i16_v2i16, )( short2 x,
209                                                short2 y )
210{
211    ushort2 temp;
212    temp.s0 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s0, y.s0);
213    temp.s1 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s1, y.s1);
214    return temp;
215}
216
217INLINE
218ushort3 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs_diff, _v3i16_v3i16, )( short3 x,
219                                                short3 y )
220{
221    ushort3 temp;
222    temp.s0 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s0, y.s0);
223    temp.s1 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s1, y.s1);
224    temp.s2 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s2, y.s2);
225    return temp;
226}
227
228INLINE
229ushort4 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs_diff, _v4i16_v4i16, )( short4 x,
230                                                short4 y )
231{
232    ushort4 temp;
233    temp.s0 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s0, y.s0);
234    temp.s1 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s1, y.s1);
235    temp.s2 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s2, y.s2);
236    temp.s3 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s3, y.s3);
237    return temp;
238}
239
240INLINE
241ushort8 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs_diff, _v8i16_v8i16, )( short8 x,
242                                                short8 y )
243{
244    ushort8 temp;
245    temp.s0 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s0, y.s0);
246    temp.s1 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s1, y.s1);
247    temp.s2 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s2, y.s2);
248    temp.s3 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s3, y.s3);
249    temp.s4 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s4, y.s4);
250    temp.s5 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s5, y.s5);
251    temp.s6 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s6, y.s6);
252    temp.s7 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s7, y.s7);
253    return temp;
254}
255
256INLINE
257ushort16 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs_diff, _v16i16_v16i16, )( short16 x,
258                                                   short16 y )
259{
260    ushort16 temp;
261    temp.s0 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s0, y.s0);
262    temp.s1 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s1, y.s1);
263    temp.s2 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s2, y.s2);
264    temp.s3 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s3, y.s3);
265    temp.s4 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s4, y.s4);
266    temp.s5 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s5, y.s5);
267    temp.s6 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s6, y.s6);
268    temp.s7 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s7, y.s7);
269    temp.s8 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s8, y.s8);
270    temp.s9 = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.s9, y.s9);
271    temp.sa = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.sa, y.sa);
272    temp.sb = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.sb, y.sb);
273    temp.sc = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.sc, y.sc);
274    temp.sd = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.sd, y.sd);
275    temp.se = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.se, y.se);
276    temp.sf = SPIRV_OCL_BUILTIN(s_abs_diff, _i16_i16, )(x.sf, y.sf);
277    return temp;
278}
279
280INLINE
281ushort SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )( ushort x,
282                                           ushort y )
283{
284    ushort result;
285    if (x > y)
286    {
287        result = x - y;
288    }
289    else
290    {
291        result = y - x;
292    }
293    return result;
294}
295
296INLINE
297ushort2 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs_diff, _v2i16_v2i16, )( ushort2 x,
298                                                ushort2 y )
299{
300    ushort2 temp;
301    temp.s0 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s0, y.s0);
302    temp.s1 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s1, y.s1);
303    return temp;
304}
305
306INLINE
307ushort3 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs_diff, _v3i16_v3i16, )( ushort3 x,
308                                                ushort3 y )
309{
310    ushort3 temp;
311    temp.s0 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s0, y.s0);
312    temp.s1 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s1, y.s1);
313    temp.s2 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s2, y.s2);
314    return temp;
315}
316
317INLINE
318ushort4 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs_diff, _v4i16_v4i16, )( ushort4 x,
319                                                ushort4 y )
320{
321    ushort4 temp;
322    temp.s0 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s0, y.s0);
323    temp.s1 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s1, y.s1);
324    temp.s2 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s2, y.s2);
325    temp.s3 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s3, y.s3);
326    return temp;
327}
328
329INLINE
330ushort8 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs_diff, _v8i16_v8i16, )( ushort8 x,
331                                                ushort8 y )
332{
333    ushort8 temp;
334    temp.s0 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s0, y.s0);
335    temp.s1 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s1, y.s1);
336    temp.s2 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s2, y.s2);
337    temp.s3 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s3, y.s3);
338    temp.s4 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s4, y.s4);
339    temp.s5 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s5, y.s5);
340    temp.s6 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s6, y.s6);
341    temp.s7 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s7, y.s7);
342    return temp;
343}
344
345INLINE
346ushort16 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs_diff, _v16i16_v16i16, )( ushort16 x,
347                                                   ushort16 y )
348{
349    ushort16 temp;
350    temp.s0 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s0, y.s0);
351    temp.s1 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s1, y.s1);
352    temp.s2 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s2, y.s2);
353    temp.s3 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s3, y.s3);
354    temp.s4 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s4, y.s4);
355    temp.s5 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s5, y.s5);
356    temp.s6 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s6, y.s6);
357    temp.s7 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s7, y.s7);
358    temp.s8 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s8, y.s8);
359    temp.s9 = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.s9, y.s9);
360    temp.sa = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.sa, y.sa);
361    temp.sb = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.sb, y.sb);
362    temp.sc = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.sc, y.sc);
363    temp.sd = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.sd, y.sd);
364    temp.se = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.se, y.se);
365    temp.sf = SPIRV_OCL_BUILTIN(u_abs_diff, _i16_i16, )(x.sf, y.sf);
366    return temp;
367}
368
369INLINE
370uint SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )( int x,
371                                         int y )
372{
373    uint result;
374    if (x > y)
375    {
376        result = (uint)(x - y);
377    }
378    else
379    {
380        result = (uint)(y - x);
381    }
382    return result;
383}
384
385INLINE
386uint2 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs_diff, _v2i32_v2i32, )( int2 x,
387                                              int2 y )
388{
389    uint2 temp;
390    temp.s0 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s0, y.s0);
391    temp.s1 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s1, y.s1);
392    return temp;
393}
394
395INLINE
396uint3 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs_diff, _v3i32_v3i32, )( int3 x,
397                                              int3 y )
398{
399    uint3 temp;
400    temp.s0 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s0, y.s0);
401    temp.s1 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s1, y.s1);
402    temp.s2 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s2, y.s2);
403    return temp;
404}
405
406INLINE
407uint4 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs_diff, _v4i32_v4i32, )( int4 x,
408                                              int4 y )
409{
410    uint4 temp;
411    temp.s0 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s0, y.s0);
412    temp.s1 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s1, y.s1);
413    temp.s2 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s2, y.s2);
414    temp.s3 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s3, y.s3);
415    return temp;
416}
417
418INLINE
419uint8 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs_diff, _v8i32_v8i32, )( int8 x,
420                                              int8 y )
421{
422    uint8 temp;
423    temp.s0 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s0, y.s0);
424    temp.s1 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s1, y.s1);
425    temp.s2 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s2, y.s2);
426    temp.s3 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s3, y.s3);
427    temp.s4 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s4, y.s4);
428    temp.s5 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s5, y.s5);
429    temp.s6 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s6, y.s6);
430    temp.s7 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s7, y.s7);
431    return temp;
432}
433
434INLINE
435uint16 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs_diff, _v16i32_v16i32, )( int16 x,
436                                                 int16 y )
437{
438    uint16 temp;
439    temp.s0 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s0, y.s0);
440    temp.s1 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s1, y.s1);
441    temp.s2 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s2, y.s2);
442    temp.s3 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s3, y.s3);
443    temp.s4 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s4, y.s4);
444    temp.s5 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s5, y.s5);
445    temp.s6 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s6, y.s6);
446    temp.s7 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s7, y.s7);
447    temp.s8 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s8, y.s8);
448    temp.s9 = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.s9, y.s9);
449    temp.sa = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.sa, y.sa);
450    temp.sb = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.sb, y.sb);
451    temp.sc = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.sc, y.sc);
452    temp.sd = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.sd, y.sd);
453    temp.se = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.se, y.se);
454    temp.sf = SPIRV_OCL_BUILTIN(s_abs_diff, _i32_i32, )(x.sf, y.sf);
455    return temp;
456}
457
458INLINE
459uint SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )( uint x,
460                                         uint y )
461{
462    uint result;
463    if (x > y)
464    {
465        result = x - y;
466    }
467    else
468    {
469        result = y - x;
470    }
471    return result;
472}
473
474INLINE
475uint2 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs_diff, _v2i32_v2i32, )( uint2 x,
476                                              uint2 y )
477{
478    uint2 temp;
479    temp.s0 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s0, y.s0);
480    temp.s1 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s1, y.s1);
481    return temp;
482}
483
484INLINE
485uint3 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs_diff, _v3i32_v3i32, )( uint3 x,
486                                              uint3 y )
487{
488    uint3 temp;
489    temp.s0 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s0, y.s0);
490    temp.s1 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s1, y.s1);
491    temp.s2 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s2, y.s2);
492    return temp;
493}
494
495INLINE
496uint4 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs_diff, _v4i32_v4i32, )( uint4 x,
497                                              uint4 y )
498{
499    uint4 temp;
500    temp.s0 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s0, y.s0);
501    temp.s1 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s1, y.s1);
502    temp.s2 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s2, y.s2);
503    temp.s3 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s3, y.s3);
504    return temp;
505}
506
507INLINE
508uint8 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs_diff, _v8i32_v8i32, )( uint8 x,
509                                              uint8 y )
510{
511    uint8 temp;
512    temp.s0 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s0, y.s0);
513    temp.s1 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s1, y.s1);
514    temp.s2 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s2, y.s2);
515    temp.s3 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s3, y.s3);
516    temp.s4 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s4, y.s4);
517    temp.s5 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s5, y.s5);
518    temp.s6 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s6, y.s6);
519    temp.s7 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s7, y.s7);
520    return temp;
521}
522
523INLINE
524uint16 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs_diff, _v16i32_v16i32, )( uint16 x,
525                                                 uint16 y )
526{
527    uint16 temp;
528    temp.s0 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s0, y.s0);
529    temp.s1 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s1, y.s1);
530    temp.s2 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s2, y.s2);
531    temp.s3 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s3, y.s3);
532    temp.s4 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s4, y.s4);
533    temp.s5 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s5, y.s5);
534    temp.s6 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s6, y.s6);
535    temp.s7 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s7, y.s7);
536    temp.s8 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s8, y.s8);
537    temp.s9 = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.s9, y.s9);
538    temp.sa = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.sa, y.sa);
539    temp.sb = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.sb, y.sb);
540    temp.sc = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.sc, y.sc);
541    temp.sd = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.sd, y.sd);
542    temp.se = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.se, y.se);
543    temp.sf = SPIRV_OCL_BUILTIN(u_abs_diff, _i32_i32, )(x.sf, y.sf);
544    return temp;
545}
546
547INLINE
548ulong SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )( long x,
549                                          long y )
550{
551    ulong result;
552    if (x > y)
553    {
554        result = (ulong)(x - y);
555    }
556    else
557    {
558        result = (ulong)(y - x);
559    }
560    return result;
561}
562
563INLINE
564ulong2 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs_diff, _v2i64_v2i64, )( long2 x,
565                                               long2 y )
566{
567    ulong2 temp;
568    temp.s0 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s0, y.s0);
569    temp.s1 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s1, y.s1);
570    return temp;
571}
572
573INLINE
574ulong3 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs_diff, _v3i64_v3i64, )( long3 x,
575                                               long3 y )
576{
577    ulong3 temp;
578    temp.s0 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s0, y.s0);
579    temp.s1 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s1, y.s1);
580    temp.s2 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s2, y.s2);
581    return temp;
582}
583
584INLINE
585ulong4 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs_diff, _v4i64_v4i64, )( long4 x,
586                                               long4 y )
587{
588    ulong4 temp;
589    temp.s0 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s0, y.s0);
590    temp.s1 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s1, y.s1);
591    temp.s2 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s2, y.s2);
592    temp.s3 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s3, y.s3);
593    return temp;
594}
595
596INLINE
597ulong8 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs_diff, _v8i64_v8i64, )( long8 x,
598                                               long8 y )
599{
600    ulong8 temp;
601    temp.s0 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s0, y.s0);
602    temp.s1 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s1, y.s1);
603    temp.s2 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s2, y.s2);
604    temp.s3 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s3, y.s3);
605    temp.s4 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s4, y.s4);
606    temp.s5 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s5, y.s5);
607    temp.s6 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s6, y.s6);
608    temp.s7 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s7, y.s7);
609    return temp;
610}
611
612INLINE
613ulong16 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(s_abs_diff, _v16i64_v16i64, )( long16 x,
614                                                  long16 y )
615{
616    ulong16 temp;
617    temp.s0 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s0, y.s0);
618    temp.s1 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s1, y.s1);
619    temp.s2 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s2, y.s2);
620    temp.s3 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s3, y.s3);
621    temp.s4 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s4, y.s4);
622    temp.s5 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s5, y.s5);
623    temp.s6 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s6, y.s6);
624    temp.s7 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s7, y.s7);
625    temp.s8 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s8, y.s8);
626    temp.s9 = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.s9, y.s9);
627    temp.sa = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.sa, y.sa);
628    temp.sb = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.sb, y.sb);
629    temp.sc = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.sc, y.sc);
630    temp.sd = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.sd, y.sd);
631    temp.se = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.se, y.se);
632    temp.sf = SPIRV_OCL_BUILTIN(s_abs_diff, _i64_i64, )(x.sf, y.sf);
633    return temp;
634}
635
636INLINE
637ulong SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )( ulong x,
638                                          ulong y )
639{
640    ulong result;
641    if (x > y)
642    {
643        result = x - y;
644    }
645    else
646    {
647        result = y - x;
648    }
649    return result;
650}
651
652INLINE
653ulong2 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs_diff, _v2i64_v2i64, )( ulong2 x,
654                                               ulong2 y )
655{
656    ulong2 temp;
657    temp.s0 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s0, y.s0);
658    temp.s1 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s1, y.s1);
659    return temp;
660}
661
662INLINE
663ulong3 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs_diff, _v3i64_v3i64, )( ulong3 x,
664                                               ulong3 y )
665{
666    ulong3 temp;
667    temp.s0 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s0, y.s0);
668    temp.s1 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s1, y.s1);
669    temp.s2 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s2, y.s2);
670    return temp;
671}
672
673INLINE
674ulong4 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs_diff, _v4i64_v4i64, )( ulong4 x,
675                                               ulong4 y )
676{
677    ulong4 temp;
678    temp.s0 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s0, y.s0);
679    temp.s1 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s1, y.s1);
680    temp.s2 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s2, y.s2);
681    temp.s3 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s3, y.s3);
682    return temp;
683}
684
685INLINE
686ulong8 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs_diff, _v8i64_v8i64, )( ulong8 x,
687                                               ulong8 y )
688{
689    ulong8 temp;
690    temp.s0 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s0, y.s0);
691    temp.s1 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s1, y.s1);
692    temp.s2 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s2, y.s2);
693    temp.s3 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s3, y.s3);
694    temp.s4 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s4, y.s4);
695    temp.s5 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s5, y.s5);
696    temp.s6 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s6, y.s6);
697    temp.s7 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s7, y.s7);
698    return temp;
699}
700
701INLINE
702ulong16 SPIRV_OVERLOADABLE SPIRV_OCL_BUILTIN(u_abs_diff, _v16i64_v16i64, )( ulong16 x,
703                                                  ulong16 y )
704{
705    ulong16 temp;
706    temp.s0 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s0, y.s0);
707    temp.s1 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s1, y.s1);
708    temp.s2 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s2, y.s2);
709    temp.s3 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s3, y.s3);
710    temp.s4 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s4, y.s4);
711    temp.s5 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s5, y.s5);
712    temp.s6 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s6, y.s6);
713    temp.s7 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s7, y.s7);
714    temp.s8 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s8, y.s8);
715    temp.s9 = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.s9, y.s9);
716    temp.sa = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.sa, y.sa);
717    temp.sb = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.sb, y.sb);
718    temp.sc = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.sc, y.sc);
719    temp.sd = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.sd, y.sd);
720    temp.se = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.se, y.se);
721    temp.sf = SPIRV_OCL_BUILTIN(u_abs_diff, _i64_i64, )(x.sf, y.sf);
722    return temp;
723}
724
725