diff options
author | Nico Weber <nicolasweber@gmx.de> | 2015-07-02 01:10:03 +0000 |
---|---|---|
committer | Nico Weber <nicolasweber@gmx.de> | 2015-07-02 01:10:03 +0000 |
commit | 5e8af5dbfb9d7d043cf39a7d4e49a45e8c4d1569 (patch) | |
tree | a74af4b10173cde8180cb5dc97519ca4cc5f587e /lib/sanitizer_common/sanitizer_atomic_msvc.h | |
parent | 54cfca3b4459e03fe782d6a4db03c48092928da2 (diff) | |
download | compiler-rt-5e8af5dbfb9d7d043cf39a7d4e49a45e8c4d1569.tar.gz |
Revert r241217, it breaks the build on Windows.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@241219 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common/sanitizer_atomic_msvc.h')
-rw-r--r-- | lib/sanitizer_common/sanitizer_atomic_msvc.h | 36 |
1 files changed, 14 insertions, 22 deletions
diff --git a/lib/sanitizer_common/sanitizer_atomic_msvc.h b/lib/sanitizer_common/sanitizer_atomic_msvc.h index 24d6f0f34..12ffef3ba 100644 --- a/lib/sanitizer_common/sanitizer_atomic_msvc.h +++ b/lib/sanitizer_common/sanitizer_atomic_msvc.h @@ -21,15 +21,6 @@ extern "C" void _mm_mfence(); #pragma intrinsic(_mm_mfence) extern "C" void _mm_pause(); #pragma intrinsic(_mm_pause) -extern "C" char _InterlockedExchange8( // NOLINT - char volatile *Addend, char Value); // NOLINT -#pragma intrinsic(_InterlockedExchange8) -extern "C" short _InterlockedExchange16( // NOLINT - short volatile *Addend, short Value); // NOLINT -#pragma intrinsic(_InterlockedExchange16) -extern "C" long _InterlockedExchange( // NOLINT - long volatile *Addend, long Value); // NOLINT -#pragma intrinsic(_InterlockedExchange) extern "C" long _InterlockedExchangeAdd( // NOLINT long volatile * Addend, long Value); // NOLINT #pragma intrinsic(_InterlockedExchangeAdd) @@ -154,25 +145,28 @@ INLINE u8 atomic_exchange(volatile atomic_uint8_t *a, u8 v, memory_order mo) { (void)mo; DCHECK(!((uptr)a % sizeof(*a))); - return (u8)_InterlockedExchange8((volatile char*)&a->val_dont_use, v); + __asm { + mov eax, a + mov cl, v + xchg [eax], cl // NOLINT + mov v, cl + } + return v; } INLINE u16 atomic_exchange(volatile atomic_uint16_t *a, u16 v, memory_order mo) { (void)mo; DCHECK(!((uptr)a % sizeof(*a))); - return (u16)_InterlockedExchange16((volatile short*)&a->val_dont_use, v); -} - -INLINE u32 atomic_exchange(volatile atomic_uint32_t *a, - u32 v, memory_order mo) { - (void)mo; - DCHECK(!((uptr)a % sizeof(*a))); - return (u32)_InterlockedExchange((volatile long*)&a->val_dont_use, v); + __asm { + mov eax, a + mov cx, v + xchg [eax], cx // NOLINT + mov v, cx + } + return v; } -#ifndef _WIN64 - INLINE bool atomic_compare_exchange_strong(volatile atomic_uint8_t *a, u8 *cmp, u8 xchgv, @@ -194,8 +188,6 @@ INLINE bool atomic_compare_exchange_strong(volatile atomic_uint8_t *a, return false; } -#endif - INLINE bool atomic_compare_exchange_strong(volatile atomic_uintptr_t *a, uptr *cmp, uptr xchg, |