17 #if !defined(__TBB_machine_H) || defined(__TBB_machine_msvc_ia32_common_H) 18 #error Do not #include this internal file directly; use public TBB headers instead. 21 #define __TBB_machine_msvc_ia32_common_H 26 #if !_M_X64 || __INTEL_COMPILER 27 #define __TBB_X86_MSVC_INLINE_ASM_AVAILABLE 1 30 #define __TBB_X86_MSVC_INLINE_ASM_AVAILABLE 0 31 #define __TBB_NO_X86_MSVC_INLINE_ASM_MSG "The compiler being used is not supported (outdated?)" 35 #define __TBB_r(reg_name) r##reg_name 36 #define __TBB_W(name) name##64 37 namespace tbb {
namespace internal {
namespace msvc_intrinsics {
41 #define __TBB_r(reg_name) e##reg_name 42 #define __TBB_W(name) name 43 namespace tbb {
namespace internal {
namespace msvc_intrinsics {
48 #if __TBB_MSVC_PART_WORD_INTERLOCKED_INTRINSICS_PRESENT 50 #define __TBB_MACHINE_DEFINE_ATOMICS(S,B,T,U) \ 51 __pragma(intrinsic( _InterlockedCompareExchange##B )) \ 52 static inline T __TBB_machine_cmpswp##S ( volatile void * ptr, U value, U comparand ) { \ 53 return _InterlockedCompareExchange##B ( (T*)ptr, value, comparand ); \ 55 __pragma(intrinsic( _InterlockedExchangeAdd##B )) \ 56 static inline T __TBB_machine_fetchadd##S ( volatile void * ptr, U addend ) { \ 57 return _InterlockedExchangeAdd##B ( (T*)ptr, addend ); \ 59 __pragma(intrinsic( _InterlockedExchange##B )) \ 60 static inline T __TBB_machine_fetchstore##S ( volatile void * ptr, U value ) { \ 61 return _InterlockedExchange##B ( (T*)ptr, value ); \ 73 #undef __TBB_MACHINE_DEFINE_ATOMICS 76 #if _MSC_VER>=1300 || __INTEL_COMPILER>=1100 77 #pragma intrinsic(_ReadWriteBarrier) 78 #pragma intrinsic(_mm_mfence) 79 #define __TBB_compiler_fence() _ReadWriteBarrier() 80 #define __TBB_full_memory_fence() _mm_mfence() 81 #elif __TBB_X86_MSVC_INLINE_ASM_AVAILABLE 82 #define __TBB_compiler_fence() __asm { __asm nop } 83 #define __TBB_full_memory_fence() __asm { __asm mfence } 85 #error Unsupported compiler; define __TBB_{control,acquire,release}_consistency_helper to support it 88 #define __TBB_control_consistency_helper() __TBB_compiler_fence() 89 #define __TBB_acquire_consistency_helper() __TBB_compiler_fence() 90 #define __TBB_release_consistency_helper() __TBB_compiler_fence() 92 #if (_MSC_VER>=1300) || (__INTEL_COMPILER) 93 #pragma intrinsic(_mm_pause) 94 namespace tbb {
namespace internal {
namespace msvc_intrinsics {
95 static inline void pause (uintptr_t delay ) {
96 for (;delay>0; --delay )
100 #define __TBB_Pause(V) tbb::internal::msvc_intrinsics::pause(V) 101 #define __TBB_SINGLE_PAUSE _mm_pause() 103 #if !__TBB_X86_MSVC_INLINE_ASM_AVAILABLE 104 #error __TBB_NO_X86_MSVC_INLINE_ASM_MSG 106 namespace tbb {
namespace internal {
namespace msvc_inline_asm
119 #define __TBB_Pause(V) tbb::internal::msvc_inline_asm::pause(V) 120 #define __TBB_SINGLE_PAUSE __asm pause 123 #if (_MSC_VER>=1400 && !__INTEL_COMPILER) || (__INTEL_COMPILER>=1200) 126 #pragma intrinsic(__TBB_W(_BitScanReverse)) 127 namespace tbb {
namespace internal {
namespace msvc_intrinsics {
128 static inline uintptr_t
lg_bsr( uintptr_t i ){
130 __TBB_W(_BitScanReverse)( &j, i );
134 #define __TBB_Log2(V) tbb::internal::msvc_intrinsics::lg_bsr(V) 136 #if !__TBB_X86_MSVC_INLINE_ASM_AVAILABLE 137 #error __TBB_NO_X86_MSVC_INLINE_ASM_MSG 140 static inline uintptr_t
lg_bsr( uintptr_t i ){
150 #define __TBB_Log2(V) tbb::internal::msvc_inline_asm::lg_bsr(V) 154 #pragma intrinsic(__TBB_W(_InterlockedOr)) 155 #pragma intrinsic(__TBB_W(_InterlockedAnd)) 156 namespace tbb {
namespace internal {
namespace msvc_intrinsics {
157 static inline void lock_or(
volatile void *operand, intptr_t addend ){
158 __TBB_W(_InterlockedOr)((
volatile word*)operand, addend);
160 static inline void lock_and(
volatile void *operand, intptr_t addend ){
161 __TBB_W(_InterlockedAnd)((
volatile word*)operand, addend);
164 #define __TBB_AtomicOR(P,V) tbb::internal::msvc_intrinsics::lock_or(P,V) 165 #define __TBB_AtomicAND(P,V) tbb::internal::msvc_intrinsics::lock_and(P,V) 167 #if !__TBB_X86_MSVC_INLINE_ASM_AVAILABLE 168 #error __TBB_NO_X86_MSVC_INLINE_ASM_MSG 170 namespace tbb {
namespace internal {
namespace msvc_inline_asm {
171 static inline void lock_or(
volatile void *operand, __int32 addend ) {
179 static inline void lock_and(
volatile void *operand, __int32 addend ) {
188 #define __TBB_AtomicOR(P,V) tbb::internal::msvc_inline_asm::lock_or(P,V) 189 #define __TBB_AtomicAND(P,V) tbb::internal::msvc_inline_asm::lock_and(P,V) 192 #pragma intrinsic(__rdtsc) 197 #define __TBB_time_stamp() __TBB_machine_time_stamp() 200 #define __TBB_CPU_CTL_ENV_PRESENT 1 202 namespace tbb {
namespace internal {
class cpu_ctl_env; } }
203 #if __TBB_X86_MSVC_INLINE_ASM_AVAILABLE 243 #if !__TBB_WIN8UI_SUPPORT 244 extern "C" __declspec(dllimport)
int __stdcall SwitchToThread(
void );
245 #define __TBB_Yield() SwitchToThread() 248 #define __TBB_Yield() std::this_thread::yield() 262 #if __TBB_TSX_INTRINSICS_PRESENT 263 #define __TBB_machine_is_in_transaction _xtest 264 #define __TBB_machine_begin_transaction _xbegin 265 #define __TBB_machine_end_transaction _xend 268 #define __TBB_machine_transaction_conflict_abort() _xabort(0xFF) void __TBB_EXPORTED_FUNC __TBB_machine_end_transaction()
#define __TBB_MACHINE_DEFINE_ATOMICS(S, T)
static const int MXCSR_CONTROL_MASK
void __TBB_EXPORTED_FUNC __TBB_machine_transaction_conflict_abort()
static uintptr_t lg_bsr(uintptr_t i)
__int8 __TBB_EXPORTED_FUNC __TBB_machine_is_in_transaction()
void __TBB_EXPORTED_FUNC __TBB_machine_unlock_elided(volatile void *ptr)
namespace msvc_inline_asm static inline void pause(uintptr_t delay)
__declspec(dllimport) int __stdcall SwitchToThread(void)
#define __TBB_SINGLE_PAUSE
unsigned __int32 __TBB_EXPORTED_FUNC __TBB_machine_begin_transaction()
bool operator!=(const cpu_ctl_env &ctl) const
void __TBB_set_cpu_ctl_env(const tbb::internal::cpu_ctl_env *ctl)
#define __TBB_EXPORTED_FUNC
__int8 __TBB_EXPORTED_FUNC __TBB_machine_try_lock_elided(volatile void *ptr)
static void __TBB_machine_try_lock_elided_cancel()
static void lock_and(volatile void *operand, __int32 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 * lock
void __TBB_get_cpu_ctl_env(tbb::internal::cpu_ctl_env *ctl)
static tbb::internal::machine_tsc_t __TBB_machine_time_stamp()
static void lock_or(volatile void *operand, __int32 addend)
#define __TBB_r(reg_name)