Index: lib/sanitizer_common/sanitizer_atomic_msvc.h =================================================================== --- lib/sanitizer_common/sanitizer_atomic_msvc.h +++ 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 @@ -176,9 +180,12 @@ u8 xchgv, memory_order mo) { #ifdef _WIN64 - // TODO(wwchrome): Implement same functionality without inline asm. - // Inline asm not supported in Win64. - __debugbreak(); + u8 cmpv = *cmp; + u8 prev = (u8)_InterlockedCompareExchange8( + (volatile char*)&a->val_dont_use, (char)xchgv, (char)cmpv); + if (prev == cmpv) + return true; + *cmp = prev; return false; #else (void)mo;