42 #define KMP_FTN_PLAIN 1
43 #define KMP_FTN_APPEND 2
44 #define KMP_FTN_UPPER 3
50 #define KMP_PTR_SKIP (sizeof(void*))
57 #define KMP_MEM_CONS_VOLATILE 0
58 #define KMP_MEM_CONS_FENCE 1
60 #ifndef KMP_MEM_CONS_MODEL
61 # define KMP_MEM_CONS_MODEL KMP_MEM_CONS_VOLATILE
66 #define KMP_OS_LINUX 0
67 #define KMP_OS_DARWIN 0
68 #define KMP_OS_WINDOWS 0
71 #define KMP_ARCH_X86 0
72 #define KMP_ARCH_X86_64 0
75 # undef KMP_OS_WINDOWS
76 # define KMP_OS_WINDOWS 1
79 #if ( defined __APPLE__ && defined __MACH__ )
81 # define KMP_OS_DARWIN 1
84 #if ( defined __linux )
86 # define KMP_OS_LINUX 1
89 #if (1 != KMP_OS_LINUX + KMP_OS_DARWIN + KMP_OS_WINDOWS)
93 #if KMP_OS_LINUX || KMP_OS_DARWIN
95 # define KMP_OS_UNIX 1
100 # undef KMP_ARCH_X86_64
101 # define KMP_ARCH_X86_64 1
104 # define KMP_ARCH_X86 1
109 # if defined __x86_64
110 # undef KMP_ARCH_X86_64
111 # define KMP_ARCH_X86_64 1
114 # define KMP_ARCH_X86 1
118 #if (1 != KMP_ARCH_X86 + KMP_ARCH_X86_64)
119 # error Unknown or unsupported architecture
123 # if defined KMP_WIN_CDECL || !defined GUIDEDLL_EXPORTS
124 # define USE_FTN_CDECL KMP_FTN_UPPER
127 # define KMP_FTN KMP_FTN_PLAIN
128 # define USE_FTN_EXTRA KMP_FTN_PLAIN
130 # if defined KMP_WIN_STDCALL || !defined GUIDEDLL_EXPORTS
131 # define USE_FTN_STDCALL KMP_FTN_UPPER
134 typedef char kmp_int8;
135 typedef unsigned char kmp_uint8;
136 typedef short kmp_int16;
137 typedef unsigned short kmp_uint16;
138 typedef int kmp_int32;
139 typedef unsigned int kmp_uint32;
140 # define KMP_INT32_SPEC "d"
141 # define KMP_UINT32_SPEC "u"
142 # ifndef KMP_STRUCT64
143 typedef __int64 kmp_int64;
144 typedef unsigned __int64 kmp_uint64;
145 #define KMP_INT64_SPEC "I64d"
146 #define KMP_UINT64_SPEC "I64u"
148 struct kmp_struct64 {
151 typedef struct kmp_struct64 kmp_int64;
152 typedef struct kmp_struct64 kmp_uint64;
156 # define KMP_INTPTR 1
157 typedef __int64 kmp_intptr_t;
158 typedef unsigned __int64 kmp_uintptr_t;
159 # define KMP_INTPTR_SPEC "I64d"
160 # define KMP_UINTPTR_SPEC "I64u"
165 # define KMP_FTN KMP_FTN_PLAIN
166 # define USE_FTN_CDECL KMP_FTN_PLAIN
167 # define USE_FTN_EXTRA KMP_FTN_APPEND
168 typedef char kmp_int8;
169 typedef unsigned char kmp_uint8;
170 typedef short kmp_int16;
171 typedef unsigned short kmp_uint16;
172 typedef int kmp_int32;
173 typedef unsigned int kmp_uint32;
174 typedef long long kmp_int64;
175 typedef unsigned long long kmp_uint64;
176 # define KMP_INT32_SPEC "d"
177 # define KMP_UINT32_SPEC "u"
178 # define KMP_INT64_SPEC "lld"
179 # define KMP_UINT64_SPEC "llu"
183 # define KMP_SIZE_T_SPEC KMP_UINT32_SPEC
184 #elif KMP_ARCH_X86_64
185 # define KMP_SIZE_T_SPEC KMP_UINT64_SPEC
187 # error "Can't determine size_t printf format specifier."
191 # define KMP_SIZE_T_MAX (0xFFFFFFFF)
193 # define KMP_SIZE_T_MAX (0xFFFFFFFFFFFFFFFF)
196 typedef size_t kmp_size_t;
197 typedef float kmp_real32;
198 typedef double kmp_real64;
201 # define KMP_INTPTR 1
202 typedef long kmp_intptr_t;
203 typedef unsigned long kmp_uintptr_t;
204 # define KMP_INTPTR_SPEC "ld"
205 # define KMP_UINTPTR_SPEC "lu"
209 typedef kmp_int64 kmp_int;
210 typedef kmp_uint64 kmp_uint;
211 # define KMP_INT_SPEC KMP_INT64_SPEC
212 # define KMP_UINT_SPEC KMP_UINT64_SPEC
213 # define KMP_INT_MAX ((kmp_int64)0x7FFFFFFFFFFFFFFFLL)
214 # define KMP_INT_MIN ((kmp_int64)0x8000000000000000LL)
216 typedef kmp_int32 kmp_int;
217 typedef kmp_uint32 kmp_uint;
218 # define KMP_INT_SPEC KMP_INT32_SPEC
219 # define KMP_UINT_SPEC KMP_UINT32_SPEC
220 # define KMP_INT_MAX ((kmp_int32)0x7FFFFFFF)
221 # define KMP_INT_MIN ((kmp_int64)0x80000000)
228 template<
typename T >
231 typedef T unsigned_t;
232 typedef T floating_t;
233 static char const * spec;
237 struct traits_t< signed int > {
238 typedef signed int signed_t;
239 typedef unsigned int unsigned_t;
240 typedef double floating_t;
241 static char const * spec;
245 struct traits_t< unsigned int > {
246 typedef signed int signed_t;
247 typedef unsigned int unsigned_t;
248 typedef double floating_t;
249 static char const * spec;
253 struct traits_t< signed long long > {
254 typedef signed long long signed_t;
255 typedef unsigned long long unsigned_t;
256 typedef long double floating_t;
257 static char const * spec;
261 struct traits_t< unsigned long long > {
262 typedef signed long long signed_t;
263 typedef unsigned long long unsigned_t;
264 typedef long double floating_t;
265 static char const * spec;
268 #endif // __cplusplus
271 # define KMP_STDCALL __stdcall
278 #define KMP_EXPORT extern
281 #define __forceinline __inline
284 #define PAGE_SIZE (0x4000)
285 #define PAGE_ALIGNED(_addr) ( ! ((size_t) _addr & \
286 (size_t)(PAGE_SIZE - 1)))
287 #define ALIGN_TO_PAGE(x) (void *)(((size_t)(x)) & ~((size_t)(PAGE_SIZE - 1)))
293 #endif // __cplusplus
297 #define CACHE_LINE 128
299 #if ( CACHE_LINE < 64 ) && ! defined( KMP_OS_DARWIN )
301 #warning CACHE_LINE is too small.
306 #if !defined KMP_PERF_V19
307 # define KMP_PERF_V19 KMP_ON
311 #if !defined KMP_PERF_V106
312 # define KMP_PERF_V106 KMP_ON
315 #define KMP_CACHE_PREFETCH(ADDR)
319 #if KMP_OS_UNIX && defined(__GNUC__)
320 # define KMP_DO_ALIGN(bytes) __attribute__((aligned(bytes)))
321 # define KMP_ALIGN_CACHE __attribute__((aligned(CACHE_LINE)))
322 # define KMP_ALIGN(bytes) __attribute__((aligned(bytes)))
324 # define KMP_DO_ALIGN(bytes) __declspec( align(bytes) )
325 # define KMP_ALIGN_CACHE __declspec( align(CACHE_LINE) )
326 # define KMP_ALIGN(bytes) __declspec( align(bytes) )
329 #if defined(__MIC__) || defined(__MIC2__)
332 # if __MIC2__ || __KNC__
346 enum kmp_mem_fence_type {
356 # define KMP_TEST_THEN_INC32( ADDR ) __sync_fetch_and_add( (kmp_int32*)(ADDR), 1 )
358 # define KMP_TEST_THEN_INC_ACQ32( ADDR ) __sync_fetch_and_add( (kmp_int32*)(ADDR), 1 )
360 # define KMP_TEST_THEN_INC64( ADDR ) __sync_fetch_and_add( (kmp_int64*)(ADDR), 1LL )
362 # define KMP_TEST_THEN_INC_ACQ64( ADDR ) __sync_fetch_and_add( (kmp_int64*)(ADDR), 1LL )
364 # define KMP_TEST_THEN_ADD4_32( ADDR ) __sync_fetch_and_add( (kmp_int32*)(ADDR), 4 )
366 # define KMP_TEST_THEN_ADD4_ACQ32( ADDR ) __sync_fetch_and_add( (kmp_int32*)(ADDR), 4 )
368 # define KMP_TEST_THEN_ADD4_64( ADDR ) __sync_fetch_and_add( (kmp_int64*)(ADDR), 4LL )
370 # define KMP_TEST_THEN_ADD4_ACQ64( ADDR ) __sync_fetch_and_add( (kmp_int64*)(ADDR), 4LL )
372 # define KMP_TEST_THEN_DEC32( ADDR ) __sync_fetch_and_sub( (kmp_int32*)(ADDR), 1 )
374 # define KMP_TEST_THEN_DEC_ACQ32( ADDR ) __sync_fetch_and_sub( (kmp_int32*)(ADDR), 1 )
376 # define KMP_TEST_THEN_DEC64( ADDR ) __sync_fetch_and_sub( (kmp_int64*)(ADDR), 1LL )
378 # define KMP_TEST_THEN_DEC_ACQ64( ADDR ) __sync_fetch_and_sub( (kmp_int64*)(ADDR), 1LL )
380 # define KMP_TEST_THEN_ADD32( ADDR, INCR ) __sync_fetch_and_add( (kmp_int32*)(ADDR), (INCR) )
382 # define KMP_TEST_THEN_ADD64( ADDR, INCR ) __sync_fetch_and_add( (kmp_int64*)(ADDR), (INCR) )
384 # define KMP_COMPARE_AND_STORE_ACQ32(p,cv,sv) __sync_bool_compare_and_swap((volatile kmp_uint32*)(p),(kmp_uint32)(cv),(kmp_uint32)(sv))
385 # define KMP_COMPARE_AND_STORE_REL32(p,cv,sv) __sync_bool_compare_and_swap((volatile kmp_uint32*)(p),(kmp_uint32)(cv),(kmp_uint32)(sv))
386 # define KMP_COMPARE_AND_STORE_ACQ64(p,cv,sv) __sync_bool_compare_and_swap((volatile kmp_uint64*)(p),(kmp_uint64)(cv),(kmp_uint64)(sv))
387 # define KMP_COMPARE_AND_STORE_REL64(p,cv,sv) __sync_bool_compare_and_swap((volatile kmp_uint64*)(p),(kmp_uint64)(cv),(kmp_uint64)(sv))
388 # define KMP_COMPARE_AND_STORE_PTR(p,cv,sv) __sync_bool_compare_and_swap((volatile kmp_uint64*)(p),(kmp_uint64)(cv),(kmp_uint64)(sv))
392 #if ! defined KMP_TEST_THEN_INC32
393 # define KMP_TEST_THEN_INC32( ADDR ) ( __kmp_test_then_add32( (ADDR), 1 ) )
395 #if ! defined KMP_TEST_THEN_INC_ACQ32
396 # define KMP_TEST_THEN_INC_ACQ32( ADDR ) ( __kmp_test_then_add32( (ADDR), 1 ) )
399 #if ! defined KMP_TEST_THEN_INC64
400 # define KMP_TEST_THEN_INC64( ADDR ) ( __kmp_test_then_add64( (ADDR), 1LL ) )
402 #if ! defined KMP_TEST_THEN_INC_ACQ64
403 # define KMP_TEST_THEN_INC_ACQ64( ADDR ) ( __kmp_test_then_add64( (ADDR), 1LL ) )
406 #if ! defined KMP_TEST_THEN_ADD4_32
407 # define KMP_TEST_THEN_ADD4_32( ADDR ) ( __kmp_test_then_add32( (ADDR), 4 ) )
409 #if ! defined KMP_TEST_THEN_ADD4_ACQ32
410 # define KMP_TEST_THEN_ADD4_ACQ32( ADDR ) ( __kmp_test_then_add32( (ADDR), 4 ) )
413 #if ! defined KMP_TEST_THEN_ADD4_64
414 # define KMP_TEST_THEN_ADD4_64( ADDR ) ( __kmp_test_then_add64( (ADDR), 4LL ) )
416 #if ! defined KMP_TEST_THEN_ADD4_ACQ64
417 # define KMP_TEST_THEN_ADD4_ACQ64( ADDR ) ( __kmp_test_then_add64( (ADDR), 4LL ) )
420 #if ! defined KMP_TEST_THEN_DEC32
421 # define KMP_TEST_THEN_DEC32( ADDR ) ( __kmp_test_then_add32( (ADDR), -1 ) )
423 #if !defined KMP_TEST_THEN_DEC_ACQ32
424 # define KMP_TEST_THEN_DEC_ACQ32( ADDR ) ( __kmp_test_then_add32( (ADDR), -1 ) )
427 #if !defined KMP_TEST_THEN_DEC64
428 # define KMP_TEST_THEN_DEC64( ADDR ) ( __kmp_test_then_add64( (ADDR), -1LL ) )
430 #if !defined KMP_TEST_THEN_DEC_ACQ64
431 # define KMP_TEST_THEN_DEC_ACQ64( ADDR ) ( __kmp_test_then_add64( (ADDR), -1LL ) )
434 #if !defined KMP_TEST_THEN_ADD32
435 # define KMP_TEST_THEN_ADD32( ADDR, INCR ) ( __kmp_test_then_add32( (ADDR), (INCR) ) )
438 #if !defined KMP_TEST_THEN_ADD64
439 # define KMP_TEST_THEN_ADD64( ADDR, INCR ) ( __kmp_test_then_add64( (ADDR), (INCR) ) )
451 # define KMP_MB() asm ("nop")
452 # define KMP_IMB() asm ("nop")
460 # define KMP_MB() asm ("nop")
461 # define KMP_IMB() asm ("nop")
478 # define KMP_ST4_REL(A,D) ( *(A) = (D) )
482 # define KMP_ST8_REL(A,D) ( *(A) = (D) )
486 # define KMP_LD4_ACQ(A) ( *(A) )
490 # define KMP_LD8_ACQ(A) ( *(A) )
508 #define TCW_4(a,b) (a) = (b)
510 #define TCW_8(a,b) (a) = (b)
511 #define TCR_SYNC_4(a) (a)
512 #define TCW_SYNC_4(a,b) (a) = (b)
513 #define TCX_SYNC_4(a,b,c) KMP_COMPARE_AND_STORE_REL32((volatile kmp_int32 *)(volatile void *)&(a), (kmp_int32)(b), (kmp_int32)(c))
514 #define TCR_SYNC_8(a) (a)
515 #define TCW_SYNC_8(a,b) (a) = (b)
516 #define TCX_SYNC_8(a,b,c) KMP_COMPARE_AND_STORE_REL64((volatile kmp_int64 *)(volatile void *)&(a), (kmp_int64)(b), (kmp_int64)(c))
520 #define TCR_PTR(a) ((void *)TCR_4(a))
521 #define TCW_PTR(a,b) TCW_4((a),(b))
522 #define TCR_SYNC_PTR(a) ((void *)TCR_SYNC_4(a))
523 #define TCW_SYNC_PTR(a,b) TCW_SYNC_4((a),(b))
524 #define TCX_SYNC_PTR(a,b,c) ((void *)TCX_SYNC_4((a),(b),(c)))
528 #define TCR_PTR(a) ((void *)TCR_8(a))
529 #define TCW_PTR(a,b) TCW_8((a),(b))
530 #define TCR_SYNC_PTR(a) ((void *)TCR_SYNC_8(a))
531 #define TCW_SYNC_PTR(a,b) TCW_SYNC_8((a),(b))
532 #define TCX_SYNC_PTR(a,b,c) ((void *)TCX_SYNC_8((a),(b),(c)))
543 # define FTN_TRUE TRUE
547 # define FTN_FALSE FALSE
550 typedef void (*microtask_t)(
int *gtid,
int *npr, ... );
552 #ifdef USE_VOLATILE_CAST
553 # define VOLATILE_CAST(x) (volatile x)
555 # define VOLATILE_CAST(x) (x)
559 # define KMP_WAIT_YIELD __kmp_wait_yield_8
560 # define KMP_EQ __kmp_eq_8
561 # define KMP_NEQ __kmp_neq_8
562 # define KMP_LT __kmp_lt_8
563 # define KMP_GE __kmp_ge_8
564 # define KMP_LE __kmp_le_8
566 # define KMP_WAIT_YIELD __kmp_wait_yield_4
567 # define KMP_EQ __kmp_eq_4
568 # define KMP_NEQ __kmp_neq_4
569 # define KMP_LT __kmp_lt_4
570 # define KMP_GE __kmp_ge_4
571 # define KMP_LE __kmp_le_4
575 #if KMP_ARCH_X86_64 && KMP_OS_LINUX
576 # define STATIC_EFI2_WORKAROUND
578 # define STATIC_EFI2_WORKAROUND static
583 #define KMP_USE_BGET 1
588 enum kmp_warnings_level {
589 kmp_warnings_off = 0,
591 kmp_warnings_explicit = 6,
597 #endif // __cplusplus