#include "atomic.h" #ifdef _MSC_VER # include # ifdef _WIN64 # pragma intrinsic(_InterlockedExchange64) # pragma intrinsic(_InterlockedExchangeAdd64) # define InterlockedExchange_ _InterlockedExchange64 # define InterlockedExchangeAdd_ _InterlockedExchangeAdd64 # else # pragma intrinsic(_InterlockedExchange32) # pragma intrinsic(_InterlockedExchangeAdd32) # define InterlockedExchange_ _InterlockedExchange32 # define InterlockedExchangeAdd_ _InterlockedExchangeAdd32 # endif void kit_atomic_store_explicit(volatile KIT_ATOMIC_VAR *var, KIT_ATOMIC_VAR value, int memory_order) { InterlockedExchange_(var, value); } KIT_ATOMIC_VAR kit_atomic_load_explicit(volatile KIT_ATOMIC_VAR *var, int memory_order) { if (memory_order == memory_order_relaxed) return *var; return InterlockedExchangeAdd_(var, 0); } KIT_ATOMIC_VAR kit_atomic_fetch_add_explicit( volatile KIT_ATOMIC_VAR *var, KIT_ATOMIC_VAR value, int memory_order) { return InterlockedExchangeAdd_(var, value); } KIT_ATOMIC_VAR kit_atomic_exchange_explicit( volatile KIT_ATOMIC_VAR *var, KIT_ATOMIC_VAR value, int memory_order) { return InterlockedExchange_(var, value); } #endif