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