21 #define KMP_FTN_PLAIN 1
22 #define KMP_FTN_APPEND 2
23 #define KMP_FTN_UPPER 3
29 #define KMP_PTR_SKIP (sizeof(void*))
36 #define KMP_MEM_CONS_VOLATILE 0
37 #define KMP_MEM_CONS_FENCE 1
39 #ifndef KMP_MEM_CONS_MODEL
40 # define KMP_MEM_CONS_MODEL KMP_MEM_CONS_VOLATILE
44 #define KMP_COMPILER_ICC 0
45 #define KMP_COMPILER_GCC 0
46 #define KMP_COMPILER_CLANG 0
47 #define KMP_COMPILER_MSVC 0
49 #if defined( __INTEL_COMPILER )
50 # undef KMP_COMPILER_ICC
51 # define KMP_COMPILER_ICC 1
52 #elif defined( __clang__ )
53 # undef KMP_COMPILER_CLANG
54 # define KMP_COMPILER_CLANG 1
55 #elif defined( __GNUC__ )
56 # undef KMP_COMPILER_GCC
57 # define KMP_COMPILER_GCC 1
58 #elif defined( _MSC_VER )
59 # undef KMP_COMPILER_MSVC
60 # define KMP_COMPILER_MSVC 1
62 # error Unknown compiler
65 #include "kmp_platform.h"
67 #if (KMP_OS_LINUX || KMP_OS_WINDOWS) && !KMP_OS_CNK && !KMP_ARCH_PPC64
68 # define KMP_AFFINITY_SUPPORTED 1
69 # if KMP_OS_WINDOWS && KMP_ARCH_X86_64
70 # define KMP_GROUP_AFFINITY 1
72 # define KMP_GROUP_AFFINITY 0
75 # define KMP_AFFINITY_SUPPORTED 0
76 # define KMP_GROUP_AFFINITY 0
80 #define KMP_HAVE_QUAD 0
81 #if KMP_ARCH_X86 || KMP_ARCH_X86_64
85 # define KMP_HAVE_QUAD 1
86 # elif KMP_COMPILER_CLANG
89 typedef long double _Quad;
90 # elif KMP_COMPILER_GCC
91 typedef __float128 _Quad;
93 # define KMP_HAVE_QUAD 1
94 # elif KMP_COMPILER_MSVC
95 typedef long double _Quad;
98 # if __LDBL_MAX_EXP__ >= 16384 && KMP_COMPILER_GCC
99 typedef long double _Quad;
100 # undef KMP_HAVE_QUAD
101 # define KMP_HAVE_QUAD 1
106 typedef char kmp_int8;
107 typedef unsigned char kmp_uint8;
108 typedef short kmp_int16;
109 typedef unsigned short kmp_uint16;
110 typedef int kmp_int32;
111 typedef unsigned int kmp_uint32;
112 # define KMP_INT32_SPEC "d"
113 # define KMP_UINT32_SPEC "u"
114 # ifndef KMP_STRUCT64
115 typedef __int64 kmp_int64;
116 typedef unsigned __int64 kmp_uint64;
117 #define KMP_INT64_SPEC "I64d"
118 #define KMP_UINT64_SPEC "I64u"
120 struct kmp_struct64 {
123 typedef struct kmp_struct64 kmp_int64;
124 typedef struct kmp_struct64 kmp_uint64;
128 # define KMP_INTPTR 1
129 typedef __int64 kmp_intptr_t;
130 typedef unsigned __int64 kmp_uintptr_t;
131 # define KMP_INTPTR_SPEC "I64d"
132 # define KMP_UINTPTR_SPEC "I64u"
137 typedef char kmp_int8;
138 typedef unsigned char kmp_uint8;
139 typedef short kmp_int16;
140 typedef unsigned short kmp_uint16;
141 typedef int kmp_int32;
142 typedef unsigned int kmp_uint32;
143 typedef long long kmp_int64;
144 typedef unsigned long long kmp_uint64;
145 # define KMP_INT32_SPEC "d"
146 # define KMP_UINT32_SPEC "u"
147 # define KMP_INT64_SPEC "lld"
148 # define KMP_UINT64_SPEC "llu"
151 #if KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS
152 # define KMP_SIZE_T_SPEC KMP_UINT32_SPEC
153 #elif KMP_ARCH_X86_64 || KMP_ARCH_PPC64 || KMP_ARCH_AARCH64 || KMP_ARCH_MIPS64
154 # define KMP_SIZE_T_SPEC KMP_UINT64_SPEC
156 # error "Can't determine size_t printf format specifier."
160 # define KMP_SIZE_T_MAX (0xFFFFFFFF)
162 # define KMP_SIZE_T_MAX (0xFFFFFFFFFFFFFFFF)
165 typedef size_t kmp_size_t;
166 typedef float kmp_real32;
167 typedef double kmp_real64;
170 # define KMP_INTPTR 1
171 typedef long kmp_intptr_t;
172 typedef unsigned long kmp_uintptr_t;
173 # define KMP_INTPTR_SPEC "ld"
174 # define KMP_UINTPTR_SPEC "lu"
178 typedef kmp_int64 kmp_int;
179 typedef kmp_uint64 kmp_uint;
180 # define KMP_INT_SPEC KMP_INT64_SPEC
181 # define KMP_UINT_SPEC KMP_UINT64_SPEC
182 # define KMP_INT_MAX ((kmp_int64)0x7FFFFFFFFFFFFFFFLL)
183 # define KMP_INT_MIN ((kmp_int64)0x8000000000000000LL)
185 typedef kmp_int32 kmp_int;
186 typedef kmp_uint32 kmp_uint;
187 # define KMP_INT_SPEC KMP_INT32_SPEC
188 # define KMP_UINT_SPEC KMP_UINT32_SPEC
189 # define KMP_INT_MAX ((kmp_int32)0x7FFFFFFF)
190 # define KMP_INT_MIN ((kmp_int32)0x80000000)
197 template<
typename T >
200 typedef T unsigned_t;
201 typedef T floating_t;
202 static char const * spec;
206 struct traits_t< signed int > {
207 typedef signed int signed_t;
208 typedef unsigned int unsigned_t;
209 typedef double floating_t;
210 static char const * spec;
214 struct traits_t< unsigned int > {
215 typedef signed int signed_t;
216 typedef unsigned int unsigned_t;
217 typedef double floating_t;
218 static char const * spec;
222 struct traits_t< signed long long > {
223 typedef signed long long signed_t;
224 typedef unsigned long long unsigned_t;
225 typedef long double floating_t;
226 static char const * spec;
230 struct traits_t< unsigned long long > {
231 typedef signed long long signed_t;
232 typedef unsigned long long unsigned_t;
233 typedef long double floating_t;
234 static char const * spec;
237 #endif // __cplusplus
239 #define KMP_EXPORT extern
242 #define __forceinline __inline
245 #define PAGE_SIZE (0x4000)
246 #define PAGE_ALIGNED(_addr) ( ! ((size_t) _addr & \
247 (size_t)(PAGE_SIZE - 1)))
248 #define ALIGN_TO_PAGE(x) (void *)(((size_t)(x)) & ~((size_t)(PAGE_SIZE - 1)))
254 #endif // __cplusplus
256 #define INTERNODE_CACHE_LINE 4096
260 #define CACHE_LINE 128
262 #if ( CACHE_LINE < 64 ) && ! defined( KMP_OS_DARWIN )
264 #warning CACHE_LINE is too small.
268 #define KMP_CACHE_PREFETCH(ADDR)
272 #if KMP_OS_UNIX && defined(__GNUC__)
273 # define KMP_DO_ALIGN(bytes) __attribute__((aligned(bytes)))
274 # define KMP_ALIGN_CACHE __attribute__((aligned(CACHE_LINE)))
275 # define KMP_ALIGN_CACHE_INTERNODE __attribute__((aligned(INTERNODE_CACHE_LINE)))
276 # define KMP_ALIGN(bytes) __attribute__((aligned(bytes)))
278 # define KMP_DO_ALIGN(bytes) __declspec( align(bytes) )
279 # define KMP_ALIGN_CACHE __declspec( align(CACHE_LINE) )
280 # define KMP_ALIGN_CACHE_INTERNODE __declspec( align(INTERNODE_CACHE_LINE) )
281 # define KMP_ALIGN(bytes) __declspec( align(bytes) )
284 #if defined(__MIC__) || defined(__MIC2__)
287 # if __MIC2__ || __KNC__
301 enum kmp_mem_fence_type {
313 #if KMP_ASM_INTRINS && KMP_OS_WINDOWS
317 #pragma intrinsic(InterlockedExchangeAdd)
318 #pragma intrinsic(InterlockedCompareExchange)
319 #pragma intrinsic(InterlockedExchange)
320 #pragma intrinsic(InterlockedExchange64)
326 # define KMP_TEST_THEN_INC32(p) InterlockedExchangeAdd( (volatile long *)(p), 1 )
327 # define KMP_TEST_THEN_INC_ACQ32(p) InterlockedExchangeAdd( (volatile long *)(p), 1 )
328 # define KMP_TEST_THEN_ADD4_32(p) InterlockedExchangeAdd( (volatile long *)(p), 4 )
329 # define KMP_TEST_THEN_ADD4_ACQ32(p) InterlockedExchangeAdd( (volatile long *)(p), 4 )
330 # define KMP_TEST_THEN_DEC32(p) InterlockedExchangeAdd( (volatile long *)(p), -1 )
331 # define KMP_TEST_THEN_DEC_ACQ32(p) InterlockedExchangeAdd( (volatile long *)(p), -1 )
332 # define KMP_TEST_THEN_ADD32(p, v) InterlockedExchangeAdd( (volatile long *)(p), (v) )
334 extern kmp_int8 __kmp_test_then_add8(
volatile kmp_int8 *p, kmp_int8 v );
335 extern kmp_int8 __kmp_test_then_or8(
volatile kmp_int8 *p, kmp_int8 v );
336 extern kmp_int8 __kmp_test_then_and8(
volatile kmp_int8 *p, kmp_int8 v );
337 # define KMP_COMPARE_AND_STORE_RET32(p, cv, sv) InterlockedCompareExchange( (volatile long *)(p),(long)(sv),(long)(cv) )
339 # define KMP_XCHG_FIXED32(p, v) InterlockedExchange( (volatile long *)(p), (long)(v) )
340 # define KMP_XCHG_FIXED64(p, v) InterlockedExchange64( (volatile kmp_int64 *)(p), (kmp_int64)(v) )
342 inline kmp_real32 KMP_XCHG_REAL32(
volatile kmp_real32 *p, kmp_real32 v)
344 kmp_int32 tmp = InterlockedExchange( (
volatile long *)p, *(
long *)&v);
345 return *(kmp_real32*)&tmp;
351 extern kmp_int32 __kmp_test_then_add32(
volatile kmp_int32 *p, kmp_int32 v );
352 extern kmp_int32 __kmp_test_then_or32(
volatile kmp_int32 *p, kmp_int32 v );
353 extern kmp_int32 __kmp_test_then_and32(
volatile kmp_int32 *p, kmp_int32 v );
354 extern kmp_int64 __kmp_test_then_add64(
volatile kmp_int64 *p, kmp_int64 v );
355 extern kmp_int64 __kmp_test_then_or64(
volatile kmp_int64 *p, kmp_int64 v );
356 extern kmp_int64 __kmp_test_then_and64(
volatile kmp_int64 *p, kmp_int64 v );
358 extern kmp_int8 __kmp_compare_and_store8(
volatile kmp_int8 *p, kmp_int8 cv, kmp_int8 sv );
359 extern kmp_int16 __kmp_compare_and_store16(
volatile kmp_int16 *p, kmp_int16 cv, kmp_int16 sv );
360 extern kmp_int32 __kmp_compare_and_store32(
volatile kmp_int32 *p, kmp_int32 cv, kmp_int32 sv );
361 extern kmp_int32 __kmp_compare_and_store64(
volatile kmp_int64 *p, kmp_int64 cv, kmp_int64 sv );
362 extern kmp_int8 __kmp_compare_and_store_ret8(
volatile kmp_int8 *p, kmp_int8 cv, kmp_int8 sv );
363 extern kmp_int16 __kmp_compare_and_store_ret16(
volatile kmp_int16 *p, kmp_int16 cv, kmp_int16 sv );
364 extern kmp_int32 __kmp_compare_and_store_ret32(
volatile kmp_int32 *p, kmp_int32 cv, kmp_int32 sv );
365 extern kmp_int64 __kmp_compare_and_store_ret64(
volatile kmp_int64 *p, kmp_int64 cv, kmp_int64 sv );
367 extern kmp_int8 __kmp_xchg_fixed8(
volatile kmp_int8 *p, kmp_int8 v );
368 extern kmp_int16 __kmp_xchg_fixed16(
volatile kmp_int16 *p, kmp_int16 v );
369 extern kmp_int32 __kmp_xchg_fixed32(
volatile kmp_int32 *p, kmp_int32 v );
370 extern kmp_int64 __kmp_xchg_fixed64(
volatile kmp_int64 *p, kmp_int64 v );
371 extern kmp_real32 __kmp_xchg_real32(
volatile kmp_real32 *p, kmp_real32 v );
372 extern kmp_real64 __kmp_xchg_real64(
volatile kmp_real64 *p, kmp_real64 v );
373 # define KMP_TEST_THEN_ADD8(p, v) __kmp_test_then_add8( (p), (v) )
376 # define KMP_TEST_THEN_OR8(p, v) __kmp_test_then_or8( (p), (v) )
377 # define KMP_TEST_THEN_AND8(p, v) __kmp_test_then_and8( (p), (v) )
379 # define KMP_TEST_THEN_INC64(p) __kmp_test_then_add64( (p), 1LL )
380 # define KMP_TEST_THEN_INC_ACQ64(p) __kmp_test_then_add64( (p), 1LL )
383 # define KMP_TEST_THEN_ADD4_64(p) __kmp_test_then_add64( (p), 4LL )
384 # define KMP_TEST_THEN_ADD4_ACQ64(p) __kmp_test_then_add64( (p), 4LL )
387 # define KMP_TEST_THEN_DEC64(p) __kmp_test_then_add64( (p), -1LL )
388 # define KMP_TEST_THEN_DEC_ACQ64(p) __kmp_test_then_add64( (p), -1LL )
390 # define KMP_TEST_THEN_ADD64(p, v) __kmp_test_then_add64( (p), (v) )
392 # define KMP_TEST_THEN_OR32(p, v) __kmp_test_then_or32( (p), (v) )
393 # define KMP_TEST_THEN_AND32(p, v) __kmp_test_then_and32( (p), (v) )
394 # define KMP_TEST_THEN_OR64(p, v) __kmp_test_then_or64( (p), (v) )
395 # define KMP_TEST_THEN_AND64(p, v) __kmp_test_then_and64( (p), (v) )
397 # define KMP_COMPARE_AND_STORE_ACQ8(p, cv, sv) __kmp_compare_and_store8( (p), (cv), (sv) )
398 # define KMP_COMPARE_AND_STORE_REL8(p, cv, sv) __kmp_compare_and_store8( (p), (cv), (sv) )
399 # define KMP_COMPARE_AND_STORE_ACQ16(p, cv, sv) __kmp_compare_and_store16( (p), (cv), (sv) )
400 # define KMP_COMPARE_AND_STORE_REL16(p, cv, sv) __kmp_compare_and_store16( (p), (cv), (sv) )
401 # define KMP_COMPARE_AND_STORE_ACQ32(p, cv, sv) __kmp_compare_and_store32( (p), (cv), (sv) )
402 # define KMP_COMPARE_AND_STORE_REL32(p, cv, sv) __kmp_compare_and_store32( (p), (cv), (sv) )
403 # define KMP_COMPARE_AND_STORE_ACQ64(p, cv, sv) __kmp_compare_and_store64( (p), (cv), (sv) )
404 # define KMP_COMPARE_AND_STORE_REL64(p, cv, sv) __kmp_compare_and_store64( (p), (cv), (sv) )
407 # define KMP_COMPARE_AND_STORE_PTR(p, cv, sv) __kmp_compare_and_store32( (volatile kmp_int32*)(p), (kmp_int32)(cv), (kmp_int32)(sv) )
409 # define KMP_COMPARE_AND_STORE_PTR(p, cv, sv) __kmp_compare_and_store64( (volatile kmp_int64*)(p), (kmp_int64)(cv), (kmp_int64)(sv) )
412 # define KMP_COMPARE_AND_STORE_RET8(p, cv, sv) __kmp_compare_and_store_ret8( (p), (cv), (sv) )
413 # define KMP_COMPARE_AND_STORE_RET16(p, cv, sv) __kmp_compare_and_store_ret16( (p), (cv), (sv) )
415 # define KMP_COMPARE_AND_STORE_RET64(p, cv, sv) __kmp_compare_and_store_ret64( (p), (cv), (sv) )
417 # define KMP_XCHG_FIXED8(p, v) __kmp_xchg_fixed8( (p), (v) );
418 # define KMP_XCHG_FIXED16(p, v) __kmp_xchg_fixed16( (p), (v) );
422 # define KMP_XCHG_REAL64(p, v) __kmp_xchg_real64( (p), (v) );
425 #elif (KMP_ASM_INTRINS && KMP_OS_UNIX) || !(KMP_ARCH_X86 || KMP_ARCH_X86_64)
426 # define KMP_TEST_THEN_ADD8(p, v) __sync_fetch_and_add( (kmp_int8 *)(p), (v) )
429 # define KMP_TEST_THEN_INC32(p) __sync_fetch_and_add( (kmp_int32 *)(p), 1 )
430 # define KMP_TEST_THEN_OR8(p, v) __sync_fetch_and_or( (kmp_int8 *)(p), (v) )
431 # define KMP_TEST_THEN_AND8(p, v) __sync_fetch_and_and( (kmp_int8 *)(p), (v) )
432 # define KMP_TEST_THEN_INC_ACQ32(p) __sync_fetch_and_add( (kmp_int32 *)(p), 1 )
433 # define KMP_TEST_THEN_INC64(p) __sync_fetch_and_add( (kmp_int64 *)(p), 1LL )
434 # define KMP_TEST_THEN_INC_ACQ64(p) __sync_fetch_and_add( (kmp_int64 *)(p), 1LL )
435 # define KMP_TEST_THEN_ADD4_32(p) __sync_fetch_and_add( (kmp_int32 *)(p), 4 )
436 # define KMP_TEST_THEN_ADD4_ACQ32(p) __sync_fetch_and_add( (kmp_int32 *)(p), 4 )
437 # define KMP_TEST_THEN_ADD4_64(p) __sync_fetch_and_add( (kmp_int64 *)(p), 4LL )
438 # define KMP_TEST_THEN_ADD4_ACQ64(p) __sync_fetch_and_add( (kmp_int64 *)(p), 4LL )
439 # define KMP_TEST_THEN_DEC32(p) __sync_fetch_and_sub( (kmp_int32 *)(p), 1 )
440 # define KMP_TEST_THEN_DEC_ACQ32(p) __sync_fetch_and_sub( (kmp_int32 *)(p), 1 )
441 # define KMP_TEST_THEN_DEC64(p) __sync_fetch_and_sub( (kmp_int64 *)(p), 1LL )
442 # define KMP_TEST_THEN_DEC_ACQ64(p) __sync_fetch_and_sub( (kmp_int64 *)(p), 1LL )
443 # define KMP_TEST_THEN_ADD32(p, v) __sync_fetch_and_add( (kmp_int32 *)(p), (v) )
444 # define KMP_TEST_THEN_ADD64(p, v) __sync_fetch_and_add( (kmp_int64 *)(p), (v) )
446 # define KMP_TEST_THEN_OR32(p, v) __sync_fetch_and_or( (kmp_int32 *)(p), (v) )
447 # define KMP_TEST_THEN_AND32(p, v) __sync_fetch_and_and( (kmp_int32 *)(p), (v) )
448 # define KMP_TEST_THEN_OR64(p, v) __sync_fetch_and_or( (kmp_int64 *)(p), (v) )
449 # define KMP_TEST_THEN_AND64(p, v) __sync_fetch_and_and( (kmp_int64 *)(p), (v) )
451 # define KMP_COMPARE_AND_STORE_ACQ8(p, cv, sv) __sync_bool_compare_and_swap( (volatile kmp_uint8 *)(p),(kmp_uint8)(cv),(kmp_uint8)(sv) )
452 # define KMP_COMPARE_AND_STORE_REL8(p, cv, sv) __sync_bool_compare_and_swap( (volatile kmp_uint8 *)(p),(kmp_uint8)(cv),(kmp_uint8)(sv) )
453 # define KMP_COMPARE_AND_STORE_ACQ16(p, cv, sv) __sync_bool_compare_and_swap( (volatile kmp_uint16 *)(p),(kmp_uint16)(cv),(kmp_uint16)(sv) )
454 # define KMP_COMPARE_AND_STORE_REL16(p, cv, sv) __sync_bool_compare_and_swap( (volatile kmp_uint16 *)(p),(kmp_uint16)(cv),(kmp_uint16)(sv) )
455 # define KMP_COMPARE_AND_STORE_ACQ32(p, cv, sv) __sync_bool_compare_and_swap( (volatile kmp_uint32 *)(p),(kmp_uint32)(cv),(kmp_uint32)(sv) )
456 # define KMP_COMPARE_AND_STORE_REL32(p, cv, sv) __sync_bool_compare_and_swap( (volatile kmp_uint32 *)(p),(kmp_uint32)(cv),(kmp_uint32)(sv) )
457 # define KMP_COMPARE_AND_STORE_ACQ64(p, cv, sv) __sync_bool_compare_and_swap( (volatile kmp_uint64 *)(p),(kmp_uint64)(cv),(kmp_uint64)(sv) )
458 # define KMP_COMPARE_AND_STORE_REL64(p, cv, sv) __sync_bool_compare_and_swap( (volatile kmp_uint64 *)(p),(kmp_uint64)(cv),(kmp_uint64)(sv) )
459 # define KMP_COMPARE_AND_STORE_PTR(p, cv, sv) __sync_bool_compare_and_swap( (volatile void **)(p),(void *)(cv),(void *)(sv) )
461 # define KMP_COMPARE_AND_STORE_RET8(p, cv, sv) __sync_val_compare_and_swap( (volatile kmp_uint8 *)(p),(kmp_uint8)(cv),(kmp_uint8)(sv) )
462 # define KMP_COMPARE_AND_STORE_RET16(p, cv, sv) __sync_val_compare_and_swap( (volatile kmp_uint16 *)(p),(kmp_uint16)(cv),(kmp_uint16)(sv) )
463 # define KMP_COMPARE_AND_STORE_RET32(p, cv, sv) __sync_val_compare_and_swap( (volatile kmp_uint32 *)(p),(kmp_uint32)(cv),(kmp_uint32)(sv) )
464 # define KMP_COMPARE_AND_STORE_RET64(p, cv, sv) __sync_val_compare_and_swap( (volatile kmp_uint64 *)(p),(kmp_uint64)(cv),(kmp_uint64)(sv) )
466 #define KMP_XCHG_FIXED8(p, v) __sync_lock_test_and_set( (volatile kmp_uint8 *)(p), (kmp_uint8)(v) )
467 #define KMP_XCHG_FIXED16(p, v) __sync_lock_test_and_set( (volatile kmp_uint16 *)(p), (kmp_uint16)(v) )
468 #define KMP_XCHG_FIXED32(p, v) __sync_lock_test_and_set( (volatile kmp_uint32 *)(p), (kmp_uint32)(v) )
469 #define KMP_XCHG_FIXED64(p, v) __sync_lock_test_and_set( (volatile kmp_uint64 *)(p), (kmp_uint64)(v) )
471 extern kmp_int8 __kmp_test_then_add8(
volatile kmp_int8 *p, kmp_int8 v );
472 extern kmp_int8 __kmp_test_then_or8(
volatile kmp_int8 *p, kmp_int8 v );
473 extern kmp_int8 __kmp_test_then_and8(
volatile kmp_int8 *p, kmp_int8 v );
474 inline kmp_real32 KMP_XCHG_REAL32(
volatile kmp_real32 *p, kmp_real32 v)
476 kmp_int32 tmp = __sync_lock_test_and_set( (kmp_int32*)p, *(kmp_int32*)&v);
477 return *(kmp_real32*)&tmp;
480 inline kmp_real64 KMP_XCHG_REAL64(
volatile kmp_real64 *p, kmp_real64 v)
482 kmp_int64 tmp = __sync_lock_test_and_set( (kmp_int64*)p, *(kmp_int64*)&v);
483 return *(kmp_real64*)&tmp;
488 extern kmp_int32 __kmp_test_then_add32(
volatile kmp_int32 *p, kmp_int32 v );
489 extern kmp_int32 __kmp_test_then_or32(
volatile kmp_int32 *p, kmp_int32 v );
490 extern kmp_int32 __kmp_test_then_and32(
volatile kmp_int32 *p, kmp_int32 v );
491 extern kmp_int64 __kmp_test_then_add64(
volatile kmp_int64 *p, kmp_int64 v );
492 extern kmp_int64 __kmp_test_then_or64(
volatile kmp_int64 *p, kmp_int64 v );
493 extern kmp_int64 __kmp_test_then_and64(
volatile kmp_int64 *p, kmp_int64 v );
495 extern kmp_int8 __kmp_compare_and_store8(
volatile kmp_int8 *p, kmp_int8 cv, kmp_int8 sv );
496 extern kmp_int16 __kmp_compare_and_store16(
volatile kmp_int16 *p, kmp_int16 cv, kmp_int16 sv );
497 extern kmp_int32 __kmp_compare_and_store32(
volatile kmp_int32 *p, kmp_int32 cv, kmp_int32 sv );
498 extern kmp_int32 __kmp_compare_and_store64(
volatile kmp_int64 *p, kmp_int64 cv, kmp_int64 sv );
499 extern kmp_int8 __kmp_compare_and_store_ret8(
volatile kmp_int8 *p, kmp_int8 cv, kmp_int8 sv );
500 extern kmp_int16 __kmp_compare_and_store_ret16(
volatile kmp_int16 *p, kmp_int16 cv, kmp_int16 sv );
501 extern kmp_int32 __kmp_compare_and_store_ret32(
volatile kmp_int32 *p, kmp_int32 cv, kmp_int32 sv );
502 extern kmp_int64 __kmp_compare_and_store_ret64(
volatile kmp_int64 *p, kmp_int64 cv, kmp_int64 sv );
504 extern kmp_int8 __kmp_xchg_fixed8(
volatile kmp_int8 *p, kmp_int8 v );
505 extern kmp_int16 __kmp_xchg_fixed16(
volatile kmp_int16 *p, kmp_int16 v );
506 extern kmp_int32 __kmp_xchg_fixed32(
volatile kmp_int32 *p, kmp_int32 v );
507 extern kmp_int64 __kmp_xchg_fixed64(
volatile kmp_int64 *p, kmp_int64 v );
508 extern kmp_real32 __kmp_xchg_real32(
volatile kmp_real32 *p, kmp_real32 v );
509 # define KMP_TEST_THEN_ADD8(p, v) __kmp_test_then_add8( (p), (v) )
510 extern kmp_real64 __kmp_xchg_real64(
volatile kmp_real64 *p, kmp_real64 v );
512 # define KMP_TEST_THEN_INC32(p) __kmp_test_then_add32( (p), 1 )
513 # define KMP_TEST_THEN_OR8(p, v) __kmp_test_then_or8( (p), (v) )
514 # define KMP_TEST_THEN_AND8(p, v) __kmp_test_then_and8( (p), (v) )
515 # define KMP_TEST_THEN_INC_ACQ32(p) __kmp_test_then_add32( (p), 1 )
516 # define KMP_TEST_THEN_INC64(p) __kmp_test_then_add64( (p), 1LL )
517 # define KMP_TEST_THEN_INC_ACQ64(p) __kmp_test_then_add64( (p), 1LL )
518 # define KMP_TEST_THEN_ADD4_32(p) __kmp_test_then_add32( (p), 4 )
519 # define KMP_TEST_THEN_ADD4_ACQ32(p) __kmp_test_then_add32( (p), 4 )
520 # define KMP_TEST_THEN_ADD4_64(p) __kmp_test_then_add64( (p), 4LL )
521 # define KMP_TEST_THEN_ADD4_ACQ64(p) __kmp_test_then_add64( (p), 4LL )
522 # define KMP_TEST_THEN_DEC32(p) __kmp_test_then_add32( (p), -1 )
523 # define KMP_TEST_THEN_DEC_ACQ32(p) __kmp_test_then_add32( (p), -1 )
524 # define KMP_TEST_THEN_DEC64(p) __kmp_test_then_add64( (p), -1LL )
525 # define KMP_TEST_THEN_DEC_ACQ64(p) __kmp_test_then_add64( (p), -1LL )
526 # define KMP_TEST_THEN_ADD32(p, v) __kmp_test_then_add32( (p), (v) )
527 # define KMP_TEST_THEN_ADD64(p, v) __kmp_test_then_add64( (p), (v) )
529 # define KMP_TEST_THEN_OR32(p, v) __kmp_test_then_or32( (p), (v) )
530 # define KMP_TEST_THEN_AND32(p, v) __kmp_test_then_and32( (p), (v) )
531 # define KMP_TEST_THEN_OR64(p, v) __kmp_test_then_or64( (p), (v) )
532 # define KMP_TEST_THEN_AND64(p, v) __kmp_test_then_and64( (p), (v) )
534 # define KMP_COMPARE_AND_STORE_ACQ8(p, cv, sv) __kmp_compare_and_store8( (p), (cv), (sv) )
535 # define KMP_COMPARE_AND_STORE_REL8(p, cv, sv) __kmp_compare_and_store8( (p), (cv), (sv) )
536 # define KMP_COMPARE_AND_STORE_ACQ16(p, cv, sv) __kmp_compare_and_store16( (p), (cv), (sv) )
537 # define KMP_COMPARE_AND_STORE_REL16(p, cv, sv) __kmp_compare_and_store16( (p), (cv), (sv) )
538 # define KMP_COMPARE_AND_STORE_ACQ32(p, cv, sv) __kmp_compare_and_store32( (p), (cv), (sv) )
539 # define KMP_COMPARE_AND_STORE_REL32(p, cv, sv) __kmp_compare_and_store32( (p), (cv), (sv) )
540 # define KMP_COMPARE_AND_STORE_ACQ64(p, cv, sv) __kmp_compare_and_store64( (p), (cv), (sv) )
541 # define KMP_COMPARE_AND_STORE_REL64(p, cv, sv) __kmp_compare_and_store64( (p), (cv), (sv) )
544 # define KMP_COMPARE_AND_STORE_PTR(p, cv, sv) __kmp_compare_and_store32( (volatile kmp_int32*)(p), (kmp_int32)(cv), (kmp_int32)(sv) )
546 # define KMP_COMPARE_AND_STORE_PTR(p, cv, sv) __kmp_compare_and_store64( (volatile kmp_int64*)(p), (kmp_int64)(cv), (kmp_int64)(sv) )
549 # define KMP_COMPARE_AND_STORE_RET8(p, cv, sv) __kmp_compare_and_store_ret8( (p), (cv), (sv) )
550 # define KMP_COMPARE_AND_STORE_RET16(p, cv, sv) __kmp_compare_and_store_ret16( (p), (cv), (sv) )
551 # define KMP_COMPARE_AND_STORE_RET32(p, cv, sv) __kmp_compare_and_store_ret32( (p), (cv), (sv) )
552 # define KMP_COMPARE_AND_STORE_RET64(p, cv, sv) __kmp_compare_and_store_ret64( (p), (cv), (sv) )
554 # define KMP_XCHG_FIXED8(p, v) __kmp_xchg_fixed8( (p), (v) );
555 # define KMP_XCHG_FIXED16(p, v) __kmp_xchg_fixed16( (p), (v) );
556 # define KMP_XCHG_FIXED32(p, v) __kmp_xchg_fixed32( (p), (v) );
557 # define KMP_XCHG_FIXED64(p, v) __kmp_xchg_fixed64( (p), (v) );
558 # define KMP_XCHG_REAL32(p, v) __kmp_xchg_real32( (p), (v) );
559 # define KMP_XCHG_REAL64(p, v) __kmp_xchg_real64( (p), (v) );
568 # define KMP_MB() asm ("nop")
569 # define KMP_IMB() asm ("nop")
576 #if KMP_ARCH_PPC64 || KMP_ARCH_ARM || KMP_ARCH_AARCH64 || KMP_ARCH_MIPS || KMP_ARCH_MIPS64
577 # define KMP_MB() __sync_synchronize()
589 # define KMP_ST_REL32(A,D) ( *(A) = (D) )
593 # define KMP_ST_REL64(A,D) ( *(A) = (D) )
597 # define KMP_LD_ACQ32(A) ( *(A) )
601 # define KMP_LD_ACQ64(A) ( *(A) )
605 #define TCW_1(a,b) (a) = (b)
621 #define TCW_4(a,b) (a) = (b)
623 #define TCW_8(a,b) (a) = (b)
624 #define TCR_SYNC_4(a) (a)
625 #define TCW_SYNC_4(a,b) (a) = (b)
626 #define TCX_SYNC_4(a,b,c) KMP_COMPARE_AND_STORE_REL32((volatile kmp_int32 *)(volatile void *)&(a), (kmp_int32)(b), (kmp_int32)(c))
627 #define TCR_SYNC_8(a) (a)
628 #define TCW_SYNC_8(a,b) (a) = (b)
629 #define TCX_SYNC_8(a,b,c) KMP_COMPARE_AND_STORE_REL64((volatile kmp_int64 *)(volatile void *)&(a), (kmp_int64)(b), (kmp_int64)(c))
631 #if KMP_ARCH_X86 || KMP_ARCH_MIPS
633 #define TCR_PTR(a) ((void *)TCR_4(a))
634 #define TCW_PTR(a,b) TCW_4((a),(b))
635 #define TCR_SYNC_PTR(a) ((void *)TCR_SYNC_4(a))
636 #define TCW_SYNC_PTR(a,b) TCW_SYNC_4((a),(b))
637 #define TCX_SYNC_PTR(a,b,c) ((void *)TCX_SYNC_4((a),(b),(c)))
641 #define TCR_PTR(a) ((void *)TCR_8(a))
642 #define TCW_PTR(a,b) TCW_8((a),(b))
643 #define TCR_SYNC_PTR(a) ((void *)TCR_SYNC_8(a))
644 #define TCW_SYNC_PTR(a,b) TCW_SYNC_8((a),(b))
645 #define TCX_SYNC_PTR(a,b,c) ((void *)TCX_SYNC_8((a),(b),(c)))
656 # define FTN_TRUE TRUE
660 # define FTN_FALSE FALSE
663 typedef void (*microtask_t)(
int *gtid,
int *npr, ... );
665 #ifdef USE_VOLATILE_CAST
666 # define VOLATILE_CAST(x) (volatile x)
668 # define VOLATILE_CAST(x) (x)
672 # define KMP_WAIT_YIELD __kmp_wait_yield_8
673 # define KMP_EQ __kmp_eq_8
674 # define KMP_NEQ __kmp_neq_8
675 # define KMP_LT __kmp_lt_8
676 # define KMP_GE __kmp_ge_8
677 # define KMP_LE __kmp_le_8
679 # define KMP_WAIT_YIELD __kmp_wait_yield_4
680 # define KMP_EQ __kmp_eq_4
681 # define KMP_NEQ __kmp_neq_4
682 # define KMP_LT __kmp_lt_4
683 # define KMP_GE __kmp_ge_4
684 # define KMP_LE __kmp_le_4
688 #if (KMP_ARCH_X86_64 || KMP_ARCH_PPC64) && KMP_OS_LINUX
689 # define STATIC_EFI2_WORKAROUND
691 # define STATIC_EFI2_WORKAROUND static
696 #define KMP_USE_BGET 1
701 #ifndef USE_SYSFS_INFO
702 # define USE_SYSFS_INFO 0
704 #ifndef USE_CMPXCHG_FIX
705 # define USE_CMPXCHG_FIX 1
709 #ifndef KMP_USE_DYNAMIC_LOCK
710 # define KMP_USE_DYNAMIC_LOCK 0
714 enum kmp_warnings_level {
715 kmp_warnings_off = 0,
717 kmp_warnings_explicit = 6,
723 #endif // __cplusplus
727 #include "kmp_safe_c_api.h"