[compiler-rt] r208700 - [Sanitizer tests] Define 16- and 64-bit versions of atomic_compare_exchange_strong on Windows
Timur Iskhodzhanov
timurrrr at google.com
Tue May 13 07:23:25 PDT 2014
Author: timurrrr
Date: Tue May 13 09:23:25 2014
New Revision: 208700
URL: http://llvm.org/viewvc/llvm-project?rev=208700&view=rev
Log:
[Sanitizer tests] Define 16- and 64-bit versions of atomic_compare_exchange_strong on Windows
Reviewed at http://reviews.llvm.org/D3745
Modified:
compiler-rt/trunk/lib/sanitizer_common/sanitizer_atomic_msvc.h
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_atomic_msvc.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_atomic_msvc.h?rev=208700&r1=208699&r2=208700&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_atomic_msvc.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_atomic_msvc.h Tue May 13 09:23:25 2014
@@ -24,6 +24,15 @@ extern "C" void _mm_pause();
extern "C" long _InterlockedExchangeAdd( // NOLINT
long volatile * Addend, long Value); // NOLINT
#pragma intrinsic(_InterlockedExchangeAdd)
+extern "C" short _InterlockedCompareExchange16( // NOLINT
+ short volatile *Destination, // NOLINT
+ short Exchange, short Comparand); // NOLINT
+#pragma intrinsic(_InterlockedCompareExchange16)
+extern "C"
+long long _InterlockedCompareExchange64( // NOLINT
+ long long volatile *Destination, // NOLINT
+ long long Exchange, long long Comparand); // NOLINT
+#pragma intrinsic(_InterlockedCompareExchange64)
#ifdef _WIN64
extern "C" long long _InterlockedExchangeAdd64( // NOLINT
@@ -205,6 +214,19 @@ INLINE bool atomic_compare_exchange_stro
return false;
}
+INLINE bool atomic_compare_exchange_strong(volatile atomic_uint16_t *a,
+ u16 *cmp,
+ u16 xchg,
+ memory_order mo) {
+ u16 cmpv = *cmp;
+ u16 prev = (u16)_InterlockedCompareExchange16(
+ (volatile short*)&a->val_dont_use, (short)xchg, (short)cmpv);
+ if (prev == cmpv)
+ return true;
+ *cmp = prev;
+ return false;
+}
+
INLINE bool atomic_compare_exchange_strong(volatile atomic_uint32_t *a,
u32 *cmp,
u32 xchg,
@@ -215,6 +237,19 @@ INLINE bool atomic_compare_exchange_stro
if (prev == cmpv)
return true;
*cmp = prev;
+ return false;
+}
+
+INLINE bool atomic_compare_exchange_strong(volatile atomic_uint64_t *a,
+ u64 *cmp,
+ u64 xchg,
+ memory_order mo) {
+ u64 cmpv = *cmp;
+ u64 prev = (u64)_InterlockedCompareExchange64(
+ (volatile long long*)&a->val_dont_use, (long long)xchg, (long long)cmpv);
+ if (prev == cmpv)
+ return true;
+ *cmp = prev;
return false;
}
More information about the llvm-commits
mailing list