Add an atomic add operation.
authorOwen Anderson <resistor@mac.com>
Tue, 23 Jun 2009 17:39:31 +0000 (17:39 +0000)
committerOwen Anderson <resistor@mac.com>
Tue, 23 Jun 2009 17:39:31 +0000 (17:39 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73964 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/System/Atomic.h
lib/System/Atomic.cpp

index adbb975298e8131bc634032914fc641e1dc95c11..c4049d40da797bbd3f47d5efa0bd799e027933e1 100644 (file)
@@ -26,6 +26,7 @@ namespace llvm {
                             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);
   }
 }
 
index 416f981df8273fe0ced309ff56a124e08d5a4bd2..6e751a30d4d291dc3f0252711f8a54f6bc2ffadc 100644 (file)
@@ -78,4 +78,17 @@ sys::cas_flag sys::AtomicDecrement(volatile sys::cas_flag* ptr) {
 #endif
 }
 
+sys::cas_flag sys::AtomicAdd(volatile sys::cas_flag* ptr, sys::cas_flag val) {
+#if LLVM_MULTITHREADED==0
+  *ptr += val;
+  return *ptr;
+#elif defined(__GNUC__)
+  return __sync_add_and_fetch(ptr, val);
+#elif defined(_MSC_VER)
+  return InterlockedAdd(ptr, val);
+#else
+#  error No atomic add implementation for your platform!
+#endif
+}
+