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