xref: /llvm-project/libcxx/include/__atomic/support/c11.h (revision 0e34f3f4968d8d32a64e26777541f939deb2274c)
1*0e34f3f4SLouis Dionne //===----------------------------------------------------------------------===//
2*0e34f3f4SLouis Dionne //
3*0e34f3f4SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0e34f3f4SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5*0e34f3f4SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0e34f3f4SLouis Dionne //
7*0e34f3f4SLouis Dionne //===----------------------------------------------------------------------===//
8*0e34f3f4SLouis Dionne 
9*0e34f3f4SLouis Dionne #ifndef _LIBCPP___ATOMIC_SUPPORT_C11_H
10*0e34f3f4SLouis Dionne #define _LIBCPP___ATOMIC_SUPPORT_C11_H
11*0e34f3f4SLouis Dionne 
12*0e34f3f4SLouis Dionne #include <__atomic/memory_order.h>
13*0e34f3f4SLouis Dionne #include <__config>
14*0e34f3f4SLouis Dionne #include <__cstddef/ptrdiff_t.h>
15*0e34f3f4SLouis Dionne #include <__memory/addressof.h>
16*0e34f3f4SLouis Dionne #include <__type_traits/remove_const.h>
17*0e34f3f4SLouis Dionne 
18*0e34f3f4SLouis Dionne #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
19*0e34f3f4SLouis Dionne #  pragma GCC system_header
20*0e34f3f4SLouis Dionne #endif
21*0e34f3f4SLouis Dionne 
22*0e34f3f4SLouis Dionne //
23*0e34f3f4SLouis Dionne // This file implements support for C11-style atomics
24*0e34f3f4SLouis Dionne //
25*0e34f3f4SLouis Dionne 
26*0e34f3f4SLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD
27*0e34f3f4SLouis Dionne 
28*0e34f3f4SLouis Dionne template <typename _Tp>
29*0e34f3f4SLouis Dionne struct __cxx_atomic_base_impl {
30*0e34f3f4SLouis Dionne   _LIBCPP_HIDE_FROM_ABI
31*0e34f3f4SLouis Dionne #ifndef _LIBCPP_CXX03_LANG
32*0e34f3f4SLouis Dionne   __cxx_atomic_base_impl() _NOEXCEPT = default;
33*0e34f3f4SLouis Dionne #else
34*0e34f3f4SLouis Dionne   __cxx_atomic_base_impl() _NOEXCEPT : __a_value() {
35*0e34f3f4SLouis Dionne   }
36*0e34f3f4SLouis Dionne #endif // _LIBCPP_CXX03_LANG
37*0e34f3f4SLouis Dionne   _LIBCPP_CONSTEXPR explicit __cxx_atomic_base_impl(_Tp __value) _NOEXCEPT : __a_value(__value) {}
38*0e34f3f4SLouis Dionne   _LIBCPP_DISABLE_EXTENSION_WARNING _Atomic(_Tp) __a_value;
39*0e34f3f4SLouis Dionne };
40*0e34f3f4SLouis Dionne 
41*0e34f3f4SLouis Dionne #define __cxx_atomic_is_lock_free(__s) __c11_atomic_is_lock_free(__s)
42*0e34f3f4SLouis Dionne 
43*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI inline void __cxx_atomic_thread_fence(memory_order __order) _NOEXCEPT {
44*0e34f3f4SLouis Dionne   __c11_atomic_thread_fence(static_cast<__memory_order_underlying_t>(__order));
45*0e34f3f4SLouis Dionne }
46*0e34f3f4SLouis Dionne 
47*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI inline void __cxx_atomic_signal_fence(memory_order __order) _NOEXCEPT {
48*0e34f3f4SLouis Dionne   __c11_atomic_signal_fence(static_cast<__memory_order_underlying_t>(__order));
49*0e34f3f4SLouis Dionne }
50*0e34f3f4SLouis Dionne 
51*0e34f3f4SLouis Dionne template <class _Tp>
52*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI void __cxx_atomic_init(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __val) _NOEXCEPT {
53*0e34f3f4SLouis Dionne   __c11_atomic_init(std::addressof(__a->__a_value), __val);
54*0e34f3f4SLouis Dionne }
55*0e34f3f4SLouis Dionne template <class _Tp>
56*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI void __cxx_atomic_init(__cxx_atomic_base_impl<_Tp>* __a, _Tp __val) _NOEXCEPT {
57*0e34f3f4SLouis Dionne   __c11_atomic_init(std::addressof(__a->__a_value), __val);
58*0e34f3f4SLouis Dionne }
59*0e34f3f4SLouis Dionne 
60*0e34f3f4SLouis Dionne template <class _Tp>
61*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI void
62*0e34f3f4SLouis Dionne __cxx_atomic_store(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __val, memory_order __order) _NOEXCEPT {
63*0e34f3f4SLouis Dionne   __c11_atomic_store(std::addressof(__a->__a_value), __val, static_cast<__memory_order_underlying_t>(__order));
64*0e34f3f4SLouis Dionne }
65*0e34f3f4SLouis Dionne template <class _Tp>
66*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI void
67*0e34f3f4SLouis Dionne __cxx_atomic_store(__cxx_atomic_base_impl<_Tp>* __a, _Tp __val, memory_order __order) _NOEXCEPT {
68*0e34f3f4SLouis Dionne   __c11_atomic_store(std::addressof(__a->__a_value), __val, static_cast<__memory_order_underlying_t>(__order));
69*0e34f3f4SLouis Dionne }
70*0e34f3f4SLouis Dionne 
71*0e34f3f4SLouis Dionne template <class _Tp>
72*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp
73*0e34f3f4SLouis Dionne __cxx_atomic_load(__cxx_atomic_base_impl<_Tp> const volatile* __a, memory_order __order) _NOEXCEPT {
74*0e34f3f4SLouis Dionne   using __ptr_type = __remove_const_t<decltype(__a->__a_value)>*;
75*0e34f3f4SLouis Dionne   return __c11_atomic_load(
76*0e34f3f4SLouis Dionne       const_cast<__ptr_type>(std::addressof(__a->__a_value)), static_cast<__memory_order_underlying_t>(__order));
77*0e34f3f4SLouis Dionne }
78*0e34f3f4SLouis Dionne template <class _Tp>
79*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp __cxx_atomic_load(__cxx_atomic_base_impl<_Tp> const* __a, memory_order __order) _NOEXCEPT {
80*0e34f3f4SLouis Dionne   using __ptr_type = __remove_const_t<decltype(__a->__a_value)>*;
81*0e34f3f4SLouis Dionne   return __c11_atomic_load(
82*0e34f3f4SLouis Dionne       const_cast<__ptr_type>(std::addressof(__a->__a_value)), static_cast<__memory_order_underlying_t>(__order));
83*0e34f3f4SLouis Dionne }
84*0e34f3f4SLouis Dionne 
85*0e34f3f4SLouis Dionne template <class _Tp>
86*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI void
87*0e34f3f4SLouis Dionne __cxx_atomic_load_inplace(__cxx_atomic_base_impl<_Tp> const volatile* __a, _Tp* __dst, memory_order __order) _NOEXCEPT {
88*0e34f3f4SLouis Dionne   using __ptr_type = __remove_const_t<decltype(__a->__a_value)>*;
89*0e34f3f4SLouis Dionne   *__dst           = __c11_atomic_load(
90*0e34f3f4SLouis Dionne       const_cast<__ptr_type>(std::addressof(__a->__a_value)), static_cast<__memory_order_underlying_t>(__order));
91*0e34f3f4SLouis Dionne }
92*0e34f3f4SLouis Dionne template <class _Tp>
93*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI void
94*0e34f3f4SLouis Dionne __cxx_atomic_load_inplace(__cxx_atomic_base_impl<_Tp> const* __a, _Tp* __dst, memory_order __order) _NOEXCEPT {
95*0e34f3f4SLouis Dionne   using __ptr_type = __remove_const_t<decltype(__a->__a_value)>*;
96*0e34f3f4SLouis Dionne   *__dst           = __c11_atomic_load(
97*0e34f3f4SLouis Dionne       const_cast<__ptr_type>(std::addressof(__a->__a_value)), static_cast<__memory_order_underlying_t>(__order));
98*0e34f3f4SLouis Dionne }
99*0e34f3f4SLouis Dionne 
100*0e34f3f4SLouis Dionne template <class _Tp>
101*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp
102*0e34f3f4SLouis Dionne __cxx_atomic_exchange(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __value, memory_order __order) _NOEXCEPT {
103*0e34f3f4SLouis Dionne   return __c11_atomic_exchange(
104*0e34f3f4SLouis Dionne       std::addressof(__a->__a_value), __value, static_cast<__memory_order_underlying_t>(__order));
105*0e34f3f4SLouis Dionne }
106*0e34f3f4SLouis Dionne template <class _Tp>
107*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp
108*0e34f3f4SLouis Dionne __cxx_atomic_exchange(__cxx_atomic_base_impl<_Tp>* __a, _Tp __value, memory_order __order) _NOEXCEPT {
109*0e34f3f4SLouis Dionne   return __c11_atomic_exchange(
110*0e34f3f4SLouis Dionne       std::addressof(__a->__a_value), __value, static_cast<__memory_order_underlying_t>(__order));
111*0e34f3f4SLouis Dionne }
112*0e34f3f4SLouis Dionne 
113*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI inline _LIBCPP_CONSTEXPR memory_order __to_failure_order(memory_order __order) {
114*0e34f3f4SLouis Dionne   // Avoid switch statement to make this a constexpr.
115*0e34f3f4SLouis Dionne   return __order == memory_order_release
116*0e34f3f4SLouis Dionne            ? memory_order_relaxed
117*0e34f3f4SLouis Dionne            : (__order == memory_order_acq_rel ? memory_order_acquire : __order);
118*0e34f3f4SLouis Dionne }
119*0e34f3f4SLouis Dionne 
120*0e34f3f4SLouis Dionne template <class _Tp>
121*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI bool __cxx_atomic_compare_exchange_strong(
122*0e34f3f4SLouis Dionne     __cxx_atomic_base_impl<_Tp> volatile* __a,
123*0e34f3f4SLouis Dionne     _Tp* __expected,
124*0e34f3f4SLouis Dionne     _Tp __value,
125*0e34f3f4SLouis Dionne     memory_order __success,
126*0e34f3f4SLouis Dionne     memory_order __failure) _NOEXCEPT {
127*0e34f3f4SLouis Dionne   return __c11_atomic_compare_exchange_strong(
128*0e34f3f4SLouis Dionne       std::addressof(__a->__a_value),
129*0e34f3f4SLouis Dionne       __expected,
130*0e34f3f4SLouis Dionne       __value,
131*0e34f3f4SLouis Dionne       static_cast<__memory_order_underlying_t>(__success),
132*0e34f3f4SLouis Dionne       static_cast<__memory_order_underlying_t>(__to_failure_order(__failure)));
133*0e34f3f4SLouis Dionne }
134*0e34f3f4SLouis Dionne template <class _Tp>
135*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI bool __cxx_atomic_compare_exchange_strong(
136*0e34f3f4SLouis Dionne     __cxx_atomic_base_impl<_Tp>* __a, _Tp* __expected, _Tp __value, memory_order __success, memory_order __failure)
137*0e34f3f4SLouis Dionne     _NOEXCEPT {
138*0e34f3f4SLouis Dionne   return __c11_atomic_compare_exchange_strong(
139*0e34f3f4SLouis Dionne       std::addressof(__a->__a_value),
140*0e34f3f4SLouis Dionne       __expected,
141*0e34f3f4SLouis Dionne       __value,
142*0e34f3f4SLouis Dionne       static_cast<__memory_order_underlying_t>(__success),
143*0e34f3f4SLouis Dionne       static_cast<__memory_order_underlying_t>(__to_failure_order(__failure)));
144*0e34f3f4SLouis Dionne }
145*0e34f3f4SLouis Dionne 
146*0e34f3f4SLouis Dionne template <class _Tp>
147*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI bool __cxx_atomic_compare_exchange_weak(
148*0e34f3f4SLouis Dionne     __cxx_atomic_base_impl<_Tp> volatile* __a,
149*0e34f3f4SLouis Dionne     _Tp* __expected,
150*0e34f3f4SLouis Dionne     _Tp __value,
151*0e34f3f4SLouis Dionne     memory_order __success,
152*0e34f3f4SLouis Dionne     memory_order __failure) _NOEXCEPT {
153*0e34f3f4SLouis Dionne   return __c11_atomic_compare_exchange_weak(
154*0e34f3f4SLouis Dionne       std::addressof(__a->__a_value),
155*0e34f3f4SLouis Dionne       __expected,
156*0e34f3f4SLouis Dionne       __value,
157*0e34f3f4SLouis Dionne       static_cast<__memory_order_underlying_t>(__success),
158*0e34f3f4SLouis Dionne       static_cast<__memory_order_underlying_t>(__to_failure_order(__failure)));
159*0e34f3f4SLouis Dionne }
160*0e34f3f4SLouis Dionne template <class _Tp>
161*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI bool __cxx_atomic_compare_exchange_weak(
162*0e34f3f4SLouis Dionne     __cxx_atomic_base_impl<_Tp>* __a, _Tp* __expected, _Tp __value, memory_order __success, memory_order __failure)
163*0e34f3f4SLouis Dionne     _NOEXCEPT {
164*0e34f3f4SLouis Dionne   return __c11_atomic_compare_exchange_weak(
165*0e34f3f4SLouis Dionne       std::addressof(__a->__a_value),
166*0e34f3f4SLouis Dionne       __expected,
167*0e34f3f4SLouis Dionne       __value,
168*0e34f3f4SLouis Dionne       static_cast<__memory_order_underlying_t>(__success),
169*0e34f3f4SLouis Dionne       static_cast<__memory_order_underlying_t>(__to_failure_order(__failure)));
170*0e34f3f4SLouis Dionne }
171*0e34f3f4SLouis Dionne 
172*0e34f3f4SLouis Dionne template <class _Tp>
173*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp
174*0e34f3f4SLouis Dionne __cxx_atomic_fetch_add(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __delta, memory_order __order) _NOEXCEPT {
175*0e34f3f4SLouis Dionne   return __c11_atomic_fetch_add(
176*0e34f3f4SLouis Dionne       std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order));
177*0e34f3f4SLouis Dionne }
178*0e34f3f4SLouis Dionne template <class _Tp>
179*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp
180*0e34f3f4SLouis Dionne __cxx_atomic_fetch_add(__cxx_atomic_base_impl<_Tp>* __a, _Tp __delta, memory_order __order) _NOEXCEPT {
181*0e34f3f4SLouis Dionne   return __c11_atomic_fetch_add(
182*0e34f3f4SLouis Dionne       std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order));
183*0e34f3f4SLouis Dionne }
184*0e34f3f4SLouis Dionne 
185*0e34f3f4SLouis Dionne template <class _Tp>
186*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp*
187*0e34f3f4SLouis Dionne __cxx_atomic_fetch_add(__cxx_atomic_base_impl<_Tp*> volatile* __a, ptrdiff_t __delta, memory_order __order) _NOEXCEPT {
188*0e34f3f4SLouis Dionne   return __c11_atomic_fetch_add(
189*0e34f3f4SLouis Dionne       std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order));
190*0e34f3f4SLouis Dionne }
191*0e34f3f4SLouis Dionne template <class _Tp>
192*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp*
193*0e34f3f4SLouis Dionne __cxx_atomic_fetch_add(__cxx_atomic_base_impl<_Tp*>* __a, ptrdiff_t __delta, memory_order __order) _NOEXCEPT {
194*0e34f3f4SLouis Dionne   return __c11_atomic_fetch_add(
195*0e34f3f4SLouis Dionne       std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order));
196*0e34f3f4SLouis Dionne }
197*0e34f3f4SLouis Dionne 
198*0e34f3f4SLouis Dionne template <class _Tp>
199*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp
200*0e34f3f4SLouis Dionne __cxx_atomic_fetch_sub(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __delta, memory_order __order) _NOEXCEPT {
201*0e34f3f4SLouis Dionne   return __c11_atomic_fetch_sub(
202*0e34f3f4SLouis Dionne       std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order));
203*0e34f3f4SLouis Dionne }
204*0e34f3f4SLouis Dionne template <class _Tp>
205*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp
206*0e34f3f4SLouis Dionne __cxx_atomic_fetch_sub(__cxx_atomic_base_impl<_Tp>* __a, _Tp __delta, memory_order __order) _NOEXCEPT {
207*0e34f3f4SLouis Dionne   return __c11_atomic_fetch_sub(
208*0e34f3f4SLouis Dionne       std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order));
209*0e34f3f4SLouis Dionne }
210*0e34f3f4SLouis Dionne template <class _Tp>
211*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp*
212*0e34f3f4SLouis Dionne __cxx_atomic_fetch_sub(__cxx_atomic_base_impl<_Tp*> volatile* __a, ptrdiff_t __delta, memory_order __order) _NOEXCEPT {
213*0e34f3f4SLouis Dionne   return __c11_atomic_fetch_sub(
214*0e34f3f4SLouis Dionne       std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order));
215*0e34f3f4SLouis Dionne }
216*0e34f3f4SLouis Dionne template <class _Tp>
217*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp*
218*0e34f3f4SLouis Dionne __cxx_atomic_fetch_sub(__cxx_atomic_base_impl<_Tp*>* __a, ptrdiff_t __delta, memory_order __order) _NOEXCEPT {
219*0e34f3f4SLouis Dionne   return __c11_atomic_fetch_sub(
220*0e34f3f4SLouis Dionne       std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order));
221*0e34f3f4SLouis Dionne }
222*0e34f3f4SLouis Dionne 
223*0e34f3f4SLouis Dionne template <class _Tp>
224*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp
225*0e34f3f4SLouis Dionne __cxx_atomic_fetch_and(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __pattern, memory_order __order) _NOEXCEPT {
226*0e34f3f4SLouis Dionne   return __c11_atomic_fetch_and(
227*0e34f3f4SLouis Dionne       std::addressof(__a->__a_value), __pattern, static_cast<__memory_order_underlying_t>(__order));
228*0e34f3f4SLouis Dionne }
229*0e34f3f4SLouis Dionne template <class _Tp>
230*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp
231*0e34f3f4SLouis Dionne __cxx_atomic_fetch_and(__cxx_atomic_base_impl<_Tp>* __a, _Tp __pattern, memory_order __order) _NOEXCEPT {
232*0e34f3f4SLouis Dionne   return __c11_atomic_fetch_and(
233*0e34f3f4SLouis Dionne       std::addressof(__a->__a_value), __pattern, static_cast<__memory_order_underlying_t>(__order));
234*0e34f3f4SLouis Dionne }
235*0e34f3f4SLouis Dionne 
236*0e34f3f4SLouis Dionne template <class _Tp>
237*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp
238*0e34f3f4SLouis Dionne __cxx_atomic_fetch_or(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __pattern, memory_order __order) _NOEXCEPT {
239*0e34f3f4SLouis Dionne   return __c11_atomic_fetch_or(
240*0e34f3f4SLouis Dionne       std::addressof(__a->__a_value), __pattern, static_cast<__memory_order_underlying_t>(__order));
241*0e34f3f4SLouis Dionne }
242*0e34f3f4SLouis Dionne template <class _Tp>
243*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp
244*0e34f3f4SLouis Dionne __cxx_atomic_fetch_or(__cxx_atomic_base_impl<_Tp>* __a, _Tp __pattern, memory_order __order) _NOEXCEPT {
245*0e34f3f4SLouis Dionne   return __c11_atomic_fetch_or(
246*0e34f3f4SLouis Dionne       std::addressof(__a->__a_value), __pattern, static_cast<__memory_order_underlying_t>(__order));
247*0e34f3f4SLouis Dionne }
248*0e34f3f4SLouis Dionne 
249*0e34f3f4SLouis Dionne template <class _Tp>
250*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp
251*0e34f3f4SLouis Dionne __cxx_atomic_fetch_xor(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __pattern, memory_order __order) _NOEXCEPT {
252*0e34f3f4SLouis Dionne   return __c11_atomic_fetch_xor(
253*0e34f3f4SLouis Dionne       std::addressof(__a->__a_value), __pattern, static_cast<__memory_order_underlying_t>(__order));
254*0e34f3f4SLouis Dionne }
255*0e34f3f4SLouis Dionne template <class _Tp>
256*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp
257*0e34f3f4SLouis Dionne __cxx_atomic_fetch_xor(__cxx_atomic_base_impl<_Tp>* __a, _Tp __pattern, memory_order __order) _NOEXCEPT {
258*0e34f3f4SLouis Dionne   return __c11_atomic_fetch_xor(
259*0e34f3f4SLouis Dionne       std::addressof(__a->__a_value), __pattern, static_cast<__memory_order_underlying_t>(__order));
260*0e34f3f4SLouis Dionne }
261*0e34f3f4SLouis Dionne 
262*0e34f3f4SLouis Dionne _LIBCPP_END_NAMESPACE_STD
263*0e34f3f4SLouis Dionne 
264*0e34f3f4SLouis Dionne #endif // _LIBCPP___ATOMIC_SUPPORT_C11_H
265