17 #if !defined(__TBB_machine_H) || defined(__TBB_machine_gcc_generic_H) 18 #error Do not #include this internal file directly; use public TBB headers instead. 21 #define __TBB_machine_gcc_generic_H 26 #define __TBB_WORDSIZE __SIZEOF_POINTER__ 28 #if __TBB_GCC_64BIT_ATOMIC_BUILTINS_BROKEN 29 #define __TBB_64BIT_ATOMICS 0 33 #if __ANDROID__ && __TBB_generic_arch 34 #define __TBB_CPU_CTL_ENV_PRESENT 0 39 #if __BIG_ENDIAN__ || (defined(__BYTE_ORDER__) && __BYTE_ORDER__==__ORDER_BIG_ENDIAN__) 40 #define __TBB_ENDIANNESS __TBB_ENDIAN_BIG 41 #elif __LITTLE_ENDIAN__ || (defined(__BYTE_ORDER__) && __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__) 42 #define __TBB_ENDIANNESS __TBB_ENDIAN_LITTLE 43 #elif defined(__BYTE_ORDER__) 44 #define __TBB_ENDIANNESS __TBB_ENDIAN_UNSUPPORTED 46 #define __TBB_ENDIANNESS __TBB_ENDIAN_DETECT 49 #if __TBB_GCC_VERSION < 40700 57 #define __TBB_acquire_consistency_helper() __sync_synchronize() 58 #define __TBB_release_consistency_helper() __sync_synchronize() 59 #define __TBB_full_memory_fence() __sync_synchronize() 60 #define __TBB_control_consistency_helper() __sync_synchronize() 62 #define __TBB_MACHINE_DEFINE_ATOMICS(S,T) \ 63 inline T __TBB_machine_cmpswp##S( volatile void *ptr, T value, T comparand ) { \ 64 return __sync_val_compare_and_swap(reinterpret_cast<volatile T *>(ptr),comparand,value); \ 66 inline T __TBB_machine_fetchadd##S( volatile void *ptr, T value ) { \ 67 return __sync_fetch_and_add(reinterpret_cast<volatile T *>(ptr),value); \ 70 #define __TBB_USE_GENERIC_FETCH_STORE 1 75 #define __TBB_compiler_fence() __asm__ __volatile__("": : :"memory") 78 #define __TBB_acquire_consistency_helper() __TBB_compiler_fence(); __atomic_thread_fence(__ATOMIC_ACQUIRE); __TBB_compiler_fence() 79 #define __TBB_release_consistency_helper() __TBB_compiler_fence(); __atomic_thread_fence(__ATOMIC_RELEASE); __TBB_compiler_fence() 80 #define __TBB_full_memory_fence() __atomic_thread_fence(__ATOMIC_SEQ_CST) 81 #define __TBB_control_consistency_helper() __TBB_acquire_consistency_helper() 83 #define __TBB_MACHINE_DEFINE_ATOMICS(S,T) \ 84 inline T __TBB_machine_cmpswp##S( volatile void *ptr, T value, T comparand ) { \ 85 (void)__atomic_compare_exchange_n(reinterpret_cast<volatile T *>(ptr), &comparand, value, \ 86 false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); \ 89 inline T __TBB_machine_fetchadd##S( volatile void *ptr, T value ) { \ 90 return __atomic_fetch_add(reinterpret_cast<volatile T *>(ptr), value, __ATOMIC_SEQ_CST); \ 92 inline T __TBB_machine_fetchstore##S( volatile void *ptr, T value ) { \ 93 return __atomic_exchange_n(reinterpret_cast<volatile T *>(ptr), value, __ATOMIC_SEQ_CST); \ 96 #endif // __TBB_GCC_VERSION < 40700 103 #undef __TBB_MACHINE_DEFINE_ATOMICS 108 #if __TBB_GCC_VERSION < 40700 112 #define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE 1 113 #define __TBB_USE_GENERIC_RELAXED_LOAD_STORE 1 114 #define __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE 1 117 __sync_fetch_and_or(reinterpret_cast<volatile uintptr_t *>(ptr),addend);
121 __sync_fetch_and_and(reinterpret_cast<volatile uintptr_t *>(ptr),addend);
125 return __sync_lock_test_and_set(&flag,1)==0;
129 __sync_lock_release(&flag);
135 static inline void __TBB_machine_or(
volatile void *ptr, uintptr_t addend ) {
136 __atomic_fetch_or(reinterpret_cast<volatile uintptr_t *>(ptr),addend,__ATOMIC_SEQ_CST);
140 __atomic_fetch_and(reinterpret_cast<volatile uintptr_t *>(ptr),addend,__ATOMIC_SEQ_CST);
144 return !__atomic_test_and_set(&flag,__ATOMIC_ACQUIRE);
148 __atomic_clear(&flag,__ATOMIC_RELEASE);
157 template <
typename T,
int MemOrder>
158 inline T __TBB_machine_atomic_load(
const volatile T& location) {
160 T
value = __atomic_load_n(&location, MemOrder);
165 template <
typename T,
int MemOrder>
166 inline void __TBB_machine_atomic_store(
volatile T& location, T
value) {
168 __atomic_store_n(&location,
value, MemOrder);
172 template <
typename T,
size_t S>
173 struct machine_load_store {
175 return __TBB_machine_atomic_load<T, __ATOMIC_ACQUIRE>(location);
178 __TBB_machine_atomic_store<T, __ATOMIC_RELEASE>(location,
value);
182 template <
typename T,
size_t S>
183 struct machine_load_store_relaxed {
184 static inline T
load (
const volatile T& location ) {
185 return __TBB_machine_atomic_load<T, __ATOMIC_RELAXED>(location);
187 static inline void store (
volatile T& location, T
value ) {
188 __TBB_machine_atomic_store<T, __ATOMIC_RELAXED>(location,
value);
192 template <
typename T,
size_t S>
193 struct machine_load_store_seq_cst {
194 static T
load (
const volatile T& location ) {
195 return __TBB_machine_atomic_load<T, __ATOMIC_SEQ_CST>(location);
197 static void store (
volatile T &location, T
value ) {
198 __TBB_machine_atomic_store<T, __ATOMIC_SEQ_CST>(location,
value);
204 #endif // __TBB_GCC_VERSION < 40700 207 #define __TBB_AtomicOR(P,V) __TBB_machine_or(P,V) 208 #define __TBB_AtomicAND(P,V) __TBB_machine_and(P,V) 210 #define __TBB_TryLockByte __TBB_machine_try_lock_byte 211 #define __TBB_UnlockByte __TBB_machine_unlock_byte 215 inline int clz(
unsigned int x){
return __builtin_clz(x); }
216 inline int clz(
unsigned long int x){
return __builtin_clzl(x); }
217 inline int clz(
unsigned long long int x){
return __builtin_clzll(x); }
225 #define __TBB_Log2(V) __TBB_machine_lg(V) 227 #if __TBB_WORDSIZE==4 228 #define __TBB_USE_GENERIC_DWORD_LOAD_STORE 1 231 #if __TBB_x86_32 || __TBB_x86_64 static void store(volatile T &location, T value)
#define __TBB_MACHINE_DEFINE_ATOMICS(S, T)
__TBB_atomic __TBB_Flag __TBB_atomic_flag
static intptr_t __TBB_machine_lg(uintptr_t x)
static void store(T &location, T value)
static void __TBB_machine_and(volatile void *ptr, uintptr_t addend)
static T load(const volatile T &location)
static T load(const T &location)
#define __TBB_compiler_fence()
static void store_with_release(volatile T &location, T value)
static T load_with_acquire(const volatile T &location)
bool __TBB_machine_try_lock_byte(__TBB_atomic_flag &flag)
static void __TBB_machine_or(volatile void *ptr, uintptr_t addend)
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long value
void __TBB_machine_unlock_byte(__TBB_atomic_flag &flag)