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