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