1 /**********************************************************************************
2  * Copyright (c) 2008-2012 The Khronos Group Inc.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and/or associated documentation files (the
6  * "Materials"), to deal in the Materials without restriction, including
7  * without limitation the rights to use, copy, modify, merge, publish,
8  * distribute, sublicense, and/or sell copies of the Materials, and to
9  * permit persons to whom the Materials are furnished to do so, subject to
10  * the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included
13  * in all copies or substantial portions of the Materials.
14  *
15  * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21  * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
22  **********************************************************************************/
23 
24 /* $Revision: 11803 $ on $Date: 2010-06-25 10:02:12 -0700 (Fri, 25 Jun 2010) $ */
25 
26 #ifndef __CL_PLATFORM_H
27 #define __CL_PLATFORM_H
28 
29 #ifdef __APPLE__
30     /* Contains #defines for AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER below */
31     #include <AvailabilityMacros.h>
32 #endif
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 
38 #if defined(_WIN32)
39     #define CL_API_ENTRY
40     #define CL_API_CALL     __stdcall
41     #define CL_CALLBACK     __stdcall
42 #else
43     #define CL_API_ENTRY
44     #define CL_API_CALL
45     #define CL_CALLBACK
46 #endif
47 
48 #ifdef __APPLE__
49     #define CL_EXTENSION_WEAK_LINK       __attribute__((weak_import))
50     #ifndef UNAVAILABLE_ATTRIBUTE
51         #define UNAVAILABLE_ATTRIBUTE
52     #endif
53     #ifdef AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER
54         #define CL_API_SUFFIX__VERSION_1_0              AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER
55         #define CL_EXT_SUFFIX__VERSION_1_0              CL_EXTENSION_WEAK_LINK AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER
56     #else
57         #define CL_API_SUFFIX__VERSION_1_0              UNAVAILABLE_ATTRIBUTE
58         #define CL_EXT_SUFFIX__VERSION_1_0              CL_EXTENSION_WEAK_LINK UNAVAILABLE_ATTRIBUTE
59     #endif
60     #ifdef AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER
61         #define CL_API_SUFFIX__VERSION_1_1              AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER
62         #define GCL_API_SUFFIX__VERSION_1_1             AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER
63         #define CL_EXT_SUFFIX__VERSION_1_1              CL_EXTENSION_WEAK_LINK AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER
64         #define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED   CL_EXTENSION_WEAK_LINK AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_7
65     #else
66         #define CL_API_SUFFIX__VERSION_1_1              UNAVAILABLE_ATTRIBUTE
67         #define GCL_API_SUFFIX__VERSION_1_1             UNAVAILABLE_ATTRIBUTE
68         #define CL_EXT_SUFFIX__VERSION_1_1              CL_EXTENSION_WEAK_LINK UNAVAILABLE_ATTRIBUTE
69         #define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATE    CL_EXT_SUFFIX__VERSION_1_0
70     #endif
71     #ifdef AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER
72         #define CL_API_SUFFIX__VERSION_1_2              AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER
73         #define GCL_API_SUFFIX__VERSION_1_2             AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER
74         #define CL_EXT_SUFFIX__VERSION_1_2              CL_EXTENSION_WEAK_LINK AVAILABLE_MAC_OS_X_VERSION_10_8_AND_LATER
75         #define CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
76         #define CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED   CL_EXTENSION_WEAK_LINK AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_8
77     #else
78         #define CL_API_SUFFIX__VERSION_1_2              UNAVAILABLE_ATTRIBUTE
79         #define GCL_API_SUFFIX__VERSION_1_2             UNAVAILABLE_ATTRIBUTE
80         #define CL_EXT_SUFFIX__VERSION_1_2              CL_EXTENSION_WEAK_LINK UNAVAILABLE_ATTRIBUTE
81         #define CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
82         #define CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED   CL_EXT_SUFFIX__VERSION_1_1
83     #endif
84 #else
85     #define CL_EXTENSION_WEAK_LINK
86     #define CL_API_SUFFIX__VERSION_1_0
87     #define CL_EXT_SUFFIX__VERSION_1_0
88     #define CL_API_SUFFIX__VERSION_1_1
89     #define CL_EXT_SUFFIX__VERSION_1_1
90     #define CL_API_SUFFIX__VERSION_1_2
91     #define CL_EXT_SUFFIX__VERSION_1_2
92 
93     #ifdef __GNUC__
94         #ifdef CL_USE_DEPRECATED_OPENCL_1_0_APIS
95             #define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED
96             #define CL_EXT_PREFIX__VERSION_1_0_DEPRECATED
97         #else
98             #define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED __attribute__((deprecated))
99             #define CL_EXT_PREFIX__VERSION_1_0_DEPRECATED
100         #endif
101 
102         #ifdef CL_USE_DEPRECATED_OPENCL_1_1_APIS
103             #define CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
104             #define CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
105         #else
106             #define CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED __attribute__((deprecated))
107             #define CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
108         #endif
109     #elif _WIN32
110         #ifdef CL_USE_DEPRECATED_OPENCL_1_0_APIS
111             #define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED
112             #define CL_EXT_PREFIX__VERSION_1_0_DEPRECATED
113         #else
114             #define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED
115             #define CL_EXT_PREFIX__VERSION_1_0_DEPRECATED __declspec(deprecated)
116         #endif
117 
118         #ifdef CL_USE_DEPRECATED_OPENCL_1_1_APIS
119             #define CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
120             #define CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
121         #else
122             #define CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
123             #define CL_EXT_PREFIX__VERSION_1_1_DEPRECATED __declspec(deprecated)
124         #endif
125     #else
126         #define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED
127         #define CL_EXT_PREFIX__VERSION_1_0_DEPRECATED
128 
129         #define CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
130         #define CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
131     #endif
132 #endif
133 
134 #if (defined (_WIN32) && defined(_MSC_VER))
135 
136 /* scalar types  */
137 typedef signed   __int8         cl_char;
138 typedef unsigned __int8         cl_uchar;
139 typedef signed   __int16        cl_short;
140 typedef unsigned __int16        cl_ushort;
141 typedef signed   __int32        cl_int;
142 typedef unsigned __int32        cl_uint;
143 typedef signed   __int64        cl_long;
144 typedef unsigned __int64        cl_ulong;
145 
146 typedef unsigned __int16        cl_half;
147 typedef float                   cl_float;
148 typedef double                  cl_double;
149 
150 /* Macro names and corresponding values defined by OpenCL */
151 #define CL_CHAR_BIT         8
152 #define CL_SCHAR_MAX        127
153 #define CL_SCHAR_MIN        (-127-1)
154 #define CL_CHAR_MAX         CL_SCHAR_MAX
155 #define CL_CHAR_MIN         CL_SCHAR_MIN
156 #define CL_UCHAR_MAX        255
157 #define CL_SHRT_MAX         32767
158 #define CL_SHRT_MIN         (-32767-1)
159 #define CL_USHRT_MAX        65535
160 #define CL_INT_MAX          2147483647
161 #define CL_INT_MIN          (-2147483647-1)
162 #define CL_UINT_MAX         0xffffffffU
163 #define CL_LONG_MAX         ((cl_long) 0x7FFFFFFFFFFFFFFFLL)
164 #define CL_LONG_MIN         ((cl_long) -0x7FFFFFFFFFFFFFFFLL - 1LL)
165 #define CL_ULONG_MAX        ((cl_ulong) 0xFFFFFFFFFFFFFFFFULL)
166 
167 #define CL_FLT_DIG          6
168 #define CL_FLT_MANT_DIG     24
169 #define CL_FLT_MAX_10_EXP   +38
170 #define CL_FLT_MAX_EXP      +128
171 #define CL_FLT_MIN_10_EXP   -37
172 #define CL_FLT_MIN_EXP      -125
173 #define CL_FLT_RADIX        2
174 #define CL_FLT_MAX          340282346638528859811704183484516925440.0f
175 #define CL_FLT_MIN          1.175494350822287507969e-38f
176 #define CL_FLT_EPSILON      0x1.0p-23f
177 
178 #define CL_DBL_DIG          15
179 #define CL_DBL_MANT_DIG     53
180 #define CL_DBL_MAX_10_EXP   +308
181 #define CL_DBL_MAX_EXP      +1024
182 #define CL_DBL_MIN_10_EXP   -307
183 #define CL_DBL_MIN_EXP      -1021
184 #define CL_DBL_RADIX        2
185 #define CL_DBL_MAX          179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0
186 #define CL_DBL_MIN          2.225073858507201383090e-308
187 #define CL_DBL_EPSILON      2.220446049250313080847e-16
188 
189 #define  CL_M_E             2.718281828459045090796
190 #define  CL_M_LOG2E         1.442695040888963387005
191 #define  CL_M_LOG10E        0.434294481903251816668
192 #define  CL_M_LN2           0.693147180559945286227
193 #define  CL_M_LN10          2.302585092994045901094
194 #define  CL_M_PI            3.141592653589793115998
195 #define  CL_M_PI_2          1.570796326794896557999
196 #define  CL_M_PI_4          0.785398163397448278999
197 #define  CL_M_1_PI          0.318309886183790691216
198 #define  CL_M_2_PI          0.636619772367581382433
199 #define  CL_M_2_SQRTPI      1.128379167095512558561
200 #define  CL_M_SQRT2         1.414213562373095145475
201 #define  CL_M_SQRT1_2       0.707106781186547572737
202 
203 #define  CL_M_E_F           2.71828174591064f
204 #define  CL_M_LOG2E_F       1.44269502162933f
205 #define  CL_M_LOG10E_F      0.43429449200630f
206 #define  CL_M_LN2_F         0.69314718246460f
207 #define  CL_M_LN10_F        2.30258512496948f
208 #define  CL_M_PI_F          3.14159274101257f
209 #define  CL_M_PI_2_F        1.57079637050629f
210 #define  CL_M_PI_4_F        0.78539818525314f
211 #define  CL_M_1_PI_F        0.31830987334251f
212 #define  CL_M_2_PI_F        0.63661974668503f
213 #define  CL_M_2_SQRTPI_F    1.12837922573090f
214 #define  CL_M_SQRT2_F       1.41421353816986f
215 #define  CL_M_SQRT1_2_F     0.70710676908493f
216 
217 #define CL_NAN              (CL_INFINITY - CL_INFINITY)
218 #define CL_HUGE_VALF        ((cl_float) 1e50)
219 #define CL_HUGE_VAL         ((cl_double) 1e500)
220 #define CL_MAXFLOAT         CL_FLT_MAX
221 #define CL_INFINITY         CL_HUGE_VALF
222 
223 #else
224 
225 #include <stdint.h>
226 
227 /* scalar types  */
228 typedef int8_t          cl_char;
229 typedef uint8_t         cl_uchar;
230 typedef int16_t         cl_short    __attribute__((aligned(2)));
231 typedef uint16_t        cl_ushort   __attribute__((aligned(2)));
232 typedef int32_t         cl_int      __attribute__((aligned(4)));
233 typedef uint32_t        cl_uint     __attribute__((aligned(4)));
234 typedef int64_t         cl_long     __attribute__((aligned(8)));
235 typedef uint64_t        cl_ulong    __attribute__((aligned(8)));
236 
237 typedef uint16_t        cl_half     __attribute__((aligned(2)));
238 typedef float           cl_float    __attribute__((aligned(4)));
239 typedef double          cl_double   __attribute__((aligned(8)));
240 
241 /* Macro names and corresponding values defined by OpenCL */
242 #define CL_CHAR_BIT         8
243 #define CL_SCHAR_MAX        127
244 #define CL_SCHAR_MIN        (-127-1)
245 #define CL_CHAR_MAX         CL_SCHAR_MAX
246 #define CL_CHAR_MIN         CL_SCHAR_MIN
247 #define CL_UCHAR_MAX        255
248 #define CL_SHRT_MAX         32767
249 #define CL_SHRT_MIN         (-32767-1)
250 #define CL_USHRT_MAX        65535
251 #define CL_INT_MAX          2147483647
252 #define CL_INT_MIN          (-2147483647-1)
253 #define CL_UINT_MAX         0xffffffffU
254 #define CL_LONG_MAX         ((cl_long) 0x7FFFFFFFFFFFFFFFLL)
255 #define CL_LONG_MIN         ((cl_long) -0x7FFFFFFFFFFFFFFFLL - 1LL)
256 #define CL_ULONG_MAX        ((cl_ulong) 0xFFFFFFFFFFFFFFFFULL)
257 
258 #define CL_FLT_DIG          6
259 #define CL_FLT_MANT_DIG     24
260 #define CL_FLT_MAX_10_EXP   +38
261 #define CL_FLT_MAX_EXP      +128
262 #define CL_FLT_MIN_10_EXP   -37
263 #define CL_FLT_MIN_EXP      -125
264 #define CL_FLT_RADIX        2
265 #define CL_FLT_MAX          0x1.fffffep127f
266 #define CL_FLT_MIN          0x1.0p-126f
267 #define CL_FLT_EPSILON      0x1.0p-23f
268 
269 #define CL_DBL_DIG          15
270 #define CL_DBL_MANT_DIG     53
271 #define CL_DBL_MAX_10_EXP   +308
272 #define CL_DBL_MAX_EXP      +1024
273 #define CL_DBL_MIN_10_EXP   -307
274 #define CL_DBL_MIN_EXP      -1021
275 #define CL_DBL_RADIX        2
276 #define CL_DBL_MAX          0x1.fffffffffffffp1023
277 #define CL_DBL_MIN          0x1.0p-1022
278 #define CL_DBL_EPSILON      0x1.0p-52
279 
280 #define  CL_M_E             2.718281828459045090796
281 #define  CL_M_LOG2E         1.442695040888963387005
282 #define  CL_M_LOG10E        0.434294481903251816668
283 #define  CL_M_LN2           0.693147180559945286227
284 #define  CL_M_LN10          2.302585092994045901094
285 #define  CL_M_PI            3.141592653589793115998
286 #define  CL_M_PI_2          1.570796326794896557999
287 #define  CL_M_PI_4          0.785398163397448278999
288 #define  CL_M_1_PI          0.318309886183790691216
289 #define  CL_M_2_PI          0.636619772367581382433
290 #define  CL_M_2_SQRTPI      1.128379167095512558561
291 #define  CL_M_SQRT2         1.414213562373095145475
292 #define  CL_M_SQRT1_2       0.707106781186547572737
293 
294 #define  CL_M_E_F           2.71828174591064f
295 #define  CL_M_LOG2E_F       1.44269502162933f
296 #define  CL_M_LOG10E_F      0.43429449200630f
297 #define  CL_M_LN2_F         0.69314718246460f
298 #define  CL_M_LN10_F        2.30258512496948f
299 #define  CL_M_PI_F          3.14159274101257f
300 #define  CL_M_PI_2_F        1.57079637050629f
301 #define  CL_M_PI_4_F        0.78539818525314f
302 #define  CL_M_1_PI_F        0.31830987334251f
303 #define  CL_M_2_PI_F        0.63661974668503f
304 #define  CL_M_2_SQRTPI_F    1.12837922573090f
305 #define  CL_M_SQRT2_F       1.41421353816986f
306 #define  CL_M_SQRT1_2_F     0.70710676908493f
307 
308 #if defined( __GNUC__ )
309    #define CL_HUGE_VALF     __builtin_huge_valf()
310    #define CL_HUGE_VAL      __builtin_huge_val()
311    #define CL_NAN           __builtin_nanf( "" )
312 #else
313    #define CL_HUGE_VALF     ((cl_float) 1e50)
314    #define CL_HUGE_VAL      ((cl_double) 1e500)
315    float nanf( const char * );
316    #define CL_NAN           nanf( "" )
317 #endif
318 #define CL_MAXFLOAT         CL_FLT_MAX
319 #define CL_INFINITY         CL_HUGE_VALF
320 
321 #endif
322 
323 #include <stddef.h>
324 
325 /* Mirror types to GL types. Mirror types allow us to avoid deciding which 87s to load based on whether we are using GL or GLES here. */
326 typedef unsigned int cl_GLuint;
327 typedef int          cl_GLint;
328 typedef unsigned int cl_GLenum;
329 
330 /*
331  * Vector types
332  *
333  *  Note:   OpenCL requires that all types be naturally aligned.
334  *          This means that vector types must be naturally aligned.
335  *          For example, a vector of four floats must be aligned to
336  *          a 16 byte boundary (calculated as 4 * the natural 4-byte
337  *          alignment of the float).  The alignment qualifiers here
338  *          will only function properly if your compiler supports them
339  *          and if you don't actively work to defeat them.  For example,
340  *          in order for a cl_float4 to be 16 byte aligned in a struct,
341  *          the start of the struct must itself be 16-byte aligned.
342  *
343  *          Maintaining proper alignment is the user's responsibility.
344  */
345 
346 /* Define basic vector types */
347 #if defined( __VEC__ )
348    #include <altivec.h>   /* may be omitted depending on compiler. AltiVec spec provides no way to detect whether the header is required. */
349    typedef vector unsigned char     __cl_uchar16;
350    typedef vector signed char       __cl_char16;
351    typedef vector unsigned short    __cl_ushort8;
352    typedef vector signed short      __cl_short8;
353    typedef vector unsigned int      __cl_uint4;
354    typedef vector signed int        __cl_int4;
355    typedef vector float             __cl_float4;
356    #define  __CL_UCHAR16__  1
357    #define  __CL_CHAR16__   1
358    #define  __CL_USHORT8__  1
359    #define  __CL_SHORT8__   1
360    #define  __CL_UINT4__    1
361    #define  __CL_INT4__     1
362    #define  __CL_FLOAT4__   1
363 #endif
364 
365 #if defined( __SSE__ )
366     #if defined( __MINGW64__ )
367         #include <intrin.h>
368     #else
369         #include <xmmintrin.h>
370     #endif
371     #if defined( __GNUC__ )
372         typedef float __cl_float4   __attribute__((vector_size(16)));
373     #else
374         typedef __m128 __cl_float4;
375     #endif
376     #define __CL_FLOAT4__   1
377 #endif
378 
379 #if defined( __SSE2__ )
380     #if defined( __MINGW64__ )
381         #include <intrin.h>
382     #else
383         #include <emmintrin.h>
384     #endif
385     #if defined( __GNUC__ )
386         typedef cl_uchar    __cl_uchar16    __attribute__((vector_size(16)));
387         typedef cl_char     __cl_char16     __attribute__((vector_size(16)));
388         typedef cl_ushort   __cl_ushort8    __attribute__((vector_size(16)));
389         typedef cl_short    __cl_short8     __attribute__((vector_size(16)));
390         typedef cl_uint     __cl_uint4      __attribute__((vector_size(16)));
391         typedef cl_int      __cl_int4       __attribute__((vector_size(16)));
392         typedef cl_ulong    __cl_ulong2     __attribute__((vector_size(16)));
393         typedef cl_long     __cl_long2      __attribute__((vector_size(16)));
394         typedef cl_double   __cl_double2    __attribute__((vector_size(16)));
395     #else
396         typedef __m128i __cl_uchar16;
397         typedef __m128i __cl_char16;
398         typedef __m128i __cl_ushort8;
399         typedef __m128i __cl_short8;
400         typedef __m128i __cl_uint4;
401         typedef __m128i __cl_int4;
402         typedef __m128i __cl_ulong2;
403         typedef __m128i __cl_long2;
404         typedef __m128d __cl_double2;
405     #endif
406     #define __CL_UCHAR16__  1
407     #define __CL_CHAR16__   1
408     #define __CL_USHORT8__  1
409     #define __CL_SHORT8__   1
410     #define __CL_INT4__     1
411     #define __CL_UINT4__    1
412     #define __CL_ULONG2__   1
413     #define __CL_LONG2__    1
414     #define __CL_DOUBLE2__  1
415 #endif
416 
417 #if defined( __MMX__ )
418     #include <mmintrin.h>
419     #if defined( __GNUC__ )
420         typedef cl_uchar    __cl_uchar8     __attribute__((vector_size(8)));
421         typedef cl_char     __cl_char8      __attribute__((vector_size(8)));
422         typedef cl_ushort   __cl_ushort4    __attribute__((vector_size(8)));
423         typedef cl_short    __cl_short4     __attribute__((vector_size(8)));
424         typedef cl_uint     __cl_uint2      __attribute__((vector_size(8)));
425         typedef cl_int      __cl_int2       __attribute__((vector_size(8)));
426         typedef cl_ulong    __cl_ulong1     __attribute__((vector_size(8)));
427         typedef cl_long     __cl_long1      __attribute__((vector_size(8)));
428         typedef cl_float    __cl_float2     __attribute__((vector_size(8)));
429     #else
430         typedef __m64       __cl_uchar8;
431         typedef __m64       __cl_char8;
432         typedef __m64       __cl_ushort4;
433         typedef __m64       __cl_short4;
434         typedef __m64       __cl_uint2;
435         typedef __m64       __cl_int2;
436         typedef __m64       __cl_ulong1;
437         typedef __m64       __cl_long1;
438         typedef __m64       __cl_float2;
439     #endif
440     #define __CL_UCHAR8__   1
441     #define __CL_CHAR8__    1
442     #define __CL_USHORT4__  1
443     #define __CL_SHORT4__   1
444     #define __CL_INT2__     1
445     #define __CL_UINT2__    1
446     #define __CL_ULONG1__   1
447     #define __CL_LONG1__    1
448     #define __CL_FLOAT2__   1
449 #endif
450 
451 #if defined( __AVX__ )
452     #if defined( __MINGW64__ )
453         #include <intrin.h>
454     #else
455         #include <immintrin.h>
456     #endif
457     #if defined( __GNUC__ )
458         typedef cl_float    __cl_float8     __attribute__((vector_size(32)));
459         typedef cl_double   __cl_double4    __attribute__((vector_size(32)));
460     #else
461         typedef __m256      __cl_float8;
462         typedef __m256d     __cl_double4;
463     #endif
464     #define __CL_FLOAT8__   1
465     #define __CL_DOUBLE4__  1
466 #endif
467 
468 /* Define alignment keys */
469 #if defined( __GNUC__ )
470     #define CL_ALIGNED(_x)          __attribute__ ((aligned(_x)))
471 #elif defined( _WIN32) && (_MSC_VER)
472     /* Alignment keys neutered on windows because MSVC can't swallow function arguments with alignment requirements     */
473     /* http://msdn.microsoft.com/en-us/library/373ak2y1%28VS.71%29.aspx                                                 */
474     /* #include <crtdefs.h>                                                                                             */
475     /* #define CL_ALIGNED(_x)          _CRT_ALIGN(_x)                                                                   */
476     #define CL_ALIGNED(_x)
477 #else
478    #warning  Need to implement some method to align data here
479    #define  CL_ALIGNED(_x)
480 #endif
481 
482 /* Indicate whether .xyzw, .s0123 and .hi.lo are supported */
483 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
484     /* .xyzw and .s0123...{f|F} are supported */
485     #define CL_HAS_NAMED_VECTOR_FIELDS 1
486     /* .hi and .lo are supported */
487     #define CL_HAS_HI_LO_VECTOR_FIELDS 1
488 #endif
489 
490 /* Define cl_vector types */
491 
492 /* ---- cl_charn ---- */
493 typedef union
494 {
495     cl_char  CL_ALIGNED(2) s[2];
496 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
497    __extension__ struct{ cl_char  x, y; };
498    __extension__ struct{ cl_char  s0, s1; };
499    __extension__ struct{ cl_char  lo, hi; };
500 #endif
501 #if defined( __CL_CHAR2__)
502     __cl_char2     v2;
503 #endif
504 }cl_char2;
505 
506 typedef union
507 {
508     cl_char  CL_ALIGNED(4) s[4];
509 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
510    __extension__ struct{ cl_char  x, y, z, w; };
511    __extension__ struct{ cl_char  s0, s1, s2, s3; };
512    __extension__ struct{ cl_char2 lo, hi; };
513 #endif
514 #if defined( __CL_CHAR2__)
515     __cl_char2     v2[2];
516 #endif
517 #if defined( __CL_CHAR4__)
518     __cl_char4     v4;
519 #endif
520 }cl_char4;
521 
522 /* cl_char3 is identical in size, alignment and behavior to cl_char4. See section 6.1.5. */
523 typedef  cl_char4  cl_char3;
524 
525 typedef union
526 {
527     cl_char   CL_ALIGNED(8) s[8];
528 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
529    __extension__ struct{ cl_char  x, y, z, w; };
530    __extension__ struct{ cl_char  s0, s1, s2, s3, s4, s5, s6, s7; };
531    __extension__ struct{ cl_char4 lo, hi; };
532 #endif
533 #if defined( __CL_CHAR2__)
534     __cl_char2     v2[4];
535 #endif
536 #if defined( __CL_CHAR4__)
537     __cl_char4     v4[2];
538 #endif
539 #if defined( __CL_CHAR8__ )
540     __cl_char8     v8;
541 #endif
542 }cl_char8;
543 
544 typedef union
545 {
546     cl_char  CL_ALIGNED(16) s[16];
547 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
548    __extension__ struct{ cl_char  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
549    __extension__ struct{ cl_char  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
550    __extension__ struct{ cl_char8 lo, hi; };
551 #endif
552 #if defined( __CL_CHAR2__)
553     __cl_char2     v2[8];
554 #endif
555 #if defined( __CL_CHAR4__)
556     __cl_char4     v4[4];
557 #endif
558 #if defined( __CL_CHAR8__ )
559     __cl_char8     v8[2];
560 #endif
561 #if defined( __CL_CHAR16__ )
562     __cl_char16    v16;
563 #endif
564 }cl_char16;
565 
566 
567 /* ---- cl_ucharn ---- */
568 typedef union
569 {
570     cl_uchar  CL_ALIGNED(2) s[2];
571 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
572    __extension__ struct{ cl_uchar  x, y; };
573    __extension__ struct{ cl_uchar  s0, s1; };
574    __extension__ struct{ cl_uchar  lo, hi; };
575 #endif
576 #if defined( __cl_uchar2__)
577     __cl_uchar2     v2;
578 #endif
579 }cl_uchar2;
580 
581 typedef union
582 {
583     cl_uchar  CL_ALIGNED(4) s[4];
584 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
585    __extension__ struct{ cl_uchar  x, y, z, w; };
586    __extension__ struct{ cl_uchar  s0, s1, s2, s3; };
587    __extension__ struct{ cl_uchar2 lo, hi; };
588 #endif
589 #if defined( __CL_UCHAR2__)
590     __cl_uchar2     v2[2];
591 #endif
592 #if defined( __CL_UCHAR4__)
593     __cl_uchar4     v4;
594 #endif
595 }cl_uchar4;
596 
597 /* cl_uchar3 is identical in size, alignment and behavior to cl_uchar4. See section 6.1.5. */
598 typedef  cl_uchar4  cl_uchar3;
599 
600 typedef union
601 {
602     cl_uchar   CL_ALIGNED(8) s[8];
603 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
604    __extension__ struct{ cl_uchar  x, y, z, w; };
605    __extension__ struct{ cl_uchar  s0, s1, s2, s3, s4, s5, s6, s7; };
606    __extension__ struct{ cl_uchar4 lo, hi; };
607 #endif
608 #if defined( __CL_UCHAR2__)
609     __cl_uchar2     v2[4];
610 #endif
611 #if defined( __CL_UCHAR4__)
612     __cl_uchar4     v4[2];
613 #endif
614 #if defined( __CL_UCHAR8__ )
615     __cl_uchar8     v8;
616 #endif
617 }cl_uchar8;
618 
619 typedef union
620 {
621     cl_uchar  CL_ALIGNED(16) s[16];
622 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
623    __extension__ struct{ cl_uchar  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
624    __extension__ struct{ cl_uchar  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
625    __extension__ struct{ cl_uchar8 lo, hi; };
626 #endif
627 #if defined( __CL_UCHAR2__)
628     __cl_uchar2     v2[8];
629 #endif
630 #if defined( __CL_UCHAR4__)
631     __cl_uchar4     v4[4];
632 #endif
633 #if defined( __CL_UCHAR8__ )
634     __cl_uchar8     v8[2];
635 #endif
636 #if defined( __CL_UCHAR16__ )
637     __cl_uchar16    v16;
638 #endif
639 }cl_uchar16;
640 
641 
642 /* ---- cl_shortn ---- */
643 typedef union
644 {
645     cl_short  CL_ALIGNED(4) s[2];
646 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
647    __extension__ struct{ cl_short  x, y; };
648    __extension__ struct{ cl_short  s0, s1; };
649    __extension__ struct{ cl_short  lo, hi; };
650 #endif
651 #if defined( __CL_SHORT2__)
652     __cl_short2     v2;
653 #endif
654 }cl_short2;
655 
656 typedef union
657 {
658     cl_short  CL_ALIGNED(8) s[4];
659 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
660    __extension__ struct{ cl_short  x, y, z, w; };
661    __extension__ struct{ cl_short  s0, s1, s2, s3; };
662    __extension__ struct{ cl_short2 lo, hi; };
663 #endif
664 #if defined( __CL_SHORT2__)
665     __cl_short2     v2[2];
666 #endif
667 #if defined( __CL_SHORT4__)
668     __cl_short4     v4;
669 #endif
670 }cl_short4;
671 
672 /* cl_short3 is identical in size, alignment and behavior to cl_short4. See section 6.1.5. */
673 typedef  cl_short4  cl_short3;
674 
675 typedef union
676 {
677     cl_short   CL_ALIGNED(16) s[8];
678 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
679    __extension__ struct{ cl_short  x, y, z, w; };
680    __extension__ struct{ cl_short  s0, s1, s2, s3, s4, s5, s6, s7; };
681    __extension__ struct{ cl_short4 lo, hi; };
682 #endif
683 #if defined( __CL_SHORT2__)
684     __cl_short2     v2[4];
685 #endif
686 #if defined( __CL_SHORT4__)
687     __cl_short4     v4[2];
688 #endif
689 #if defined( __CL_SHORT8__ )
690     __cl_short8     v8;
691 #endif
692 }cl_short8;
693 
694 typedef union
695 {
696     cl_short  CL_ALIGNED(32) s[16];
697 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
698    __extension__ struct{ cl_short  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
699    __extension__ struct{ cl_short  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
700    __extension__ struct{ cl_short8 lo, hi; };
701 #endif
702 #if defined( __CL_SHORT2__)
703     __cl_short2     v2[8];
704 #endif
705 #if defined( __CL_SHORT4__)
706     __cl_short4     v4[4];
707 #endif
708 #if defined( __CL_SHORT8__ )
709     __cl_short8     v8[2];
710 #endif
711 #if defined( __CL_SHORT16__ )
712     __cl_short16    v16;
713 #endif
714 }cl_short16;
715 
716 
717 /* ---- cl_ushortn ---- */
718 typedef union
719 {
720     cl_ushort  CL_ALIGNED(4) s[2];
721 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
722    __extension__ struct{ cl_ushort  x, y; };
723    __extension__ struct{ cl_ushort  s0, s1; };
724    __extension__ struct{ cl_ushort  lo, hi; };
725 #endif
726 #if defined( __CL_USHORT2__)
727     __cl_ushort2     v2;
728 #endif
729 }cl_ushort2;
730 
731 typedef union
732 {
733     cl_ushort  CL_ALIGNED(8) s[4];
734 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
735    __extension__ struct{ cl_ushort  x, y, z, w; };
736    __extension__ struct{ cl_ushort  s0, s1, s2, s3; };
737    __extension__ struct{ cl_ushort2 lo, hi; };
738 #endif
739 #if defined( __CL_USHORT2__)
740     __cl_ushort2     v2[2];
741 #endif
742 #if defined( __CL_USHORT4__)
743     __cl_ushort4     v4;
744 #endif
745 }cl_ushort4;
746 
747 /* cl_ushort3 is identical in size, alignment and behavior to cl_ushort4. See section 6.1.5. */
748 typedef  cl_ushort4  cl_ushort3;
749 
750 typedef union
751 {
752     cl_ushort   CL_ALIGNED(16) s[8];
753 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
754    __extension__ struct{ cl_ushort  x, y, z, w; };
755    __extension__ struct{ cl_ushort  s0, s1, s2, s3, s4, s5, s6, s7; };
756    __extension__ struct{ cl_ushort4 lo, hi; };
757 #endif
758 #if defined( __CL_USHORT2__)
759     __cl_ushort2     v2[4];
760 #endif
761 #if defined( __CL_USHORT4__)
762     __cl_ushort4     v4[2];
763 #endif
764 #if defined( __CL_USHORT8__ )
765     __cl_ushort8     v8;
766 #endif
767 }cl_ushort8;
768 
769 typedef union
770 {
771     cl_ushort  CL_ALIGNED(32) s[16];
772 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
773    __extension__ struct{ cl_ushort  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
774    __extension__ struct{ cl_ushort  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
775    __extension__ struct{ cl_ushort8 lo, hi; };
776 #endif
777 #if defined( __CL_USHORT2__)
778     __cl_ushort2     v2[8];
779 #endif
780 #if defined( __CL_USHORT4__)
781     __cl_ushort4     v4[4];
782 #endif
783 #if defined( __CL_USHORT8__ )
784     __cl_ushort8     v8[2];
785 #endif
786 #if defined( __CL_USHORT16__ )
787     __cl_ushort16    v16;
788 #endif
789 }cl_ushort16;
790 
791 /* ---- cl_intn ---- */
792 typedef union
793 {
794     cl_int  CL_ALIGNED(8) s[2];
795 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
796    __extension__ struct{ cl_int  x, y; };
797    __extension__ struct{ cl_int  s0, s1; };
798    __extension__ struct{ cl_int  lo, hi; };
799 #endif
800 #if defined( __CL_INT2__)
801     __cl_int2     v2;
802 #endif
803 }cl_int2;
804 
805 typedef union
806 {
807     cl_int  CL_ALIGNED(16) s[4];
808 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
809    __extension__ struct{ cl_int  x, y, z, w; };
810    __extension__ struct{ cl_int  s0, s1, s2, s3; };
811    __extension__ struct{ cl_int2 lo, hi; };
812 #endif
813 #if defined( __CL_INT2__)
814     __cl_int2     v2[2];
815 #endif
816 #if defined( __CL_INT4__)
817     __cl_int4     v4;
818 #endif
819 }cl_int4;
820 
821 /* cl_int3 is identical in size, alignment and behavior to cl_int4. See section 6.1.5. */
822 typedef  cl_int4  cl_int3;
823 
824 typedef union
825 {
826     cl_int   CL_ALIGNED(32) s[8];
827 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
828    __extension__ struct{ cl_int  x, y, z, w; };
829    __extension__ struct{ cl_int  s0, s1, s2, s3, s4, s5, s6, s7; };
830    __extension__ struct{ cl_int4 lo, hi; };
831 #endif
832 #if defined( __CL_INT2__)
833     __cl_int2     v2[4];
834 #endif
835 #if defined( __CL_INT4__)
836     __cl_int4     v4[2];
837 #endif
838 #if defined( __CL_INT8__ )
839     __cl_int8     v8;
840 #endif
841 }cl_int8;
842 
843 typedef union
844 {
845     cl_int  CL_ALIGNED(64) s[16];
846 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
847    __extension__ struct{ cl_int  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
848    __extension__ struct{ cl_int  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
849    __extension__ struct{ cl_int8 lo, hi; };
850 #endif
851 #if defined( __CL_INT2__)
852     __cl_int2     v2[8];
853 #endif
854 #if defined( __CL_INT4__)
855     __cl_int4     v4[4];
856 #endif
857 #if defined( __CL_INT8__ )
858     __cl_int8     v8[2];
859 #endif
860 #if defined( __CL_INT16__ )
861     __cl_int16    v16;
862 #endif
863 }cl_int16;
864 
865 
866 /* ---- cl_uintn ---- */
867 typedef union
868 {
869     cl_uint  CL_ALIGNED(8) s[2];
870 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
871    __extension__ struct{ cl_uint  x, y; };
872    __extension__ struct{ cl_uint  s0, s1; };
873    __extension__ struct{ cl_uint  lo, hi; };
874 #endif
875 #if defined( __CL_UINT2__)
876     __cl_uint2     v2;
877 #endif
878 }cl_uint2;
879 
880 typedef union
881 {
882     cl_uint  CL_ALIGNED(16) s[4];
883 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
884    __extension__ struct{ cl_uint  x, y, z, w; };
885    __extension__ struct{ cl_uint  s0, s1, s2, s3; };
886    __extension__ struct{ cl_uint2 lo, hi; };
887 #endif
888 #if defined( __CL_UINT2__)
889     __cl_uint2     v2[2];
890 #endif
891 #if defined( __CL_UINT4__)
892     __cl_uint4     v4;
893 #endif
894 }cl_uint4;
895 
896 /* cl_uint3 is identical in size, alignment and behavior to cl_uint4. See section 6.1.5. */
897 typedef  cl_uint4  cl_uint3;
898 
899 typedef union
900 {
901     cl_uint   CL_ALIGNED(32) s[8];
902 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
903    __extension__ struct{ cl_uint  x, y, z, w; };
904    __extension__ struct{ cl_uint  s0, s1, s2, s3, s4, s5, s6, s7; };
905    __extension__ struct{ cl_uint4 lo, hi; };
906 #endif
907 #if defined( __CL_UINT2__)
908     __cl_uint2     v2[4];
909 #endif
910 #if defined( __CL_UINT4__)
911     __cl_uint4     v4[2];
912 #endif
913 #if defined( __CL_UINT8__ )
914     __cl_uint8     v8;
915 #endif
916 }cl_uint8;
917 
918 typedef union
919 {
920     cl_uint  CL_ALIGNED(64) s[16];
921 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
922    __extension__ struct{ cl_uint  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
923    __extension__ struct{ cl_uint  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
924    __extension__ struct{ cl_uint8 lo, hi; };
925 #endif
926 #if defined( __CL_UINT2__)
927     __cl_uint2     v2[8];
928 #endif
929 #if defined( __CL_UINT4__)
930     __cl_uint4     v4[4];
931 #endif
932 #if defined( __CL_UINT8__ )
933     __cl_uint8     v8[2];
934 #endif
935 #if defined( __CL_UINT16__ )
936     __cl_uint16    v16;
937 #endif
938 }cl_uint16;
939 
940 /* ---- cl_longn ---- */
941 typedef union
942 {
943     cl_long  CL_ALIGNED(16) s[2];
944 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
945    __extension__ struct{ cl_long  x, y; };
946    __extension__ struct{ cl_long  s0, s1; };
947    __extension__ struct{ cl_long  lo, hi; };
948 #endif
949 #if defined( __CL_LONG2__)
950     __cl_long2     v2;
951 #endif
952 }cl_long2;
953 
954 typedef union
955 {
956     cl_long  CL_ALIGNED(32) s[4];
957 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
958    __extension__ struct{ cl_long  x, y, z, w; };
959    __extension__ struct{ cl_long  s0, s1, s2, s3; };
960    __extension__ struct{ cl_long2 lo, hi; };
961 #endif
962 #if defined( __CL_LONG2__)
963     __cl_long2     v2[2];
964 #endif
965 #if defined( __CL_LONG4__)
966     __cl_long4     v4;
967 #endif
968 }cl_long4;
969 
970 /* cl_long3 is identical in size, alignment and behavior to cl_long4. See section 6.1.5. */
971 typedef  cl_long4  cl_long3;
972 
973 typedef union
974 {
975     cl_long   CL_ALIGNED(64) s[8];
976 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
977    __extension__ struct{ cl_long  x, y, z, w; };
978    __extension__ struct{ cl_long  s0, s1, s2, s3, s4, s5, s6, s7; };
979    __extension__ struct{ cl_long4 lo, hi; };
980 #endif
981 #if defined( __CL_LONG2__)
982     __cl_long2     v2[4];
983 #endif
984 #if defined( __CL_LONG4__)
985     __cl_long4     v4[2];
986 #endif
987 #if defined( __CL_LONG8__ )
988     __cl_long8     v8;
989 #endif
990 }cl_long8;
991 
992 typedef union
993 {
994     cl_long  CL_ALIGNED(128) s[16];
995 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
996    __extension__ struct{ cl_long  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
997    __extension__ struct{ cl_long  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
998    __extension__ struct{ cl_long8 lo, hi; };
999 #endif
1000 #if defined( __CL_LONG2__)
1001     __cl_long2     v2[8];
1002 #endif
1003 #if defined( __CL_LONG4__)
1004     __cl_long4     v4[4];
1005 #endif
1006 #if defined( __CL_LONG8__ )
1007     __cl_long8     v8[2];
1008 #endif
1009 #if defined( __CL_LONG16__ )
1010     __cl_long16    v16;
1011 #endif
1012 }cl_long16;
1013 
1014 
1015 /* ---- cl_ulongn ---- */
1016 typedef union
1017 {
1018     cl_ulong  CL_ALIGNED(16) s[2];
1019 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
1020    __extension__ struct{ cl_ulong  x, y; };
1021    __extension__ struct{ cl_ulong  s0, s1; };
1022    __extension__ struct{ cl_ulong  lo, hi; };
1023 #endif
1024 #if defined( __CL_ULONG2__)
1025     __cl_ulong2     v2;
1026 #endif
1027 }cl_ulong2;
1028 
1029 typedef union
1030 {
1031     cl_ulong  CL_ALIGNED(32) s[4];
1032 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
1033    __extension__ struct{ cl_ulong  x, y, z, w; };
1034    __extension__ struct{ cl_ulong  s0, s1, s2, s3; };
1035    __extension__ struct{ cl_ulong2 lo, hi; };
1036 #endif
1037 #if defined( __CL_ULONG2__)
1038     __cl_ulong2     v2[2];
1039 #endif
1040 #if defined( __CL_ULONG4__)
1041     __cl_ulong4     v4;
1042 #endif
1043 }cl_ulong4;
1044 
1045 /* cl_ulong3 is identical in size, alignment and behavior to cl_ulong4. See section 6.1.5. */
1046 typedef  cl_ulong4  cl_ulong3;
1047 
1048 typedef union
1049 {
1050     cl_ulong   CL_ALIGNED(64) s[8];
1051 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
1052    __extension__ struct{ cl_ulong  x, y, z, w; };
1053    __extension__ struct{ cl_ulong  s0, s1, s2, s3, s4, s5, s6, s7; };
1054    __extension__ struct{ cl_ulong4 lo, hi; };
1055 #endif
1056 #if defined( __CL_ULONG2__)
1057     __cl_ulong2     v2[4];
1058 #endif
1059 #if defined( __CL_ULONG4__)
1060     __cl_ulong4     v4[2];
1061 #endif
1062 #if defined( __CL_ULONG8__ )
1063     __cl_ulong8     v8;
1064 #endif
1065 }cl_ulong8;
1066 
1067 typedef union
1068 {
1069     cl_ulong  CL_ALIGNED(128) s[16];
1070 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
1071    __extension__ struct{ cl_ulong  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
1072    __extension__ struct{ cl_ulong  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
1073    __extension__ struct{ cl_ulong8 lo, hi; };
1074 #endif
1075 #if defined( __CL_ULONG2__)
1076     __cl_ulong2     v2[8];
1077 #endif
1078 #if defined( __CL_ULONG4__)
1079     __cl_ulong4     v4[4];
1080 #endif
1081 #if defined( __CL_ULONG8__ )
1082     __cl_ulong8     v8[2];
1083 #endif
1084 #if defined( __CL_ULONG16__ )
1085     __cl_ulong16    v16;
1086 #endif
1087 }cl_ulong16;
1088 
1089 
1090 /* --- cl_floatn ---- */
1091 
1092 typedef union
1093 {
1094     cl_float  CL_ALIGNED(8) s[2];
1095 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
1096    __extension__ struct{ cl_float  x, y; };
1097    __extension__ struct{ cl_float  s0, s1; };
1098    __extension__ struct{ cl_float  lo, hi; };
1099 #endif
1100 #if defined( __CL_FLOAT2__)
1101     __cl_float2     v2;
1102 #endif
1103 }cl_float2;
1104 
1105 typedef union
1106 {
1107     cl_float  CL_ALIGNED(16) s[4];
1108 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
1109    __extension__ struct{ cl_float   x, y, z, w; };
1110    __extension__ struct{ cl_float   s0, s1, s2, s3; };
1111    __extension__ struct{ cl_float2  lo, hi; };
1112 #endif
1113 #if defined( __CL_FLOAT2__)
1114     __cl_float2     v2[2];
1115 #endif
1116 #if defined( __CL_FLOAT4__)
1117     __cl_float4     v4;
1118 #endif
1119 }cl_float4;
1120 
1121 /* cl_float3 is identical in size, alignment and behavior to cl_float4. See section 6.1.5. */
1122 typedef  cl_float4  cl_float3;
1123 
1124 typedef union
1125 {
1126     cl_float   CL_ALIGNED(32) s[8];
1127 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
1128    __extension__ struct{ cl_float   x, y, z, w; };
1129    __extension__ struct{ cl_float   s0, s1, s2, s3, s4, s5, s6, s7; };
1130    __extension__ struct{ cl_float4  lo, hi; };
1131 #endif
1132 #if defined( __CL_FLOAT2__)
1133     __cl_float2     v2[4];
1134 #endif
1135 #if defined( __CL_FLOAT4__)
1136     __cl_float4     v4[2];
1137 #endif
1138 #if defined( __CL_FLOAT8__ )
1139     __cl_float8     v8;
1140 #endif
1141 }cl_float8;
1142 
1143 typedef union
1144 {
1145     cl_float  CL_ALIGNED(64) s[16];
1146 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
1147    __extension__ struct{ cl_float  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
1148    __extension__ struct{ cl_float  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
1149    __extension__ struct{ cl_float8 lo, hi; };
1150 #endif
1151 #if defined( __CL_FLOAT2__)
1152     __cl_float2     v2[8];
1153 #endif
1154 #if defined( __CL_FLOAT4__)
1155     __cl_float4     v4[4];
1156 #endif
1157 #if defined( __CL_FLOAT8__ )
1158     __cl_float8     v8[2];
1159 #endif
1160 #if defined( __CL_FLOAT16__ )
1161     __cl_float16    v16;
1162 #endif
1163 }cl_float16;
1164 
1165 /* --- cl_doublen ---- */
1166 
1167 typedef union
1168 {
1169     cl_double  CL_ALIGNED(16) s[2];
1170 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
1171    __extension__ struct{ cl_double  x, y; };
1172    __extension__ struct{ cl_double s0, s1; };
1173    __extension__ struct{ cl_double lo, hi; };
1174 #endif
1175 #if defined( __CL_DOUBLE2__)
1176     __cl_double2     v2;
1177 #endif
1178 }cl_double2;
1179 
1180 typedef union
1181 {
1182     cl_double  CL_ALIGNED(32) s[4];
1183 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
1184    __extension__ struct{ cl_double  x, y, z, w; };
1185    __extension__ struct{ cl_double  s0, s1, s2, s3; };
1186    __extension__ struct{ cl_double2 lo, hi; };
1187 #endif
1188 #if defined( __CL_DOUBLE2__)
1189     __cl_double2     v2[2];
1190 #endif
1191 #if defined( __CL_DOUBLE4__)
1192     __cl_double4     v4;
1193 #endif
1194 }cl_double4;
1195 
1196 /* cl_double3 is identical in size, alignment and behavior to cl_double4. See section 6.1.5. */
1197 typedef  cl_double4  cl_double3;
1198 
1199 typedef union
1200 {
1201     cl_double   CL_ALIGNED(64) s[8];
1202 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
1203    __extension__ struct{ cl_double  x, y, z, w; };
1204    __extension__ struct{ cl_double  s0, s1, s2, s3, s4, s5, s6, s7; };
1205    __extension__ struct{ cl_double4 lo, hi; };
1206 #endif
1207 #if defined( __CL_DOUBLE2__)
1208     __cl_double2     v2[4];
1209 #endif
1210 #if defined( __CL_DOUBLE4__)
1211     __cl_double4     v4[2];
1212 #endif
1213 #if defined( __CL_DOUBLE8__ )
1214     __cl_double8     v8;
1215 #endif
1216 }cl_double8;
1217 
1218 typedef union
1219 {
1220     cl_double  CL_ALIGNED(128) s[16];
1221 #if defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
1222    __extension__ struct{ cl_double  x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
1223    __extension__ struct{ cl_double  s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
1224    __extension__ struct{ cl_double8 lo, hi; };
1225 #endif
1226 #if defined( __CL_DOUBLE2__)
1227     __cl_double2     v2[8];
1228 #endif
1229 #if defined( __CL_DOUBLE4__)
1230     __cl_double4     v4[4];
1231 #endif
1232 #if defined( __CL_DOUBLE8__ )
1233     __cl_double8     v8[2];
1234 #endif
1235 #if defined( __CL_DOUBLE16__ )
1236     __cl_double16    v16;
1237 #endif
1238 }cl_double16;
1239 
1240 /* Macro to facilitate debugging
1241  * Usage:
1242  *   Place CL_PROGRAM_STRING_DEBUG_INFO on the line before the first line of your source.
1243  *   The first line ends with:   CL_PROGRAM_STRING_DEBUG_INFO \"
1244  *   Each line thereafter of OpenCL C source must end with: \n\
1245  *   The last line ends in ";
1246  *
1247  *   Example:
1248  *
1249  *   const char *my_program = CL_PROGRAM_STRING_DEBUG_INFO "\
1250  *   kernel void foo( int a, float * b )             \n\
1251  *   {                                               \n\
1252  *      // my comment                                \n\
1253  *      *b[ get_global_id(0)] = a;                   \n\
1254  *   }                                               \n\
1255  *   ";
1256  *
1257  * This should correctly set up the line, (column) and file information for your source
1258  * string so you can do source level debugging.
1259  */
1260 #define  __CL_STRINGIFY( _x )               # _x
1261 #define  _CL_STRINGIFY( _x )                __CL_STRINGIFY( _x )
1262 #define  CL_PROGRAM_STRING_DEBUG_INFO       "#line "  _CL_STRINGIFY(__LINE__) " \"" __FILE__ "\" \n\n"
1263 
1264 #ifdef __cplusplus
1265 }
1266 #endif
1267 
1268 #endif  /* __CL_PLATFORM_H  */
1269