@@ -72,6 +72,13 @@ class alignas(Size) atomic_impl {
7272 return value.compare_exchange_weak (oldValue, newValue, successOrder,
7373 failureOrder);
7474 }
75+
76+ bool compare_exchange_strong (Value &oldValue, Value newValue,
77+ std::memory_order successOrder,
78+ std::memory_order failureOrder) {
79+ return value.compare_exchange_strong (oldValue, newValue, successOrder,
80+ failureOrder);
81+ }
7582};
7683
7784#if defined(_WIN64)
@@ -128,11 +135,14 @@ class alignas(2 * sizeof(void*)) atomic_impl<Value, 2 * sizeof(void*)> {
128135 bool compare_exchange_weak (Value &oldValue, Value newValue,
129136 std::memory_order successOrder,
130137 std::memory_order failureOrder) {
131- assert (failureOrder == std::memory_order_relaxed ||
132- failureOrder == std::memory_order_acquire ||
133- failureOrder == std::memory_order_consume);
134- assert (successOrder == std::memory_order_relaxed ||
135- successOrder == std::memory_order_release);
138+ // We do not have weak CAS intrinsics, fallback to strong
139+ return compare_exchange_strong (oldValue, newValue, successOrder,
140+ failureOrder);
141+ }
142+
143+ bool compare_exchange_strong (Value &oldValue, Value newValue,
144+ std::memory_order successOrder,
145+ std::memory_order failureOrder) {
136146#if SWIFT_HAS_MSVC_ARM_ATOMICS
137147 if (successOrder == std::memory_order_relaxed &&
138148 failureOrder != std::memory_order_acquire) {
@@ -180,7 +190,7 @@ class alignas(2 * sizeof(void*)) atomic_impl<Value, 2 * sizeof(void*)> {
180190template <class T >
181191class atomic : public impl ::atomic_impl<T> {
182192public:
183- atomic (T value) : impl::atomic_impl<T>(value) {}
193+ constexpr atomic (T value) : impl::atomic_impl<T>(value) {}
184194};
185195
186196} // end namespace swift
0 commit comments