diff --git a/include/llvm/System/Atomic.h b/include/llvm/System/Atomic.h index fafd69797bf..eeb4fe26da1 100644 --- a/include/llvm/System/Atomic.h +++ b/include/llvm/System/Atomic.h @@ -14,75 +14,16 @@ #ifndef LLVM_SYSTEM_ATOMIC_H #define LLVM_SYSTEM_ATOMIC_H -#include "llvm/Config/config.h" - -#if defined(_MSC_VER) -#define NOMINMAX -#include -#endif - +#include namespace llvm { namespace sys { - - inline void MemoryFence() { -#if LLVM_MULTITHREADED==0 - return; -#else -# if defined(__GNUC__) - __sync_synchronize(); -# elif defined(_MSC_VER) - MemoryBarrier(); -# else -# error No memory fence implementation for your platform! -# endif -#endif -} - -#if LLVM_MULTITHREADED==0 - typedef unsigned long cas_flag; - template - inline T CompareAndSwap(volatile T* dest, - T exc, T c) { - T result = *dest; - if (result == c) - *dest = exc; - return result; - } -#elif defined(__GNUC__) - typedef unsigned long cas_flag; - template - inline T CompareAndSwap(volatile T* ptr, - T new_value, - T old_value) { - return __sync_val_compare_and_swap(ptr, old_value, new_value); - } -#elif defined(_MSC_VER) - typedef LONG cas_flag; - template - inline T CompareAndSwap(volatile T* ptr, - T new_value, - T old_value) { - if (sizeof(T) == 4) - return InterlockedCompareExchange(ptr, new_value, old_value); - else if (sizeof(T) == 8) - return InterlockedCompareExchange64(ptr, new_value, old_value); - else - assert(0 && "Unsupported compare-and-swap size!"); - } - - template - inline T* CompareAndSwap(volatile T** ptr, - T* new_value, - T* old_value) { - return InterlockedCompareExchangePtr(ptr, new_value, old_value); - } - - -#else -# error No compare-and-swap implementation for your platform! -#endif + void MemoryFence(); + typedef uint32_t cas_flag; + cas_flag CompareAndSwap(volatile cas_flag* ptr, + cas_flag new_value, + cas_flag old_value); } } diff --git a/lib/System/Atomic.cpp b/lib/System/Atomic.cpp new file mode 100644 index 00000000000..fa8a937c07f --- /dev/null +++ b/lib/System/Atomic.cpp @@ -0,0 +1,52 @@ +//===-- Atomic.cpp - Atomic Operations --------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This header file implements atomic operations. +// +//===----------------------------------------------------------------------===// + +#include "llvm/System/Atomic.h" +#include "llvm/Config/config.h" + +using namespace llvm; + +#if defined(_MSC_VER) +#include +#endif + +void sys::MemoryFence() { +#if LLVM_MULTITHREADED==0 + return; +#else +# if defined(__GNUC__) + __sync_synchronize(); +# elif defined(_MSC_VER) + MemoryBarrier(); +# else +# error No memory fence implementation for your platform! +# endif +#endif +} + +sys::cas_flag sys::CompareAndSwap(volatile sys::cas_flag* ptr, + sys::cas_flag new_value, + sys::cas_flag old_value) { +#if LLVM_MULTITHREADED==0 + T result = *dest; + if (result == c) + *dest = exc; + return result; +#elif defined(__GNUC__) + return __sync_val_compare_and_swap(ptr, old_value, new_value); +#elif defined(_MSC_VER) + return InterlockedCompareExchange(ptr, new_value, old_value); +#else +# error No compare-and-swap implementation for your platform! +#endif +} \ No newline at end of file