diff options
author | Owen Anderson <resistor@mac.com> | 2009-06-23 21:19:04 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2009-06-23 21:19:04 +0000 |
commit | e0fa0b42b2b5e95c81ceff19401c7bb2152dd22a (patch) | |
tree | 98648008dfd2af3b7a592debcbeaf18942063fc4 | |
parent | 343beeb3868eb4dedf42aa46b17029bcee20dfa2 (diff) |
Add atomic multiply and divide operations, built on top of CompareAndSwap.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74004 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/System/Atomic.h | 2 | ||||
-rw-r--r-- | lib/System/Atomic.cpp | 18 |
2 files changed, 20 insertions, 0 deletions
diff --git a/include/llvm/System/Atomic.h b/include/llvm/System/Atomic.h index c4049d40da..4ec117be29 100644 --- a/include/llvm/System/Atomic.h +++ b/include/llvm/System/Atomic.h @@ -27,6 +27,8 @@ namespace llvm { 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); } } diff --git a/lib/System/Atomic.cpp b/lib/System/Atomic.cpp index 6e751a30d4..f9b55a186d 100644 --- a/lib/System/Atomic.cpp +++ b/lib/System/Atomic.cpp @@ -91,4 +91,22 @@ sys::cas_flag sys::AtomicAdd(volatile sys::cas_flag* ptr, sys::cas_flag val) { #endif } +sys::cas_flag sys::AtomicMul(volatile sys::cas_flag* ptr, sys::cas_flag val) { + sys::cas_flag original, result; + do { + original = *ptr; + result = original * val; + } while (sys::CompareAndSwap(ptr, result, original) != original); + return result; +} + +sys::cas_flag sys::AtomicDiv(volatile sys::cas_flag* ptr, sys::cas_flag val) { + sys::cas_flag original, result; + do { + original = *ptr; + result = original / val; + } while (sys::CompareAndSwap(ptr, result, original) != original); + + return result; +} |