21 #if !defined(__TBB_machine_H) || defined(__TBB_machine_icc_generic_H) 22 #error Do not #include this internal file directly; use public TBB headers instead. 25 #if ! __TBB_ICC_BUILTIN_ATOMICS_PRESENT 26 #error "Intel C++ Compiler of at least 12.0 version is needed to use ICC intrinsics port" 29 #define __TBB_machine_icc_generic_H 42 #define __TBB_WORDSIZE 4 44 #define __TBB_WORDSIZE 8 46 #define __TBB_ENDIANNESS __TBB_ENDIAN_LITTLE 49 #ifndef __TBB_compiler_fence 52 #pragma intrinsic(_ReadWriteBarrier) 53 #define __TBB_compiler_fence() _ReadWriteBarrier() 55 #define __TBB_compiler_fence() __asm__ __volatile__("": : :"memory") 59 #ifndef __TBB_full_memory_fence 62 #pragma intrinsic(_mm_mfence) 63 #define __TBB_full_memory_fence() _mm_mfence() 65 #define __TBB_full_memory_fence() __asm__ __volatile__("mfence": : :"memory") 69 #ifndef __TBB_control_consistency_helper 70 #define __TBB_control_consistency_helper() __TBB_compiler_fence() 73 namespace tbb {
namespace internal {
83 namespace icc_intrinsics_port {
97 template <
typename T,
size_t S>
107 template <
typename T,
size_t S>
109 static inline T
load (
const T& location ) {
117 template <
typename T,
size_t S>
119 static T
load (
const volatile T& location ) {
130 namespace tbb{
namespace internal {
namespace icc_intrinsics_port{
139 #define __TBB_MACHINE_DEFINE_ATOMICS(S,T,M) \ 140 inline T __TBB_machine_cmpswp##S##M( volatile void *ptr, T value, T comparand ) { \ 141 __atomic_compare_exchange_strong_explicit( \ 145 , tbb::internal::icc_intrinsics_port::M \ 146 , tbb::internal::icc_intrinsics_port::M); \ 150 inline T __TBB_machine_fetchstore##S##M(volatile void *ptr, T value) { \ 151 return __atomic_exchange_explicit((T*)ptr, value, tbb::internal::icc_intrinsics_port::M); \ 154 inline T __TBB_machine_fetchadd##S##M(volatile void *ptr, T value) { \ 155 return __atomic_fetch_add_explicit((T*)ptr, value, tbb::internal::icc_intrinsics_port::M); \ 179 #undef __TBB_MACHINE_DEFINE_ATOMICS 181 #define __TBB_USE_FENCED_ATOMICS 1 183 namespace tbb {
namespace internal {
184 #if __TBB_FORCE_64BIT_ALIGNMENT_BROKEN 194 template <
typename T>
195 struct machine_load_store<T,8> {
200 return __TBB_machine_generic_load8acquire(&location);
207 return __TBB_machine_generic_store8release(&location,
value);
212 template <
typename T>
213 struct machine_load_store_relaxed<T,8> {
214 static T
load(
const volatile T& location ) {
218 return __TBB_machine_generic_load8relaxed(&location);
221 static void store(
volatile T &location, T
value ) {
225 return __TBB_machine_generic_store8relaxed(&location,
value);
230 template <
typename T >
231 struct machine_load_store_seq_cst<T,8> {
232 static T
load (
const volatile T& location ) {
236 return __TBB_machine_generic_load8full_fence(&location);
241 static void store (
volatile T &location, T
value ) {
245 return __TBB_machine_generic_store8full_fence(&location,
value);
253 template <
typename T>
258 template <
typename T>
static void store_with_release(volatile T &location, T value)
#define __TBB_MACHINE_DEFINE_STORE8_GENERIC_FENCED(M)
static void store(volatile T &location, T value)
static T load_with_acquire(const volatile T &location)
static T load(const volatile T &location)
#define __TBB_MACHINE_DEFINE_LOAD8_GENERIC_FENCED(M)
T convert_argument(T value)
bool is_aligned(T *pointer, uintptr_t alignment)
A function to check if passed in pointer is aligned on a specific border.
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_OR(T *operand, T addend)
static void store(T &location, T value)
#define __TBB_MACHINE_DEFINE_ATOMICS(S, T, M)
void __TBB_machine_AND(T *operand, T addend)
static T load(const T &location)