blob: 2d69cc4e51a2868690aeb35b347e27ad24cecc73 [file] [log] [blame]
Sheri Zhang79cb9452021-09-07 14:51:49 +01001/*******************************************************************************
2 * Copyright (c) 2008-2020 The Khronos Group Inc.
Anthony Barbier6ff3b192017-09-04 18:44:23 +01003 *
Sheri Zhang79cb9452021-09-07 14:51:49 +01004 * 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
Anthony Barbier6ff3b192017-09-04 18:44:23 +01007 *
Sheri Zhang79cb9452021-09-07 14:51:49 +01008 * http://www.apache.org/licenses/LICENSE-2.0
Anthony Barbier6ff3b192017-09-04 18:44:23 +01009 *
Sheri Zhang79cb9452021-09-07 14:51:49 +010010 * 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 ******************************************************************************/
Anthony Barbier6ff3b192017-09-04 18:44:23 +010016
Anthony Barbier6ff3b192017-09-04 18:44:23 +010017#ifndef __CL_PLATFORM_H
18#define __CL_PLATFORM_H
19
Sheri Zhang67354e02021-06-30 16:08:29 +010020#include <CL/cl_version.h>
Anthony Barbier6ff3b192017-09-04 18:44:23 +010021
22#ifdef __cplusplus
23extern "C" {
24#endif
25
26#if defined(_WIN32)
27 #define CL_API_ENTRY
28 #define CL_API_CALL __stdcall
29 #define CL_CALLBACK __stdcall
30#else
31 #define CL_API_ENTRY
32 #define CL_API_CALL
33 #define CL_CALLBACK
34#endif
35
Pablo Telloe86a09f2018-01-11 15:44:48 +000036/*
37 * Deprecation flags refer to the last version of the header in which the
38 * feature was not deprecated.
39 *
40 * E.g. VERSION_1_1_DEPRECATED means the feature is present in 1.1 without
41 * deprecation but is deprecated in versions later than 1.1.
42 */
43
Sheri Zhang67354e02021-06-30 16:08:29 +010044#define CL_EXTENSION_WEAK_LINK
45#define CL_API_SUFFIX__VERSION_1_0
46#define CL_EXT_SUFFIX__VERSION_1_0
47#define CL_API_SUFFIX__VERSION_1_1
48#define CL_EXT_SUFFIX__VERSION_1_1
49#define CL_API_SUFFIX__VERSION_1_2
50#define CL_EXT_SUFFIX__VERSION_1_2
51#define CL_API_SUFFIX__VERSION_2_0
52#define CL_EXT_SUFFIX__VERSION_2_0
53#define CL_API_SUFFIX__VERSION_2_1
54#define CL_EXT_SUFFIX__VERSION_2_1
55#define CL_API_SUFFIX__VERSION_2_2
56#define CL_EXT_SUFFIX__VERSION_2_2
Sheri Zhang79cb9452021-09-07 14:51:49 +010057#define CL_API_SUFFIX__VERSION_3_0
58#define CL_EXT_SUFFIX__VERSION_3_0
59#define CL_API_SUFFIX__EXPERIMENTAL
60#define CL_EXT_SUFFIX__EXPERIMENTAL
Anthony Barbier8b2fdc92018-08-09 11:42:38 +010061
Sheri Zhang67354e02021-06-30 16:08:29 +010062
63#ifdef __GNUC__
64 #define CL_EXT_SUFFIX_DEPRECATED __attribute__((deprecated))
65 #define CL_EXT_PREFIX_DEPRECATED
66#elif defined(_WIN32)
67 #define CL_EXT_SUFFIX_DEPRECATED
68 #define CL_EXT_PREFIX_DEPRECATED __declspec(deprecated)
Anthony Barbier6ff3b192017-09-04 18:44:23 +010069#else
Sheri Zhang67354e02021-06-30 16:08:29 +010070 #define CL_EXT_SUFFIX_DEPRECATED
71 #define CL_EXT_PREFIX_DEPRECATED
72#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +010073
Sheri Zhang67354e02021-06-30 16:08:29 +010074#ifdef CL_USE_DEPRECATED_OPENCL_1_0_APIS
75 #define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED
76 #define CL_EXT_PREFIX__VERSION_1_0_DEPRECATED
77#else
78 #define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED CL_EXT_SUFFIX_DEPRECATED
79 #define CL_EXT_PREFIX__VERSION_1_0_DEPRECATED CL_EXT_PREFIX_DEPRECATED
80#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +010081
Sheri Zhang67354e02021-06-30 16:08:29 +010082#ifdef CL_USE_DEPRECATED_OPENCL_1_1_APIS
83 #define CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED
84 #define CL_EXT_PREFIX__VERSION_1_1_DEPRECATED
85#else
86 #define CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED CL_EXT_SUFFIX_DEPRECATED
87 #define CL_EXT_PREFIX__VERSION_1_1_DEPRECATED CL_EXT_PREFIX_DEPRECATED
88#endif
Pablo Telloe86a09f2018-01-11 15:44:48 +000089
Sheri Zhang67354e02021-06-30 16:08:29 +010090#ifdef CL_USE_DEPRECATED_OPENCL_1_2_APIS
91 #define CL_EXT_SUFFIX__VERSION_1_2_DEPRECATED
92 #define CL_EXT_PREFIX__VERSION_1_2_DEPRECATED
93#else
94 #define CL_EXT_SUFFIX__VERSION_1_2_DEPRECATED CL_EXT_SUFFIX_DEPRECATED
95 #define CL_EXT_PREFIX__VERSION_1_2_DEPRECATED CL_EXT_PREFIX_DEPRECATED
96 #endif
Pablo Telloe86a09f2018-01-11 15:44:48 +000097
Sheri Zhang67354e02021-06-30 16:08:29 +010098#ifdef CL_USE_DEPRECATED_OPENCL_2_0_APIS
99 #define CL_EXT_SUFFIX__VERSION_2_0_DEPRECATED
100 #define CL_EXT_PREFIX__VERSION_2_0_DEPRECATED
101#else
102 #define CL_EXT_SUFFIX__VERSION_2_0_DEPRECATED CL_EXT_SUFFIX_DEPRECATED
103 #define CL_EXT_PREFIX__VERSION_2_0_DEPRECATED CL_EXT_PREFIX_DEPRECATED
104#endif
Pablo Telloe86a09f2018-01-11 15:44:48 +0000105
Sheri Zhang67354e02021-06-30 16:08:29 +0100106#ifdef CL_USE_DEPRECATED_OPENCL_2_1_APIS
107 #define CL_EXT_SUFFIX__VERSION_2_1_DEPRECATED
108 #define CL_EXT_PREFIX__VERSION_2_1_DEPRECATED
109#else
110 #define CL_EXT_SUFFIX__VERSION_2_1_DEPRECATED CL_EXT_SUFFIX_DEPRECATED
111 #define CL_EXT_PREFIX__VERSION_2_1_DEPRECATED CL_EXT_PREFIX_DEPRECATED
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100112#endif
113
Sheri Zhang79cb9452021-09-07 14:51:49 +0100114#ifdef CL_USE_DEPRECATED_OPENCL_2_2_APIS
115 #define CL_EXT_SUFFIX__VERSION_2_2_DEPRECATED
116 #define CL_EXT_PREFIX__VERSION_2_2_DEPRECATED
117#else
118 #define CL_EXT_SUFFIX__VERSION_2_2_DEPRECATED CL_EXT_SUFFIX_DEPRECATED
119 #define CL_EXT_PREFIX__VERSION_2_2_DEPRECATED CL_EXT_PREFIX_DEPRECATED
120#endif
121
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100122#if (defined (_WIN32) && defined(_MSC_VER))
123
124/* scalar types */
125typedef signed __int8 cl_char;
126typedef unsigned __int8 cl_uchar;
127typedef signed __int16 cl_short;
128typedef unsigned __int16 cl_ushort;
129typedef signed __int32 cl_int;
130typedef unsigned __int32 cl_uint;
131typedef signed __int64 cl_long;
132typedef unsigned __int64 cl_ulong;
133
134typedef unsigned __int16 cl_half;
135typedef float cl_float;
136typedef double cl_double;
137
138/* Macro names and corresponding values defined by OpenCL */
139#define CL_CHAR_BIT 8
140#define CL_SCHAR_MAX 127
141#define CL_SCHAR_MIN (-127-1)
142#define CL_CHAR_MAX CL_SCHAR_MAX
143#define CL_CHAR_MIN CL_SCHAR_MIN
144#define CL_UCHAR_MAX 255
145#define CL_SHRT_MAX 32767
146#define CL_SHRT_MIN (-32767-1)
147#define CL_USHRT_MAX 65535
148#define CL_INT_MAX 2147483647
149#define CL_INT_MIN (-2147483647-1)
150#define CL_UINT_MAX 0xffffffffU
151#define CL_LONG_MAX ((cl_long) 0x7FFFFFFFFFFFFFFFLL)
152#define CL_LONG_MIN ((cl_long) -0x7FFFFFFFFFFFFFFFLL - 1LL)
153#define CL_ULONG_MAX ((cl_ulong) 0xFFFFFFFFFFFFFFFFULL)
154
155#define CL_FLT_DIG 6
156#define CL_FLT_MANT_DIG 24
157#define CL_FLT_MAX_10_EXP +38
158#define CL_FLT_MAX_EXP +128
159#define CL_FLT_MIN_10_EXP -37
160#define CL_FLT_MIN_EXP -125
161#define CL_FLT_RADIX 2
162#define CL_FLT_MAX 340282346638528859811704183484516925440.0f
163#define CL_FLT_MIN 1.175494350822287507969e-38f
Pablo Telloe86a09f2018-01-11 15:44:48 +0000164#define CL_FLT_EPSILON 1.1920928955078125e-7f
165
166#define CL_HALF_DIG 3
167#define CL_HALF_MANT_DIG 11
168#define CL_HALF_MAX_10_EXP +4
169#define CL_HALF_MAX_EXP +16
170#define CL_HALF_MIN_10_EXP -4
171#define CL_HALF_MIN_EXP -13
172#define CL_HALF_RADIX 2
173#define CL_HALF_MAX 65504.0f
174#define CL_HALF_MIN 6.103515625e-05f
175#define CL_HALF_EPSILON 9.765625e-04f
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100176
177#define CL_DBL_DIG 15
178#define CL_DBL_MANT_DIG 53
179#define CL_DBL_MAX_10_EXP +308
180#define CL_DBL_MAX_EXP +1024
181#define CL_DBL_MIN_10_EXP -307
182#define CL_DBL_MIN_EXP -1021
183#define CL_DBL_RADIX 2
Pablo Telloe86a09f2018-01-11 15:44:48 +0000184#define CL_DBL_MAX 1.7976931348623158e+308
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100185#define CL_DBL_MIN 2.225073858507201383090e-308
186#define CL_DBL_EPSILON 2.220446049250313080847e-16
187
Pablo Telloe86a09f2018-01-11 15:44:48 +0000188#define CL_M_E 2.7182818284590452354
189#define CL_M_LOG2E 1.4426950408889634074
190#define CL_M_LOG10E 0.43429448190325182765
191#define CL_M_LN2 0.69314718055994530942
192#define CL_M_LN10 2.30258509299404568402
193#define CL_M_PI 3.14159265358979323846
194#define CL_M_PI_2 1.57079632679489661923
195#define CL_M_PI_4 0.78539816339744830962
196#define CL_M_1_PI 0.31830988618379067154
197#define CL_M_2_PI 0.63661977236758134308
198#define CL_M_2_SQRTPI 1.12837916709551257390
199#define CL_M_SQRT2 1.41421356237309504880
200#define CL_M_SQRT1_2 0.70710678118654752440
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100201
Pablo Telloe86a09f2018-01-11 15:44:48 +0000202#define CL_M_E_F 2.718281828f
203#define CL_M_LOG2E_F 1.442695041f
204#define CL_M_LOG10E_F 0.434294482f
205#define CL_M_LN2_F 0.693147181f
206#define CL_M_LN10_F 2.302585093f
207#define CL_M_PI_F 3.141592654f
208#define CL_M_PI_2_F 1.570796327f
209#define CL_M_PI_4_F 0.785398163f
210#define CL_M_1_PI_F 0.318309886f
211#define CL_M_2_PI_F 0.636619772f
212#define CL_M_2_SQRTPI_F 1.128379167f
213#define CL_M_SQRT2_F 1.414213562f
214#define CL_M_SQRT1_2_F 0.707106781f
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100215
216#define CL_NAN (CL_INFINITY - CL_INFINITY)
217#define CL_HUGE_VALF ((cl_float) 1e50)
218#define CL_HUGE_VAL ((cl_double) 1e500)
219#define CL_MAXFLOAT CL_FLT_MAX
220#define CL_INFINITY CL_HUGE_VALF
221
222#else
223
224#include <stdint.h>
225
226/* scalar types */
227typedef int8_t cl_char;
228typedef uint8_t cl_uchar;
Sheri Zhang67354e02021-06-30 16:08:29 +0100229typedef int16_t cl_short;
230typedef uint16_t cl_ushort;
231typedef int32_t cl_int;
232typedef uint32_t cl_uint;
233typedef int64_t cl_long;
234typedef uint64_t cl_ulong;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100235
Sheri Zhang67354e02021-06-30 16:08:29 +0100236typedef uint16_t cl_half;
237typedef float cl_float;
238typedef double cl_double;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100239
240/* Macro names and corresponding values defined by OpenCL */
241#define CL_CHAR_BIT 8
242#define CL_SCHAR_MAX 127
243#define CL_SCHAR_MIN (-127-1)
244#define CL_CHAR_MAX CL_SCHAR_MAX
245#define CL_CHAR_MIN CL_SCHAR_MIN
246#define CL_UCHAR_MAX 255
247#define CL_SHRT_MAX 32767
248#define CL_SHRT_MIN (-32767-1)
249#define CL_USHRT_MAX 65535
250#define CL_INT_MAX 2147483647
251#define CL_INT_MIN (-2147483647-1)
252#define CL_UINT_MAX 0xffffffffU
253#define CL_LONG_MAX ((cl_long) 0x7FFFFFFFFFFFFFFFLL)
254#define CL_LONG_MIN ((cl_long) -0x7FFFFFFFFFFFFFFFLL - 1LL)
255#define CL_ULONG_MAX ((cl_ulong) 0xFFFFFFFFFFFFFFFFULL)
256
257#define CL_FLT_DIG 6
258#define CL_FLT_MANT_DIG 24
259#define CL_FLT_MAX_10_EXP +38
260#define CL_FLT_MAX_EXP +128
261#define CL_FLT_MIN_10_EXP -37
262#define CL_FLT_MIN_EXP -125
263#define CL_FLT_RADIX 2
Pablo Telloe86a09f2018-01-11 15:44:48 +0000264#define CL_FLT_MAX 340282346638528859811704183484516925440.0f
265#define CL_FLT_MIN 1.175494350822287507969e-38f
266#define CL_FLT_EPSILON 1.1920928955078125e-7f
267
268#define CL_HALF_DIG 3
269#define CL_HALF_MANT_DIG 11
270#define CL_HALF_MAX_10_EXP +4
271#define CL_HALF_MAX_EXP +16
272#define CL_HALF_MIN_10_EXP -4
273#define CL_HALF_MIN_EXP -13
274#define CL_HALF_RADIX 2
275#define CL_HALF_MAX 65504.0f
276#define CL_HALF_MIN 6.103515625e-05f
277#define CL_HALF_EPSILON 9.765625e-04f
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100278
279#define CL_DBL_DIG 15
280#define CL_DBL_MANT_DIG 53
281#define CL_DBL_MAX_10_EXP +308
282#define CL_DBL_MAX_EXP +1024
283#define CL_DBL_MIN_10_EXP -307
284#define CL_DBL_MIN_EXP -1021
285#define CL_DBL_RADIX 2
Pablo Telloe86a09f2018-01-11 15:44:48 +0000286#define CL_DBL_MAX 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0
287#define CL_DBL_MIN 2.225073858507201383090e-308
288#define CL_DBL_EPSILON 2.220446049250313080847e-16
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100289
Pablo Telloe86a09f2018-01-11 15:44:48 +0000290#define CL_M_E 2.7182818284590452354
291#define CL_M_LOG2E 1.4426950408889634074
292#define CL_M_LOG10E 0.43429448190325182765
293#define CL_M_LN2 0.69314718055994530942
294#define CL_M_LN10 2.30258509299404568402
295#define CL_M_PI 3.14159265358979323846
296#define CL_M_PI_2 1.57079632679489661923
297#define CL_M_PI_4 0.78539816339744830962
298#define CL_M_1_PI 0.31830988618379067154
299#define CL_M_2_PI 0.63661977236758134308
300#define CL_M_2_SQRTPI 1.12837916709551257390
301#define CL_M_SQRT2 1.41421356237309504880
302#define CL_M_SQRT1_2 0.70710678118654752440
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100303
Pablo Telloe86a09f2018-01-11 15:44:48 +0000304#define CL_M_E_F 2.718281828f
305#define CL_M_LOG2E_F 1.442695041f
306#define CL_M_LOG10E_F 0.434294482f
307#define CL_M_LN2_F 0.693147181f
308#define CL_M_LN10_F 2.302585093f
309#define CL_M_PI_F 3.141592654f
310#define CL_M_PI_2_F 1.570796327f
311#define CL_M_PI_4_F 0.785398163f
312#define CL_M_1_PI_F 0.318309886f
313#define CL_M_2_PI_F 0.636619772f
314#define CL_M_2_SQRTPI_F 1.128379167f
315#define CL_M_SQRT2_F 1.414213562f
316#define CL_M_SQRT1_2_F 0.707106781f
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100317
318#if defined( __GNUC__ )
319 #define CL_HUGE_VALF __builtin_huge_valf()
320 #define CL_HUGE_VAL __builtin_huge_val()
321 #define CL_NAN __builtin_nanf( "" )
322#else
323 #define CL_HUGE_VALF ((cl_float) 1e50)
324 #define CL_HUGE_VAL ((cl_double) 1e500)
325 float nanf( const char * );
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100326 #define CL_NAN nanf( "" )
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100327#endif
328#define CL_MAXFLOAT CL_FLT_MAX
329#define CL_INFINITY CL_HUGE_VALF
330
331#endif
332
333#include <stddef.h>
334
335/* 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. */
336typedef unsigned int cl_GLuint;
337typedef int cl_GLint;
338typedef unsigned int cl_GLenum;
339
340/*
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100341 * Vector types
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100342 *
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100343 * Note: OpenCL requires that all types be naturally aligned.
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100344 * This means that vector types must be naturally aligned.
345 * For example, a vector of four floats must be aligned to
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100346 * a 16 byte boundary (calculated as 4 * the natural 4-byte
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100347 * alignment of the float). The alignment qualifiers here
348 * will only function properly if your compiler supports them
349 * and if you don't actively work to defeat them. For example,
350 * in order for a cl_float4 to be 16 byte aligned in a struct,
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100351 * the start of the struct must itself be 16-byte aligned.
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100352 *
353 * Maintaining proper alignment is the user's responsibility.
354 */
355
356/* Define basic vector types */
357#if defined( __VEC__ )
Sheri Zhang79cb9452021-09-07 14:51:49 +0100358 #if !defined(__clang__)
359 #include <altivec.h> /* may be omitted depending on compiler. AltiVec spec provides no way to detect whether the header is required. */
360 #endif
Sheri Zhang67354e02021-06-30 16:08:29 +0100361 typedef __vector unsigned char __cl_uchar16;
362 typedef __vector signed char __cl_char16;
363 typedef __vector unsigned short __cl_ushort8;
364 typedef __vector signed short __cl_short8;
365 typedef __vector unsigned int __cl_uint4;
366 typedef __vector signed int __cl_int4;
367 typedef __vector float __cl_float4;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100368 #define __CL_UCHAR16__ 1
369 #define __CL_CHAR16__ 1
370 #define __CL_USHORT8__ 1
371 #define __CL_SHORT8__ 1
372 #define __CL_UINT4__ 1
373 #define __CL_INT4__ 1
374 #define __CL_FLOAT4__ 1
375#endif
376
377#if defined( __SSE__ )
378 #if defined( __MINGW64__ )
379 #include <intrin.h>
380 #else
381 #include <xmmintrin.h>
382 #endif
383 #if defined( __GNUC__ )
384 typedef float __cl_float4 __attribute__((vector_size(16)));
385 #else
386 typedef __m128 __cl_float4;
387 #endif
388 #define __CL_FLOAT4__ 1
389#endif
390
391#if defined( __SSE2__ )
392 #if defined( __MINGW64__ )
393 #include <intrin.h>
394 #else
395 #include <emmintrin.h>
396 #endif
397 #if defined( __GNUC__ )
398 typedef cl_uchar __cl_uchar16 __attribute__((vector_size(16)));
399 typedef cl_char __cl_char16 __attribute__((vector_size(16)));
400 typedef cl_ushort __cl_ushort8 __attribute__((vector_size(16)));
401 typedef cl_short __cl_short8 __attribute__((vector_size(16)));
402 typedef cl_uint __cl_uint4 __attribute__((vector_size(16)));
403 typedef cl_int __cl_int4 __attribute__((vector_size(16)));
404 typedef cl_ulong __cl_ulong2 __attribute__((vector_size(16)));
405 typedef cl_long __cl_long2 __attribute__((vector_size(16)));
406 typedef cl_double __cl_double2 __attribute__((vector_size(16)));
407 #else
408 typedef __m128i __cl_uchar16;
409 typedef __m128i __cl_char16;
410 typedef __m128i __cl_ushort8;
411 typedef __m128i __cl_short8;
412 typedef __m128i __cl_uint4;
413 typedef __m128i __cl_int4;
414 typedef __m128i __cl_ulong2;
415 typedef __m128i __cl_long2;
416 typedef __m128d __cl_double2;
417 #endif
418 #define __CL_UCHAR16__ 1
419 #define __CL_CHAR16__ 1
420 #define __CL_USHORT8__ 1
421 #define __CL_SHORT8__ 1
422 #define __CL_INT4__ 1
423 #define __CL_UINT4__ 1
424 #define __CL_ULONG2__ 1
425 #define __CL_LONG2__ 1
426 #define __CL_DOUBLE2__ 1
427#endif
428
429#if defined( __MMX__ )
430 #include <mmintrin.h>
431 #if defined( __GNUC__ )
432 typedef cl_uchar __cl_uchar8 __attribute__((vector_size(8)));
433 typedef cl_char __cl_char8 __attribute__((vector_size(8)));
434 typedef cl_ushort __cl_ushort4 __attribute__((vector_size(8)));
435 typedef cl_short __cl_short4 __attribute__((vector_size(8)));
436 typedef cl_uint __cl_uint2 __attribute__((vector_size(8)));
437 typedef cl_int __cl_int2 __attribute__((vector_size(8)));
438 typedef cl_ulong __cl_ulong1 __attribute__((vector_size(8)));
439 typedef cl_long __cl_long1 __attribute__((vector_size(8)));
440 typedef cl_float __cl_float2 __attribute__((vector_size(8)));
441 #else
442 typedef __m64 __cl_uchar8;
443 typedef __m64 __cl_char8;
444 typedef __m64 __cl_ushort4;
445 typedef __m64 __cl_short4;
446 typedef __m64 __cl_uint2;
447 typedef __m64 __cl_int2;
448 typedef __m64 __cl_ulong1;
449 typedef __m64 __cl_long1;
450 typedef __m64 __cl_float2;
451 #endif
452 #define __CL_UCHAR8__ 1
453 #define __CL_CHAR8__ 1
454 #define __CL_USHORT4__ 1
455 #define __CL_SHORT4__ 1
456 #define __CL_INT2__ 1
457 #define __CL_UINT2__ 1
458 #define __CL_ULONG1__ 1
459 #define __CL_LONG1__ 1
460 #define __CL_FLOAT2__ 1
461#endif
462
463#if defined( __AVX__ )
464 #if defined( __MINGW64__ )
465 #include <intrin.h>
466 #else
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100467 #include <immintrin.h>
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100468 #endif
469 #if defined( __GNUC__ )
470 typedef cl_float __cl_float8 __attribute__((vector_size(32)));
471 typedef cl_double __cl_double4 __attribute__((vector_size(32)));
472 #else
473 typedef __m256 __cl_float8;
474 typedef __m256d __cl_double4;
475 #endif
476 #define __CL_FLOAT8__ 1
477 #define __CL_DOUBLE4__ 1
478#endif
479
Pablo Telloe86a09f2018-01-11 15:44:48 +0000480/* Define capabilities for anonymous struct members. */
481#if !defined(__cplusplus) && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
482#define __CL_HAS_ANON_STRUCT__ 1
483#define __CL_ANON_STRUCT__
484#elif defined( __GNUC__) && ! defined( __STRICT_ANSI__ )
485#define __CL_HAS_ANON_STRUCT__ 1
486#define __CL_ANON_STRUCT__ __extension__
Sheri Zhang79cb9452021-09-07 14:51:49 +0100487#elif defined( _WIN32) && defined(_MSC_VER) && ! defined(__STDC__)
Pablo Telloe86a09f2018-01-11 15:44:48 +0000488 #if _MSC_VER >= 1500
489 /* Microsoft Developer Studio 2008 supports anonymous structs, but
490 * complains by default. */
491 #define __CL_HAS_ANON_STRUCT__ 1
492 #define __CL_ANON_STRUCT__
493 /* Disable warning C4201: nonstandard extension used : nameless
494 * struct/union */
495 #pragma warning( push )
496 #pragma warning( disable : 4201 )
497 #endif
498#else
499#define __CL_HAS_ANON_STRUCT__ 0
500#define __CL_ANON_STRUCT__
501#endif
502
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100503/* Define alignment keys */
Sheri Zhang79cb9452021-09-07 14:51:49 +0100504#if defined( __GNUC__ ) || defined(__INTEGRITY)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100505 #define CL_ALIGNED(_x) __attribute__ ((aligned(_x)))
506#elif defined( _WIN32) && (_MSC_VER)
507 /* Alignment keys neutered on windows because MSVC can't swallow function arguments with alignment requirements */
508 /* http://msdn.microsoft.com/en-us/library/373ak2y1%28VS.71%29.aspx */
509 /* #include <crtdefs.h> */
510 /* #define CL_ALIGNED(_x) _CRT_ALIGN(_x) */
511 #define CL_ALIGNED(_x)
512#else
513 #warning Need to implement some method to align data here
514 #define CL_ALIGNED(_x)
515#endif
516
517/* Indicate whether .xyzw, .s0123 and .hi.lo are supported */
Pablo Telloe86a09f2018-01-11 15:44:48 +0000518#if __CL_HAS_ANON_STRUCT__
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100519 /* .xyzw and .s0123...{f|F} are supported */
520 #define CL_HAS_NAMED_VECTOR_FIELDS 1
521 /* .hi and .lo are supported */
522 #define CL_HAS_HI_LO_VECTOR_FIELDS 1
523#endif
524
525/* Define cl_vector types */
526
527/* ---- cl_charn ---- */
528typedef union
529{
530 cl_char CL_ALIGNED(2) s[2];
Pablo Telloe86a09f2018-01-11 15:44:48 +0000531#if __CL_HAS_ANON_STRUCT__
532 __CL_ANON_STRUCT__ struct{ cl_char x, y; };
533 __CL_ANON_STRUCT__ struct{ cl_char s0, s1; };
534 __CL_ANON_STRUCT__ struct{ cl_char lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100535#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100536#if defined( __CL_CHAR2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100537 __cl_char2 v2;
538#endif
539}cl_char2;
540
541typedef union
542{
543 cl_char CL_ALIGNED(4) s[4];
Pablo Telloe86a09f2018-01-11 15:44:48 +0000544#if __CL_HAS_ANON_STRUCT__
545 __CL_ANON_STRUCT__ struct{ cl_char x, y, z, w; };
546 __CL_ANON_STRUCT__ struct{ cl_char s0, s1, s2, s3; };
547 __CL_ANON_STRUCT__ struct{ cl_char2 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100548#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100549#if defined( __CL_CHAR2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100550 __cl_char2 v2[2];
551#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100552#if defined( __CL_CHAR4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100553 __cl_char4 v4;
554#endif
555}cl_char4;
556
557/* cl_char3 is identical in size, alignment and behavior to cl_char4. See section 6.1.5. */
558typedef cl_char4 cl_char3;
559
560typedef union
561{
562 cl_char CL_ALIGNED(8) s[8];
Pablo Telloe86a09f2018-01-11 15:44:48 +0000563#if __CL_HAS_ANON_STRUCT__
564 __CL_ANON_STRUCT__ struct{ cl_char x, y, z, w; };
565 __CL_ANON_STRUCT__ struct{ cl_char s0, s1, s2, s3, s4, s5, s6, s7; };
566 __CL_ANON_STRUCT__ struct{ cl_char4 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100567#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100568#if defined( __CL_CHAR2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100569 __cl_char2 v2[4];
570#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100571#if defined( __CL_CHAR4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100572 __cl_char4 v4[2];
573#endif
574#if defined( __CL_CHAR8__ )
575 __cl_char8 v8;
576#endif
577}cl_char8;
578
579typedef union
580{
581 cl_char CL_ALIGNED(16) s[16];
Pablo Telloe86a09f2018-01-11 15:44:48 +0000582#if __CL_HAS_ANON_STRUCT__
583 __CL_ANON_STRUCT__ struct{ cl_char x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
584 __CL_ANON_STRUCT__ struct{ cl_char s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
585 __CL_ANON_STRUCT__ struct{ cl_char8 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100586#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100587#if defined( __CL_CHAR2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100588 __cl_char2 v2[8];
589#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100590#if defined( __CL_CHAR4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100591 __cl_char4 v4[4];
592#endif
593#if defined( __CL_CHAR8__ )
594 __cl_char8 v8[2];
595#endif
596#if defined( __CL_CHAR16__ )
597 __cl_char16 v16;
598#endif
599}cl_char16;
600
601
602/* ---- cl_ucharn ---- */
603typedef union
604{
605 cl_uchar CL_ALIGNED(2) s[2];
Pablo Telloe86a09f2018-01-11 15:44:48 +0000606#if __CL_HAS_ANON_STRUCT__
607 __CL_ANON_STRUCT__ struct{ cl_uchar x, y; };
608 __CL_ANON_STRUCT__ struct{ cl_uchar s0, s1; };
609 __CL_ANON_STRUCT__ struct{ cl_uchar lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100610#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100611#if defined( __cl_uchar2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100612 __cl_uchar2 v2;
613#endif
614}cl_uchar2;
615
616typedef union
617{
618 cl_uchar CL_ALIGNED(4) s[4];
Pablo Telloe86a09f2018-01-11 15:44:48 +0000619#if __CL_HAS_ANON_STRUCT__
620 __CL_ANON_STRUCT__ struct{ cl_uchar x, y, z, w; };
621 __CL_ANON_STRUCT__ struct{ cl_uchar s0, s1, s2, s3; };
622 __CL_ANON_STRUCT__ struct{ cl_uchar2 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100623#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100624#if defined( __CL_UCHAR2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100625 __cl_uchar2 v2[2];
626#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100627#if defined( __CL_UCHAR4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100628 __cl_uchar4 v4;
629#endif
630}cl_uchar4;
631
632/* cl_uchar3 is identical in size, alignment and behavior to cl_uchar4. See section 6.1.5. */
633typedef cl_uchar4 cl_uchar3;
634
635typedef union
636{
637 cl_uchar CL_ALIGNED(8) s[8];
Pablo Telloe86a09f2018-01-11 15:44:48 +0000638#if __CL_HAS_ANON_STRUCT__
639 __CL_ANON_STRUCT__ struct{ cl_uchar x, y, z, w; };
640 __CL_ANON_STRUCT__ struct{ cl_uchar s0, s1, s2, s3, s4, s5, s6, s7; };
641 __CL_ANON_STRUCT__ struct{ cl_uchar4 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100642#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100643#if defined( __CL_UCHAR2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100644 __cl_uchar2 v2[4];
645#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100646#if defined( __CL_UCHAR4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100647 __cl_uchar4 v4[2];
648#endif
649#if defined( __CL_UCHAR8__ )
650 __cl_uchar8 v8;
651#endif
652}cl_uchar8;
653
654typedef union
655{
656 cl_uchar CL_ALIGNED(16) s[16];
Pablo Telloe86a09f2018-01-11 15:44:48 +0000657#if __CL_HAS_ANON_STRUCT__
658 __CL_ANON_STRUCT__ struct{ cl_uchar x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
659 __CL_ANON_STRUCT__ struct{ cl_uchar s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
660 __CL_ANON_STRUCT__ struct{ cl_uchar8 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100661#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100662#if defined( __CL_UCHAR2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100663 __cl_uchar2 v2[8];
664#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100665#if defined( __CL_UCHAR4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100666 __cl_uchar4 v4[4];
667#endif
668#if defined( __CL_UCHAR8__ )
669 __cl_uchar8 v8[2];
670#endif
671#if defined( __CL_UCHAR16__ )
672 __cl_uchar16 v16;
673#endif
674}cl_uchar16;
675
676
677/* ---- cl_shortn ---- */
678typedef union
679{
680 cl_short CL_ALIGNED(4) s[2];
Pablo Telloe86a09f2018-01-11 15:44:48 +0000681#if __CL_HAS_ANON_STRUCT__
682 __CL_ANON_STRUCT__ struct{ cl_short x, y; };
683 __CL_ANON_STRUCT__ struct{ cl_short s0, s1; };
684 __CL_ANON_STRUCT__ struct{ cl_short lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100685#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100686#if defined( __CL_SHORT2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100687 __cl_short2 v2;
688#endif
689}cl_short2;
690
691typedef union
692{
693 cl_short CL_ALIGNED(8) s[4];
Pablo Telloe86a09f2018-01-11 15:44:48 +0000694#if __CL_HAS_ANON_STRUCT__
695 __CL_ANON_STRUCT__ struct{ cl_short x, y, z, w; };
696 __CL_ANON_STRUCT__ struct{ cl_short s0, s1, s2, s3; };
697 __CL_ANON_STRUCT__ struct{ cl_short2 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100698#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100699#if defined( __CL_SHORT2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100700 __cl_short2 v2[2];
701#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100702#if defined( __CL_SHORT4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100703 __cl_short4 v4;
704#endif
705}cl_short4;
706
707/* cl_short3 is identical in size, alignment and behavior to cl_short4. See section 6.1.5. */
708typedef cl_short4 cl_short3;
709
710typedef union
711{
712 cl_short CL_ALIGNED(16) s[8];
Pablo Telloe86a09f2018-01-11 15:44:48 +0000713#if __CL_HAS_ANON_STRUCT__
714 __CL_ANON_STRUCT__ struct{ cl_short x, y, z, w; };
715 __CL_ANON_STRUCT__ struct{ cl_short s0, s1, s2, s3, s4, s5, s6, s7; };
716 __CL_ANON_STRUCT__ struct{ cl_short4 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100717#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100718#if defined( __CL_SHORT2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100719 __cl_short2 v2[4];
720#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100721#if defined( __CL_SHORT4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100722 __cl_short4 v4[2];
723#endif
724#if defined( __CL_SHORT8__ )
725 __cl_short8 v8;
726#endif
727}cl_short8;
728
729typedef union
730{
731 cl_short CL_ALIGNED(32) s[16];
Pablo Telloe86a09f2018-01-11 15:44:48 +0000732#if __CL_HAS_ANON_STRUCT__
733 __CL_ANON_STRUCT__ struct{ cl_short x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
734 __CL_ANON_STRUCT__ struct{ cl_short s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
735 __CL_ANON_STRUCT__ struct{ cl_short8 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100736#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100737#if defined( __CL_SHORT2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100738 __cl_short2 v2[8];
739#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100740#if defined( __CL_SHORT4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100741 __cl_short4 v4[4];
742#endif
743#if defined( __CL_SHORT8__ )
744 __cl_short8 v8[2];
745#endif
746#if defined( __CL_SHORT16__ )
747 __cl_short16 v16;
748#endif
749}cl_short16;
750
751
752/* ---- cl_ushortn ---- */
753typedef union
754{
755 cl_ushort CL_ALIGNED(4) s[2];
Pablo Telloe86a09f2018-01-11 15:44:48 +0000756#if __CL_HAS_ANON_STRUCT__
757 __CL_ANON_STRUCT__ struct{ cl_ushort x, y; };
758 __CL_ANON_STRUCT__ struct{ cl_ushort s0, s1; };
759 __CL_ANON_STRUCT__ struct{ cl_ushort lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100760#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100761#if defined( __CL_USHORT2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100762 __cl_ushort2 v2;
763#endif
764}cl_ushort2;
765
766typedef union
767{
768 cl_ushort CL_ALIGNED(8) s[4];
Pablo Telloe86a09f2018-01-11 15:44:48 +0000769#if __CL_HAS_ANON_STRUCT__
770 __CL_ANON_STRUCT__ struct{ cl_ushort x, y, z, w; };
771 __CL_ANON_STRUCT__ struct{ cl_ushort s0, s1, s2, s3; };
772 __CL_ANON_STRUCT__ struct{ cl_ushort2 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100773#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100774#if defined( __CL_USHORT2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100775 __cl_ushort2 v2[2];
776#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100777#if defined( __CL_USHORT4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100778 __cl_ushort4 v4;
779#endif
780}cl_ushort4;
781
782/* cl_ushort3 is identical in size, alignment and behavior to cl_ushort4. See section 6.1.5. */
783typedef cl_ushort4 cl_ushort3;
784
785typedef union
786{
787 cl_ushort CL_ALIGNED(16) s[8];
Pablo Telloe86a09f2018-01-11 15:44:48 +0000788#if __CL_HAS_ANON_STRUCT__
789 __CL_ANON_STRUCT__ struct{ cl_ushort x, y, z, w; };
790 __CL_ANON_STRUCT__ struct{ cl_ushort s0, s1, s2, s3, s4, s5, s6, s7; };
791 __CL_ANON_STRUCT__ struct{ cl_ushort4 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100792#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100793#if defined( __CL_USHORT2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100794 __cl_ushort2 v2[4];
795#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100796#if defined( __CL_USHORT4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100797 __cl_ushort4 v4[2];
798#endif
799#if defined( __CL_USHORT8__ )
800 __cl_ushort8 v8;
801#endif
802}cl_ushort8;
803
804typedef union
805{
806 cl_ushort CL_ALIGNED(32) s[16];
Pablo Telloe86a09f2018-01-11 15:44:48 +0000807#if __CL_HAS_ANON_STRUCT__
808 __CL_ANON_STRUCT__ struct{ cl_ushort x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
809 __CL_ANON_STRUCT__ struct{ cl_ushort s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
810 __CL_ANON_STRUCT__ struct{ cl_ushort8 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100811#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100812#if defined( __CL_USHORT2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100813 __cl_ushort2 v2[8];
814#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100815#if defined( __CL_USHORT4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100816 __cl_ushort4 v4[4];
817#endif
818#if defined( __CL_USHORT8__ )
819 __cl_ushort8 v8[2];
820#endif
821#if defined( __CL_USHORT16__ )
822 __cl_ushort16 v16;
823#endif
824}cl_ushort16;
825
Pablo Telloe86a09f2018-01-11 15:44:48 +0000826
827/* ---- cl_halfn ---- */
828typedef union
829{
830 cl_half CL_ALIGNED(4) s[2];
831#if __CL_HAS_ANON_STRUCT__
832 __CL_ANON_STRUCT__ struct{ cl_half x, y; };
833 __CL_ANON_STRUCT__ struct{ cl_half s0, s1; };
834 __CL_ANON_STRUCT__ struct{ cl_half lo, hi; };
835#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100836#if defined( __CL_HALF2__)
Pablo Telloe86a09f2018-01-11 15:44:48 +0000837 __cl_half2 v2;
838#endif
839}cl_half2;
840
841typedef union
842{
843 cl_half CL_ALIGNED(8) s[4];
844#if __CL_HAS_ANON_STRUCT__
845 __CL_ANON_STRUCT__ struct{ cl_half x, y, z, w; };
846 __CL_ANON_STRUCT__ struct{ cl_half s0, s1, s2, s3; };
847 __CL_ANON_STRUCT__ struct{ cl_half2 lo, hi; };
848#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100849#if defined( __CL_HALF2__)
Pablo Telloe86a09f2018-01-11 15:44:48 +0000850 __cl_half2 v2[2];
851#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100852#if defined( __CL_HALF4__)
Pablo Telloe86a09f2018-01-11 15:44:48 +0000853 __cl_half4 v4;
854#endif
855}cl_half4;
856
857/* cl_half3 is identical in size, alignment and behavior to cl_half4. See section 6.1.5. */
858typedef cl_half4 cl_half3;
859
860typedef union
861{
862 cl_half CL_ALIGNED(16) s[8];
863#if __CL_HAS_ANON_STRUCT__
864 __CL_ANON_STRUCT__ struct{ cl_half x, y, z, w; };
865 __CL_ANON_STRUCT__ struct{ cl_half s0, s1, s2, s3, s4, s5, s6, s7; };
866 __CL_ANON_STRUCT__ struct{ cl_half4 lo, hi; };
867#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100868#if defined( __CL_HALF2__)
Pablo Telloe86a09f2018-01-11 15:44:48 +0000869 __cl_half2 v2[4];
870#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100871#if defined( __CL_HALF4__)
Pablo Telloe86a09f2018-01-11 15:44:48 +0000872 __cl_half4 v4[2];
873#endif
874#if defined( __CL_HALF8__ )
875 __cl_half8 v8;
876#endif
877}cl_half8;
878
879typedef union
880{
881 cl_half CL_ALIGNED(32) s[16];
882#if __CL_HAS_ANON_STRUCT__
883 __CL_ANON_STRUCT__ struct{ cl_half x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
884 __CL_ANON_STRUCT__ struct{ cl_half s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
885 __CL_ANON_STRUCT__ struct{ cl_half8 lo, hi; };
886#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100887#if defined( __CL_HALF2__)
Pablo Telloe86a09f2018-01-11 15:44:48 +0000888 __cl_half2 v2[8];
889#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100890#if defined( __CL_HALF4__)
Pablo Telloe86a09f2018-01-11 15:44:48 +0000891 __cl_half4 v4[4];
892#endif
893#if defined( __CL_HALF8__ )
894 __cl_half8 v8[2];
895#endif
896#if defined( __CL_HALF16__ )
897 __cl_half16 v16;
898#endif
899}cl_half16;
900
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100901/* ---- cl_intn ---- */
902typedef union
903{
904 cl_int CL_ALIGNED(8) s[2];
Pablo Telloe86a09f2018-01-11 15:44:48 +0000905#if __CL_HAS_ANON_STRUCT__
906 __CL_ANON_STRUCT__ struct{ cl_int x, y; };
907 __CL_ANON_STRUCT__ struct{ cl_int s0, s1; };
908 __CL_ANON_STRUCT__ struct{ cl_int lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100909#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100910#if defined( __CL_INT2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100911 __cl_int2 v2;
912#endif
913}cl_int2;
914
915typedef union
916{
917 cl_int CL_ALIGNED(16) s[4];
Pablo Telloe86a09f2018-01-11 15:44:48 +0000918#if __CL_HAS_ANON_STRUCT__
919 __CL_ANON_STRUCT__ struct{ cl_int x, y, z, w; };
920 __CL_ANON_STRUCT__ struct{ cl_int s0, s1, s2, s3; };
921 __CL_ANON_STRUCT__ struct{ cl_int2 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100922#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100923#if defined( __CL_INT2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100924 __cl_int2 v2[2];
925#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100926#if defined( __CL_INT4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100927 __cl_int4 v4;
928#endif
929}cl_int4;
930
931/* cl_int3 is identical in size, alignment and behavior to cl_int4. See section 6.1.5. */
932typedef cl_int4 cl_int3;
933
934typedef union
935{
936 cl_int CL_ALIGNED(32) s[8];
Pablo Telloe86a09f2018-01-11 15:44:48 +0000937#if __CL_HAS_ANON_STRUCT__
938 __CL_ANON_STRUCT__ struct{ cl_int x, y, z, w; };
939 __CL_ANON_STRUCT__ struct{ cl_int s0, s1, s2, s3, s4, s5, s6, s7; };
940 __CL_ANON_STRUCT__ struct{ cl_int4 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100941#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100942#if defined( __CL_INT2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100943 __cl_int2 v2[4];
944#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100945#if defined( __CL_INT4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100946 __cl_int4 v4[2];
947#endif
948#if defined( __CL_INT8__ )
949 __cl_int8 v8;
950#endif
951}cl_int8;
952
953typedef union
954{
955 cl_int CL_ALIGNED(64) s[16];
Pablo Telloe86a09f2018-01-11 15:44:48 +0000956#if __CL_HAS_ANON_STRUCT__
957 __CL_ANON_STRUCT__ struct{ cl_int x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
958 __CL_ANON_STRUCT__ struct{ cl_int s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
959 __CL_ANON_STRUCT__ struct{ cl_int8 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100960#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100961#if defined( __CL_INT2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100962 __cl_int2 v2[8];
963#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100964#if defined( __CL_INT4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100965 __cl_int4 v4[4];
966#endif
967#if defined( __CL_INT8__ )
968 __cl_int8 v8[2];
969#endif
970#if defined( __CL_INT16__ )
971 __cl_int16 v16;
972#endif
973}cl_int16;
974
975
976/* ---- cl_uintn ---- */
977typedef union
978{
979 cl_uint CL_ALIGNED(8) s[2];
Pablo Telloe86a09f2018-01-11 15:44:48 +0000980#if __CL_HAS_ANON_STRUCT__
981 __CL_ANON_STRUCT__ struct{ cl_uint x, y; };
982 __CL_ANON_STRUCT__ struct{ cl_uint s0, s1; };
983 __CL_ANON_STRUCT__ struct{ cl_uint lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100984#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100985#if defined( __CL_UINT2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100986 __cl_uint2 v2;
987#endif
988}cl_uint2;
989
990typedef union
991{
992 cl_uint CL_ALIGNED(16) s[4];
Pablo Telloe86a09f2018-01-11 15:44:48 +0000993#if __CL_HAS_ANON_STRUCT__
994 __CL_ANON_STRUCT__ struct{ cl_uint x, y, z, w; };
995 __CL_ANON_STRUCT__ struct{ cl_uint s0, s1, s2, s3; };
996 __CL_ANON_STRUCT__ struct{ cl_uint2 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100997#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +0100998#if defined( __CL_UINT2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100999 __cl_uint2 v2[2];
1000#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001001#if defined( __CL_UINT4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001002 __cl_uint4 v4;
1003#endif
1004}cl_uint4;
1005
1006/* cl_uint3 is identical in size, alignment and behavior to cl_uint4. See section 6.1.5. */
1007typedef cl_uint4 cl_uint3;
1008
1009typedef union
1010{
1011 cl_uint CL_ALIGNED(32) s[8];
Pablo Telloe86a09f2018-01-11 15:44:48 +00001012#if __CL_HAS_ANON_STRUCT__
1013 __CL_ANON_STRUCT__ struct{ cl_uint x, y, z, w; };
1014 __CL_ANON_STRUCT__ struct{ cl_uint s0, s1, s2, s3, s4, s5, s6, s7; };
1015 __CL_ANON_STRUCT__ struct{ cl_uint4 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001016#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001017#if defined( __CL_UINT2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001018 __cl_uint2 v2[4];
1019#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001020#if defined( __CL_UINT4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001021 __cl_uint4 v4[2];
1022#endif
1023#if defined( __CL_UINT8__ )
1024 __cl_uint8 v8;
1025#endif
1026}cl_uint8;
1027
1028typedef union
1029{
1030 cl_uint CL_ALIGNED(64) s[16];
Pablo Telloe86a09f2018-01-11 15:44:48 +00001031#if __CL_HAS_ANON_STRUCT__
1032 __CL_ANON_STRUCT__ struct{ cl_uint x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
1033 __CL_ANON_STRUCT__ struct{ cl_uint s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
1034 __CL_ANON_STRUCT__ struct{ cl_uint8 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001035#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001036#if defined( __CL_UINT2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001037 __cl_uint2 v2[8];
1038#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001039#if defined( __CL_UINT4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001040 __cl_uint4 v4[4];
1041#endif
1042#if defined( __CL_UINT8__ )
1043 __cl_uint8 v8[2];
1044#endif
1045#if defined( __CL_UINT16__ )
1046 __cl_uint16 v16;
1047#endif
1048}cl_uint16;
1049
1050/* ---- cl_longn ---- */
1051typedef union
1052{
1053 cl_long CL_ALIGNED(16) s[2];
Pablo Telloe86a09f2018-01-11 15:44:48 +00001054#if __CL_HAS_ANON_STRUCT__
1055 __CL_ANON_STRUCT__ struct{ cl_long x, y; };
1056 __CL_ANON_STRUCT__ struct{ cl_long s0, s1; };
1057 __CL_ANON_STRUCT__ struct{ cl_long lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001058#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001059#if defined( __CL_LONG2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001060 __cl_long2 v2;
1061#endif
1062}cl_long2;
1063
1064typedef union
1065{
1066 cl_long CL_ALIGNED(32) s[4];
Pablo Telloe86a09f2018-01-11 15:44:48 +00001067#if __CL_HAS_ANON_STRUCT__
1068 __CL_ANON_STRUCT__ struct{ cl_long x, y, z, w; };
1069 __CL_ANON_STRUCT__ struct{ cl_long s0, s1, s2, s3; };
1070 __CL_ANON_STRUCT__ struct{ cl_long2 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001071#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001072#if defined( __CL_LONG2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001073 __cl_long2 v2[2];
1074#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001075#if defined( __CL_LONG4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001076 __cl_long4 v4;
1077#endif
1078}cl_long4;
1079
1080/* cl_long3 is identical in size, alignment and behavior to cl_long4. See section 6.1.5. */
1081typedef cl_long4 cl_long3;
1082
1083typedef union
1084{
1085 cl_long CL_ALIGNED(64) s[8];
Pablo Telloe86a09f2018-01-11 15:44:48 +00001086#if __CL_HAS_ANON_STRUCT__
1087 __CL_ANON_STRUCT__ struct{ cl_long x, y, z, w; };
1088 __CL_ANON_STRUCT__ struct{ cl_long s0, s1, s2, s3, s4, s5, s6, s7; };
1089 __CL_ANON_STRUCT__ struct{ cl_long4 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001090#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001091#if defined( __CL_LONG2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001092 __cl_long2 v2[4];
1093#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001094#if defined( __CL_LONG4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001095 __cl_long4 v4[2];
1096#endif
1097#if defined( __CL_LONG8__ )
1098 __cl_long8 v8;
1099#endif
1100}cl_long8;
1101
1102typedef union
1103{
1104 cl_long CL_ALIGNED(128) s[16];
Pablo Telloe86a09f2018-01-11 15:44:48 +00001105#if __CL_HAS_ANON_STRUCT__
1106 __CL_ANON_STRUCT__ struct{ cl_long x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
1107 __CL_ANON_STRUCT__ struct{ cl_long s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
1108 __CL_ANON_STRUCT__ struct{ cl_long8 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001109#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001110#if defined( __CL_LONG2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001111 __cl_long2 v2[8];
1112#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001113#if defined( __CL_LONG4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001114 __cl_long4 v4[4];
1115#endif
1116#if defined( __CL_LONG8__ )
1117 __cl_long8 v8[2];
1118#endif
1119#if defined( __CL_LONG16__ )
1120 __cl_long16 v16;
1121#endif
1122}cl_long16;
1123
1124
1125/* ---- cl_ulongn ---- */
1126typedef union
1127{
1128 cl_ulong CL_ALIGNED(16) s[2];
Pablo Telloe86a09f2018-01-11 15:44:48 +00001129#if __CL_HAS_ANON_STRUCT__
1130 __CL_ANON_STRUCT__ struct{ cl_ulong x, y; };
1131 __CL_ANON_STRUCT__ struct{ cl_ulong s0, s1; };
1132 __CL_ANON_STRUCT__ struct{ cl_ulong lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001133#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001134#if defined( __CL_ULONG2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001135 __cl_ulong2 v2;
1136#endif
1137}cl_ulong2;
1138
1139typedef union
1140{
1141 cl_ulong CL_ALIGNED(32) s[4];
Pablo Telloe86a09f2018-01-11 15:44:48 +00001142#if __CL_HAS_ANON_STRUCT__
1143 __CL_ANON_STRUCT__ struct{ cl_ulong x, y, z, w; };
1144 __CL_ANON_STRUCT__ struct{ cl_ulong s0, s1, s2, s3; };
1145 __CL_ANON_STRUCT__ struct{ cl_ulong2 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001146#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001147#if defined( __CL_ULONG2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001148 __cl_ulong2 v2[2];
1149#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001150#if defined( __CL_ULONG4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001151 __cl_ulong4 v4;
1152#endif
1153}cl_ulong4;
1154
1155/* cl_ulong3 is identical in size, alignment and behavior to cl_ulong4. See section 6.1.5. */
1156typedef cl_ulong4 cl_ulong3;
1157
1158typedef union
1159{
1160 cl_ulong CL_ALIGNED(64) s[8];
Pablo Telloe86a09f2018-01-11 15:44:48 +00001161#if __CL_HAS_ANON_STRUCT__
1162 __CL_ANON_STRUCT__ struct{ cl_ulong x, y, z, w; };
1163 __CL_ANON_STRUCT__ struct{ cl_ulong s0, s1, s2, s3, s4, s5, s6, s7; };
1164 __CL_ANON_STRUCT__ struct{ cl_ulong4 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001165#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001166#if defined( __CL_ULONG2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001167 __cl_ulong2 v2[4];
1168#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001169#if defined( __CL_ULONG4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001170 __cl_ulong4 v4[2];
1171#endif
1172#if defined( __CL_ULONG8__ )
1173 __cl_ulong8 v8;
1174#endif
1175}cl_ulong8;
1176
1177typedef union
1178{
1179 cl_ulong CL_ALIGNED(128) s[16];
Pablo Telloe86a09f2018-01-11 15:44:48 +00001180#if __CL_HAS_ANON_STRUCT__
1181 __CL_ANON_STRUCT__ struct{ cl_ulong x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
1182 __CL_ANON_STRUCT__ struct{ cl_ulong s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
1183 __CL_ANON_STRUCT__ struct{ cl_ulong8 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001184#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001185#if defined( __CL_ULONG2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001186 __cl_ulong2 v2[8];
1187#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001188#if defined( __CL_ULONG4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001189 __cl_ulong4 v4[4];
1190#endif
1191#if defined( __CL_ULONG8__ )
1192 __cl_ulong8 v8[2];
1193#endif
1194#if defined( __CL_ULONG16__ )
1195 __cl_ulong16 v16;
1196#endif
1197}cl_ulong16;
1198
1199
1200/* --- cl_floatn ---- */
1201
1202typedef union
1203{
1204 cl_float CL_ALIGNED(8) s[2];
Pablo Telloe86a09f2018-01-11 15:44:48 +00001205#if __CL_HAS_ANON_STRUCT__
1206 __CL_ANON_STRUCT__ struct{ cl_float x, y; };
1207 __CL_ANON_STRUCT__ struct{ cl_float s0, s1; };
1208 __CL_ANON_STRUCT__ struct{ cl_float lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001209#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001210#if defined( __CL_FLOAT2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001211 __cl_float2 v2;
1212#endif
1213}cl_float2;
1214
1215typedef union
1216{
1217 cl_float CL_ALIGNED(16) s[4];
Pablo Telloe86a09f2018-01-11 15:44:48 +00001218#if __CL_HAS_ANON_STRUCT__
1219 __CL_ANON_STRUCT__ struct{ cl_float x, y, z, w; };
1220 __CL_ANON_STRUCT__ struct{ cl_float s0, s1, s2, s3; };
1221 __CL_ANON_STRUCT__ struct{ cl_float2 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001222#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001223#if defined( __CL_FLOAT2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001224 __cl_float2 v2[2];
1225#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001226#if defined( __CL_FLOAT4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001227 __cl_float4 v4;
1228#endif
1229}cl_float4;
1230
1231/* cl_float3 is identical in size, alignment and behavior to cl_float4. See section 6.1.5. */
1232typedef cl_float4 cl_float3;
1233
1234typedef union
1235{
1236 cl_float CL_ALIGNED(32) s[8];
Pablo Telloe86a09f2018-01-11 15:44:48 +00001237#if __CL_HAS_ANON_STRUCT__
1238 __CL_ANON_STRUCT__ struct{ cl_float x, y, z, w; };
1239 __CL_ANON_STRUCT__ struct{ cl_float s0, s1, s2, s3, s4, s5, s6, s7; };
1240 __CL_ANON_STRUCT__ struct{ cl_float4 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001241#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001242#if defined( __CL_FLOAT2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001243 __cl_float2 v2[4];
1244#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001245#if defined( __CL_FLOAT4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001246 __cl_float4 v4[2];
1247#endif
1248#if defined( __CL_FLOAT8__ )
1249 __cl_float8 v8;
1250#endif
1251}cl_float8;
1252
1253typedef union
1254{
1255 cl_float CL_ALIGNED(64) s[16];
Pablo Telloe86a09f2018-01-11 15:44:48 +00001256#if __CL_HAS_ANON_STRUCT__
1257 __CL_ANON_STRUCT__ struct{ cl_float x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
1258 __CL_ANON_STRUCT__ struct{ cl_float s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
1259 __CL_ANON_STRUCT__ struct{ cl_float8 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001260#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001261#if defined( __CL_FLOAT2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001262 __cl_float2 v2[8];
1263#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001264#if defined( __CL_FLOAT4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001265 __cl_float4 v4[4];
1266#endif
1267#if defined( __CL_FLOAT8__ )
1268 __cl_float8 v8[2];
1269#endif
1270#if defined( __CL_FLOAT16__ )
1271 __cl_float16 v16;
1272#endif
1273}cl_float16;
1274
1275/* --- cl_doublen ---- */
1276
1277typedef union
1278{
1279 cl_double CL_ALIGNED(16) s[2];
Pablo Telloe86a09f2018-01-11 15:44:48 +00001280#if __CL_HAS_ANON_STRUCT__
1281 __CL_ANON_STRUCT__ struct{ cl_double x, y; };
1282 __CL_ANON_STRUCT__ struct{ cl_double s0, s1; };
1283 __CL_ANON_STRUCT__ struct{ cl_double lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001284#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001285#if defined( __CL_DOUBLE2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001286 __cl_double2 v2;
1287#endif
1288}cl_double2;
1289
1290typedef union
1291{
1292 cl_double CL_ALIGNED(32) s[4];
Pablo Telloe86a09f2018-01-11 15:44:48 +00001293#if __CL_HAS_ANON_STRUCT__
1294 __CL_ANON_STRUCT__ struct{ cl_double x, y, z, w; };
1295 __CL_ANON_STRUCT__ struct{ cl_double s0, s1, s2, s3; };
1296 __CL_ANON_STRUCT__ struct{ cl_double2 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001297#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001298#if defined( __CL_DOUBLE2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001299 __cl_double2 v2[2];
1300#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001301#if defined( __CL_DOUBLE4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001302 __cl_double4 v4;
1303#endif
1304}cl_double4;
1305
1306/* cl_double3 is identical in size, alignment and behavior to cl_double4. See section 6.1.5. */
1307typedef cl_double4 cl_double3;
1308
1309typedef union
1310{
1311 cl_double CL_ALIGNED(64) s[8];
Pablo Telloe86a09f2018-01-11 15:44:48 +00001312#if __CL_HAS_ANON_STRUCT__
1313 __CL_ANON_STRUCT__ struct{ cl_double x, y, z, w; };
1314 __CL_ANON_STRUCT__ struct{ cl_double s0, s1, s2, s3, s4, s5, s6, s7; };
1315 __CL_ANON_STRUCT__ struct{ cl_double4 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001316#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001317#if defined( __CL_DOUBLE2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001318 __cl_double2 v2[4];
1319#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001320#if defined( __CL_DOUBLE4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001321 __cl_double4 v4[2];
1322#endif
1323#if defined( __CL_DOUBLE8__ )
1324 __cl_double8 v8;
1325#endif
1326}cl_double8;
1327
1328typedef union
1329{
1330 cl_double CL_ALIGNED(128) s[16];
Pablo Telloe86a09f2018-01-11 15:44:48 +00001331#if __CL_HAS_ANON_STRUCT__
1332 __CL_ANON_STRUCT__ struct{ cl_double x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; };
1333 __CL_ANON_STRUCT__ struct{ cl_double s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; };
1334 __CL_ANON_STRUCT__ struct{ cl_double8 lo, hi; };
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001335#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001336#if defined( __CL_DOUBLE2__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001337 __cl_double2 v2[8];
1338#endif
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001339#if defined( __CL_DOUBLE4__)
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001340 __cl_double4 v4[4];
1341#endif
1342#if defined( __CL_DOUBLE8__ )
1343 __cl_double8 v8[2];
1344#endif
1345#if defined( __CL_DOUBLE16__ )
1346 __cl_double16 v16;
1347#endif
1348}cl_double16;
1349
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001350/* Macro to facilitate debugging
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001351 * Usage:
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001352 * Place CL_PROGRAM_STRING_DEBUG_INFO on the line before the first line of your source.
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001353 * The first line ends with: CL_PROGRAM_STRING_DEBUG_INFO \"
1354 * Each line thereafter of OpenCL C source must end with: \n\
1355 * The last line ends in ";
1356 *
1357 * Example:
1358 *
1359 * const char *my_program = CL_PROGRAM_STRING_DEBUG_INFO "\
1360 * kernel void foo( int a, float * b ) \n\
1361 * { \n\
1362 * // my comment \n\
1363 * *b[ get_global_id(0)] = a; \n\
1364 * } \n\
1365 * ";
1366 *
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001367 * This should correctly set up the line, (column) and file information for your source
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001368 * string so you can do source level debugging.
1369 */
1370#define __CL_STRINGIFY( _x ) # _x
1371#define _CL_STRINGIFY( _x ) __CL_STRINGIFY( _x )
Anthony Barbier8b2fdc92018-08-09 11:42:38 +01001372#define CL_PROGRAM_STRING_DEBUG_INFO "#line " _CL_STRINGIFY(__LINE__) " \"" __FILE__ "\" \n\n"
1373
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001374#ifdef __cplusplus
1375}
1376#endif
1377
Sheri Zhang79cb9452021-09-07 14:51:49 +01001378#if defined( _WIN32) && defined(_MSC_VER) && ! defined(__STDC__)
Pablo Telloe86a09f2018-01-11 15:44:48 +00001379 #if _MSC_VER >=1500
1380 #pragma warning( pop )
1381 #endif
1382#endif
1383
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001384#endif /* __CL_PLATFORM_H */