1//
2// Copyright (c) 2020 The Khronos Group Inc.
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8//    http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
16
17#include <inttypes.h>
18#include <stdio.h>
19
20#include "CL/cl.h"
21
22int test_char()
23{
24/* char */
25    /* Constructor */
26    cl_char a = 0;
27    cl_char2 a2 = {{ 0, 1 }};
28    cl_char4 a4 = {{ 0, 1, 2, 3 }};
29    cl_char8 a8 = {{ 0, 1, 2, 3, 4, 5, 6, 7 }};
30    cl_char16 a16 = {{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }};
31
32    /* assignment */
33    cl_char    b = a;
34    cl_char2   b2 = a2;
35    cl_char4   b4 = a4;
36    cl_char8   b8 = a8;
37    cl_char16  b16 = a16;
38
39    printf("\nVerifying assignment:\n" );
40    printf("b:   %d\n", b );
41    printf("b2:  %d %d \n", b2.s[0], b2.s[1] );
42    printf("b4:  %d %d %d %d\n", b4.s[0], b4.s[1], b4.s[2], b4.s[3] );
43    printf("b8:  %d %d %d %d %d %d %d %d\n", b8.s[0], b8.s[1], b8.s[2], b8.s[3], b8.s[4], b8.s[5], b8.s[6], b8.s[7] );
44    printf("b16: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", b16.s[0], b16.s[1], b16.s[2], b16.s[3], b16.s[4], b16.s[5], b16.s[6], b16.s[7],
45                                                                     b16.s[8], b16.s[9], b16.s[10], b16.s[11], b16.s[12], b16.s[13], b16.s[14], b16.s[15]);
46
47    /* vector access */
48    printf("\nVerifying vector access:\n" );
49#if defined( __CL_CHAR2__ )
50    __cl_char2 v2 = b2.v2;
51    printf("__cl_char2:  %d %d \n", ((cl_char*)&v2)[0], ((cl_char*)&v2)[1] );
52#else
53    printf( "__cl_char2 SIMD vectors not supported on this architecture.\n" );
54#endif
55
56#if defined( __CL_CHAR4__ )
57    __cl_char4 v4 = b4.v4;
58    printf("__cl_char4:  %d %d %d %d \n", ((cl_char*)&v4)[0], ((cl_char*)&v4)[1], ((cl_char*)&v4)[2], ((cl_char*)&v4)[3] );
59#else
60    printf( "__cl_char4 SIMD vectors not supported on this architecture.\n" );
61#endif
62
63#if defined( __CL_CHAR8__ )
64    __cl_char8 v8 = b8.v8;
65    printf("__cl_char8:  %d %d %d %d %d %d %d %d \n", ((cl_char*)&v8)[0], ((cl_char*)&v8)[1], ((cl_char*)&v8)[2], ((cl_char*)&v8)[3], ((cl_char*)&v8)[4], ((cl_char*)&v8)[5], ((cl_char*)&v8)[6], ((cl_char*)&v8)[7] );
66#else
67    printf( "__cl_char8 SIMD vectors not supported on this architecture.\n" );
68#endif
69
70#if defined( __CL_CHAR16__ )
71    __cl_char16 v16 = b16.v16;
72    printf("__cl_char16: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d \n", ((cl_char*)&v16)[0], ((cl_char*)&v16)[1], ((cl_char*)&v16)[2], ((cl_char*)&v16)[3], ((cl_char*)&v16)[4], ((cl_char*)&v16)[5], ((cl_char*)&v16)[6], ((cl_char*)&v16)[7],
73                                                                      ((cl_char*)&v16)[8], ((cl_char*)&v16)[9], ((cl_char*)&v16)[10], ((cl_char*)&v16)[11], ((cl_char*)&v16)[12], ((cl_char*)&v16)[13], ((cl_char*)&v16)[14], ((cl_char*)&v16)[15]);
74#else
75    printf( "__cl_char16 SIMD vectors not supported on this architecture.\n" );
76#endif
77
78    printf( "\n" );
79    return 0;
80}
81
82int test_uchar()
83{
84/* uchar */
85    /* Constructor */
86    cl_uchar a = 0;
87    cl_uchar2 a2 = {{ 0, 1 }};
88    cl_uchar4 a4 = {{ 0, 1, 2, 3 }};
89    cl_uchar8 a8 = {{ 0, 1, 2, 3, 4, 5, 6, 7 }};
90    cl_uchar16 a16 = {{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }};
91
92    /* assignment */
93    cl_uchar    b = a;
94    cl_uchar2   b2 = a2;
95    cl_uchar4   b4 = a4;
96    cl_uchar8   b8 = a8;
97    cl_uchar16  b16 = a16;
98
99    printf("\nVerifying assignment:\n" );
100    printf("b:   %d\n", b );
101    printf("b2:  %d %d \n", b2.s[0], b2.s[1] );
102    printf("b4:  %d %d %d %d\n", b4.s[0], b4.s[1], b4.s[2], b4.s[3] );
103    printf("b8:  %d %d %d %d %d %d %d %d\n", b8.s[0], b8.s[1], b8.s[2], b8.s[3], b8.s[4], b8.s[5], b8.s[6], b8.s[7] );
104    printf("b16: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", b16.s[0], b16.s[1], b16.s[2], b16.s[3], b16.s[4], b16.s[5], b16.s[6], b16.s[7],
105                                                                     b16.s[8], b16.s[9], b16.s[10], b16.s[11], b16.s[12], b16.s[13], b16.s[14], b16.s[15]);
106
107    /* vector access */
108    printf("\nVerifying vector access:\n" );
109#if defined( __CL_UCHAR2__ )
110    __cl_uchar2 v2 = b2.v2;
111    printf("__cl_uchar2:  %d %d \n", ((uchar*)&v2)[0], ((cl_uchar*)&v2)[1] );
112#else
113    printf( "__cl_uchar2 SIMD vectors not supported on this architecture.\n" );
114#endif
115
116#if defined( __CL_UCHAR4__ )
117    __cl_uchar4 v4 = b4.v4;
118    printf("__cl_uchar4:  %d %d %d %d \n", ((uchar*)&v4)[0], ((cl_uchar*)&v4)[1], ((cl_uchar*)&v4)[2], ((cl_uchar*)&v4)[3] );
119#else
120    printf( "__cl_uchar4 SIMD vectors not supported on this architecture.\n" );
121#endif
122
123#if defined( __CL_UCHAR8__ )
124    __cl_uchar8 v8 = b8.v8;
125    printf("__cl_uchar8:  %d %d %d %d %d %d %d %d \n", ((cl_uchar*)&v8)[0], ((cl_uchar*)&v8)[1], ((cl_uchar*)&v8)[2], ((cl_uchar*)&v8)[3], ((cl_uchar*)&v8)[4], ((cl_uchar*)&v8)[5], ((cl_uchar*)&v8)[6], ((cl_uchar*)&v8)[7] );
126#else
127    printf( "__cl_uchar8 SIMD vectors not supported on this architecture.\n" );
128#endif
129
130#if defined( __CL_UCHAR16__ )
131    __cl_uchar16 v16 = b16.v16;
132    printf("__cl_uchar16: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d \n", ((cl_uchar*)&v16)[0], ((cl_uchar*)&v16)[1], ((cl_uchar*)&v16)[2], ((cl_uchar*)&v16)[3], ((cl_uchar*)&v16)[4], ((cl_uchar*)&v16)[5], ((cl_uchar*)&v16)[6], ((cl_uchar*)&v16)[7],
133                                                                      ((cl_uchar*)&v16)[8], ((cl_uchar*)&v16)[9], ((cl_uchar*)&v16)[10], ((cl_uchar*)&v16)[11], ((cl_uchar*)&v16)[12], ((cl_uchar*)&v16)[13], ((cl_uchar*)&v16)[14], ((cl_uchar*)&v16)[15]);
134#else
135    printf( "__cl_uchar16 SIMD vectors not supported on this architecture.\n" );
136#endif
137
138    printf( "\n" );
139    return 0;
140}
141
142int test_short()
143{
144/* short */
145    /* Constructor */
146    cl_short a = 0;
147    cl_short2 a2 = {{ 0, 1 }};
148    cl_short4 a4 = {{ 0, 1, 2, 3 }};
149    cl_short8 a8 = {{ 0, 1, 2, 3, 4, 5, 6, 7 }};
150    cl_short16 a16 = {{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }};
151
152    /* assignment */
153    cl_short    b = a;
154    cl_short2   b2 = a2;
155    cl_short4   b4 = a4;
156    cl_short8   b8 = a8;
157    cl_short16  b16 = a16;
158
159    printf("\nVerifying assignment:\n" );
160    printf("b:   %d\n", b );
161    printf("b2:  %d %d \n", b2.s[0], b2.s[1] );
162    printf("b4:  %d %d %d %d\n", b4.s[0], b4.s[1], b4.s[2], b4.s[3] );
163    printf("b8:  %d %d %d %d %d %d %d %d\n", b8.s[0], b8.s[1], b8.s[2], b8.s[3], b8.s[4], b8.s[5], b8.s[6], b8.s[7] );
164    printf("b16: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", b16.s[0], b16.s[1], b16.s[2], b16.s[3], b16.s[4], b16.s[5], b16.s[6], b16.s[7],
165                                                                     b16.s[8], b16.s[9], b16.s[10], b16.s[11], b16.s[12], b16.s[13], b16.s[14], b16.s[15]);
166
167    /* vector access */
168    printf("\nVerifying vector access:\n" );
169#if defined( __CL_SHORT2__ )
170    __cl_short2 v2 = b2.v2;
171    printf("__cl_short2:  %d %d \n", ((cl_short*)&v2)[0], ((cl_short*)&v2)[1] );
172#else
173    printf( "__cl_short2 SIMD vectors not supported on this architecture.\n" );
174#endif
175
176#if defined( __CL_SHORT4__ )
177    __cl_short4 v4 = b4.v4;
178    printf("__cl_short4:  %d %d %d %d \n", ((cl_short*)&v4)[0], ((cl_short*)&v4)[1], ((cl_short*)&v4)[2], ((cl_short*)&v4)[3] );
179#else
180    printf( "__cl_short4 SIMD vectors not supported on this architecture.\n" );
181#endif
182
183#if defined( __CL_SHORT8__ )
184    __cl_short8 v8 = b8.v8;
185    printf("__cl_short8:  %d %d %d %d %d %d %d %d \n", ((cl_short*)&v8)[0], ((cl_short*)&v8)[1], ((cl_short*)&v8)[2], ((cl_short*)&v8)[3], ((cl_short*)&v8)[4], ((cl_short*)&v8)[5], ((cl_short*)&v8)[6], ((cl_short*)&v8)[7] );
186#else
187    printf( "__cl_short8 SIMD vectors not supported on this architecture.\n" );
188#endif
189
190#if defined( __CL_SHORT16__ )
191    __cl_short16 v16 = b16.v16;
192    printf("__cl_short16: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d \n", ((cl_short*)&v16)[0], ((cl_short*)&v16)[1], ((cl_short*)&v16)[2], ((cl_short*)&v16)[3], ((cl_short*)&v16)[4], ((cl_short*)&v16)[5], ((cl_short*)&v16)[6], ((cl_short*)&v16)[7],
193                                                                      ((cl_short*)&v16)[8], ((cl_short*)&v16)[9], ((cl_short*)&v16)[10], ((cl_short*)&v16)[11], ((cl_short*)&v16)[12], ((cl_short*)&v16)[13], ((cl_short*)&v16)[14], ((cl_short*)&v16)[15]);
194#else
195    printf( "__cl_short16 SIMD vectors not supported on this architecture.\n" );
196#endif
197
198    printf( "\n" );
199    return 0;
200}
201
202int test_ushort()
203{
204/* ushort */
205    /* Constructor */
206    cl_ushort a = 0;
207    cl_ushort2 a2 = {{ 0, 1 }};
208    cl_ushort4 a4 = {{ 0, 1, 2, 3 }};
209    cl_ushort8 a8 = {{ 0, 1, 2, 3, 4, 5, 6, 7 }};
210    cl_ushort16 a16 = {{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }};
211
212    /* assignment */
213    cl_ushort    b = a;
214    cl_ushort2   b2 = a2;
215    cl_ushort4   b4 = a4;
216    cl_ushort8   b8 = a8;
217    cl_ushort16  b16 = a16;
218
219    printf("\nVerifying assignment:\n" );
220    printf("b:   %d\n", b );
221    printf("b2:  %d %d \n", b2.s[0], b2.s[1] );
222    printf("b4:  %d %d %d %d\n", b4.s[0], b4.s[1], b4.s[2], b4.s[3] );
223    printf("b8:  %d %d %d %d %d %d %d %d\n", b8.s[0], b8.s[1], b8.s[2], b8.s[3], b8.s[4], b8.s[5], b8.s[6], b8.s[7] );
224    printf("b16: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", b16.s[0], b16.s[1], b16.s[2], b16.s[3], b16.s[4], b16.s[5], b16.s[6], b16.s[7],
225                                                                     b16.s[8], b16.s[9], b16.s[10], b16.s[11], b16.s[12], b16.s[13], b16.s[14], b16.s[15]);
226
227    /* vector access */
228    printf("\nVerifying vector access:\n" );
229#if defined( __CL_USHORT2__ )
230    __cl_ushort2 v2 = b2.v2;
231    printf("__cl_ushort2:  %d %d \n", ((unsigned short*)&v2)[0], ((unsigned short*)&v2)[1] );
232#else
233    printf( "__cl_ushort2 SIMD vectors not supported on this architecture.\n" );
234#endif
235
236#if defined( __CL_USHORT4__ )
237    __cl_ushort4 v4 = b4.v4;
238    printf("__cl_ushort4:  %d %d %d %d \n", ((unsigned short*)&v4)[0], ((unsigned short*)&v4)[1], ((unsigned short*)&v4)[2], ((unsigned short*)&v4)[3] );
239#else
240    printf( "__cl_ushort4 SIMD vectors not supported on this architecture.\n" );
241#endif
242
243#if defined( __CL_USHORT8__ )
244    __cl_ushort8 v8 = b8.v8;
245    printf("__cl_ushort8:  %d %d %d %d %d %d %d %d \n", ((unsigned short*)&v8)[0], ((unsigned short*)&v8)[1], ((unsigned short*)&v8)[2], ((unsigned short*)&v8)[3], ((unsigned short*)&v8)[4], ((unsigned short*)&v8)[5], ((unsigned short*)&v8)[6], ((unsigned short*)&v8)[7] );
246#else
247    printf( "__cl_ushort8 SIMD vectors not supported on this architecture.\n" );
248#endif
249
250#if defined( __CL_USHORT16__ )
251    __cl_ushort16 v16 = b16.v16;
252    printf("__cl_ushort16: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d \n", ((unsigned short*)&v16)[0], ((unsigned short*)&v16)[1], ((unsigned short*)&v16)[2], ((unsigned short*)&v16)[3], ((unsigned short*)&v16)[4], ((unsigned short*)&v16)[5], ((unsigned short*)&v16)[6], ((unsigned short*)&v16)[7],
253                                                                      ((unsigned short*)&v16)[8], ((unsigned short*)&v16)[9], ((unsigned short*)&v16)[10], ((unsigned short*)&v16)[11], ((unsigned short*)&v16)[12], ((unsigned short*)&v16)[13], ((unsigned short*)&v16)[14], ((unsigned short*)&v16)[15]);
254#else
255    printf( "__cl_ushort16 SIMD vectors not supported on this architecture.\n" );
256#endif
257
258    printf( "\n" );
259    return 0;
260}
261
262int test_int()
263{
264/* int */
265    /* Constructor */
266    cl_int a = 0;
267    cl_int2 a2 = {{ 0, 1 }};
268    cl_int4 a4 = {{ 0, 1, 2, 3 }};
269    cl_int8 a8 = {{ 0, 1, 2, 3, 4, 5, 6, 7 }};
270    cl_int16 a16 = {{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }};
271
272    /* assignment */
273    cl_int    b = a;
274    cl_int2   b2 = a2;
275    cl_int4   b4 = a4;
276    cl_int8   b8 = a8;
277    cl_int16  b16 = a16;
278
279    printf("\nVerifying assignment:\n" );
280    printf("b:   %d\n", b );
281    printf("b2:  %d %d \n", b2.s[0], b2.s[1] );
282    printf("b4:  %d %d %d %d\n", b4.s[0], b4.s[1], b4.s[2], b4.s[3] );
283    printf("b8:  %d %d %d %d %d %d %d %d\n", b8.s[0], b8.s[1], b8.s[2], b8.s[3], b8.s[4], b8.s[5], b8.s[6], b8.s[7] );
284    printf("b16: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", b16.s[0], b16.s[1], b16.s[2], b16.s[3], b16.s[4], b16.s[5], b16.s[6], b16.s[7],
285                                                                     b16.s[8], b16.s[9], b16.s[10], b16.s[11], b16.s[12], b16.s[13], b16.s[14], b16.s[15]);
286
287    /* vector access */
288    printf("\nVerifying vector access:\n" );
289#if defined( __CL_INT2__ )
290    __cl_int2 v2 = b2.v2;
291    printf("__cl_int2:  %d %d \n", ((cl_int*)&v2)[0], ((cl_int*)&v2)[1] );
292#else
293    printf( "__cl_int2 SIMD vectors not supported on this architecture.\n" );
294#endif
295
296#if defined( __CL_INT4__ )
297    __cl_int4 v4 = b4.v4;
298    printf("__cl_int4:  %d %d %d %d \n", ((cl_int*)&v4)[0], ((cl_int*)&v4)[1], ((cl_int*)&v4)[2], ((cl_int*)&v4)[3] );
299#else
300    printf( "__cl_int4 SIMD vectors not supported on this architecture.\n" );
301#endif
302
303#if defined( __CL_INT8__ )
304    __cl_int8 v8 = b8.v8;
305    printf("__cl_int8:  %d %d %d %d %d %d %d %d \n", ((cl_int*)&v8)[0], ((cl_int*)&v8)[1], ((cl_int*)&v8)[2], ((cl_int*)&v8)[3], ((cl_int*)&v8)[4], ((cl_int*)&v8)[5], ((cl_int*)&v8)[6], ((cl_int*)&v8)[7] );
306#else
307    printf( "__cl_int8 SIMD vectors not supported on this architecture.\n" );
308#endif
309
310#if defined( __CL_INT16__ )
311    __cl_int16 v16 = b16.v16;
312    printf("__cl_int16: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d \n", ((cl_int*)&v16)[0], ((cl_int*)&v16)[1], ((cl_int*)&v16)[2], ((cl_int*)&v16)[3], ((cl_int*)&v16)[4], ((cl_int*)&v16)[5], ((cl_int*)&v16)[6], ((cl_int*)&v16)[7],
313                                                                      ((cl_int*)&v16)[8], ((cl_int*)&v16)[9], ((cl_int*)&v16)[10], ((cl_int*)&v16)[11], ((cl_int*)&v16)[12], ((cl_int*)&v16)[13], ((cl_int*)&v16)[14], ((cl_int*)&v16)[15]);
314#else
315    printf( "__cl_int16 SIMD vectors not supported on this architecture.\n" );
316#endif
317
318    printf( "\n" );
319    return 0;
320}
321
322int test_uint()
323{
324/* uint */
325    /* Constructor */
326    cl_uint a = 0;
327    cl_uint2 a2 = {{ 0, 1 }};
328    cl_uint4 a4 = {{ 0, 1, 2, 3 }};
329    cl_uint8 a8 = {{ 0, 1, 2, 3, 4, 5, 6, 7 }};
330    cl_uint16 a16 = {{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }};
331
332    /* assignment */
333    cl_uint    b = a;
334    cl_uint2   b2 = a2;
335    cl_uint4   b4 = a4;
336    cl_uint8   b8 = a8;
337    cl_uint16  b16 = a16;
338
339    printf("\nVerifying assignment:\n" );
340    printf("b:   %d\n", b );
341    printf("b2:  %d %d \n", b2.s[0], b2.s[1] );
342    printf("b4:  %d %d %d %d\n", b4.s[0], b4.s[1], b4.s[2], b4.s[3] );
343    printf("b8:  %d %d %d %d %d %d %d %d\n", b8.s[0], b8.s[1], b8.s[2], b8.s[3], b8.s[4], b8.s[5], b8.s[6], b8.s[7] );
344    printf("b16: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", b16.s[0], b16.s[1], b16.s[2], b16.s[3], b16.s[4], b16.s[5], b16.s[6], b16.s[7],
345                                                                     b16.s[8], b16.s[9], b16.s[10], b16.s[11], b16.s[12], b16.s[13], b16.s[14], b16.s[15]);
346
347    /* vector access */
348    printf("\nVerifying vector access:\n" );
349#if defined( __CL_UINT2__ )
350    __cl_uint2 v2 = b2.v2;
351    printf("__cl_uint2:  %d %d \n", ((cl_uint*)&v2)[0], ((cl_uint*)&v2)[1] );
352#else
353    printf( "__cl_uint2 SIMD vectors not supported on this architecture.\n" );
354#endif
355
356#if defined( __CL_UINT4__ )
357    __cl_uint4 v4 = b4.v4;
358    printf("__cl_uint4:  %d %d %d %d \n", ((cl_uint*)&v4)[0], ((cl_uint*)&v4)[1], ((cl_uint*)&v4)[2], ((cl_uint*)&v4)[3] );
359#else
360    printf( "__cl_uint4 SIMD vectors not supported on this architecture.\n" );
361#endif
362
363#if defined( __CL_UINT8__ )
364    __cl_uint8 v8 = b8.v8;
365    printf("__cl_uint8:  %d %d %d %d %d %d %d %d \n", ((cl_uint*)&v8)[0], ((cl_uint*)&v8)[1], ((cl_uint*)&v8)[2], ((cl_uint*)&v8)[3], ((cl_uint*)&v8)[4], ((cl_uint*)&v8)[5], ((cl_uint*)&v8)[6], ((cl_uint*)&v8)[7] );
366#else
367    printf( "__cl_uint8 SIMD vectors not supported on this architecture.\n" );
368#endif
369
370#if defined( __CL_UINT16__ )
371    __cl_uint16 v16 = b16.v16;
372    printf("__cl_uint16: %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d \n", ((cl_uint*)&v16)[0], ((cl_uint*)&v16)[1], ((cl_uint*)&v16)[2], ((cl_uint*)&v16)[3], ((cl_uint*)&v16)[4], ((cl_uint*)&v16)[5], ((cl_uint*)&v16)[6], ((cl_uint*)&v16)[7],
373                                                                      ((cl_uint*)&v16)[8], ((cl_uint*)&v16)[9], ((cl_uint*)&v16)[10], ((cl_uint*)&v16)[11], ((cl_uint*)&v16)[12], ((cl_uint*)&v16)[13], ((cl_uint*)&v16)[14], ((cl_uint*)&v16)[15]);
374#else
375    printf( "__cl_uint16 SIMD vectors not supported on this architecture.\n" );
376#endif
377
378    printf( "\n" );
379    return 0;
380}
381
382int test_long()
383{
384/* long */
385    /* Constructor */
386    cl_long a = 0;
387    cl_long2 a2 = {{ 0, 1 }};
388    cl_long4 a4 = {{ 0, 1, 2, 3 }};
389    cl_long8 a8 = {{ 0, 1, 2, 3, 4, 5, 6, 7 }};
390    cl_long16 a16 = {{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }};
391
392    /* assignment */
393    cl_long    b = a;
394    cl_long2   b2 = a2;
395    cl_long4   b4 = a4;
396    cl_long8   b8 = a8;
397    cl_long16  b16 = a16;
398
399    printf("\nVerifying assignment:\n" );
400    printf("b:   %" PRId64 "\n", b );
401    printf("b2:  %" PRId64 " %" PRId64 " \n", b2.s[0], b2.s[1] );
402    printf("b4:  %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 "\n", b4.s[0], b4.s[1], b4.s[2], b4.s[3] );
403    printf("b8:  %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 "\n", b8.s[0], b8.s[1], b8.s[2], b8.s[3], b8.s[4], b8.s[5], b8.s[6], b8.s[7] );
404    printf("b16: %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 "\n", b16.s[0], b16.s[1], b16.s[2], b16.s[3], b16.s[4], b16.s[5], b16.s[6], b16.s[7],
405                                                                     b16.s[8], b16.s[9], b16.s[10], b16.s[11], b16.s[12], b16.s[13], b16.s[14], b16.s[15]);
406
407    /* vector access */
408    printf("\nVerifying vector access:\n" );
409#if defined( __CL_LONG2__ )
410    __cl_long2 v2 = b2.v2;
411    printf("__cl_long2:  %" PRId64 " %" PRId64 " \n", ((cl_long*)&v2)[0], ((cl_long*)&v2)[1] );
412#else
413    printf( "__cl_long2 SIMD vectors not supported on this architecture.\n" );
414#endif
415
416#if defined( __CL_LONG4__ )
417    __cl_long4 v4 = b4.v4;
418    printf("__cl_long4:  %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " \n", ((cl_long*)&v4)[0], ((cl_long*)&v4)[1], ((cl_long*)&v4)[2], ((cl_long*)&v4)[3] );
419#else
420    printf( "__cl_long4 SIMD vectors not supported on this architecture.\n" );
421#endif
422
423#if defined( __CL_LONG8__ )
424    __cl_long8 v8 = b8.v8;
425    printf("__cl_long8:  %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " \n", ((cl_long*)&v8)[0], ((cl_long*)&v8)[1], ((cl_long*)&v8)[2], ((cl_long*)&v8)[3], ((cl_long*)&v8)[4], ((cl_long*)&v8)[5], ((cl_long*)&v8)[6], ((cl_long*)&v8)[7] );
426#else
427    printf( "__cl_long8 SIMD vectors not supported on this architecture.\n" );
428#endif
429
430#if defined( __CL_LONG16__ )
431    __cl_long16 v16 = b16.v16;
432    printf("__cl_long16: %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " \n", ((cl_long*)&v16)[0], ((cl_long*)&v16)[1], ((cl_long*)&v16)[2], ((cl_long*)&v16)[3], ((cl_long*)&v16)[4], ((cl_long*)&v16)[5], ((cl_long*)&v16)[6], ((cl_long*)&v16)[7],
433                                                                      ((cl_long*)&v16)[8], ((cl_long*)&v16)[9], ((cl_long*)&v16)[10], ((cl_long*)&v16)[11], ((cl_long*)&v16)[12], ((cl_long*)&v16)[13], ((cl_long*)&v16)[14], ((cl_long*)&v16)[15]);
434#else
435    printf( "__cl_long16 SIMD vectors not supported on this architecture.\n" );
436#endif
437
438    printf( "\n" );
439    return 0;
440}
441
442int test_ulong()
443{
444/* ulong */
445    /* Constructor */
446    cl_ulong a = 0;
447    cl_ulong2 a2 = {{ 0, 1 }};
448    cl_ulong4 a4 = {{ 0, 1, 2, 3 }};
449    cl_ulong8 a8 = {{ 0, 1, 2, 3, 4, 5, 6, 7 }};
450    cl_ulong16 a16 = {{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }};
451
452    /* assignment */
453    cl_ulong    b = a;
454    cl_ulong2   b2 = a2;
455    cl_ulong4   b4 = a4;
456    cl_ulong8   b8 = a8;
457    cl_ulong16  b16 = a16;
458
459    printf("\nVerifying assignment:\n" );
460    printf("b:   %" PRIu64 "\n", b );
461    printf("b2:  %" PRIu64 " %" PRIu64 " \n", b2.s[0], b2.s[1] );
462    printf("b4:  %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 "\n", b4.s[0], b4.s[1], b4.s[2], b4.s[3] );
463    printf("b8:  %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 "\n", b8.s[0], b8.s[1], b8.s[2], b8.s[3], b8.s[4], b8.s[5], b8.s[6], b8.s[7] );
464    printf("b16: %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 "\n", b16.s[0], b16.s[1], b16.s[2], b16.s[3], b16.s[4], b16.s[5], b16.s[6], b16.s[7],
465                                                                     b16.s[8], b16.s[9], b16.s[10], b16.s[11], b16.s[12], b16.s[13], b16.s[14], b16.s[15]);
466
467    /* vector access */
468    printf("\nVerifying vector access:\n" );
469#if defined( __CL_ULONG2__ )
470    __cl_ulong2 v2 = b2.v2;
471    printf("__cl_ulong2:  %" PRIu64 " %" PRIu64 " \n", ((cl_ulong*)&v2)[0], ((cl_ulong*)&v2)[1] );
472#else
473    printf( "__cl_ulong2 SIMD vectors not supported on this architecture.\n" );
474#endif
475
476#if defined( __CL_ULONG4__ )
477    __cl_ulong4 v4 = b4.v4;
478    printf("__cl_ulong4:  %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " \n", ((cl_ulong*)&v4)[0], ((cl_ulong*)&v4)[1], ((cl_ulong*)&v4)[2], ((cl_ulong*)&v4)[3] );
479#else
480    printf( "__cl_ulong4 SIMD vectors not supported on this architecture.\n" );
481#endif
482
483#if defined( __CL_ULONG8__ )
484    __cl_ulong8 v8 = b8.v8;
485    printf("__cl_ulong8:  %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " \n", ((cl_ulong*)&v8)[0], ((cl_ulong*)&v8)[1], ((cl_ulong*)&v8)[2], ((cl_ulong*)&v8)[3], ((cl_ulong*)&v8)[4], ((cl_ulong*)&v8)[5], ((cl_ulong*)&v8)[6], ((cl_ulong*)&v8)[7] );
486#else
487    printf( "__cl_ulong8 SIMD vectors not supported on this architecture.\n" );
488#endif
489
490#if defined( __CL_ULONG16__ )
491    __cl_ulong16 v16 = b16.v16;
492    printf("__cl_ulong16: %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " \n", ((cl_ulong*)&v16)[0], ((cl_ulong*)&v16)[1], ((cl_ulong*)&v16)[2], ((cl_ulong*)&v16)[3], ((cl_ulong*)&v16)[4], ((cl_ulong*)&v16)[5], ((cl_ulong*)&v16)[6], ((cl_ulong*)&v16)[7],
493                                                                      ((cl_ulong*)&v16)[8], ((cl_ulong*)&v16)[9], ((cl_ulong*)&v16)[10], ((cl_ulong*)&v16)[11], ((cl_ulong*)&v16)[12], ((cl_ulong*)&v16)[13], ((cl_ulong*)&v16)[14], ((cl_ulong*)&v16)[15]);
494#else
495    printf( "__cl_ulong16 SIMD vectors not supported on this architecture.\n" );
496#endif
497
498    printf( "\n" );
499    return 0;
500}
501
502int test_float()
503{
504/* float */
505    /* Constructor */
506    cl_float a = 0.0f;
507    cl_float2 a2 = {{ 0.0f, 1.0f }};
508    cl_float4 a4 = {{ 0.0f, 1.0f, 2.0f, 3.0f }};
509    cl_float8 a8 = {{ 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f }};
510    cl_float16 a16 = {{ 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f }};
511
512    /* assignment */
513    cl_float    b = a;
514    cl_float2   b2 = a2;
515    cl_float4   b4 = a4;
516    cl_float8   b8 = a8;
517    cl_float16  b16 = a16;
518
519    printf("\nVerifying assignment:\n" );
520    printf("b:   %f\n", b );
521    printf("b2:  %f %f \n", b2.s[0], b2.s[1] );
522    printf("b4:  %f %f %f %f\n", b4.s[0], b4.s[1], b4.s[2], b4.s[3] );
523    printf("b8:  %f %f %f %f %f %f %f %f\n", b8.s[0], b8.s[1], b8.s[2], b8.s[3], b8.s[4], b8.s[5], b8.s[6], b8.s[7] );
524    printf("b16: %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f\n", b16.s[0], b16.s[1], b16.s[2], b16.s[3], b16.s[4], b16.s[5], b16.s[6], b16.s[7],
525                                                                     b16.s[8], b16.s[9], b16.s[10], b16.s[11], b16.s[12], b16.s[13], b16.s[14], b16.s[15]);
526
527    /* vector access */
528    printf("\nVerifying vector access:\n" );
529#if defined( __CL_FLOAT2__ )
530    __cl_float2 v2 = b2.v2;
531    printf("__cl_float2:  %f %f \n", ((cl_float*)&v2)[0], ((cl_float*)&v2)[1] );
532#else
533    printf( "__cl_float2 SIMD vectors not supported on this architecture.\n" );
534#endif
535
536#if defined( __CL_FLOAT4__ )
537    {
538        __cl_float4 v4 = b4.v4;
539        printf("__cl_float4:  %f %f %f %f \n", ((cl_float*)&v4)[0], ((cl_float*)&v4)[1], ((cl_float*)&v4)[2], ((cl_float*)&v4)[3] );
540    }
541#else
542    printf( "__cl_float4 SIMD vectors not supported on this architecture.\n" );
543#endif
544
545#if defined( __CL_FLOAT8__ )
546    __cl_float8 v8 = b8.v8;
547    printf("__cl_float8:  %f %f %f %f %f %f %f %f \n", ((cl_float*)&v8)[0], ((cl_float*)&v8)[1], ((cl_float*)&v8)[2], ((cl_float*)&v8)[3], ((cl_float*)&v8)[4], ((cl_float*)&v8)[5], ((cl_float*)&v8)[6], ((cl_float*)&v8)[7] );
548#else
549    printf( "__cl_float8 SIMD vectors not supported on this architecture.\n" );
550#endif
551
552#if defined( __CL_FLOAT16__ )
553    __cl_float16 v16 = b16.v16;
554    printf("__cl_float16: %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f \n", ((cl_float*)&v16)[0], ((cl_float*)&v16)[1], ((cl_float*)&v16)[2], ((cl_float*)&v16)[3], ((cl_float*)&v16)[4], ((cl_float*)&v16)[5], ((cl_float*)&v16)[6], ((cl_float*)&v16)[7],
555                                                                      ((cl_float*)&v16)[8], ((cl_float*)&v16)[9], ((cl_float*)&v16)[10], ((cl_float*)&v16)[11], ((cl_float*)&v16)[12], ((cl_float*)&v16)[13], ((cl_float*)&v16)[14], ((cl_float*)&v16)[15]);
556#else
557    printf( "__cl_float16 SIMD vectors not supported on this architecture.\n" );
558#endif
559
560    printf( "\n" );
561    return 0;
562}
563
564int test_double()
565{
566/* double */
567    /* Constructor */
568    cl_double a = 0.0f;
569    cl_double2 a2 = {{ 0.0f, 1.0f }};
570    cl_double4 a4 = {{ 0.0f, 1.0f, 2.0f, 3.0f }};
571    cl_double8 a8 = {{ 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f }};
572    cl_double16 a16 = {{ 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f }};
573
574    /* assignment */
575    cl_double    b = a;
576    cl_double2   b2 = a2;
577    cl_double4   b4 = a4;
578    cl_double8   b8 = a8;
579    cl_double16  b16 = a16;
580
581    printf("\nVerifying assignment:\n" );
582    printf("b:   %f\n", b );
583    printf("b2:  %f %f \n", b2.s[0], b2.s[1] );
584    printf("b4:  %f %f %f %f\n", b4.s[0], b4.s[1], b4.s[2], b4.s[3] );
585    printf("b8:  %f %f %f %f %f %f %f %f\n", b8.s[0], b8.s[1], b8.s[2], b8.s[3], b8.s[4], b8.s[5], b8.s[6], b8.s[7] );
586    printf("b16: %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f\n", b16.s[0], b16.s[1], b16.s[2], b16.s[3], b16.s[4], b16.s[5], b16.s[6], b16.s[7],
587                                                                     b16.s[8], b16.s[9], b16.s[10], b16.s[11], b16.s[12], b16.s[13], b16.s[14], b16.s[15]);
588
589    /* vector access */
590    printf("\nVerifying vector access:\n" );
591#if defined( __CL_DOUBLE2__ )
592    __cl_double2 v2 = b2.v2;
593    printf("__cl_double2:  %f %f \n", ((cl_double*)&v2)[0], ((cl_double*)&v2)[1] );
594#else
595    printf( "__cl_double2 SIMD vectors not supported on this architecture.\n" );
596#endif
597
598#if defined( __CL_DOUBLE4__ )
599    __cl_double4 v4 = b4.v4;
600    printf("__cl_double4:  %f %f %f %f \n", ((cl_double*)&v4)[0], ((cl_double*)&v4)[1], ((cl_double*)&v4)[2], ((cl_double*)&v4)[3] );
601#else
602    printf( "__cl_double4 SIMD vectors not supported on this architecture.\n" );
603#endif
604
605#if defined( __CL_DOUBLE8__ )
606    __cl_double8 v8 = b8.v8;
607    printf("__cl_double8:  %f %f %f %f %f %f %f %f \n", ((cl_double*)&v8)[0], ((cl_double*)&v8)[1], ((cl_double*)&v8)[2], ((cl_double*)&v8)[3], ((cl_double*)&v8)[4], ((cl_double*)&v8)[5], ((cl_double*)&v8)[6], ((cl_double*)&v8)[7] );
608#else
609    printf( "__cl_double8 SIMD vectors not supported on this architecture.\n" );
610#endif
611
612#if defined( __CL_DOUBLE16__ )
613    __cl_double16 v16 = b16.v16;
614    printf("__cl_double16: %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f \n", ((cl_double*)&v16)[0], ((cl_double*)&v16)[1], ((cl_double*)&v16)[2], ((cl_double*)&v16)[3], ((cl_double*)&v16)[4], ((cl_double*)&v16)[5], ((cl_double*)&v16)[6], ((cl_double*)&v16)[7],
615                                                                      ((cl_double*)&v16)[8], ((cl_double*)&v16)[9], ((cl_double*)&v16)[10], ((cl_double*)&v16)[11], ((cl_double*)&v16)[12], ((cl_double*)&v16)[13], ((cl_double*)&v16)[14], ((cl_double*)&v16)[15]);
616#else
617    printf( "__cl_double16 SIMD vectors not supported on this architecture.\n" );
618#endif
619
620    printf( "\n" );
621    return 0;
622}
623
624int main(void)
625{
626  printf( "\nChecking operations on cl_types.\nNumbers, where presented, should walk upward from 0, with step of 1:\n" );
627
628  test_char();
629  test_uchar();
630  test_short();
631  test_ushort();
632  test_long();
633  test_ulong();
634  test_float();
635  test_double();
636
637  return 0;
638}
639