(original) (raw)

diff --git a/libc/src/__support/CPP/atomic.h b/libc/src/__support/CPP/atomic.h index 5e428940565b9..e273d998c0702 100644 --- a/libc/src/__support/CPP/atomic.h +++ b/libc/src/__support/CPP/atomic.h @@ -101,6 +101,36 @@ template struct Atomic { int(mem_ord), int(mem_ord)); } + // Atomic compare exchange (separate success and failure memory orders) + bool compare_exchange_strong( + T &expected, T desired, MemoryOrder success_order, + MemoryOrder failure_order, + [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) { + return __atomic_compare_exchange_n(&val, &expected, desired, false, + static_cast(success_order), + static_cast(failure_order)); + } + + // Atomic compare exchange (weak version) + bool compare_exchange_weak( + T &expected, T desired, MemoryOrder mem_ord = MemoryOrder::SEQ_CST, + [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) { + return __atomic_compare_exchange_n(&val, &expected, desired, true, + static_cast(mem_ord), + static_cast(mem_ord)); + } + + // Atomic compare exchange (weak version with separate success and failure + // memory orders) + bool compare_exchange_weak( + T &expected, T desired, MemoryOrder success_order, + MemoryOrder failure_order, + [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) { + return __atomic_compare_exchange_n(&val, &expected, desired, true, + static_cast(success_order), + static_cast(failure_order)); + } + T exchange(T desired, MemoryOrder mem_ord = MemoryOrder::SEQ_CST, [[maybe_unused]] MemoryScope mem_scope = MemoryScope::DEVICE) { #if __has_builtin(__scoped_atomic_exchange_n)