Handle lshr for i128 correctly on SPU also when
[oota-llvm.git] / include / llvm / System / Atomic.h
index 5830b37083b56986f82b0799a566f36c7aa2b60d..fc19369d11bdeb387f34ef02c741cea160736fad 100644 (file)
 #ifndef LLVM_SYSTEM_ATOMIC_H
 #define LLVM_SYSTEM_ATOMIC_H
 
-#if defined(_MSC_VER)
-#include <windows.h>
-#endif
-
+#include "llvm/System/DataTypes.h"
 
 namespace llvm {
   namespace sys {
-    
-    inline void MemoryFence() {
-#if !defined(ENABLE_THREADS) || ENABLE_THREADS == 0
-#  if defined(__GNUC__)
-      __asm__ __volatile__("" : : : "memory");
-#  elif defined(_MSC_VER)
-      __asm { };
-#  else
-#    error No memory fence implementation for your platform!
-#  endif
-#else
-#  if defined(__GNUC__)
-      __sync_synchronize();
-#  elif defined(_MSC_VER)
-      MemoryBarrier();
-#  else
-#    error No memory fence implementation for your platform!
-#  endif
-#endif
-}
-
-#if !defined(ENABLE_THREADS) || ENABLE_THREADS == 0
-    typedef unsigned long cas_flag;
-    template<typename T>
-    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<typename T>
-    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<typename T>
-    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<typename T>
-    inline T* CompareAndSwap<T*>(volatile T** ptr,
-                                T* new_value,
-                                T* old_value) {
-      return InterlockedCompareExchangePtr(ptr, new_value, old_value);
-    }
-
+    void MemoryFence();
 
+#ifdef _MSC_VER
+    typedef long cas_flag;
 #else
-#  error No compare-and-swap implementation for your platform!
+    typedef uint32_t cas_flag;
 #endif
-
+    cas_flag CompareAndSwap(volatile cas_flag* ptr,
+                            cas_flag new_value,
+                            cas_flag old_value);
+    cas_flag AtomicIncrement(volatile cas_flag* ptr);
+    cas_flag AtomicDecrement(volatile cas_flag* ptr);
+    cas_flag AtomicAdd(volatile cas_flag* ptr, cas_flag val);
+    cas_flag AtomicMul(volatile cas_flag* ptr, cas_flag val);
+    cas_flag AtomicDiv(volatile cas_flag* ptr, cas_flag val);
   }
 }