[llvm-commits] [llvm] r167309 - /llvm/trunk/lib/Support/Atomic.cpp
Rafael Espindola
rafael.espindola at gmail.com
Fri Nov 2 13:54:45 PDT 2012
Author: rafael
Date: Fri Nov 2 15:54:45 2012
New Revision: 167309
URL: http://llvm.org/viewvc/llvm-project?rev=167309&view=rev
Log:
XLC supports the same atomic functions as GCC, use them.
Patch by Kai.
Modified:
llvm/trunk/lib/Support/Atomic.cpp
Modified: llvm/trunk/lib/Support/Atomic.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Atomic.cpp?rev=167309&r1=167308&r2=167309&view=diff
==============================================================================
--- llvm/trunk/lib/Support/Atomic.cpp (original)
+++ llvm/trunk/lib/Support/Atomic.cpp Fri Nov 2 15:54:45 2012
@@ -21,11 +21,15 @@
#undef MemoryFence
#endif
+#if defined(__GNUC__) || (defined(__IBMCPP__) && __IBMCPP__ >= 1210)
+#define GNU_ATOMICS
+#endif
+
void sys::MemoryFence() {
#if LLVM_HAS_ATOMICS == 0
return;
#else
-# if defined(__GNUC__)
+# if defined(GNU_ATOMICS)
__sync_synchronize();
# elif defined(_MSC_VER)
MemoryBarrier();
@@ -43,7 +47,7 @@
if (result == old_value)
*ptr = new_value;
return result;
-#elif defined(__GNUC__)
+#elif defined(GNU_ATOMICS)
return __sync_val_compare_and_swap(ptr, old_value, new_value);
#elif defined(_MSC_VER)
return InterlockedCompareExchange(ptr, new_value, old_value);
@@ -56,7 +60,7 @@
#if LLVM_HAS_ATOMICS == 0
++(*ptr);
return *ptr;
-#elif defined(__GNUC__)
+#elif defined(GNU_ATOMICS)
return __sync_add_and_fetch(ptr, 1);
#elif defined(_MSC_VER)
return InterlockedIncrement(ptr);
@@ -69,7 +73,7 @@
#if LLVM_HAS_ATOMICS == 0
--(*ptr);
return *ptr;
-#elif defined(__GNUC__)
+#elif defined(GNU_ATOMICS)
return __sync_sub_and_fetch(ptr, 1);
#elif defined(_MSC_VER)
return InterlockedDecrement(ptr);
@@ -82,7 +86,7 @@
#if LLVM_HAS_ATOMICS == 0
*ptr += val;
return *ptr;
-#elif defined(__GNUC__)
+#elif defined(GNU_ATOMICS)
return __sync_add_and_fetch(ptr, val);
#elif defined(_MSC_VER)
return InterlockedExchangeAdd(ptr, val) + val;
More information about the llvm-commits
mailing list