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