21 #if !defined(__TBB_machine_H) || defined(__TBB_machine_gcc_generic_H) 22 #error Do not #include this internal file directly; use public TBB headers instead. 25 #define __TBB_machine_gcc_generic_H 30 #define __TBB_WORDSIZE __SIZEOF_POINTER__ 32 #if __TBB_GCC_64BIT_ATOMIC_BUILTINS_BROKEN 33 #define __TBB_64BIT_ATOMICS 0 37 #if __ANDROID__ && __TBB_generic_arch 38 #define __TBB_CPU_CTL_ENV_PRESENT 0 43 #if __BIG_ENDIAN__ || (defined(__BYTE_ORDER__) && __BYTE_ORDER__==__ORDER_BIG_ENDIAN__) 44 #define __TBB_ENDIANNESS __TBB_ENDIAN_BIG 45 #elif __LITTLE_ENDIAN__ || (defined(__BYTE_ORDER__) && __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__) 46 #define __TBB_ENDIANNESS __TBB_ENDIAN_LITTLE 47 #elif defined(__BYTE_ORDER__) 48 #define __TBB_ENDIANNESS __TBB_ENDIAN_UNSUPPORTED 50 #define __TBB_ENDIANNESS __TBB_ENDIAN_DETECT 53 #if __TBB_GCC_VERSION < 40700 61 #define __TBB_acquire_consistency_helper() __sync_synchronize() 62 #define __TBB_release_consistency_helper() __sync_synchronize() 63 #define __TBB_full_memory_fence() __sync_synchronize() 64 #define __TBB_control_consistency_helper() __sync_synchronize() 66 #define __TBB_MACHINE_DEFINE_ATOMICS(S,T) \ 67 inline T __TBB_machine_cmpswp##S( volatile void *ptr, T value, T comparand ) { \ 68 return __sync_val_compare_and_swap(reinterpret_cast<volatile T *>(ptr),comparand,value); \ 70 inline T __TBB_machine_fetchadd##S( volatile void *ptr, T value ) { \ 71 return __sync_fetch_and_add(reinterpret_cast<volatile T *>(ptr),value); \ 74 #define __TBB_USE_GENERIC_FETCH_STORE 1 79 #define __TBB_compiler_fence() __asm__ __volatile__("": : :"memory") 82 #define __TBB_acquire_consistency_helper() __TBB_compiler_fence(); __atomic_thread_fence(__ATOMIC_ACQUIRE); __TBB_compiler_fence() 83 #define __TBB_release_consistency_helper() __TBB_compiler_fence(); __atomic_thread_fence(__ATOMIC_RELEASE); __TBB_compiler_fence() 84 #define __TBB_full_memory_fence() __atomic_thread_fence(__ATOMIC_SEQ_CST) 85 #define __TBB_control_consistency_helper() __TBB_acquire_consistency_helper() 87 #define __TBB_MACHINE_DEFINE_ATOMICS(S,T) \ 88 inline T __TBB_machine_cmpswp##S( volatile void *ptr, T value, T comparand ) { \ 89 (void)__atomic_compare_exchange_n(reinterpret_cast<volatile T *>(ptr), &comparand, value, \ 90 false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); \ 93 inline T __TBB_machine_fetchadd##S( volatile void *ptr, T value ) { \ 94 return __atomic_fetch_add(reinterpret_cast<volatile T *>(ptr), value, __ATOMIC_SEQ_CST); \ 96 inline T __TBB_machine_fetchstore##S( volatile void *ptr, T value ) { \ 97 return __atomic_exchange_n(reinterpret_cast<volatile T *>(ptr), value, __ATOMIC_SEQ_CST); \ 100 #endif // __TBB_GCC_VERSION < 40700 102 __TBB_MACHINE_DEFINE_ATOMICS(1,int8_t)
103 __TBB_MACHINE_DEFINE_ATOMICS(2,int16_t)
104 __TBB_MACHINE_DEFINE_ATOMICS(4,int32_t)
105 __TBB_MACHINE_DEFINE_ATOMICS(8,int64_t)
107 #undef __TBB_MACHINE_DEFINE_ATOMICS 109 namespace tbb{
namespace internal {
namespace gcc_builtins {
110 inline int clz(
unsigned int x){
return __builtin_clz(x);};
111 inline int clz(
unsigned long int x){
return __builtin_clzl(x);};
112 inline int clz(
unsigned long long int x){
return __builtin_clzll(x);};
115 static inline intptr_t __TBB_machine_lg( uintptr_t x ) {
116 return sizeof(x)*8 - tbb::internal::gcc_builtins::clz(x) -1 ;
120 typedef unsigned char __TBB_Flag;
121 typedef __TBB_atomic __TBB_Flag __TBB_atomic_flag;
123 #if __TBB_GCC_VERSION < 40700 126 static inline void __TBB_machine_or(
volatile void *ptr, uintptr_t addend ) {
127 __sync_fetch_and_or(reinterpret_cast<volatile uintptr_t *>(ptr),addend);
130 static inline void __TBB_machine_and(
volatile void *ptr, uintptr_t addend ) {
131 __sync_fetch_and_and(reinterpret_cast<volatile uintptr_t *>(ptr),addend);
134 inline bool __TBB_machine_try_lock_byte( __TBB_atomic_flag &flag ) {
135 return __sync_lock_test_and_set(&flag,1)==0;
138 inline void __TBB_machine_unlock_byte( __TBB_atomic_flag &flag ) {
139 __sync_lock_release(&flag);
145 static inline void __TBB_machine_or(
volatile void *ptr, uintptr_t addend ) {
146 __atomic_fetch_or(reinterpret_cast<volatile uintptr_t *>(ptr),addend,__ATOMIC_SEQ_CST);
149 static inline void __TBB_machine_and(
volatile void *ptr, uintptr_t addend ) {
150 __atomic_fetch_and(reinterpret_cast<volatile uintptr_t *>(ptr),addend,__ATOMIC_SEQ_CST);
153 inline bool __TBB_machine_try_lock_byte( __TBB_atomic_flag &flag ) {
154 return !__atomic_test_and_set(&flag,__ATOMIC_ACQUIRE);
157 inline void __TBB_machine_unlock_byte( __TBB_atomic_flag &flag ) {
158 __atomic_clear(&flag,__ATOMIC_RELEASE);
161 #endif // __TBB_GCC_VERSION < 40700 164 #define __TBB_AtomicOR(P,V) __TBB_machine_or(P,V) 165 #define __TBB_AtomicAND(P,V) __TBB_machine_and(P,V) 167 #define __TBB_TryLockByte __TBB_machine_try_lock_byte 168 #define __TBB_UnlockByte __TBB_machine_unlock_byte 171 #define __TBB_Log2(V) __TBB_machine_lg(V) 174 #define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE 1 175 #define __TBB_USE_GENERIC_RELAXED_LOAD_STORE 1 176 #define __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE 1 178 #if __TBB_WORDSIZE==4 179 #define __TBB_USE_GENERIC_DWORD_LOAD_STORE 1 182 #if __TBB_x86_32 || __TBB_x86_64 183 #include "gcc_itsx.h" Definition: _flow_graph_async_msg_impl.h:32
The namespace tbb contains all components of the library.
Definition: parallel_for.h:44