Index: compiler-rt/trunk/lib/sanitizer_common/sanitizer_atomic_msvc.h =================================================================== --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_atomic_msvc.h +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_atomic_msvc.h @@ -33,6 +33,10 @@ extern "C" long _InterlockedExchangeAdd( // NOLINT long volatile * Addend, long Value); // NOLINT #pragma intrinsic(_InterlockedExchangeAdd) +extern "C" char _InterlockedCompareExchange8( // NOLINT + char volatile *Destination, // NOLINT + char Exchange, char Comparand); // NOLINT +#pragma intrinsic(_InterlockedCompareExchange8) extern "C" short _InterlockedCompareExchange16( // NOLINT short volatile *Destination, // NOLINT short Exchange, short Comparand); // NOLINT @@ -175,15 +179,13 @@ u8 *cmp, u8 xchgv, memory_order mo) { -#ifdef _WIN64 - // TODO(wwchrome): Implement same functionality without inline asm. - // Inline asm not supported in Win64. - __debugbreak(); - return false; -#else (void)mo; DCHECK(!((uptr)a % sizeof(*a))); u8 cmpv = *cmp; +#ifdef _WIN64 + u8 prev = (u8)_InterlockedCompareExchange8( + (volatile char*)&a->val_dont_use, (char)xchgv, (char)cmpv); +#else u8 prev; __asm { mov al, cmpv @@ -192,11 +194,11 @@ lock cmpxchg [ecx], dl mov prev, al } +#endif if (prev == cmpv) return true; *cmp = prev; return false; -#endif } INLINE bool atomic_compare_exchange_strong(volatile atomic_uintptr_t *a,