Filling out the infrastructure in <atomic>

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@115577 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/atomic b/include/atomic
index edcfd2e..e55d092 100644
--- a/include/atomic
+++ b/include/atomic
@@ -2439,7 +2439,7 @@
 
 template <class _Tp>
 _Tp
-__load_seq_cst(const volatile _Tp* __obj)
+__load_seq_cst(_Tp const volatile* __obj)
 {
     unique_lock<mutex> _(__not_atomic_mut());
     return *__obj;
@@ -2449,7 +2449,7 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_load_seq_cst(const volatile bool* __obj)
+__choose_load_seq_cst(bool const volatile* __obj)
 {
 #if __has_feature(__atomic_load_seq_cst_b)
     return __atomic_load_seq_cst(__obj);
@@ -2460,7 +2460,7 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_load_acquire(const volatile bool* __obj)
+__choose_load_acquire(bool const volatile* __obj)
 {
 #if __has_feature(__atomic_load_acquire_b)
     return __atomic_load_acquire(__obj);
@@ -2471,7 +2471,7 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_load_consume(const volatile bool* __obj)
+__choose_load_consume(bool const volatile* __obj)
 {
 #if __has_feature(__atomic_load_consume_b)
     return __atomic_load_consume(__obj);
@@ -2482,7 +2482,7 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_load_relaxed(const volatile bool* __obj)
+__choose_load_relaxed(bool const volatile* __obj)
 {
 #if __has_feature(__atomic_load_relaxed_b)
     return __atomic_load_relaxed(__obj);
@@ -2491,11 +2491,705 @@
 #endif
 }
 
+// load char
+
+inline _LIBCPP_INLINE_VISIBILITY
+char
+__choose_load_seq_cst(char const volatile* __obj)
+{
+#if __has_feature(__atomic_load_seq_cst_c)
+    return __atomic_load_seq_cst(__obj);
+#else
+    return __load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+char
+__choose_load_acquire(char const volatile* __obj)
+{
+#if __has_feature(__atomic_load_acquire_c)
+    return __atomic_load_acquire(__obj);
+#else
+    return __choose_load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+char
+__choose_load_consume(char const volatile* __obj)
+{
+#if __has_feature(__atomic_load_consume_c)
+    return __atomic_load_consume(__obj);
+#else
+    return __choose_load_acquire(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+char
+__choose_load_relaxed(char const volatile* __obj)
+{
+#if __has_feature(__atomic_load_relaxed_c)
+    return __atomic_load_relaxed(__obj);
+#else
+    return __choose_load_consume(__obj);
+#endif
+}
+
+// load signed char
+
+inline _LIBCPP_INLINE_VISIBILITY
+signed char
+__choose_load_seq_cst(signed char const volatile* __obj)
+{
+#if __has_feature(__atomic_load_seq_cst_a)
+    return __atomic_load_seq_cst(__obj);
+#else
+    return __load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+signed char
+__choose_load_acquire(signed char const volatile* __obj)
+{
+#if __has_feature(__atomic_load_acquire_a)
+    return __atomic_load_acquire(__obj);
+#else
+    return __choose_load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+signed char
+__choose_load_consume(signed char const volatile* __obj)
+{
+#if __has_feature(__atomic_load_consume_a)
+    return __atomic_load_consume(__obj);
+#else
+    return __choose_load_acquire(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+signed char
+__choose_load_relaxed(signed char const volatile* __obj)
+{
+#if __has_feature(__atomic_load_relaxed_a)
+    return __atomic_load_relaxed(__obj);
+#else
+    return __choose_load_consume(__obj);
+#endif
+}
+
+// load unsigned char
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned char
+__choose_load_seq_cst(unsigned char const volatile* __obj)
+{
+#if __has_feature(__atomic_load_seq_cst_h)
+    return __atomic_load_seq_cst(__obj);
+#else
+    return __load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned char
+__choose_load_acquire(unsigned char const volatile* __obj)
+{
+#if __has_feature(__atomic_load_acquire_h)
+    return __atomic_load_acquire(__obj);
+#else
+    return __choose_load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned char
+__choose_load_consume(unsigned char const volatile* __obj)
+{
+#if __has_feature(__atomic_load_consume_h)
+    return __atomic_load_consume(__obj);
+#else
+    return __choose_load_acquire(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned char
+__choose_load_relaxed(unsigned char const volatile* __obj)
+{
+#if __has_feature(__atomic_load_relaxed_h)
+    return __atomic_load_relaxed(__obj);
+#else
+    return __choose_load_consume(__obj);
+#endif
+}
+
+#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
+
+// load char16_t
+
+inline _LIBCPP_INLINE_VISIBILITY
+char16_t
+__choose_load_seq_cst(char16_t const volatile* __obj)
+{
+#if __has_feature(__atomic_load_seq_cst_Ds)
+    return __atomic_load_seq_cst(__obj);
+#else
+    return __load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+char16_t
+__choose_load_acquire(char16_t const volatile* __obj)
+{
+#if __has_feature(__atomic_load_acquire_Ds)
+    return __atomic_load_acquire(__obj);
+#else
+    return __choose_load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+char16_t
+__choose_load_consume(char16_t const volatile* __obj)
+{
+#if __has_feature(__atomic_load_consume_Ds)
+    return __atomic_load_consume(__obj);
+#else
+    return __choose_load_acquire(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+char16_t
+__choose_load_relaxed(char16_t const volatile* __obj)
+{
+#if __has_feature(__atomic_load_relaxed_Ds)
+    return __atomic_load_relaxed(__obj);
+#else
+    return __choose_load_consume(__obj);
+#endif
+}
+
+// load char32_t
+
+inline _LIBCPP_INLINE_VISIBILITY
+char32_t
+__choose_load_seq_cst(char32_t const volatile* __obj)
+{
+#if __has_feature(__atomic_load_seq_cst_Di)
+    return __atomic_load_seq_cst(__obj);
+#else
+    return __load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+char32_t
+__choose_load_acquire(char32_t const volatile* __obj)
+{
+#if __has_feature(__atomic_load_acquire_Di)
+    return __atomic_load_acquire(__obj);
+#else
+    return __choose_load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+char32_t
+__choose_load_consume(char32_t const volatile* __obj)
+{
+#if __has_feature(__atomic_load_consume_Di)
+    return __atomic_load_consume(__obj);
+#else
+    return __choose_load_acquire(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+char32_t
+__choose_load_relaxed(char32_t const volatile* __obj)
+{
+#if __has_feature(__atomic_load_relaxed_Di)
+    return __atomic_load_relaxed(__obj);
+#else
+    return __choose_load_consume(__obj);
+#endif
+}
+
+#endif  // _LIBCPP_HAS_NO_UNICODE_CHARS
+
+// load wchar_t
+
+inline _LIBCPP_INLINE_VISIBILITY
+wchar_t
+__choose_load_seq_cst(wchar_t const volatile* __obj)
+{
+#if __has_feature(__atomic_load_seq_cst_w)
+    return __atomic_load_seq_cst(__obj);
+#else
+    return __load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+wchar_t
+__choose_load_acquire(wchar_t const volatile* __obj)
+{
+#if __has_feature(__atomic_load_acquire_w)
+    return __atomic_load_acquire(__obj);
+#else
+    return __choose_load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+wchar_t
+__choose_load_consume(wchar_t const volatile* __obj)
+{
+#if __has_feature(__atomic_load_consume_w)
+    return __atomic_load_consume(__obj);
+#else
+    return __choose_load_acquire(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+wchar_t
+__choose_load_relaxed(wchar_t const volatile* __obj)
+{
+#if __has_feature(__atomic_load_relaxed_w)
+    return __atomic_load_relaxed(__obj);
+#else
+    return __choose_load_consume(__obj);
+#endif
+}
+
+// load short
+
+inline _LIBCPP_INLINE_VISIBILITY
+short
+__choose_load_seq_cst(short const volatile* __obj)
+{
+#if __has_feature(__atomic_load_seq_cst_s)
+    return __atomic_load_seq_cst(__obj);
+#else
+    return __load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+short
+__choose_load_acquire(short const volatile* __obj)
+{
+#if __has_feature(__atomic_load_acquire_s)
+    return __atomic_load_acquire(__obj);
+#else
+    return __choose_load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+short
+__choose_load_consume(short const volatile* __obj)
+{
+#if __has_feature(__atomic_load_consume_s)
+    return __atomic_load_consume(__obj);
+#else
+    return __choose_load_acquire(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+short
+__choose_load_relaxed(short const volatile* __obj)
+{
+#if __has_feature(__atomic_load_relaxed_s)
+    return __atomic_load_relaxed(__obj);
+#else
+    return __choose_load_consume(__obj);
+#endif
+}
+
+// load unsigned short
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned short
+__choose_load_seq_cst(unsigned short const volatile* __obj)
+{
+#if __has_feature(__atomic_load_seq_cst_t)
+    return __atomic_load_seq_cst(__obj);
+#else
+    return __load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned short
+__choose_load_acquire(unsigned short const volatile* __obj)
+{
+#if __has_feature(__atomic_load_acquire_t)
+    return __atomic_load_acquire(__obj);
+#else
+    return __choose_load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned short
+__choose_load_consume(unsigned short const volatile* __obj)
+{
+#if __has_feature(__atomic_load_consume_t)
+    return __atomic_load_consume(__obj);
+#else
+    return __choose_load_acquire(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned short
+__choose_load_relaxed(unsigned short const volatile* __obj)
+{
+#if __has_feature(__atomic_load_relaxed_t)
+    return __atomic_load_relaxed(__obj);
+#else
+    return __choose_load_consume(__obj);
+#endif
+}
+
+// load int
+
+inline _LIBCPP_INLINE_VISIBILITY
+int
+__choose_load_seq_cst(int const volatile* __obj)
+{
+#if __has_feature(__atomic_load_seq_cst_i)
+    return __atomic_load_seq_cst(__obj);
+#else
+    return __load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+int
+__choose_load_acquire(int const volatile* __obj)
+{
+#if __has_feature(__atomic_load_acquire_i)
+    return __atomic_load_acquire(__obj);
+#else
+    return __choose_load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+int
+__choose_load_consume(int const volatile* __obj)
+{
+#if __has_feature(__atomic_load_consume_i)
+    return __atomic_load_consume(__obj);
+#else
+    return __choose_load_acquire(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+int
+__choose_load_relaxed(int const volatile* __obj)
+{
+#if __has_feature(__atomic_load_relaxed_i)
+    return __atomic_load_relaxed(__obj);
+#else
+    return __choose_load_consume(__obj);
+#endif
+}
+
+// load unsigned int
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned int
+__choose_load_seq_cst(unsigned int const volatile* __obj)
+{
+#if __has_feature(__atomic_load_seq_cst_j)
+    return __atomic_load_seq_cst(__obj);
+#else
+    return __load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned int
+__choose_load_acquire(unsigned int const volatile* __obj)
+{
+#if __has_feature(__atomic_load_acquire_j)
+    return __atomic_load_acquire(__obj);
+#else
+    return __choose_load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned int
+__choose_load_consume(unsigned int const volatile* __obj)
+{
+#if __has_feature(__atomic_load_consume_j)
+    return __atomic_load_consume(__obj);
+#else
+    return __choose_load_acquire(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned int
+__choose_load_relaxed(unsigned int const volatile* __obj)
+{
+#if __has_feature(__atomic_load_relaxed_j)
+    return __atomic_load_relaxed(__obj);
+#else
+    return __choose_load_consume(__obj);
+#endif
+}
+
+// load long
+
+inline _LIBCPP_INLINE_VISIBILITY
+long
+__choose_load_seq_cst(long const volatile* __obj)
+{
+#if __has_feature(__atomic_load_seq_cst_l)
+    return __atomic_load_seq_cst(__obj);
+#else
+    return __load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+long
+__choose_load_acquire(long const volatile* __obj)
+{
+#if __has_feature(__atomic_load_acquire_l)
+    return __atomic_load_acquire(__obj);
+#else
+    return __choose_load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+long
+__choose_load_consume(long const volatile* __obj)
+{
+#if __has_feature(__atomic_load_consume_l)
+    return __atomic_load_consume(__obj);
+#else
+    return __choose_load_acquire(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+long
+__choose_load_relaxed(long const volatile* __obj)
+{
+#if __has_feature(__atomic_load_relaxed_l)
+    return __atomic_load_relaxed(__obj);
+#else
+    return __choose_load_consume(__obj);
+#endif
+}
+
+// load unsigned long
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned long
+__choose_load_seq_cst(unsigned long const volatile* __obj)
+{
+#if __has_feature(__atomic_load_seq_cst_m)
+    return __atomic_load_seq_cst(__obj);
+#else
+    return __load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned long
+__choose_load_acquire(unsigned long const volatile* __obj)
+{
+#if __has_feature(__atomic_load_acquire_m)
+    return __atomic_load_acquire(__obj);
+#else
+    return __choose_load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned long
+__choose_load_consume(unsigned long const volatile* __obj)
+{
+#if __has_feature(__atomic_load_consume_m)
+    return __atomic_load_consume(__obj);
+#else
+    return __choose_load_acquire(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned long
+__choose_load_relaxed(unsigned long const volatile* __obj)
+{
+#if __has_feature(__atomic_load_relaxed_m)
+    return __atomic_load_relaxed(__obj);
+#else
+    return __choose_load_consume(__obj);
+#endif
+}
+
+// load long long
+
+inline _LIBCPP_INLINE_VISIBILITY
+long long
+__choose_load_seq_cst(long long const volatile* __obj)
+{
+#if __has_feature(__atomic_load_seq_cst_x)
+    return __atomic_load_seq_cst(__obj);
+#else
+    return __load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+long long
+__choose_load_acquire(long long const volatile* __obj)
+{
+#if __has_feature(__atomic_load_acquire_x)
+    return __atomic_load_acquire(__obj);
+#else
+    return __choose_load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+long long
+__choose_load_consume(long long const volatile* __obj)
+{
+#if __has_feature(__atomic_load_consume_x)
+    return __atomic_load_consume(__obj);
+#else
+    return __choose_load_acquire(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+long long
+__choose_load_relaxed(long long const volatile* __obj)
+{
+#if __has_feature(__atomic_load_relaxed_x)
+    return __atomic_load_relaxed(__obj);
+#else
+    return __choose_load_consume(__obj);
+#endif
+}
+
+// load unsigned long long
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned long long
+__choose_load_seq_cst(unsigned long long const volatile* __obj)
+{
+#if __has_feature(__atomic_load_seq_cst_y)
+    return __atomic_load_seq_cst(__obj);
+#else
+    return __load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned long long
+__choose_load_acquire(unsigned long long const volatile* __obj)
+{
+#if __has_feature(__atomic_load_acquire_y)
+    return __atomic_load_acquire(__obj);
+#else
+    return __choose_load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned long long
+__choose_load_consume(unsigned long long const volatile* __obj)
+{
+#if __has_feature(__atomic_load_consume_y)
+    return __atomic_load_consume(__obj);
+#else
+    return __choose_load_acquire(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned long long
+__choose_load_relaxed(unsigned long long const volatile* __obj)
+{
+#if __has_feature(__atomic_load_relaxed_y)
+    return __atomic_load_relaxed(__obj);
+#else
+    return __choose_load_consume(__obj);
+#endif
+}
+
+// load void*
+
+inline _LIBCPP_INLINE_VISIBILITY
+void*
+__choose_load_seq_cst(void* const volatile* __obj)
+{
+#if __has_feature(__atomic_load_seq_cst_Py)
+    return __atomic_load_seq_cst(__obj);
+#else
+    return __load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void*
+__choose_load_acquire(void* const volatile* __obj)
+{
+#if __has_feature(__atomic_load_acquire_Py)
+    return __atomic_load_acquire(__obj);
+#else
+    return __choose_load_seq_cst(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void*
+__choose_load_consume(void* const volatile* __obj)
+{
+#if __has_feature(__atomic_load_consume_Py)
+    return __atomic_load_consume(__obj);
+#else
+    return __choose_load_acquire(__obj);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void*
+__choose_load_relaxed(void* const volatile* __obj)
+{
+#if __has_feature(__atomic_load_relaxed_Py)
+    return __atomic_load_relaxed(__obj);
+#else
+    return __choose_load_consume(__obj);
+#endif
+}
+
 // store
 
 template <class _Tp>
 void
-__store_seq_cst(volatile _Tp* __obj, _Tp __desr)
+__store_seq_cst(_Tp volatile* __obj, _Tp __desr)
 {
     unique_lock<mutex> _(__not_atomic_mut());
     *__obj = __desr;
@@ -2505,7 +3199,7 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 void
-__choose_store_seq_cst(volatile bool* __obj, bool __desr)
+__choose_store_seq_cst(bool volatile* __obj, bool __desr)
 {
 #if __has_feature(__atomic_store_seq_cst_b)
     __atomic_store_seq_cst(__obj, __desr);
@@ -2516,7 +3210,7 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 void
-__choose_store_release(volatile bool* __obj, bool __desr)
+__choose_store_release(bool volatile* __obj, bool __desr)
 {
 #if __has_feature(__atomic_store_release_b)
     __atomic_store_release(__obj, __desr);
@@ -2527,7 +3221,7 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 void
-__choose_store_relaxed(volatile bool* __obj, bool __desr)
+__choose_store_relaxed(bool volatile* __obj, bool __desr)
 {
 #if __has_feature(__atomic_store_relaxed_b)
     __atomic_store_relaxed(__obj, __desr);
@@ -2536,11 +3230,540 @@
 #endif
 }
 
+// store char
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_seq_cst(char volatile* __obj, char __desr)
+{
+#if __has_feature(__atomic_store_seq_cst_c)
+    __atomic_store_seq_cst(__obj, __desr);
+#else
+    __store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_release(char volatile* __obj, char __desr)
+{
+#if __has_feature(__atomic_store_release_c)
+    __atomic_store_release(__obj, __desr);
+#else
+    __choose_store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_relaxed(char volatile* __obj, char __desr)
+{
+#if __has_feature(__atomic_store_relaxed_c)
+    __atomic_store_relaxed(__obj, __desr);
+#else
+    __choose_store_release(__obj, __desr);
+#endif
+}
+
+// store signed char
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_seq_cst(signed char volatile* __obj, signed char __desr)
+{
+#if __has_feature(__atomic_store_seq_cst_a)
+    __atomic_store_seq_cst(__obj, __desr);
+#else
+    __store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_release(signed char volatile* __obj, signed char __desr)
+{
+#if __has_feature(__atomic_store_release_a)
+    __atomic_store_release(__obj, __desr);
+#else
+    __choose_store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_relaxed(signed char volatile* __obj, signed char __desr)
+{
+#if __has_feature(__atomic_store_relaxed_a)
+    __atomic_store_relaxed(__obj, __desr);
+#else
+    __choose_store_release(__obj, __desr);
+#endif
+}
+
+// store unsigned char
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_seq_cst(unsigned char volatile* __obj, unsigned char __desr)
+{
+#if __has_feature(__atomic_store_seq_cst_h)
+    __atomic_store_seq_cst(__obj, __desr);
+#else
+    __store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_release(unsigned char volatile* __obj, unsigned char __desr)
+{
+#if __has_feature(__atomic_store_release_h)
+    __atomic_store_release(__obj, __desr);
+#else
+    __choose_store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_relaxed(unsigned char volatile* __obj, unsigned char __desr)
+{
+#if __has_feature(__atomic_store_relaxed_h)
+    __atomic_store_relaxed(__obj, __desr);
+#else
+    __choose_store_release(__obj, __desr);
+#endif
+}
+
+#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
+
+// store char16_t
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_seq_cst(char16_t volatile* __obj, char16_t __desr)
+{
+#if __has_feature(__atomic_store_seq_cst_Ds)
+    __atomic_store_seq_cst(__obj, __desr);
+#else
+    __store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_release(char16_t volatile* __obj, char16_t __desr)
+{
+#if __has_feature(__atomic_store_release_Ds)
+    __atomic_store_release(__obj, __desr);
+#else
+    __choose_store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_relaxed(char16_t volatile* __obj, char16_t __desr)
+{
+#if __has_feature(__atomic_store_relaxed_Ds)
+    __atomic_store_relaxed(__obj, __desr);
+#else
+    __choose_store_release(__obj, __desr);
+#endif
+}
+
+// store char32_t
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_seq_cst(char32_t volatile* __obj, char32_t __desr)
+{
+#if __has_feature(__atomic_store_seq_cst_Di)
+    __atomic_store_seq_cst(__obj, __desr);
+#else
+    __store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_release(char32_t volatile* __obj, char32_t __desr)
+{
+#if __has_feature(__atomic_store_release_Di)
+    __atomic_store_release(__obj, __desr);
+#else
+    __choose_store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_relaxed(char32_t volatile* __obj, char32_t __desr)
+{
+#if __has_feature(__atomic_store_relaxed_Di)
+    __atomic_store_relaxed(__obj, __desr);
+#else
+    __choose_store_release(__obj, __desr);
+#endif
+}
+
+#endif  // _LIBCPP_HAS_NO_UNICODE_CHARS
+
+// store wchar_t
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_seq_cst(wchar_t volatile* __obj, wchar_t __desr)
+{
+#if __has_feature(__atomic_store_seq_cst_w)
+    __atomic_store_seq_cst(__obj, __desr);
+#else
+    __store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_release(wchar_t volatile* __obj, wchar_t __desr)
+{
+#if __has_feature(__atomic_store_release_w)
+    __atomic_store_release(__obj, __desr);
+#else
+    __choose_store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_relaxed(wchar_t volatile* __obj, wchar_t __desr)
+{
+#if __has_feature(__atomic_store_relaxed_w)
+    __atomic_store_relaxed(__obj, __desr);
+#else
+    __choose_store_release(__obj, __desr);
+#endif
+}
+
+// store short
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_seq_cst(short volatile* __obj, short __desr)
+{
+#if __has_feature(__atomic_store_seq_cst_s)
+    __atomic_store_seq_cst(__obj, __desr);
+#else
+    __store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_release(short volatile* __obj, short __desr)
+{
+#if __has_feature(__atomic_store_release_s)
+    __atomic_store_release(__obj, __desr);
+#else
+    __choose_store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_relaxed(short volatile* __obj, short __desr)
+{
+#if __has_feature(__atomic_store_relaxed_s)
+    __atomic_store_relaxed(__obj, __desr);
+#else
+    __choose_store_release(__obj, __desr);
+#endif
+}
+
+// store unsigned short
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_seq_cst(unsigned short volatile* __obj, unsigned short __desr)
+{
+#if __has_feature(__atomic_store_seq_cst_t)
+    __atomic_store_seq_cst(__obj, __desr);
+#else
+    __store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_release(unsigned short volatile* __obj, unsigned short __desr)
+{
+#if __has_feature(__atomic_store_release_t)
+    __atomic_store_release(__obj, __desr);
+#else
+    __choose_store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_relaxed(unsigned short volatile* __obj, unsigned short __desr)
+{
+#if __has_feature(__atomic_store_relaxed_t)
+    __atomic_store_relaxed(__obj, __desr);
+#else
+    __choose_store_release(__obj, __desr);
+#endif
+}
+
+// store int
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_seq_cst(int volatile* __obj, int __desr)
+{
+#if __has_feature(__atomic_store_seq_cst_i)
+    __atomic_store_seq_cst(__obj, __desr);
+#else
+    __store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_release(int volatile* __obj, int __desr)
+{
+#if __has_feature(__atomic_store_release_i)
+    __atomic_store_release(__obj, __desr);
+#else
+    __choose_store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_relaxed(int volatile* __obj, int __desr)
+{
+#if __has_feature(__atomic_store_relaxed_i)
+    __atomic_store_relaxed(__obj, __desr);
+#else
+    __choose_store_release(__obj, __desr);
+#endif
+}
+
+// store unsigned int
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_seq_cst(unsigned int volatile* __obj, unsigned int __desr)
+{
+#if __has_feature(__atomic_store_seq_cst_j)
+    __atomic_store_seq_cst(__obj, __desr);
+#else
+    __store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_release(unsigned int volatile* __obj, unsigned int __desr)
+{
+#if __has_feature(__atomic_store_release_j)
+    __atomic_store_release(__obj, __desr);
+#else
+    __choose_store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_relaxed(unsigned int volatile* __obj, unsigned int __desr)
+{
+#if __has_feature(__atomic_store_relaxed_j)
+    __atomic_store_relaxed(__obj, __desr);
+#else
+    __choose_store_release(__obj, __desr);
+#endif
+}
+
+// store long
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_seq_cst(long volatile* __obj, long __desr)
+{
+#if __has_feature(__atomic_store_seq_cst_l)
+    __atomic_store_seq_cst(__obj, __desr);
+#else
+    __store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_release(long volatile* __obj, long __desr)
+{
+#if __has_feature(__atomic_store_release_l)
+    __atomic_store_release(__obj, __desr);
+#else
+    __choose_store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_relaxed(long volatile* __obj, long __desr)
+{
+#if __has_feature(__atomic_store_relaxed_l)
+    __atomic_store_relaxed(__obj, __desr);
+#else
+    __choose_store_release(__obj, __desr);
+#endif
+}
+
+// store unsigned long
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_seq_cst(unsigned long volatile* __obj, unsigned long __desr)
+{
+#if __has_feature(__atomic_store_seq_cst_m)
+    __atomic_store_seq_cst(__obj, __desr);
+#else
+    __store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_release(unsigned long volatile* __obj, unsigned long __desr)
+{
+#if __has_feature(__atomic_store_release_m)
+    __atomic_store_release(__obj, __desr);
+#else
+    __choose_store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_relaxed(unsigned long volatile* __obj, unsigned long __desr)
+{
+#if __has_feature(__atomic_store_relaxed_m)
+    __atomic_store_relaxed(__obj, __desr);
+#else
+    __choose_store_release(__obj, __desr);
+#endif
+}
+
+// store long long
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_seq_cst(long long volatile* __obj, long long __desr)
+{
+#if __has_feature(__atomic_store_seq_cst_x)
+    __atomic_store_seq_cst(__obj, __desr);
+#else
+    __store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_release(long long volatile* __obj, long long __desr)
+{
+#if __has_feature(__atomic_store_release_x)
+    __atomic_store_release(__obj, __desr);
+#else
+    __choose_store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_relaxed(long long volatile* __obj, long long __desr)
+{
+#if __has_feature(__atomic_store_relaxed_x)
+    __atomic_store_relaxed(__obj, __desr);
+#else
+    __choose_store_release(__obj, __desr);
+#endif
+}
+
+// store unsigned long long
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_seq_cst(unsigned long long volatile* __obj, unsigned long long __desr)
+{
+#if __has_feature(__atomic_store_seq_cst_y)
+    __atomic_store_seq_cst(__obj, __desr);
+#else
+    __store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_release(unsigned long long volatile* __obj, unsigned long long __desr)
+{
+#if __has_feature(__atomic_store_release_y)
+    __atomic_store_release(__obj, __desr);
+#else
+    __choose_store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_relaxed(unsigned long long volatile* __obj, unsigned long long __desr)
+{
+#if __has_feature(__atomic_store_relaxed_y)
+    __atomic_store_relaxed(__obj, __desr);
+#else
+    __choose_store_release(__obj, __desr);
+#endif
+}
+
+// store void*
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_seq_cst(void* volatile* __obj, void* __desr)
+{
+#if __has_feature(__atomic_store_seq_cst_Py)
+    __atomic_store_seq_cst(__obj, __desr);
+#else
+    __store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_release(void* volatile* __obj, void* __desr)
+{
+#if __has_feature(__atomic_store_release_Py)
+    __atomic_store_release(__obj, __desr);
+#else
+    __choose_store_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__choose_store_relaxed(void* volatile* __obj, void* __desr)
+{
+#if __has_feature(__atomic_store_relaxed_Py)
+    __atomic_store_relaxed(__obj, __desr);
+#else
+    __choose_store_release(__obj, __desr);
+#endif
+}
+
 // exchange
 
 template <class _Tp>
 _Tp
-__exchange_seq_cst(volatile _Tp* __obj, _Tp __desr)
+__exchange_seq_cst(_Tp volatile* __obj, _Tp __desr)
 {
     unique_lock<mutex> _(__not_atomic_mut());
     _Tp __r = *__obj;
@@ -2552,7 +3775,7 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_exchange_seq_cst(volatile bool* __obj, bool __desr)
+__choose_exchange_seq_cst(bool volatile* __obj, bool __desr)
 {
 #if __has_feature(__atomic_exchange_seq_cst_b)
     return __atomic_exchange_seq_cst(__obj, __desr);
@@ -2563,7 +3786,7 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_exchange_acq_rel(volatile bool* __obj, bool __desr)
+__choose_exchange_acq_rel(bool volatile* __obj, bool __desr)
 {
 #if __has_feature(__atomic_exchange_acq_rel_b)
     return __atomic_exchange_acq_rel(__obj, __desr);
@@ -2574,7 +3797,7 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_exchange_release(volatile bool* __obj, bool __desr)
+__choose_exchange_release(bool volatile* __obj, bool __desr)
 {
 #if __has_feature(__atomic_exchange_release_b)
     return __atomic_exchange_release(__obj, __desr);
@@ -2585,7 +3808,7 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_exchange_acquire(volatile bool* __obj, bool __desr)
+__choose_exchange_acquire(bool volatile* __obj, bool __desr)
 {
 #if __has_feature(__atomic_exchange_acquire_b)
     return __atomic_exchange_acquire(__obj, __desr);
@@ -2596,7 +3819,7 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_exchange_consume(volatile bool* __obj, bool __desr)
+__choose_exchange_consume(bool volatile* __obj, bool __desr)
 {
 #if __has_feature(__atomic_exchange_consume_b)
     return __atomic_exchange_consume(__obj, __desr);
@@ -2607,7 +3830,7 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_exchange_relaxed(volatile bool* __obj, bool __desr)
+__choose_exchange_relaxed(bool volatile* __obj, bool __desr)
 {
 #if __has_feature(__atomic_exchange_relaxed_b)
     return __atomic_exchange_relaxed(__obj, __desr);
@@ -2616,11 +3839,1035 @@
 #endif
 }
 
+// exchange char
+
+inline _LIBCPP_INLINE_VISIBILITY
+char
+__choose_exchange_seq_cst(char volatile* __obj, char __desr)
+{
+#if __has_feature(__atomic_exchange_seq_cst_c)
+    return __atomic_exchange_seq_cst(__obj, __desr);
+#else
+    return __exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+char
+__choose_exchange_acq_rel(char volatile* __obj, char __desr)
+{
+#if __has_feature(__atomic_exchange_acq_rel_c)
+    return __atomic_exchange_acq_rel(__obj, __desr);
+#else
+    return __choose_exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+char
+__choose_exchange_release(char volatile* __obj, char __desr)
+{
+#if __has_feature(__atomic_exchange_release_c)
+    return __atomic_exchange_release(__obj, __desr);
+#else
+    return __choose_exchange_acq_rel(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+char
+__choose_exchange_acquire(char volatile* __obj, char __desr)
+{
+#if __has_feature(__atomic_exchange_acquire_c)
+    return __atomic_exchange_acquire(__obj, __desr);
+#else
+    return __choose_exchange_release(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+char
+__choose_exchange_consume(char volatile* __obj, char __desr)
+{
+#if __has_feature(__atomic_exchange_consume_c)
+    return __atomic_exchange_consume(__obj, __desr);
+#else
+    return __choose_exchange_acquire(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+char
+__choose_exchange_relaxed(char volatile* __obj, char __desr)
+{
+#if __has_feature(__atomic_exchange_relaxed_c)
+    return __atomic_exchange_relaxed(__obj, __desr);
+#else
+    return __choose_exchange_consume(__obj, __desr);
+#endif
+}
+
+// exchange signed char
+
+inline _LIBCPP_INLINE_VISIBILITY
+signed char
+__choose_exchange_seq_cst(signed char volatile* __obj, signed char __desr)
+{
+#if __has_feature(__atomic_exchange_seq_cst_a)
+    return __atomic_exchange_seq_cst(__obj, __desr);
+#else
+    return __exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+signed char
+__choose_exchange_acq_rel(signed char volatile* __obj, signed char __desr)
+{
+#if __has_feature(__atomic_exchange_acq_rel_a)
+    return __atomic_exchange_acq_rel(__obj, __desr);
+#else
+    return __choose_exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+signed char
+__choose_exchange_release(signed char volatile* __obj, signed char __desr)
+{
+#if __has_feature(__atomic_exchange_release_a)
+    return __atomic_exchange_release(__obj, __desr);
+#else
+    return __choose_exchange_acq_rel(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+signed char
+__choose_exchange_acquire(signed char volatile* __obj, signed char __desr)
+{
+#if __has_feature(__atomic_exchange_acquire_a)
+    return __atomic_exchange_acquire(__obj, __desr);
+#else
+    return __choose_exchange_release(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+signed char
+__choose_exchange_consume(signed char volatile* __obj, signed char __desr)
+{
+#if __has_feature(__atomic_exchange_consume_a)
+    return __atomic_exchange_consume(__obj, __desr);
+#else
+    return __choose_exchange_acquire(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+signed char
+__choose_exchange_relaxed(signed char volatile* __obj, signed char __desr)
+{
+#if __has_feature(__atomic_exchange_relaxed_a)
+    return __atomic_exchange_relaxed(__obj, __desr);
+#else
+    return __choose_exchange_consume(__obj, __desr);
+#endif
+}
+
+// exchange unsigned char
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned char
+__choose_exchange_seq_cst(unsigned char volatile* __obj, unsigned char __desr)
+{
+#if __has_feature(__atomic_exchange_seq_cst_h)
+    return __atomic_exchange_seq_cst(__obj, __desr);
+#else
+    return __exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned char
+__choose_exchange_acq_rel(unsigned char volatile* __obj, unsigned char __desr)
+{
+#if __has_feature(__atomic_exchange_acq_rel_h)
+    return __atomic_exchange_acq_rel(__obj, __desr);
+#else
+    return __choose_exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned char
+__choose_exchange_release(unsigned char volatile* __obj, unsigned char __desr)
+{
+#if __has_feature(__atomic_exchange_release_h)
+    return __atomic_exchange_release(__obj, __desr);
+#else
+    return __choose_exchange_acq_rel(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned char
+__choose_exchange_acquire(unsigned char volatile* __obj, unsigned char __desr)
+{
+#if __has_feature(__atomic_exchange_acquire_h)
+    return __atomic_exchange_acquire(__obj, __desr);
+#else
+    return __choose_exchange_release(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned char
+__choose_exchange_consume(unsigned char volatile* __obj, unsigned char __desr)
+{
+#if __has_feature(__atomic_exchange_consume_h)
+    return __atomic_exchange_consume(__obj, __desr);
+#else
+    return __choose_exchange_acquire(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned char
+__choose_exchange_relaxed(unsigned char volatile* __obj, unsigned char __desr)
+{
+#if __has_feature(__atomic_exchange_relaxed_h)
+    return __atomic_exchange_relaxed(__obj, __desr);
+#else
+    return __choose_exchange_consume(__obj, __desr);
+#endif
+}
+
+#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
+
+// exchange char16_t
+
+inline _LIBCPP_INLINE_VISIBILITY
+char16_t
+__choose_exchange_seq_cst(char16_t volatile* __obj, char16_t __desr)
+{
+#if __has_feature(__atomic_exchange_seq_cst_Ds)
+    return __atomic_exchange_seq_cst(__obj, __desr);
+#else
+    return __exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+char16_t
+__choose_exchange_acq_rel(char16_t volatile* __obj, char16_t __desr)
+{
+#if __has_feature(__atomic_exchange_acq_rel_Ds)
+    return __atomic_exchange_acq_rel(__obj, __desr);
+#else
+    return __choose_exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+char16_t
+__choose_exchange_release(char16_t volatile* __obj, char16_t __desr)
+{
+#if __has_feature(__atomic_exchange_release_Ds)
+    return __atomic_exchange_release(__obj, __desr);
+#else
+    return __choose_exchange_acq_rel(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+char16_t
+__choose_exchange_acquire(char16_t volatile* __obj, char16_t __desr)
+{
+#if __has_feature(__atomic_exchange_acquire_Ds)
+    return __atomic_exchange_acquire(__obj, __desr);
+#else
+    return __choose_exchange_release(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+char16_t
+__choose_exchange_consume(char16_t volatile* __obj, char16_t __desr)
+{
+#if __has_feature(__atomic_exchange_consume_Ds)
+    return __atomic_exchange_consume(__obj, __desr);
+#else
+    return __choose_exchange_acquire(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+char16_t
+__choose_exchange_relaxed(char16_t volatile* __obj, char16_t __desr)
+{
+#if __has_feature(__atomic_exchange_relaxed_Ds)
+    return __atomic_exchange_relaxed(__obj, __desr);
+#else
+    return __choose_exchange_consume(__obj, __desr);
+#endif
+}
+
+// exchange char32_t
+
+inline _LIBCPP_INLINE_VISIBILITY
+char32_t
+__choose_exchange_seq_cst(char32_t volatile* __obj, char32_t __desr)
+{
+#if __has_feature(__atomic_exchange_seq_cst_Di)
+    return __atomic_exchange_seq_cst(__obj, __desr);
+#else
+    return __exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+char32_t
+__choose_exchange_acq_rel(char32_t volatile* __obj, char32_t __desr)
+{
+#if __has_feature(__atomic_exchange_acq_rel_Di)
+    return __atomic_exchange_acq_rel(__obj, __desr);
+#else
+    return __choose_exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+char32_t
+__choose_exchange_release(char32_t volatile* __obj, char32_t __desr)
+{
+#if __has_feature(__atomic_exchange_release_Di)
+    return __atomic_exchange_release(__obj, __desr);
+#else
+    return __choose_exchange_acq_rel(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+char32_t
+__choose_exchange_acquire(char32_t volatile* __obj, char32_t __desr)
+{
+#if __has_feature(__atomic_exchange_acquire_Di)
+    return __atomic_exchange_acquire(__obj, __desr);
+#else
+    return __choose_exchange_release(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+char32_t
+__choose_exchange_consume(char32_t volatile* __obj, char32_t __desr)
+{
+#if __has_feature(__atomic_exchange_consume_Di)
+    return __atomic_exchange_consume(__obj, __desr);
+#else
+    return __choose_exchange_acquire(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+char32_t
+__choose_exchange_relaxed(char32_t volatile* __obj, char32_t __desr)
+{
+#if __has_feature(__atomic_exchange_relaxed_Di)
+    return __atomic_exchange_relaxed(__obj, __desr);
+#else
+    return __choose_exchange_consume(__obj, __desr);
+#endif
+}
+
+#endif  // _LIBCPP_HAS_NO_UNICODE_CHARS
+
+// exchange wchar_t
+
+inline _LIBCPP_INLINE_VISIBILITY
+wchar_t
+__choose_exchange_seq_cst(wchar_t volatile* __obj, wchar_t __desr)
+{
+#if __has_feature(__atomic_exchange_seq_cst_w)
+    return __atomic_exchange_seq_cst(__obj, __desr);
+#else
+    return __exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+wchar_t
+__choose_exchange_acq_rel(wchar_t volatile* __obj, wchar_t __desr)
+{
+#if __has_feature(__atomic_exchange_acq_rel_w)
+    return __atomic_exchange_acq_rel(__obj, __desr);
+#else
+    return __choose_exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+wchar_t
+__choose_exchange_release(wchar_t volatile* __obj, wchar_t __desr)
+{
+#if __has_feature(__atomic_exchange_release_w)
+    return __atomic_exchange_release(__obj, __desr);
+#else
+    return __choose_exchange_acq_rel(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+wchar_t
+__choose_exchange_acquire(wchar_t volatile* __obj, wchar_t __desr)
+{
+#if __has_feature(__atomic_exchange_acquire_w)
+    return __atomic_exchange_acquire(__obj, __desr);
+#else
+    return __choose_exchange_release(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+wchar_t
+__choose_exchange_consume(wchar_t volatile* __obj, wchar_t __desr)
+{
+#if __has_feature(__atomic_exchange_consume_w)
+    return __atomic_exchange_consume(__obj, __desr);
+#else
+    return __choose_exchange_acquire(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+wchar_t
+__choose_exchange_relaxed(wchar_t volatile* __obj, wchar_t __desr)
+{
+#if __has_feature(__atomic_exchange_relaxed_w)
+    return __atomic_exchange_relaxed(__obj, __desr);
+#else
+    return __choose_exchange_consume(__obj, __desr);
+#endif
+}
+
+// exchange short
+
+inline _LIBCPP_INLINE_VISIBILITY
+short
+__choose_exchange_seq_cst(short volatile* __obj, short __desr)
+{
+#if __has_feature(__atomic_exchange_seq_cst_s)
+    return __atomic_exchange_seq_cst(__obj, __desr);
+#else
+    return __exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+short
+__choose_exchange_acq_rel(short volatile* __obj, short __desr)
+{
+#if __has_feature(__atomic_exchange_acq_rel_s)
+    return __atomic_exchange_acq_rel(__obj, __desr);
+#else
+    return __choose_exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+short
+__choose_exchange_release(short volatile* __obj, short __desr)
+{
+#if __has_feature(__atomic_exchange_release_s)
+    return __atomic_exchange_release(__obj, __desr);
+#else
+    return __choose_exchange_acq_rel(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+short
+__choose_exchange_acquire(short volatile* __obj, short __desr)
+{
+#if __has_feature(__atomic_exchange_acquire_s)
+    return __atomic_exchange_acquire(__obj, __desr);
+#else
+    return __choose_exchange_release(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+short
+__choose_exchange_consume(short volatile* __obj, short __desr)
+{
+#if __has_feature(__atomic_exchange_consume_s)
+    return __atomic_exchange_consume(__obj, __desr);
+#else
+    return __choose_exchange_acquire(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+short
+__choose_exchange_relaxed(short volatile* __obj, short __desr)
+{
+#if __has_feature(__atomic_exchange_relaxed_s)
+    return __atomic_exchange_relaxed(__obj, __desr);
+#else
+    return __choose_exchange_consume(__obj, __desr);
+#endif
+}
+
+// exchange unsigned short
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned short
+__choose_exchange_seq_cst(unsigned short volatile* __obj, unsigned short __desr)
+{
+#if __has_feature(__atomic_exchange_seq_cst_t)
+    return __atomic_exchange_seq_cst(__obj, __desr);
+#else
+    return __exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned short
+__choose_exchange_acq_rel(unsigned short volatile* __obj, unsigned short __desr)
+{
+#if __has_feature(__atomic_exchange_acq_rel_t)
+    return __atomic_exchange_acq_rel(__obj, __desr);
+#else
+    return __choose_exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned short
+__choose_exchange_release(unsigned short volatile* __obj, unsigned short __desr)
+{
+#if __has_feature(__atomic_exchange_release_t)
+    return __atomic_exchange_release(__obj, __desr);
+#else
+    return __choose_exchange_acq_rel(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned short
+__choose_exchange_acquire(unsigned short volatile* __obj, unsigned short __desr)
+{
+#if __has_feature(__atomic_exchange_acquire_t)
+    return __atomic_exchange_acquire(__obj, __desr);
+#else
+    return __choose_exchange_release(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned short
+__choose_exchange_consume(unsigned short volatile* __obj, unsigned short __desr)
+{
+#if __has_feature(__atomic_exchange_consume_t)
+    return __atomic_exchange_consume(__obj, __desr);
+#else
+    return __choose_exchange_acquire(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned short
+__choose_exchange_relaxed(unsigned short volatile* __obj, unsigned short __desr)
+{
+#if __has_feature(__atomic_exchange_relaxed_t)
+    return __atomic_exchange_relaxed(__obj, __desr);
+#else
+    return __choose_exchange_consume(__obj, __desr);
+#endif
+}
+
+// exchange int
+
+inline _LIBCPP_INLINE_VISIBILITY
+int
+__choose_exchange_seq_cst(int volatile* __obj, int __desr)
+{
+#if __has_feature(__atomic_exchange_seq_cst_i)
+    return __atomic_exchange_seq_cst(__obj, __desr);
+#else
+    return __exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+int
+__choose_exchange_acq_rel(int volatile* __obj, int __desr)
+{
+#if __has_feature(__atomic_exchange_acq_rel_i)
+    return __atomic_exchange_acq_rel(__obj, __desr);
+#else
+    return __choose_exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+int
+__choose_exchange_release(int volatile* __obj, int __desr)
+{
+#if __has_feature(__atomic_exchange_release_i)
+    return __atomic_exchange_release(__obj, __desr);
+#else
+    return __choose_exchange_acq_rel(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+int
+__choose_exchange_acquire(int volatile* __obj, int __desr)
+{
+#if __has_feature(__atomic_exchange_acquire_i)
+    return __atomic_exchange_acquire(__obj, __desr);
+#else
+    return __choose_exchange_release(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+int
+__choose_exchange_consume(int volatile* __obj, int __desr)
+{
+#if __has_feature(__atomic_exchange_consume_i)
+    return __atomic_exchange_consume(__obj, __desr);
+#else
+    return __choose_exchange_acquire(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+int
+__choose_exchange_relaxed(int volatile* __obj, int __desr)
+{
+#if __has_feature(__atomic_exchange_relaxed_i)
+    return __atomic_exchange_relaxed(__obj, __desr);
+#else
+    return __choose_exchange_consume(__obj, __desr);
+#endif
+}
+
+// exchange unsigned int
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned int
+__choose_exchange_seq_cst(unsigned int volatile* __obj, unsigned int __desr)
+{
+#if __has_feature(__atomic_exchange_seq_cst_j)
+    return __atomic_exchange_seq_cst(__obj, __desr);
+#else
+    return __exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned int
+__choose_exchange_acq_rel(unsigned int volatile* __obj, unsigned int __desr)
+{
+#if __has_feature(__atomic_exchange_acq_rel_j)
+    return __atomic_exchange_acq_rel(__obj, __desr);
+#else
+    return __choose_exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned int
+__choose_exchange_release(unsigned int volatile* __obj, unsigned int __desr)
+{
+#if __has_feature(__atomic_exchange_release_j)
+    return __atomic_exchange_release(__obj, __desr);
+#else
+    return __choose_exchange_acq_rel(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned int
+__choose_exchange_acquire(unsigned int volatile* __obj, unsigned int __desr)
+{
+#if __has_feature(__atomic_exchange_acquire_j)
+    return __atomic_exchange_acquire(__obj, __desr);
+#else
+    return __choose_exchange_release(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned int
+__choose_exchange_consume(unsigned int volatile* __obj, unsigned int __desr)
+{
+#if __has_feature(__atomic_exchange_consume_j)
+    return __atomic_exchange_consume(__obj, __desr);
+#else
+    return __choose_exchange_acquire(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned int
+__choose_exchange_relaxed(unsigned int volatile* __obj, unsigned int __desr)
+{
+#if __has_feature(__atomic_exchange_relaxed_j)
+    return __atomic_exchange_relaxed(__obj, __desr);
+#else
+    return __choose_exchange_consume(__obj, __desr);
+#endif
+}
+
+// exchange long
+
+inline _LIBCPP_INLINE_VISIBILITY
+long
+__choose_exchange_seq_cst(long volatile* __obj, long __desr)
+{
+#if __has_feature(__atomic_exchange_seq_cst_l)
+    return __atomic_exchange_seq_cst(__obj, __desr);
+#else
+    return __exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+long
+__choose_exchange_acq_rel(long volatile* __obj, long __desr)
+{
+#if __has_feature(__atomic_exchange_acq_rel_l)
+    return __atomic_exchange_acq_rel(__obj, __desr);
+#else
+    return __choose_exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+long
+__choose_exchange_release(long volatile* __obj, long __desr)
+{
+#if __has_feature(__atomic_exchange_release_l)
+    return __atomic_exchange_release(__obj, __desr);
+#else
+    return __choose_exchange_acq_rel(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+long
+__choose_exchange_acquire(long volatile* __obj, long __desr)
+{
+#if __has_feature(__atomic_exchange_acquire_l)
+    return __atomic_exchange_acquire(__obj, __desr);
+#else
+    return __choose_exchange_release(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+long
+__choose_exchange_consume(long volatile* __obj, long __desr)
+{
+#if __has_feature(__atomic_exchange_consume_l)
+    return __atomic_exchange_consume(__obj, __desr);
+#else
+    return __choose_exchange_acquire(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+long
+__choose_exchange_relaxed(long volatile* __obj, long __desr)
+{
+#if __has_feature(__atomic_exchange_relaxed_l)
+    return __atomic_exchange_relaxed(__obj, __desr);
+#else
+    return __choose_exchange_consume(__obj, __desr);
+#endif
+}
+
+// exchange unsigned long
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned long
+__choose_exchange_seq_cst(unsigned long volatile* __obj, unsigned long __desr)
+{
+#if __has_feature(__atomic_exchange_seq_cst_m)
+    return __atomic_exchange_seq_cst(__obj, __desr);
+#else
+    return __exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned long
+__choose_exchange_acq_rel(unsigned long volatile* __obj, unsigned long __desr)
+{
+#if __has_feature(__atomic_exchange_acq_rel_m)
+    return __atomic_exchange_acq_rel(__obj, __desr);
+#else
+    return __choose_exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned long
+__choose_exchange_release(unsigned long volatile* __obj, unsigned long __desr)
+{
+#if __has_feature(__atomic_exchange_release_m)
+    return __atomic_exchange_release(__obj, __desr);
+#else
+    return __choose_exchange_acq_rel(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned long
+__choose_exchange_acquire(unsigned long volatile* __obj, unsigned long __desr)
+{
+#if __has_feature(__atomic_exchange_acquire_m)
+    return __atomic_exchange_acquire(__obj, __desr);
+#else
+    return __choose_exchange_release(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned long
+__choose_exchange_consume(unsigned long volatile* __obj, unsigned long __desr)
+{
+#if __has_feature(__atomic_exchange_consume_m)
+    return __atomic_exchange_consume(__obj, __desr);
+#else
+    return __choose_exchange_acquire(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned long
+__choose_exchange_relaxed(unsigned long volatile* __obj, unsigned long __desr)
+{
+#if __has_feature(__atomic_exchange_relaxed_m)
+    return __atomic_exchange_relaxed(__obj, __desr);
+#else
+    return __choose_exchange_consume(__obj, __desr);
+#endif
+}
+
+// exchange long long
+
+inline _LIBCPP_INLINE_VISIBILITY
+long long
+__choose_exchange_seq_cst(long long volatile* __obj, long long __desr)
+{
+#if __has_feature(__atomic_exchange_seq_cst_x)
+    return __atomic_exchange_seq_cst(__obj, __desr);
+#else
+    return __exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+long long
+__choose_exchange_acq_rel(long long volatile* __obj, long long __desr)
+{
+#if __has_feature(__atomic_exchange_acq_rel_x)
+    return __atomic_exchange_acq_rel(__obj, __desr);
+#else
+    return __choose_exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+long long
+__choose_exchange_release(long long volatile* __obj, long long __desr)
+{
+#if __has_feature(__atomic_exchange_release_x)
+    return __atomic_exchange_release(__obj, __desr);
+#else
+    return __choose_exchange_acq_rel(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+long long
+__choose_exchange_acquire(long long volatile* __obj, long long __desr)
+{
+#if __has_feature(__atomic_exchange_acquire_x)
+    return __atomic_exchange_acquire(__obj, __desr);
+#else
+    return __choose_exchange_release(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+long long
+__choose_exchange_consume(long long volatile* __obj, long long __desr)
+{
+#if __has_feature(__atomic_exchange_consume_x)
+    return __atomic_exchange_consume(__obj, __desr);
+#else
+    return __choose_exchange_acquire(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+long long
+__choose_exchange_relaxed(long long volatile* __obj, long long __desr)
+{
+#if __has_feature(__atomic_exchange_relaxed_x)
+    return __atomic_exchange_relaxed(__obj, __desr);
+#else
+    return __choose_exchange_consume(__obj, __desr);
+#endif
+}
+
+// exchange unsigned long long
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned long long
+__choose_exchange_seq_cst(unsigned long long volatile* __obj, unsigned long long __desr)
+{
+#if __has_feature(__atomic_exchange_seq_cst_y)
+    return __atomic_exchange_seq_cst(__obj, __desr);
+#else
+    return __exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned long long
+__choose_exchange_acq_rel(unsigned long long volatile* __obj, unsigned long long __desr)
+{
+#if __has_feature(__atomic_exchange_acq_rel_y)
+    return __atomic_exchange_acq_rel(__obj, __desr);
+#else
+    return __choose_exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned long long
+__choose_exchange_release(unsigned long long volatile* __obj, unsigned long long __desr)
+{
+#if __has_feature(__atomic_exchange_release_y)
+    return __atomic_exchange_release(__obj, __desr);
+#else
+    return __choose_exchange_acq_rel(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned long long
+__choose_exchange_acquire(unsigned long long volatile* __obj, unsigned long long __desr)
+{
+#if __has_feature(__atomic_exchange_acquire_y)
+    return __atomic_exchange_acquire(__obj, __desr);
+#else
+    return __choose_exchange_release(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned long long
+__choose_exchange_consume(unsigned long long volatile* __obj, unsigned long long __desr)
+{
+#if __has_feature(__atomic_exchange_consume_y)
+    return __atomic_exchange_consume(__obj, __desr);
+#else
+    return __choose_exchange_acquire(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+unsigned long long
+__choose_exchange_relaxed(unsigned long long volatile* __obj, unsigned long long __desr)
+{
+#if __has_feature(__atomic_exchange_relaxed_y)
+    return __atomic_exchange_relaxed(__obj, __desr);
+#else
+    return __choose_exchange_consume(__obj, __desr);
+#endif
+}
+
+// exchange void*
+
+inline _LIBCPP_INLINE_VISIBILITY
+void*
+__choose_exchange_seq_cst(void* volatile* __obj, void* __desr)
+{
+#if __has_feature(__atomic_exchange_seq_cst_Py)
+    return __atomic_exchange_seq_cst(__obj, __desr);
+#else
+    return __exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void*
+__choose_exchange_acq_rel(void* volatile* __obj, void* __desr)
+{
+#if __has_feature(__atomic_exchange_acq_rel_Py)
+    return __atomic_exchange_acq_rel(__obj, __desr);
+#else
+    return __choose_exchange_seq_cst(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void*
+__choose_exchange_release(void* volatile* __obj, void* __desr)
+{
+#if __has_feature(__atomic_exchange_release_Py)
+    return __atomic_exchange_release(__obj, __desr);
+#else
+    return __choose_exchange_acq_rel(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void*
+__choose_exchange_acquire(void* volatile* __obj, void* __desr)
+{
+#if __has_feature(__atomic_exchange_acquire_Py)
+    return __atomic_exchange_acquire(__obj, __desr);
+#else
+    return __choose_exchange_release(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void*
+__choose_exchange_consume(void* volatile* __obj, void* __desr)
+{
+#if __has_feature(__atomic_exchange_consume_Py)
+    return __atomic_exchange_consume(__obj, __desr);
+#else
+    return __choose_exchange_acquire(__obj, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+void*
+__choose_exchange_relaxed(void* volatile* __obj, void* __desr)
+{
+#if __has_feature(__atomic_exchange_relaxed_Py)
+    return __atomic_exchange_relaxed(__obj, __desr);
+#else
+    return __choose_exchange_consume(__obj, __desr);
+#endif
+}
+
 // compare_exchange_strong
 
 template <class _Tp>
 bool
-__compare_exchange_strong_seq_cst_seq_cst(volatile _Tp* __obj, _Tp* __exp,
+__compare_exchange_strong_seq_cst_seq_cst(_Tp volatile* __obj, _Tp* __exp,
                                                                      _Tp __desr)
 {
     unique_lock<mutex> _(__not_atomic_mut());
@@ -2637,8 +4884,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_strong_seq_cst_seq_cst(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_strong_seq_cst_seq_cst(bool volatile* __obj,
+                                                 bool* __exp,
+                                                 bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_b)
     return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
@@ -2650,8 +4898,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_strong_seq_cst_acquire(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_strong_seq_cst_acquire(bool volatile* __obj,
+                                                 bool* __exp,
+                                                 bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_b)
     return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
@@ -2664,8 +4913,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_strong_seq_cst_consume(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_strong_seq_cst_consume(bool volatile* __obj,
+                                                 bool* __exp,
+                                                 bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_b)
     return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
@@ -2678,8 +4928,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_strong_seq_cst_relaxed(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_strong_seq_cst_relaxed(bool volatile* __obj,
+                                                 bool* __exp,
+                                                 bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_b)
     return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
@@ -2692,8 +4943,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_strong_acq_rel_acquire(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_strong_acq_rel_acquire(bool volatile* __obj,
+                                                 bool* __exp,
+                                                 bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_b)
     return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
@@ -2706,8 +4958,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_strong_acq_rel_consume(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_strong_acq_rel_consume(bool volatile* __obj,
+                                                 bool* __exp,
+                                                 bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_b)
     return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
@@ -2720,8 +4973,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_strong_acq_rel_relaxed(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_strong_acq_rel_relaxed(bool volatile* __obj,
+                                                 bool* __exp,
+                                                 bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_b)
     return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
@@ -2734,8 +4988,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_strong_release_acquire(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_strong_release_acquire(bool volatile* __obj,
+                                                 bool* __exp,
+                                                 bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_strong_release_acquire_b)
     return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
@@ -2748,8 +5003,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_strong_release_consume(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_strong_release_consume(bool volatile* __obj,
+                                                 bool* __exp,
+                                                 bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_strong_release_consume_b)
     return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
@@ -2762,8 +5018,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_strong_release_relaxed(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_strong_release_relaxed(bool volatile* __obj,
+                                                 bool* __exp,
+                                                 bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_strong_release_relaxed_b)
     return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
@@ -2776,8 +5033,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_strong_acquire_acquire(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_strong_acquire_acquire(bool volatile* __obj,
+                                                 bool* __exp,
+                                                 bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_b)
     return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
@@ -2790,8 +5048,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_strong_acquire_consume(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_strong_acquire_consume(bool volatile* __obj,
+                                                 bool* __exp,
+                                                 bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_strong_acquire_consume_b)
     return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
@@ -2804,8 +5063,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_strong_acquire_relaxed(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_strong_acquire_relaxed(bool volatile* __obj,
+                                                 bool* __exp,
+                                                 bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_b)
     return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
@@ -2818,8 +5078,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_strong_consume_consume(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_strong_consume_consume(bool volatile* __obj,
+                                                 bool* __exp,
+                                                 bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_strong_consume_consume_b)
     return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
@@ -2832,8 +5093,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_strong_consume_relaxed(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_strong_consume_relaxed(bool volatile* __obj,
+                                                 bool* __exp,
+                                                 bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_b)
     return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
@@ -2846,8 +5108,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_strong_relaxed_relaxed(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_strong_relaxed_relaxed(bool volatile* __obj,
+                                                 bool* __exp,
+                                                 bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_b)
     return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
@@ -2858,12 +5121,3632 @@
 #endif
 }
 
+// compare_exchange_strong char
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_seq_cst(char volatile* __obj,
+                                                 char* __exp,
+                                                 char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_c)
+    return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_acquire(char volatile* __obj,
+                                                 char* __exp,
+                                                 char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_c)
+    return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_consume(char volatile* __obj,
+                                                 char* __exp,
+                                                 char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_c)
+    return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_relaxed(char volatile* __obj,
+                                                 char* __exp,
+                                                 char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_c)
+    return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_acquire(char volatile* __obj,
+                                                 char* __exp,
+                                                 char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_c)
+    return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_consume(char volatile* __obj,
+                                                 char* __exp,
+                                                 char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_c)
+    return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_relaxed(char volatile* __obj,
+                                                 char* __exp,
+                                                 char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_c)
+    return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_acquire(char volatile* __obj,
+                                                 char* __exp,
+                                                 char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_acquire_c)
+    return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_consume(char volatile* __obj,
+                                                 char* __exp,
+                                                 char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_consume_c)
+    return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_relaxed(char volatile* __obj,
+                                                 char* __exp,
+                                                 char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_c)
+    return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_acquire(char volatile* __obj,
+                                                 char* __exp,
+                                                 char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_c)
+    return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_consume(char volatile* __obj,
+                                                 char* __exp,
+                                                 char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_c)
+    return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_relaxed(char volatile* __obj,
+                                                 char* __exp,
+                                                 char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_c)
+    return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_consume(char volatile* __obj,
+                                                 char* __exp,
+                                                 char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_consume_c)
+    return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_relaxed(char volatile* __obj,
+                                                 char* __exp,
+                                                 char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_c)
+    return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_relaxed_relaxed(char volatile* __obj,
+                                                 char* __exp,
+                                                 char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_c)
+    return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+// compare_exchange_strong signed char
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_seq_cst(signed char volatile* __obj,
+                                                 signed char* __exp,
+                                                 signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_a)
+    return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_acquire(signed char volatile* __obj,
+                                                 signed char* __exp,
+                                                 signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_a)
+    return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_consume(signed char volatile* __obj,
+                                                 signed char* __exp,
+                                                 signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_a)
+    return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_relaxed(signed char volatile* __obj,
+                                                 signed char* __exp,
+                                                 signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_a)
+    return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_acquire(signed char volatile* __obj,
+                                                 signed char* __exp,
+                                                 signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_a)
+    return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_consume(signed char volatile* __obj,
+                                                 signed char* __exp,
+                                                 signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_a)
+    return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_relaxed(signed char volatile* __obj,
+                                                 signed char* __exp,
+                                                 signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_a)
+    return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_acquire(signed char volatile* __obj,
+                                                 signed char* __exp,
+                                                 signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_acquire_a)
+    return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_consume(signed char volatile* __obj,
+                                                 signed char* __exp,
+                                                 signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_consume_a)
+    return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_relaxed(signed char volatile* __obj,
+                                                 signed char* __exp,
+                                                 signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_a)
+    return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_acquire(signed char volatile* __obj,
+                                                 signed char* __exp,
+                                                 signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_a)
+    return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_consume(signed char volatile* __obj,
+                                                 signed char* __exp,
+                                                 signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_a)
+    return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_relaxed(signed char volatile* __obj,
+                                                 signed char* __exp,
+                                                 signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_a)
+    return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_consume(signed char volatile* __obj,
+                                                 signed char* __exp,
+                                                 signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_consume_a)
+    return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_relaxed(signed char volatile* __obj,
+                                                 signed char* __exp,
+                                                 signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_a)
+    return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_relaxed_relaxed(signed char volatile* __obj,
+                                                 signed char* __exp,
+                                                 signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_a)
+    return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+// compare_exchange_strong unsigned char
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_seq_cst(unsigned char volatile* __obj,
+                                                 unsigned char* __exp,
+                                                 unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_h)
+    return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_acquire(unsigned char volatile* __obj,
+                                                 unsigned char* __exp,
+                                                 unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_h)
+    return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_consume(unsigned char volatile* __obj,
+                                                 unsigned char* __exp,
+                                                 unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_h)
+    return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_relaxed(unsigned char volatile* __obj,
+                                                 unsigned char* __exp,
+                                                 unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_h)
+    return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_acquire(unsigned char volatile* __obj,
+                                                 unsigned char* __exp,
+                                                 unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_h)
+    return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_consume(unsigned char volatile* __obj,
+                                                 unsigned char* __exp,
+                                                 unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_h)
+    return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_relaxed(unsigned char volatile* __obj,
+                                                 unsigned char* __exp,
+                                                 unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_h)
+    return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_acquire(unsigned char volatile* __obj,
+                                                 unsigned char* __exp,
+                                                 unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_acquire_h)
+    return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_consume(unsigned char volatile* __obj,
+                                                 unsigned char* __exp,
+                                                 unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_consume_h)
+    return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_relaxed(unsigned char volatile* __obj,
+                                                 unsigned char* __exp,
+                                                 unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_h)
+    return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_acquire(unsigned char volatile* __obj,
+                                                 unsigned char* __exp,
+                                                 unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_h)
+    return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_consume(unsigned char volatile* __obj,
+                                                 unsigned char* __exp,
+                                                 unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_h)
+    return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_relaxed(unsigned char volatile* __obj,
+                                                 unsigned char* __exp,
+                                                 unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_h)
+    return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_consume(unsigned char volatile* __obj,
+                                                 unsigned char* __exp,
+                                                 unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_consume_h)
+    return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_relaxed(unsigned char volatile* __obj,
+                                                 unsigned char* __exp,
+                                                 unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_h)
+    return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_relaxed_relaxed(unsigned char volatile* __obj,
+                                                 unsigned char* __exp,
+                                                 unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_h)
+    return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
+
+// compare_exchange_strong char16_t
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_seq_cst(char16_t volatile* __obj,
+                                                 char16_t* __exp,
+                                                 char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_Ds)
+    return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_acquire(char16_t volatile* __obj,
+                                                 char16_t* __exp,
+                                                 char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_Ds)
+    return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_consume(char16_t volatile* __obj,
+                                                 char16_t* __exp,
+                                                 char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_Ds)
+    return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_relaxed(char16_t volatile* __obj,
+                                                 char16_t* __exp,
+                                                 char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_Ds)
+    return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_acquire(char16_t volatile* __obj,
+                                                 char16_t* __exp,
+                                                 char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_Ds)
+    return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_consume(char16_t volatile* __obj,
+                                                 char16_t* __exp,
+                                                 char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_Ds)
+    return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_relaxed(char16_t volatile* __obj,
+                                                 char16_t* __exp,
+                                                 char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_Ds)
+    return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_acquire(char16_t volatile* __obj,
+                                                 char16_t* __exp,
+                                                 char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_acquire_Ds)
+    return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_consume(char16_t volatile* __obj,
+                                                 char16_t* __exp,
+                                                 char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_consume_Ds)
+    return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_relaxed(char16_t volatile* __obj,
+                                                 char16_t* __exp,
+                                                 char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_Ds)
+    return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_acquire(char16_t volatile* __obj,
+                                                 char16_t* __exp,
+                                                 char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_Ds)
+    return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_consume(char16_t volatile* __obj,
+                                                 char16_t* __exp,
+                                                 char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_Ds)
+    return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_relaxed(char16_t volatile* __obj,
+                                                 char16_t* __exp,
+                                                 char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_Ds)
+    return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_consume(char16_t volatile* __obj,
+                                                 char16_t* __exp,
+                                                 char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_consume_Ds)
+    return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_relaxed(char16_t volatile* __obj,
+                                                 char16_t* __exp,
+                                                 char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_Ds)
+    return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_relaxed_relaxed(char16_t volatile* __obj,
+                                                 char16_t* __exp,
+                                                 char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_Ds)
+    return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+// compare_exchange_strong char32_t
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_seq_cst(char32_t volatile* __obj,
+                                                 char32_t* __exp,
+                                                 char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_Di)
+    return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_acquire(char32_t volatile* __obj,
+                                                 char32_t* __exp,
+                                                 char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_Di)
+    return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_consume(char32_t volatile* __obj,
+                                                 char32_t* __exp,
+                                                 char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_Di)
+    return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_relaxed(char32_t volatile* __obj,
+                                                 char32_t* __exp,
+                                                 char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_Di)
+    return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_acquire(char32_t volatile* __obj,
+                                                 char32_t* __exp,
+                                                 char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_Di)
+    return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_consume(char32_t volatile* __obj,
+                                                 char32_t* __exp,
+                                                 char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_Di)
+    return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_relaxed(char32_t volatile* __obj,
+                                                 char32_t* __exp,
+                                                 char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_Di)
+    return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_acquire(char32_t volatile* __obj,
+                                                 char32_t* __exp,
+                                                 char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_acquire_Di)
+    return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_consume(char32_t volatile* __obj,
+                                                 char32_t* __exp,
+                                                 char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_consume_Di)
+    return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_relaxed(char32_t volatile* __obj,
+                                                 char32_t* __exp,
+                                                 char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_Di)
+    return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_acquire(char32_t volatile* __obj,
+                                                 char32_t* __exp,
+                                                 char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_Di)
+    return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_consume(char32_t volatile* __obj,
+                                                 char32_t* __exp,
+                                                 char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_Di)
+    return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_relaxed(char32_t volatile* __obj,
+                                                 char32_t* __exp,
+                                                 char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_Di)
+    return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_consume(char32_t volatile* __obj,
+                                                 char32_t* __exp,
+                                                 char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_consume_Di)
+    return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_relaxed(char32_t volatile* __obj,
+                                                 char32_t* __exp,
+                                                 char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_Di)
+    return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_relaxed_relaxed(char32_t volatile* __obj,
+                                                 char32_t* __exp,
+                                                 char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_Di)
+    return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+#endif  // _LIBCPP_HAS_NO_UNICODE_CHARS
+
+// compare_exchange_strong wchar_t
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_seq_cst(wchar_t volatile* __obj,
+                                                 wchar_t* __exp,
+                                                 wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_w)
+    return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_acquire(wchar_t volatile* __obj,
+                                                 wchar_t* __exp,
+                                                 wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_w)
+    return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_consume(wchar_t volatile* __obj,
+                                                 wchar_t* __exp,
+                                                 wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_w)
+    return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_relaxed(wchar_t volatile* __obj,
+                                                 wchar_t* __exp,
+                                                 wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_w)
+    return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_acquire(wchar_t volatile* __obj,
+                                                 wchar_t* __exp,
+                                                 wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_w)
+    return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_consume(wchar_t volatile* __obj,
+                                                 wchar_t* __exp,
+                                                 wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_w)
+    return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_relaxed(wchar_t volatile* __obj,
+                                                 wchar_t* __exp,
+                                                 wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_w)
+    return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_acquire(wchar_t volatile* __obj,
+                                                 wchar_t* __exp,
+                                                 wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_acquire_w)
+    return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_consume(wchar_t volatile* __obj,
+                                                 wchar_t* __exp,
+                                                 wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_consume_w)
+    return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_relaxed(wchar_t volatile* __obj,
+                                                 wchar_t* __exp,
+                                                 wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_w)
+    return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_acquire(wchar_t volatile* __obj,
+                                                 wchar_t* __exp,
+                                                 wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_w)
+    return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_consume(wchar_t volatile* __obj,
+                                                 wchar_t* __exp,
+                                                 wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_w)
+    return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_relaxed(wchar_t volatile* __obj,
+                                                 wchar_t* __exp,
+                                                 wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_w)
+    return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_consume(wchar_t volatile* __obj,
+                                                 wchar_t* __exp,
+                                                 wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_consume_w)
+    return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_relaxed(wchar_t volatile* __obj,
+                                                 wchar_t* __exp,
+                                                 wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_w)
+    return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_relaxed_relaxed(wchar_t volatile* __obj,
+                                                 wchar_t* __exp,
+                                                 wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_w)
+    return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+// compare_exchange_strong short
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_seq_cst(short volatile* __obj,
+                                                 short* __exp,
+                                                 short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_s)
+    return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_acquire(short volatile* __obj,
+                                                 short* __exp,
+                                                 short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_s)
+    return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_consume(short volatile* __obj,
+                                                 short* __exp,
+                                                 short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_s)
+    return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_relaxed(short volatile* __obj,
+                                                 short* __exp,
+                                                 short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_s)
+    return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_acquire(short volatile* __obj,
+                                                 short* __exp,
+                                                 short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_s)
+    return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_consume(short volatile* __obj,
+                                                 short* __exp,
+                                                 short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_s)
+    return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_relaxed(short volatile* __obj,
+                                                 short* __exp,
+                                                 short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_s)
+    return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_acquire(short volatile* __obj,
+                                                 short* __exp,
+                                                 short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_acquire_s)
+    return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_consume(short volatile* __obj,
+                                                 short* __exp,
+                                                 short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_consume_s)
+    return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_relaxed(short volatile* __obj,
+                                                 short* __exp,
+                                                 short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_s)
+    return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_acquire(short volatile* __obj,
+                                                 short* __exp,
+                                                 short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_s)
+    return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_consume(short volatile* __obj,
+                                                 short* __exp,
+                                                 short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_s)
+    return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_relaxed(short volatile* __obj,
+                                                 short* __exp,
+                                                 short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_s)
+    return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_consume(short volatile* __obj,
+                                                 short* __exp,
+                                                 short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_consume_s)
+    return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_relaxed(short volatile* __obj,
+                                                 short* __exp,
+                                                 short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_s)
+    return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_relaxed_relaxed(short volatile* __obj,
+                                                 short* __exp,
+                                                 short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_s)
+    return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+// compare_exchange_strong unsigned short
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_seq_cst(unsigned short volatile* __obj,
+                                                 unsigned short* __exp,
+                                                 unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_t)
+    return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_acquire(unsigned short volatile* __obj,
+                                                 unsigned short* __exp,
+                                                 unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_t)
+    return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_consume(unsigned short volatile* __obj,
+                                                 unsigned short* __exp,
+                                                 unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_t)
+    return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_relaxed(unsigned short volatile* __obj,
+                                                 unsigned short* __exp,
+                                                 unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_t)
+    return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_acquire(unsigned short volatile* __obj,
+                                                 unsigned short* __exp,
+                                                 unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_t)
+    return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_consume(unsigned short volatile* __obj,
+                                                 unsigned short* __exp,
+                                                 unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_t)
+    return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_relaxed(unsigned short volatile* __obj,
+                                                 unsigned short* __exp,
+                                                 unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_t)
+    return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_acquire(unsigned short volatile* __obj,
+                                                 unsigned short* __exp,
+                                                 unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_acquire_t)
+    return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_consume(unsigned short volatile* __obj,
+                                                 unsigned short* __exp,
+                                                 unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_consume_t)
+    return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_relaxed(unsigned short volatile* __obj,
+                                                 unsigned short* __exp,
+                                                 unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_t)
+    return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_acquire(unsigned short volatile* __obj,
+                                                 unsigned short* __exp,
+                                                 unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_t)
+    return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_consume(unsigned short volatile* __obj,
+                                                 unsigned short* __exp,
+                                                 unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_t)
+    return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_relaxed(unsigned short volatile* __obj,
+                                                 unsigned short* __exp,
+                                                 unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_t)
+    return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_consume(unsigned short volatile* __obj,
+                                                 unsigned short* __exp,
+                                                 unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_consume_t)
+    return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_relaxed(unsigned short volatile* __obj,
+                                                 unsigned short* __exp,
+                                                 unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_t)
+    return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_relaxed_relaxed(unsigned short volatile* __obj,
+                                                 unsigned short* __exp,
+                                                 unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_t)
+    return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+// compare_exchange_strong int
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_seq_cst(int volatile* __obj,
+                                                 int* __exp,
+                                                 int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_i)
+    return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_acquire(int volatile* __obj,
+                                                 int* __exp,
+                                                 int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_i)
+    return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_consume(int volatile* __obj,
+                                                 int* __exp,
+                                                 int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_i)
+    return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_relaxed(int volatile* __obj,
+                                                 int* __exp,
+                                                 int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_i)
+    return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_acquire(int volatile* __obj,
+                                                 int* __exp,
+                                                 int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_i)
+    return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_consume(int volatile* __obj,
+                                                 int* __exp,
+                                                 int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_i)
+    return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_relaxed(int volatile* __obj,
+                                                 int* __exp,
+                                                 int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_i)
+    return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_acquire(int volatile* __obj,
+                                                 int* __exp,
+                                                 int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_acquire_i)
+    return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_consume(int volatile* __obj,
+                                                 int* __exp,
+                                                 int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_consume_i)
+    return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_relaxed(int volatile* __obj,
+                                                 int* __exp,
+                                                 int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_i)
+    return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_acquire(int volatile* __obj,
+                                                 int* __exp,
+                                                 int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_i)
+    return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_consume(int volatile* __obj,
+                                                 int* __exp,
+                                                 int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_i)
+    return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_relaxed(int volatile* __obj,
+                                                 int* __exp,
+                                                 int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_i)
+    return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_consume(int volatile* __obj,
+                                                 int* __exp,
+                                                 int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_consume_i)
+    return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_relaxed(int volatile* __obj,
+                                                 int* __exp,
+                                                 int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_i)
+    return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_relaxed_relaxed(int volatile* __obj,
+                                                 int* __exp,
+                                                 int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_i)
+    return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+// compare_exchange_strong unsigned int
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_seq_cst(unsigned int volatile* __obj,
+                                                 unsigned int* __exp,
+                                                 unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_j)
+    return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_acquire(unsigned int volatile* __obj,
+                                                 unsigned int* __exp,
+                                                 unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_j)
+    return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_consume(unsigned int volatile* __obj,
+                                                 unsigned int* __exp,
+                                                 unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_j)
+    return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_relaxed(unsigned int volatile* __obj,
+                                                 unsigned int* __exp,
+                                                 unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_j)
+    return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_acquire(unsigned int volatile* __obj,
+                                                 unsigned int* __exp,
+                                                 unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_j)
+    return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_consume(unsigned int volatile* __obj,
+                                                 unsigned int* __exp,
+                                                 unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_j)
+    return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_relaxed(unsigned int volatile* __obj,
+                                                 unsigned int* __exp,
+                                                 unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_j)
+    return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_acquire(unsigned int volatile* __obj,
+                                                 unsigned int* __exp,
+                                                 unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_acquire_j)
+    return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_consume(unsigned int volatile* __obj,
+                                                 unsigned int* __exp,
+                                                 unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_consume_j)
+    return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_relaxed(unsigned int volatile* __obj,
+                                                 unsigned int* __exp,
+                                                 unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_j)
+    return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_acquire(unsigned int volatile* __obj,
+                                                 unsigned int* __exp,
+                                                 unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_j)
+    return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_consume(unsigned int volatile* __obj,
+                                                 unsigned int* __exp,
+                                                 unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_j)
+    return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_relaxed(unsigned int volatile* __obj,
+                                                 unsigned int* __exp,
+                                                 unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_j)
+    return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_consume(unsigned int volatile* __obj,
+                                                 unsigned int* __exp,
+                                                 unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_consume_j)
+    return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_relaxed(unsigned int volatile* __obj,
+                                                 unsigned int* __exp,
+                                                 unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_j)
+    return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_relaxed_relaxed(unsigned int volatile* __obj,
+                                                 unsigned int* __exp,
+                                                 unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_j)
+    return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+// compare_exchange_strong long
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_seq_cst(long volatile* __obj,
+                                                 long* __exp,
+                                                 long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_l)
+    return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_acquire(long volatile* __obj,
+                                                 long* __exp,
+                                                 long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_l)
+    return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_consume(long volatile* __obj,
+                                                 long* __exp,
+                                                 long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_l)
+    return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_relaxed(long volatile* __obj,
+                                                 long* __exp,
+                                                 long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_l)
+    return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_acquire(long volatile* __obj,
+                                                 long* __exp,
+                                                 long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_l)
+    return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_consume(long volatile* __obj,
+                                                 long* __exp,
+                                                 long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_l)
+    return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_relaxed(long volatile* __obj,
+                                                 long* __exp,
+                                                 long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_l)
+    return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_acquire(long volatile* __obj,
+                                                 long* __exp,
+                                                 long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_acquire_l)
+    return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_consume(long volatile* __obj,
+                                                 long* __exp,
+                                                 long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_consume_l)
+    return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_relaxed(long volatile* __obj,
+                                                 long* __exp,
+                                                 long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_l)
+    return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_acquire(long volatile* __obj,
+                                                 long* __exp,
+                                                 long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_l)
+    return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_consume(long volatile* __obj,
+                                                 long* __exp,
+                                                 long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_l)
+    return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_relaxed(long volatile* __obj,
+                                                 long* __exp,
+                                                 long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_l)
+    return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_consume(long volatile* __obj,
+                                                 long* __exp,
+                                                 long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_consume_l)
+    return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_relaxed(long volatile* __obj,
+                                                 long* __exp,
+                                                 long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_l)
+    return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_relaxed_relaxed(long volatile* __obj,
+                                                 long* __exp,
+                                                 long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_l)
+    return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+// compare_exchange_strong unsigned long
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_seq_cst(unsigned long volatile* __obj,
+                                                 unsigned long* __exp,
+                                                 unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_m)
+    return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_acquire(unsigned long volatile* __obj,
+                                                 unsigned long* __exp,
+                                                 unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_m)
+    return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_consume(unsigned long volatile* __obj,
+                                                 unsigned long* __exp,
+                                                 unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_m)
+    return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_relaxed(unsigned long volatile* __obj,
+                                                 unsigned long* __exp,
+                                                 unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_m)
+    return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_acquire(unsigned long volatile* __obj,
+                                                 unsigned long* __exp,
+                                                 unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_m)
+    return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_consume(unsigned long volatile* __obj,
+                                                 unsigned long* __exp,
+                                                 unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_m)
+    return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_relaxed(unsigned long volatile* __obj,
+                                                 unsigned long* __exp,
+                                                 unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_m)
+    return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_acquire(unsigned long volatile* __obj,
+                                                 unsigned long* __exp,
+                                                 unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_acquire_m)
+    return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_consume(unsigned long volatile* __obj,
+                                                 unsigned long* __exp,
+                                                 unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_consume_m)
+    return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_relaxed(unsigned long volatile* __obj,
+                                                 unsigned long* __exp,
+                                                 unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_m)
+    return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_acquire(unsigned long volatile* __obj,
+                                                 unsigned long* __exp,
+                                                 unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_m)
+    return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_consume(unsigned long volatile* __obj,
+                                                 unsigned long* __exp,
+                                                 unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_m)
+    return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_relaxed(unsigned long volatile* __obj,
+                                                 unsigned long* __exp,
+                                                 unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_m)
+    return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_consume(unsigned long volatile* __obj,
+                                                 unsigned long* __exp,
+                                                 unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_consume_m)
+    return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_relaxed(unsigned long volatile* __obj,
+                                                 unsigned long* __exp,
+                                                 unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_m)
+    return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_relaxed_relaxed(unsigned long volatile* __obj,
+                                                 unsigned long* __exp,
+                                                 unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_m)
+    return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+// compare_exchange_strong long long
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_seq_cst(long long volatile* __obj,
+                                                 long long* __exp,
+                                                 long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_x)
+    return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_acquire(long long volatile* __obj,
+                                                 long long* __exp,
+                                                 long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_x)
+    return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_consume(long long volatile* __obj,
+                                                 long long* __exp,
+                                                 long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_x)
+    return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_relaxed(long long volatile* __obj,
+                                                 long long* __exp,
+                                                 long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_x)
+    return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_acquire(long long volatile* __obj,
+                                                 long long* __exp,
+                                                 long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_x)
+    return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_consume(long long volatile* __obj,
+                                                 long long* __exp,
+                                                 long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_x)
+    return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_relaxed(long long volatile* __obj,
+                                                 long long* __exp,
+                                                 long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_x)
+    return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_acquire(long long volatile* __obj,
+                                                 long long* __exp,
+                                                 long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_acquire_x)
+    return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_consume(long long volatile* __obj,
+                                                 long long* __exp,
+                                                 long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_consume_x)
+    return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_relaxed(long long volatile* __obj,
+                                                 long long* __exp,
+                                                 long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_x)
+    return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_acquire(long long volatile* __obj,
+                                                 long long* __exp,
+                                                 long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_x)
+    return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_consume(long long volatile* __obj,
+                                                 long long* __exp,
+                                                 long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_x)
+    return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_relaxed(long long volatile* __obj,
+                                                 long long* __exp,
+                                                 long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_x)
+    return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_consume(long long volatile* __obj,
+                                                 long long* __exp,
+                                                 long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_consume_x)
+    return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_relaxed(long long volatile* __obj,
+                                                 long long* __exp,
+                                                 long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_x)
+    return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_relaxed_relaxed(long long volatile* __obj,
+                                                 long long* __exp,
+                                                 long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_x)
+    return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+// compare_exchange_strong unsigned long long
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_seq_cst(unsigned long long volatile* __obj,
+                                                 unsigned long long* __exp,
+                                                 unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_y)
+    return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_acquire(unsigned long long volatile* __obj,
+                                                 unsigned long long* __exp,
+                                                 unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_y)
+    return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_consume(unsigned long long volatile* __obj,
+                                                 unsigned long long* __exp,
+                                                 unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_y)
+    return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_relaxed(unsigned long long volatile* __obj,
+                                                 unsigned long long* __exp,
+                                                 unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_y)
+    return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_acquire(unsigned long long volatile* __obj,
+                                                 unsigned long long* __exp,
+                                                 unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_y)
+    return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_consume(unsigned long long volatile* __obj,
+                                                 unsigned long long* __exp,
+                                                 unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_y)
+    return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_relaxed(unsigned long long volatile* __obj,
+                                                 unsigned long long* __exp,
+                                                 unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_y)
+    return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_acquire(unsigned long long volatile* __obj,
+                                                 unsigned long long* __exp,
+                                                 unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_acquire_y)
+    return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_consume(unsigned long long volatile* __obj,
+                                                 unsigned long long* __exp,
+                                                 unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_consume_y)
+    return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_relaxed(unsigned long long volatile* __obj,
+                                                 unsigned long long* __exp,
+                                                 unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_y)
+    return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_acquire(unsigned long long volatile* __obj,
+                                                 unsigned long long* __exp,
+                                                 unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_y)
+    return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_consume(unsigned long long volatile* __obj,
+                                                 unsigned long long* __exp,
+                                                 unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_y)
+    return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_relaxed(unsigned long long volatile* __obj,
+                                                 unsigned long long* __exp,
+                                                 unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_y)
+    return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_consume(unsigned long long volatile* __obj,
+                                                 unsigned long long* __exp,
+                                                 unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_consume_y)
+    return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_relaxed(unsigned long long volatile* __obj,
+                                                 unsigned long long* __exp,
+                                                 unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_y)
+    return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_relaxed_relaxed(unsigned long long volatile* __obj,
+                                                 unsigned long long* __exp,
+                                                 unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_y)
+    return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+// compare_exchange_strong void*
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_seq_cst(void* volatile* __obj,
+                                                 void** __exp,
+                                                 void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_seq_cst_Py)
+    return __atomic_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __compare_exchange_strong_seq_cst_seq_cst(__obj, __exp, __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_acquire(void* volatile* __obj,
+                                                 void** __exp,
+                                                 void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_acquire_Py)
+    return __atomic_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_consume(void* volatile* __obj,
+                                                 void** __exp,
+                                                 void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_consume_Py)
+    return __atomic_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_seq_cst_relaxed(void* volatile* __obj,
+                                                 void** __exp,
+                                                 void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_seq_cst_relaxed_Py)
+    return __atomic_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_acquire(void* volatile* __obj,
+                                                 void** __exp,
+                                                 void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_acquire_Py)
+    return __atomic_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_consume(void* volatile* __obj,
+                                                 void** __exp,
+                                                 void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_consume_Py)
+    return __atomic_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acq_rel_relaxed(void* volatile* __obj,
+                                                 void** __exp,
+                                                 void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acq_rel_relaxed_Py)
+    return __atomic_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_acquire(void* volatile* __obj,
+                                                 void** __exp,
+                                                 void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_acquire_Py)
+    return __atomic_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_consume(void* volatile* __obj,
+                                                 void** __exp,
+                                                 void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_consume_Py)
+    return __atomic_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_release_relaxed(void* volatile* __obj,
+                                                 void** __exp,
+                                                 void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_release_relaxed_Py)
+    return __atomic_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_acquire(void* volatile* __obj,
+                                                 void** __exp,
+                                                 void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_acquire_Py)
+    return __atomic_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_consume(void* volatile* __obj,
+                                                 void** __exp,
+                                                 void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_consume_Py)
+    return __atomic_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_acquire_relaxed(void* volatile* __obj,
+                                                 void** __exp,
+                                                 void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_acquire_relaxed_Py)
+    return __atomic_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_consume(void* volatile* __obj,
+                                                 void** __exp,
+                                                 void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_consume_Py)
+    return __atomic_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_consume_relaxed(void* volatile* __obj,
+                                                 void** __exp,
+                                                 void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_consume_relaxed_Py)
+    return __atomic_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_strong_relaxed_relaxed(void* volatile* __obj,
+                                                 void** __exp,
+                                                 void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_strong_relaxed_relaxed_Py)
+    return __atomic_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
 // compare_exchange_weak bool
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_weak_seq_cst_seq_cst(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_weak_seq_cst_seq_cst(bool volatile* __obj,
+                                               bool* __exp,
+                                               bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_b)
     return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
@@ -2876,8 +8759,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_weak_seq_cst_acquire(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_weak_seq_cst_acquire(bool volatile* __obj,
+                                               bool* __exp,
+                                               bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_b)
     return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
@@ -2890,8 +8774,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_weak_seq_cst_consume(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_weak_seq_cst_consume(bool volatile* __obj,
+                                               bool* __exp,
+                                               bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_b)
     return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
@@ -2904,8 +8789,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_weak_seq_cst_relaxed(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_weak_seq_cst_relaxed(bool volatile* __obj,
+                                               bool* __exp,
+                                               bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_b)
     return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
@@ -2918,8 +8804,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_weak_acq_rel_acquire(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_weak_acq_rel_acquire(bool volatile* __obj,
+                                               bool* __exp,
+                                               bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_b)
     return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
@@ -2932,8 +8819,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_weak_acq_rel_consume(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_weak_acq_rel_consume(bool volatile* __obj,
+                                               bool* __exp,
+                                               bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_b)
     return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
@@ -2946,8 +8834,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_weak_acq_rel_relaxed(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_weak_acq_rel_relaxed(bool volatile* __obj,
+                                               bool* __exp,
+                                               bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_b)
     return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
@@ -2960,8 +8849,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_weak_release_acquire(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_weak_release_acquire(bool volatile* __obj,
+                                               bool* __exp,
+                                               bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_weak_release_acquire_b)
     return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
@@ -2974,8 +8864,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_weak_release_consume(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_weak_release_consume(bool volatile* __obj,
+                                               bool* __exp,
+                                               bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_weak_release_consume_b)
     return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
@@ -2988,8 +8879,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_weak_release_relaxed(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_weak_release_relaxed(bool volatile* __obj,
+                                               bool* __exp,
+                                               bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_weak_release_relaxed_b)
     return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
@@ -3002,8 +8894,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_weak_acquire_acquire(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_weak_acquire_acquire(bool volatile* __obj,
+                                               bool* __exp,
+                                               bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_b)
     return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
@@ -3016,8 +8909,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_weak_acquire_consume(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_weak_acquire_consume(bool volatile* __obj,
+                                               bool* __exp,
+                                               bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_weak_acquire_consume_b)
     return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
@@ -3030,8 +8924,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_weak_acquire_relaxed(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_weak_acquire_relaxed(bool volatile* __obj,
+                                               bool* __exp,
+                                               bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_b)
     return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
@@ -3044,8 +8939,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_weak_consume_consume(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_weak_consume_consume(bool volatile* __obj,
+                                               bool* __exp,
+                                               bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_weak_consume_consume_b)
     return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
@@ -3058,8 +8954,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_weak_consume_relaxed(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_weak_consume_relaxed(bool volatile* __obj,
+                                               bool* __exp,
+                                               bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_b)
     return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
@@ -3072,8 +8969,9 @@
 
 inline _LIBCPP_INLINE_VISIBILITY
 bool
-__choose_compare_exchange_weak_relaxed_relaxed(volatile bool* __obj,
-                                                       bool* __exp, bool __desr)
+__choose_compare_exchange_weak_relaxed_relaxed(bool volatile* __obj,
+                                               bool* __exp,
+                                               bool __desr)
 {
 #if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_b)
     return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
@@ -3084,6 +8982,3398 @@
 #endif
 }
 
+// compare_exchange_weak signed char
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_seq_cst(signed char volatile* __obj,
+                                               signed char* __exp,
+                                               signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_a)
+    return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_acquire(signed char volatile* __obj,
+                                               signed char* __exp,
+                                               signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_a)
+    return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_consume(signed char volatile* __obj,
+                                               signed char* __exp,
+                                               signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_a)
+    return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_relaxed(signed char volatile* __obj,
+                                               signed char* __exp,
+                                               signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_a)
+    return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_acquire(signed char volatile* __obj,
+                                               signed char* __exp,
+                                               signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_a)
+    return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_consume(signed char volatile* __obj,
+                                               signed char* __exp,
+                                               signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_a)
+    return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_relaxed(signed char volatile* __obj,
+                                               signed char* __exp,
+                                               signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_a)
+    return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_acquire(signed char volatile* __obj,
+                                               signed char* __exp,
+                                               signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_acquire_a)
+    return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_consume(signed char volatile* __obj,
+                                               signed char* __exp,
+                                               signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_consume_a)
+    return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_relaxed(signed char volatile* __obj,
+                                               signed char* __exp,
+                                               signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_a)
+    return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_acquire(signed char volatile* __obj,
+                                               signed char* __exp,
+                                               signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_a)
+    return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_consume(signed char volatile* __obj,
+                                               signed char* __exp,
+                                               signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_a)
+    return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_relaxed(signed char volatile* __obj,
+                                               signed char* __exp,
+                                               signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_a)
+    return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_consume(signed char volatile* __obj,
+                                               signed char* __exp,
+                                               signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_consume_a)
+    return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_relaxed(signed char volatile* __obj,
+                                               signed char* __exp,
+                                               signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_a)
+    return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_relaxed_relaxed(signed char volatile* __obj,
+                                               signed char* __exp,
+                                               signed char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_a)
+    return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+// compare_exchange_weak unsigned char
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_seq_cst(unsigned char volatile* __obj,
+                                               unsigned char* __exp,
+                                               unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_h)
+    return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_acquire(unsigned char volatile* __obj,
+                                               unsigned char* __exp,
+                                               unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_h)
+    return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_consume(unsigned char volatile* __obj,
+                                               unsigned char* __exp,
+                                               unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_h)
+    return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_relaxed(unsigned char volatile* __obj,
+                                               unsigned char* __exp,
+                                               unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_h)
+    return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_acquire(unsigned char volatile* __obj,
+                                               unsigned char* __exp,
+                                               unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_h)
+    return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_consume(unsigned char volatile* __obj,
+                                               unsigned char* __exp,
+                                               unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_h)
+    return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_relaxed(unsigned char volatile* __obj,
+                                               unsigned char* __exp,
+                                               unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_h)
+    return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_acquire(unsigned char volatile* __obj,
+                                               unsigned char* __exp,
+                                               unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_acquire_h)
+    return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_consume(unsigned char volatile* __obj,
+                                               unsigned char* __exp,
+                                               unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_consume_h)
+    return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_relaxed(unsigned char volatile* __obj,
+                                               unsigned char* __exp,
+                                               unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_h)
+    return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_acquire(unsigned char volatile* __obj,
+                                               unsigned char* __exp,
+                                               unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_h)
+    return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_consume(unsigned char volatile* __obj,
+                                               unsigned char* __exp,
+                                               unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_h)
+    return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_relaxed(unsigned char volatile* __obj,
+                                               unsigned char* __exp,
+                                               unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_h)
+    return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_consume(unsigned char volatile* __obj,
+                                               unsigned char* __exp,
+                                               unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_consume_h)
+    return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_relaxed(unsigned char volatile* __obj,
+                                               unsigned char* __exp,
+                                               unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_h)
+    return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_relaxed_relaxed(unsigned char volatile* __obj,
+                                               unsigned char* __exp,
+                                               unsigned char __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_h)
+    return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
+
+// compare_exchange_weak char16_t
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_seq_cst(char16_t volatile* __obj,
+                                               char16_t* __exp,
+                                               char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_Ds)
+    return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_acquire(char16_t volatile* __obj,
+                                               char16_t* __exp,
+                                               char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_Ds)
+    return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_consume(char16_t volatile* __obj,
+                                               char16_t* __exp,
+                                               char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_Ds)
+    return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_relaxed(char16_t volatile* __obj,
+                                               char16_t* __exp,
+                                               char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_Ds)
+    return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_acquire(char16_t volatile* __obj,
+                                               char16_t* __exp,
+                                               char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_Ds)
+    return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_consume(char16_t volatile* __obj,
+                                               char16_t* __exp,
+                                               char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_Ds)
+    return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_relaxed(char16_t volatile* __obj,
+                                               char16_t* __exp,
+                                               char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_Ds)
+    return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_acquire(char16_t volatile* __obj,
+                                               char16_t* __exp,
+                                               char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_acquire_Ds)
+    return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_consume(char16_t volatile* __obj,
+                                               char16_t* __exp,
+                                               char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_consume_Ds)
+    return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_relaxed(char16_t volatile* __obj,
+                                               char16_t* __exp,
+                                               char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_Ds)
+    return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_acquire(char16_t volatile* __obj,
+                                               char16_t* __exp,
+                                               char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_Ds)
+    return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_consume(char16_t volatile* __obj,
+                                               char16_t* __exp,
+                                               char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_Ds)
+    return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_relaxed(char16_t volatile* __obj,
+                                               char16_t* __exp,
+                                               char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_Ds)
+    return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_consume(char16_t volatile* __obj,
+                                               char16_t* __exp,
+                                               char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_consume_Ds)
+    return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_relaxed(char16_t volatile* __obj,
+                                               char16_t* __exp,
+                                               char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_Ds)
+    return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_relaxed_relaxed(char16_t volatile* __obj,
+                                               char16_t* __exp,
+                                               char16_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_Ds)
+    return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+// compare_exchange_weak char32_t
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_seq_cst(char32_t volatile* __obj,
+                                               char32_t* __exp,
+                                               char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_Di)
+    return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_acquire(char32_t volatile* __obj,
+                                               char32_t* __exp,
+                                               char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_Di)
+    return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_consume(char32_t volatile* __obj,
+                                               char32_t* __exp,
+                                               char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_Di)
+    return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_relaxed(char32_t volatile* __obj,
+                                               char32_t* __exp,
+                                               char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_Di)
+    return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_acquire(char32_t volatile* __obj,
+                                               char32_t* __exp,
+                                               char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_Di)
+    return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_consume(char32_t volatile* __obj,
+                                               char32_t* __exp,
+                                               char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_Di)
+    return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_relaxed(char32_t volatile* __obj,
+                                               char32_t* __exp,
+                                               char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_Di)
+    return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_acquire(char32_t volatile* __obj,
+                                               char32_t* __exp,
+                                               char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_acquire_Di)
+    return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_consume(char32_t volatile* __obj,
+                                               char32_t* __exp,
+                                               char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_consume_Di)
+    return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_relaxed(char32_t volatile* __obj,
+                                               char32_t* __exp,
+                                               char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_Di)
+    return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_acquire(char32_t volatile* __obj,
+                                               char32_t* __exp,
+                                               char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_Di)
+    return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_consume(char32_t volatile* __obj,
+                                               char32_t* __exp,
+                                               char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_Di)
+    return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_relaxed(char32_t volatile* __obj,
+                                               char32_t* __exp,
+                                               char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_Di)
+    return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_consume(char32_t volatile* __obj,
+                                               char32_t* __exp,
+                                               char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_consume_Di)
+    return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_relaxed(char32_t volatile* __obj,
+                                               char32_t* __exp,
+                                               char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_Di)
+    return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_relaxed_relaxed(char32_t volatile* __obj,
+                                               char32_t* __exp,
+                                               char32_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_Di)
+    return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+#endif  // _LIBCPP_HAS_NO_UNICODE_CHARS
+
+// compare_exchange_weak wchar_t
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_seq_cst(wchar_t volatile* __obj,
+                                               wchar_t* __exp,
+                                               wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_w)
+    return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_acquire(wchar_t volatile* __obj,
+                                               wchar_t* __exp,
+                                               wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_w)
+    return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_consume(wchar_t volatile* __obj,
+                                               wchar_t* __exp,
+                                               wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_w)
+    return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_relaxed(wchar_t volatile* __obj,
+                                               wchar_t* __exp,
+                                               wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_w)
+    return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_acquire(wchar_t volatile* __obj,
+                                               wchar_t* __exp,
+                                               wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_w)
+    return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_consume(wchar_t volatile* __obj,
+                                               wchar_t* __exp,
+                                               wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_w)
+    return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_relaxed(wchar_t volatile* __obj,
+                                               wchar_t* __exp,
+                                               wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_w)
+    return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_acquire(wchar_t volatile* __obj,
+                                               wchar_t* __exp,
+                                               wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_acquire_w)
+    return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_consume(wchar_t volatile* __obj,
+                                               wchar_t* __exp,
+                                               wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_consume_w)
+    return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_relaxed(wchar_t volatile* __obj,
+                                               wchar_t* __exp,
+                                               wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_w)
+    return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_acquire(wchar_t volatile* __obj,
+                                               wchar_t* __exp,
+                                               wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_w)
+    return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_consume(wchar_t volatile* __obj,
+                                               wchar_t* __exp,
+                                               wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_w)
+    return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_relaxed(wchar_t volatile* __obj,
+                                               wchar_t* __exp,
+                                               wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_w)
+    return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_consume(wchar_t volatile* __obj,
+                                               wchar_t* __exp,
+                                               wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_consume_w)
+    return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_relaxed(wchar_t volatile* __obj,
+                                               wchar_t* __exp,
+                                               wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_w)
+    return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_relaxed_relaxed(wchar_t volatile* __obj,
+                                               wchar_t* __exp,
+                                               wchar_t __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_w)
+    return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+// compare_exchange_weak short
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_seq_cst(short volatile* __obj,
+                                               short* __exp,
+                                               short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_s)
+    return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_acquire(short volatile* __obj,
+                                               short* __exp,
+                                               short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_s)
+    return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_consume(short volatile* __obj,
+                                               short* __exp,
+                                               short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_s)
+    return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_relaxed(short volatile* __obj,
+                                               short* __exp,
+                                               short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_s)
+    return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_acquire(short volatile* __obj,
+                                               short* __exp,
+                                               short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_s)
+    return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_consume(short volatile* __obj,
+                                               short* __exp,
+                                               short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_s)
+    return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_relaxed(short volatile* __obj,
+                                               short* __exp,
+                                               short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_s)
+    return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_acquire(short volatile* __obj,
+                                               short* __exp,
+                                               short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_acquire_s)
+    return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_consume(short volatile* __obj,
+                                               short* __exp,
+                                               short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_consume_s)
+    return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_relaxed(short volatile* __obj,
+                                               short* __exp,
+                                               short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_s)
+    return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_acquire(short volatile* __obj,
+                                               short* __exp,
+                                               short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_s)
+    return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_consume(short volatile* __obj,
+                                               short* __exp,
+                                               short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_s)
+    return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_relaxed(short volatile* __obj,
+                                               short* __exp,
+                                               short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_s)
+    return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_consume(short volatile* __obj,
+                                               short* __exp,
+                                               short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_consume_s)
+    return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_relaxed(short volatile* __obj,
+                                               short* __exp,
+                                               short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_s)
+    return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_relaxed_relaxed(short volatile* __obj,
+                                               short* __exp,
+                                               short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_s)
+    return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+// compare_exchange_weak unsigned short
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_seq_cst(unsigned short volatile* __obj,
+                                               unsigned short* __exp,
+                                               unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_t)
+    return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_acquire(unsigned short volatile* __obj,
+                                               unsigned short* __exp,
+                                               unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_t)
+    return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_consume(unsigned short volatile* __obj,
+                                               unsigned short* __exp,
+                                               unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_t)
+    return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_relaxed(unsigned short volatile* __obj,
+                                               unsigned short* __exp,
+                                               unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_t)
+    return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_acquire(unsigned short volatile* __obj,
+                                               unsigned short* __exp,
+                                               unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_t)
+    return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_consume(unsigned short volatile* __obj,
+                                               unsigned short* __exp,
+                                               unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_t)
+    return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_relaxed(unsigned short volatile* __obj,
+                                               unsigned short* __exp,
+                                               unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_t)
+    return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_acquire(unsigned short volatile* __obj,
+                                               unsigned short* __exp,
+                                               unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_acquire_t)
+    return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_consume(unsigned short volatile* __obj,
+                                               unsigned short* __exp,
+                                               unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_consume_t)
+    return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_relaxed(unsigned short volatile* __obj,
+                                               unsigned short* __exp,
+                                               unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_t)
+    return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_acquire(unsigned short volatile* __obj,
+                                               unsigned short* __exp,
+                                               unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_t)
+    return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_consume(unsigned short volatile* __obj,
+                                               unsigned short* __exp,
+                                               unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_t)
+    return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_relaxed(unsigned short volatile* __obj,
+                                               unsigned short* __exp,
+                                               unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_t)
+    return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_consume(unsigned short volatile* __obj,
+                                               unsigned short* __exp,
+                                               unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_consume_t)
+    return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_relaxed(unsigned short volatile* __obj,
+                                               unsigned short* __exp,
+                                               unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_t)
+    return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_relaxed_relaxed(unsigned short volatile* __obj,
+                                               unsigned short* __exp,
+                                               unsigned short __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_t)
+    return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+// compare_exchange_weak int
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_seq_cst(int volatile* __obj,
+                                               int* __exp,
+                                               int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_i)
+    return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_acquire(int volatile* __obj,
+                                               int* __exp,
+                                               int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_i)
+    return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_consume(int volatile* __obj,
+                                               int* __exp,
+                                               int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_i)
+    return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_relaxed(int volatile* __obj,
+                                               int* __exp,
+                                               int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_i)
+    return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_acquire(int volatile* __obj,
+                                               int* __exp,
+                                               int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_i)
+    return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_consume(int volatile* __obj,
+                                               int* __exp,
+                                               int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_i)
+    return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_relaxed(int volatile* __obj,
+                                               int* __exp,
+                                               int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_i)
+    return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_acquire(int volatile* __obj,
+                                               int* __exp,
+                                               int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_acquire_i)
+    return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_consume(int volatile* __obj,
+                                               int* __exp,
+                                               int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_consume_i)
+    return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_relaxed(int volatile* __obj,
+                                               int* __exp,
+                                               int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_i)
+    return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_acquire(int volatile* __obj,
+                                               int* __exp,
+                                               int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_i)
+    return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_consume(int volatile* __obj,
+                                               int* __exp,
+                                               int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_i)
+    return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_relaxed(int volatile* __obj,
+                                               int* __exp,
+                                               int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_i)
+    return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_consume(int volatile* __obj,
+                                               int* __exp,
+                                               int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_consume_i)
+    return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_relaxed(int volatile* __obj,
+                                               int* __exp,
+                                               int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_i)
+    return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_relaxed_relaxed(int volatile* __obj,
+                                               int* __exp,
+                                               int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_i)
+    return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+// compare_exchange_weak unsigned int
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_seq_cst(unsigned int volatile* __obj,
+                                               unsigned int* __exp,
+                                               unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_j)
+    return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_acquire(unsigned int volatile* __obj,
+                                               unsigned int* __exp,
+                                               unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_j)
+    return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_consume(unsigned int volatile* __obj,
+                                               unsigned int* __exp,
+                                               unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_j)
+    return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_relaxed(unsigned int volatile* __obj,
+                                               unsigned int* __exp,
+                                               unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_j)
+    return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_acquire(unsigned int volatile* __obj,
+                                               unsigned int* __exp,
+                                               unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_j)
+    return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_consume(unsigned int volatile* __obj,
+                                               unsigned int* __exp,
+                                               unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_j)
+    return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_relaxed(unsigned int volatile* __obj,
+                                               unsigned int* __exp,
+                                               unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_j)
+    return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_acquire(unsigned int volatile* __obj,
+                                               unsigned int* __exp,
+                                               unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_acquire_j)
+    return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_consume(unsigned int volatile* __obj,
+                                               unsigned int* __exp,
+                                               unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_consume_j)
+    return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_relaxed(unsigned int volatile* __obj,
+                                               unsigned int* __exp,
+                                               unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_j)
+    return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_acquire(unsigned int volatile* __obj,
+                                               unsigned int* __exp,
+                                               unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_j)
+    return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_consume(unsigned int volatile* __obj,
+                                               unsigned int* __exp,
+                                               unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_j)
+    return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_relaxed(unsigned int volatile* __obj,
+                                               unsigned int* __exp,
+                                               unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_j)
+    return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_consume(unsigned int volatile* __obj,
+                                               unsigned int* __exp,
+                                               unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_consume_j)
+    return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_relaxed(unsigned int volatile* __obj,
+                                               unsigned int* __exp,
+                                               unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_j)
+    return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_relaxed_relaxed(unsigned int volatile* __obj,
+                                               unsigned int* __exp,
+                                               unsigned int __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_j)
+    return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+// compare_exchange_weak long
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_seq_cst(long volatile* __obj,
+                                               long* __exp,
+                                               long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_l)
+    return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_acquire(long volatile* __obj,
+                                               long* __exp,
+                                               long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_l)
+    return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_consume(long volatile* __obj,
+                                               long* __exp,
+                                               long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_l)
+    return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_relaxed(long volatile* __obj,
+                                               long* __exp,
+                                               long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_l)
+    return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_acquire(long volatile* __obj,
+                                               long* __exp,
+                                               long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_l)
+    return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_consume(long volatile* __obj,
+                                               long* __exp,
+                                               long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_l)
+    return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_relaxed(long volatile* __obj,
+                                               long* __exp,
+                                               long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_l)
+    return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_acquire(long volatile* __obj,
+                                               long* __exp,
+                                               long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_acquire_l)
+    return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_consume(long volatile* __obj,
+                                               long* __exp,
+                                               long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_consume_l)
+    return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_relaxed(long volatile* __obj,
+                                               long* __exp,
+                                               long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_l)
+    return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_acquire(long volatile* __obj,
+                                               long* __exp,
+                                               long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_l)
+    return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_consume(long volatile* __obj,
+                                               long* __exp,
+                                               long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_l)
+    return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_relaxed(long volatile* __obj,
+                                               long* __exp,
+                                               long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_l)
+    return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_consume(long volatile* __obj,
+                                               long* __exp,
+                                               long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_consume_l)
+    return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_relaxed(long volatile* __obj,
+                                               long* __exp,
+                                               long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_l)
+    return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_relaxed_relaxed(long volatile* __obj,
+                                               long* __exp,
+                                               long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_l)
+    return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+// compare_exchange_weak unsigned long
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_seq_cst(unsigned long volatile* __obj,
+                                               unsigned long* __exp,
+                                               unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_m)
+    return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_acquire(unsigned long volatile* __obj,
+                                               unsigned long* __exp,
+                                               unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_m)
+    return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_consume(unsigned long volatile* __obj,
+                                               unsigned long* __exp,
+                                               unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_m)
+    return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_relaxed(unsigned long volatile* __obj,
+                                               unsigned long* __exp,
+                                               unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_m)
+    return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_acquire(unsigned long volatile* __obj,
+                                               unsigned long* __exp,
+                                               unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_m)
+    return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_consume(unsigned long volatile* __obj,
+                                               unsigned long* __exp,
+                                               unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_m)
+    return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_relaxed(unsigned long volatile* __obj,
+                                               unsigned long* __exp,
+                                               unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_m)
+    return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_acquire(unsigned long volatile* __obj,
+                                               unsigned long* __exp,
+                                               unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_acquire_m)
+    return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_consume(unsigned long volatile* __obj,
+                                               unsigned long* __exp,
+                                               unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_consume_m)
+    return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_relaxed(unsigned long volatile* __obj,
+                                               unsigned long* __exp,
+                                               unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_m)
+    return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_acquire(unsigned long volatile* __obj,
+                                               unsigned long* __exp,
+                                               unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_m)
+    return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_consume(unsigned long volatile* __obj,
+                                               unsigned long* __exp,
+                                               unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_m)
+    return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_relaxed(unsigned long volatile* __obj,
+                                               unsigned long* __exp,
+                                               unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_m)
+    return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_consume(unsigned long volatile* __obj,
+                                               unsigned long* __exp,
+                                               unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_consume_m)
+    return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_relaxed(unsigned long volatile* __obj,
+                                               unsigned long* __exp,
+                                               unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_m)
+    return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_relaxed_relaxed(unsigned long volatile* __obj,
+                                               unsigned long* __exp,
+                                               unsigned long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_m)
+    return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+// compare_exchange_weak long long
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_seq_cst(long long volatile* __obj,
+                                               long long* __exp,
+                                               long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_x)
+    return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_acquire(long long volatile* __obj,
+                                               long long* __exp,
+                                               long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_x)
+    return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_consume(long long volatile* __obj,
+                                               long long* __exp,
+                                               long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_x)
+    return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_relaxed(long long volatile* __obj,
+                                               long long* __exp,
+                                               long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_x)
+    return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_acquire(long long volatile* __obj,
+                                               long long* __exp,
+                                               long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_x)
+    return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_consume(long long volatile* __obj,
+                                               long long* __exp,
+                                               long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_x)
+    return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_relaxed(long long volatile* __obj,
+                                               long long* __exp,
+                                               long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_x)
+    return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_acquire(long long volatile* __obj,
+                                               long long* __exp,
+                                               long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_acquire_x)
+    return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_consume(long long volatile* __obj,
+                                               long long* __exp,
+                                               long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_consume_x)
+    return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_relaxed(long long volatile* __obj,
+                                               long long* __exp,
+                                               long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_x)
+    return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_acquire(long long volatile* __obj,
+                                               long long* __exp,
+                                               long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_x)
+    return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_consume(long long volatile* __obj,
+                                               long long* __exp,
+                                               long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_x)
+    return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_relaxed(long long volatile* __obj,
+                                               long long* __exp,
+                                               long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_x)
+    return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_consume(long long volatile* __obj,
+                                               long long* __exp,
+                                               long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_consume_x)
+    return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_relaxed(long long volatile* __obj,
+                                               long long* __exp,
+                                               long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_x)
+    return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_relaxed_relaxed(long long volatile* __obj,
+                                               long long* __exp,
+                                               long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_x)
+    return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+// compare_exchange_weak unsigned long long
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_seq_cst(unsigned long long volatile* __obj,
+                                               unsigned long long* __exp,
+                                               unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_y)
+    return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_acquire(unsigned long long volatile* __obj,
+                                               unsigned long long* __exp,
+                                               unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_y)
+    return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_consume(unsigned long long volatile* __obj,
+                                               unsigned long long* __exp,
+                                               unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_y)
+    return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_relaxed(unsigned long long volatile* __obj,
+                                               unsigned long long* __exp,
+                                               unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_y)
+    return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_acquire(unsigned long long volatile* __obj,
+                                               unsigned long long* __exp,
+                                               unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_y)
+    return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_consume(unsigned long long volatile* __obj,
+                                               unsigned long long* __exp,
+                                               unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_y)
+    return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_relaxed(unsigned long long volatile* __obj,
+                                               unsigned long long* __exp,
+                                               unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_y)
+    return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_acquire(unsigned long long volatile* __obj,
+                                               unsigned long long* __exp,
+                                               unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_acquire_y)
+    return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_consume(unsigned long long volatile* __obj,
+                                               unsigned long long* __exp,
+                                               unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_consume_y)
+    return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_relaxed(unsigned long long volatile* __obj,
+                                               unsigned long long* __exp,
+                                               unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_y)
+    return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_acquire(unsigned long long volatile* __obj,
+                                               unsigned long long* __exp,
+                                               unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_y)
+    return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_consume(unsigned long long volatile* __obj,
+                                               unsigned long long* __exp,
+                                               unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_y)
+    return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_relaxed(unsigned long long volatile* __obj,
+                                               unsigned long long* __exp,
+                                               unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_y)
+    return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_consume(unsigned long long volatile* __obj,
+                                               unsigned long long* __exp,
+                                               unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_consume_y)
+    return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_relaxed(unsigned long long volatile* __obj,
+                                               unsigned long long* __exp,
+                                               unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_y)
+    return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_relaxed_relaxed(unsigned long long volatile* __obj,
+                                               unsigned long long* __exp,
+                                               unsigned long long __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_y)
+    return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+// compare_exchange_weak void*
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_seq_cst(void* volatile* __obj,
+                                               void** __exp,
+                                               void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_seq_cst_Py)
+    return __atomic_compare_exchange_weak_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_seq_cst(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_acquire(void* volatile* __obj,
+                                               void** __exp,
+                                               void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_acquire_Py)
+    return __atomic_compare_exchange_weak_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_consume(void* volatile* __obj,
+                                               void** __exp,
+                                               void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_consume_Py)
+    return __atomic_compare_exchange_weak_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_seq_cst_relaxed(void* volatile* __obj,
+                                               void** __exp,
+                                               void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_seq_cst_relaxed_Py)
+    return __atomic_compare_exchange_weak_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_seq_cst_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_acquire(void* volatile* __obj,
+                                               void** __exp,
+                                               void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_acquire_Py)
+    return __atomic_compare_exchange_weak_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_consume(void* volatile* __obj,
+                                               void** __exp,
+                                               void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_consume_Py)
+    return __atomic_compare_exchange_weak_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acq_rel_relaxed(void* volatile* __obj,
+                                               void** __exp,
+                                               void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acq_rel_relaxed_Py)
+    return __atomic_compare_exchange_weak_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acq_rel_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_acquire(void* volatile* __obj,
+                                               void** __exp,
+                                               void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_acquire_Py)
+    return __atomic_compare_exchange_weak_release_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_consume(void* volatile* __obj,
+                                               void** __exp,
+                                               void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_consume_Py)
+    return __atomic_compare_exchange_weak_release_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_release_relaxed(void* volatile* __obj,
+                                               void** __exp,
+                                               void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_release_relaxed_Py)
+    return __atomic_compare_exchange_weak_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_release_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_acquire(void* volatile* __obj,
+                                               void** __exp,
+                                               void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_acquire_Py)
+    return __atomic_compare_exchange_weak_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_acquire(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_consume(void* volatile* __obj,
+                                               void** __exp,
+                                               void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_consume_Py)
+    return __atomic_compare_exchange_weak_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_acquire_relaxed(void* volatile* __obj,
+                                               void** __exp,
+                                               void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_acquire_relaxed_Py)
+    return __atomic_compare_exchange_weak_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_acquire_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_consume(void* volatile* __obj,
+                                               void** __exp,
+                                               void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_consume_Py)
+    return __atomic_compare_exchange_weak_consume_consume(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_consume(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_consume_relaxed(void* volatile* __obj,
+                                               void** __exp,
+                                               void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_consume_relaxed_Py)
+    return __atomic_compare_exchange_weak_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_consume_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+__choose_compare_exchange_weak_relaxed_relaxed(void* volatile* __obj,
+                                               void** __exp,
+                                               void* __desr)
+{
+#if __has_feature(__atomic_compare_exchange_weak_relaxed_relaxed_Py)
+    return __atomic_compare_exchange_weak_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#else
+    return __choose_compare_exchange_strong_relaxed_relaxed(__obj, __exp,
+                                                                        __desr);
+#endif
+}
+
 // flag type and operations
 
 struct atomic_flag;