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