summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Popov <pinkbyte@gentoo.org>2015-08-25 14:35:41 +0300
committerSergey Popov <pinkbyte@gentoo.org>2015-08-25 14:35:41 +0300
commit89f7694c5ab1f1860014549565ff919f87fb3f06 (patch)
treeebe837062ebc4609dfcdd6d9d41a5b2ab4993f8f /dev-libs/boost
parentdev-python/isodate: Version Bump (diff)
downloadgentoo-89f7694c5ab1f1860014549565ff919f87fb3f06.tar.gz
gentoo-89f7694c5ab1f1860014549565ff919f87fb3f06.tar.bz2
gentoo-89f7694c5ab1f1860014549565ff919f87fb3f06.zip
dev-libs/boost: backport build fixes for Boost::Atomic
Backport build fixes for atomic ops support on some ARM devices Upstream bugreport - https://svn.boost.org/trac/boost/ticket/10446 Gentoo-Bug: 557168 Reported-by: Daniel Savard <dsavard@cids.ca> Gentoo-Bug: 558042 Reported-by: Michael Jones <gentoo@jonesmz.com> Package-Manager: portage-2.2.20
Diffstat (limited to 'dev-libs/boost')
-rw-r--r--dev-libs/boost/boost-1.56.0-r1.ebuild3
-rw-r--r--dev-libs/boost/files/boost-1.56.0-atomic.patch402
2 files changed, 404 insertions, 1 deletions
diff --git a/dev-libs/boost/boost-1.56.0-r1.ebuild b/dev-libs/boost/boost-1.56.0-r1.ebuild
index 5d09eda4c9bc..8059695ecf7b 100644
--- a/dev-libs/boost/boost-1.56.0-r1.ebuild
+++ b/dev-libs/boost/boost-1.56.0-r1.ebuild
@@ -114,7 +114,8 @@ src_prepare() {
"${FILESDIR}/${PN}-1.55.0-tools-c98-compat.patch" \
"${FILESDIR}/${PN}-1.52.0-threads.patch" \
"${FILESDIR}/${PN}-1.56.0-build-auto_index-tool.patch" \
- "${FILESDIR}/${PN}-1.55.0-variadic-templates.patch"
+ "${FILESDIR}/${PN}-1.55.0-variadic-templates.patch" \
+ "${FILESDIR}/${PN}-1.56.0-atomic.patch"
# Do not try to build missing 'wave' tool, bug #522682
# Upstream bugreport - https://svn.boost.org/trac/boost/ticket/10507
diff --git a/dev-libs/boost/files/boost-1.56.0-atomic.patch b/dev-libs/boost/files/boost-1.56.0-atomic.patch
new file mode 100644
index 000000000000..6d724188c8b3
--- /dev/null
+++ b/dev-libs/boost/files/boost-1.56.0-atomic.patch
@@ -0,0 +1,402 @@
+Fixed in 1.57
+
+commit 415db7054723291042e4ff1ffa8fdd5bc8b07163
+Author: Andrey Semashev <andrey.semashev@gmail.com>
+Date: Sat Sep 27 20:40:09 2014 +0400
+
+ Added support for extending operations to GCC atomic backend.
+
+ Fix for #10446. Some platforms (e.g. Raspberry Pi) only support atomic ops of some particular size but not less. Use extending arithmetic operations for these platforms. Also, make sure bools are always treated as 8-bit values, even if the actual type is larger. This makes its use in atomic<>, atomic_flag and lock pool more consistent.
+
+diff --git a/include/boost/atomic/capabilities.hpp b/include/boost/atomic/capabilities.hpp
+index 658dd22..05bbb0f 100644
+--- a/include/boost/atomic/capabilities.hpp
++++ b/include/boost/atomic/capabilities.hpp
+@@ -142,6 +142,7 @@
+ #define BOOST_ATOMIC_ADDRESS_LOCK_FREE BOOST_ATOMIC_POINTER_LOCK_FREE
+
+ #ifndef BOOST_ATOMIC_BOOL_LOCK_FREE
++// We store bools in 1-byte storage in all backends
+ #define BOOST_ATOMIC_BOOL_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
+ #endif
+
+diff --git a/include/boost/atomic/detail/atomic_template.hpp b/include/boost/atomic/detail/atomic_template.hpp
+index 4fd6d79..bc3922a 100644
+--- a/include/boost/atomic/detail/atomic_template.hpp
++++ b/include/boost/atomic/detail/atomic_template.hpp
+@@ -234,7 +234,7 @@ class base_atomic< bool, int >
+ {
+ private:
+ typedef bool value_type;
+- typedef atomics::detail::operations< storage_size_of< value_type >::value, false > operations;
++ typedef atomics::detail::operations< 1u, false > operations;
+
+ protected:
+ typedef value_type value_arg_type;
+diff --git a/include/boost/atomic/detail/caps_gcc_atomic.hpp b/include/boost/atomic/detail/caps_gcc_atomic.hpp
+index 8299ad0..f4e7a70 100644
+--- a/include/boost/atomic/detail/caps_gcc_atomic.hpp
++++ b/include/boost/atomic/detail/caps_gcc_atomic.hpp
+@@ -29,66 +29,48 @@
+ #define BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B 1
+ #endif
+
+-#if __GCC_ATOMIC_BOOL_LOCK_FREE == 2
+-#define BOOST_ATOMIC_FLAG_LOCK_FREE 2
+-#else
+-#define BOOST_ATOMIC_FLAG_LOCK_FREE 0
+-#endif
+-#if __GCC_ATOMIC_CHAR_LOCK_FREE == 2
+-#define BOOST_ATOMIC_CHAR_LOCK_FREE 2
+-#else
+-#define BOOST_ATOMIC_CHAR_LOCK_FREE 0
+-#endif
+-#if __GCC_ATOMIC_CHAR16_T_LOCK_FREE == 2
+-#define BOOST_ATOMIC_CHAR16_T_LOCK_FREE 2
+-#else
+-#define BOOST_ATOMIC_CHAR16_T_LOCK_FREE 0
+-#endif
+-#if __GCC_ATOMIC_CHAR32_T_LOCK_FREE == 2
+-#define BOOST_ATOMIC_CHAR32_T_LOCK_FREE 2
++#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B) && (defined(BOOST_HAS_INT128) || !defined(BOOST_NO_ALIGNMENT))
++#define BOOST_ATOMIC_INT128_LOCK_FREE 2
+ #else
+-#define BOOST_ATOMIC_CHAR32_T_LOCK_FREE 0
++#define BOOST_ATOMIC_INT128_LOCK_FREE 0
+ #endif
+-#if __GCC_ATOMIC_WCHAR_T_LOCK_FREE == 2
+-#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 2
++
++#if __GCC_ATOMIC_LLONG_LOCK_FREE == 2
++#define BOOST_ATOMIC_LLONG_LOCK_FREE 2
+ #else
+-#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 0
++#define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT128_LOCK_FREE
+ #endif
+-#if __GCC_ATOMIC_SHORT_LOCK_FREE == 2
+-#define BOOST_ATOMIC_SHORT_LOCK_FREE 2
++
++#if __GCC_ATOMIC_LONG_LOCK_FREE == 2
++#define BOOST_ATOMIC_LONG_LOCK_FREE 2
+ #else
+-#define BOOST_ATOMIC_SHORT_LOCK_FREE 0
++#define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_LLONG_LOCK_FREE
+ #endif
++
+ #if __GCC_ATOMIC_INT_LOCK_FREE == 2
+ #define BOOST_ATOMIC_INT_LOCK_FREE 2
+ #else
+-#define BOOST_ATOMIC_INT_LOCK_FREE 0
+-#endif
+-#if __GCC_ATOMIC_LONG_LOCK_FREE == 2
+-#define BOOST_ATOMIC_LONG_LOCK_FREE 2
+-#else
+-#define BOOST_ATOMIC_LONG_LOCK_FREE 0
++#define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_LONG_LOCK_FREE
+ #endif
+-#if __GCC_ATOMIC_LLONG_LOCK_FREE == 2
+-#define BOOST_ATOMIC_LLONG_LOCK_FREE 2
++
++#if __GCC_ATOMIC_SHORT_LOCK_FREE == 2
++#define BOOST_ATOMIC_SHORT_LOCK_FREE 2
+ #else
+-#define BOOST_ATOMIC_LLONG_LOCK_FREE 0
++#define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT_LOCK_FREE
+ #endif
+-#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B) && (defined(BOOST_HAS_INT128) || !defined(BOOST_NO_ALIGNMENT))
+-#define BOOST_ATOMIC_INT128_LOCK_FREE 2
++
++#if __GCC_ATOMIC_CHAR_LOCK_FREE == 2
++#define BOOST_ATOMIC_CHAR_LOCK_FREE 2
+ #else
+-#define BOOST_ATOMIC_INT128_LOCK_FREE 0
++#define BOOST_ATOMIC_CHAR_LOCK_FREE BOOST_ATOMIC_SHORT_LOCK_FREE
+ #endif
++
+ #if __GCC_ATOMIC_POINTER_LOCK_FREE == 2
+ #define BOOST_ATOMIC_POINTER_LOCK_FREE 2
+ #else
+ #define BOOST_ATOMIC_POINTER_LOCK_FREE 0
+ #endif
+-#if __GCC_ATOMIC_BOOL_LOCK_FREE == 2
+-#define BOOST_ATOMIC_BOOL_LOCK_FREE 2
+-#else
+-#define BOOST_ATOMIC_BOOL_LOCK_FREE 0
+-#endif
++
+
+ #define BOOST_ATOMIC_INT8_LOCK_FREE BOOST_ATOMIC_CHAR_LOCK_FREE
+
+@@ -128,6 +110,24 @@
+ #define BOOST_ATOMIC_INT64_LOCK_FREE 0
+ #endif
+
++
++#if __GCC_ATOMIC_WCHAR_T_LOCK_FREE == 2
++#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 2
++#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 8
++#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
++#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 4
++#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
++#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 2
++#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
++#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 1
++#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
++#else
++#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 0
++#endif
++
++#define BOOST_ATOMIC_CHAR32_T_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
++#define BOOST_ATOMIC_CHAR16_T_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
++
+ #define BOOST_ATOMIC_THREAD_FENCE 2
+ #define BOOST_ATOMIC_SIGNAL_FENCE 2
+
+diff --git a/include/boost/atomic/detail/ops_gcc_atomic.hpp b/include/boost/atomic/detail/ops_gcc_atomic.hpp
+index 2297791..2e4c37b 100644
+--- a/include/boost/atomic/detail/ops_gcc_atomic.hpp
++++ b/include/boost/atomic/detail/ops_gcc_atomic.hpp
+@@ -24,6 +24,15 @@
+ #include <boost/atomic/detail/ops_cas_based.hpp>
+ #endif
+
++#if __GCC_ATOMIC_LLONG_LOCK_FREE != BOOST_ATOMIC_LLONG_LOCK_FREE || __GCC_ATOMIC_LONG_LOCK_FREE != BOOST_ATOMIC_LONG_LOCK_FREE ||\
++ __GCC_ATOMIC_INT_LOCK_FREE != BOOST_ATOMIC_INT_LOCK_FREE || __GCC_ATOMIC_SHORT_LOCK_FREE != BOOST_ATOMIC_SHORT_LOCK_FREE ||\
++ __GCC_ATOMIC_CHAR_LOCK_FREE != BOOST_ATOMIC_CHAR_LOCK_FREE || __GCC_ATOMIC_BOOL_LOCK_FREE != BOOST_ATOMIC_BOOL_LOCK_FREE ||\
++ __GCC_ATOMIC_WCHAR_T_LOCK_FREE != BOOST_ATOMIC_WCHAR_T_LOCK_FREE
++// There are platforms where we need to use larger storage types
++#include <boost/atomic/detail/int_sizes.hpp>
++#include <boost/atomic/detail/ops_extending_cas_based.hpp>
++#endif
++
+ #ifdef BOOST_HAS_PRAGMA_ONCE
+ #pragma once
+ #endif
+@@ -154,73 +163,206 @@ struct gcc_atomic_operations
+ }
+ };
+
+-#if BOOST_ATOMIC_INT8_LOCK_FREE > 0
++#if BOOST_ATOMIC_INT128_LOCK_FREE > 0
++#if defined(__clang__) && defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B)
++
++// Workaround for clang bug: http://llvm.org/bugs/show_bug.cgi?id=19149
++// Clang 3.4 does not implement 128-bit __atomic* intrinsics even though it defines __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16
+ template< bool Signed >
+-struct operations< 1u, Signed > :
+- public gcc_atomic_operations< typename make_storage_type< 1u, Signed >::type >
++struct operations< 16u, Signed > :
++ public cas_based_operations< gcc_dcas_x86_64< Signed > >
+ {
+ };
++
++#else
++
++template< bool Signed >
++struct operations< 16u, Signed > :
++ public gcc_atomic_operations< typename make_storage_type< 16u, Signed >::type >
++{
++};
++
++#endif
+ #endif
+
+-#if BOOST_ATOMIC_INT16_LOCK_FREE > 0
++
++#if BOOST_ATOMIC_INT64_LOCK_FREE > 0
++#if defined(__clang__) && defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B)
++
++// Workaround for clang bug http://llvm.org/bugs/show_bug.cgi?id=19355
+ template< bool Signed >
+-struct operations< 2u, Signed > :
+- public gcc_atomic_operations< typename make_storage_type< 2u, Signed >::type >
++struct operations< 8u, Signed > :
++ public cas_based_operations< gcc_dcas_x86< Signed > >
++{
++};
++
++#elif (BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 8 && __GCC_ATOMIC_LLONG_LOCK_FREE != BOOST_ATOMIC_LLONG_LOCK_FREE) ||\
++ (BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 8 && __GCC_ATOMIC_LONG_LOCK_FREE != BOOST_ATOMIC_LONG_LOCK_FREE) ||\
++ (BOOST_ATOMIC_DETAIL_SIZEOF_INT == 8 && __GCC_ATOMIC_INT_LOCK_FREE != BOOST_ATOMIC_INT_LOCK_FREE) ||\
++ (BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 8 && __GCC_ATOMIC_SHORT_LOCK_FREE != BOOST_ATOMIC_SHORT_LOCK_FREE) ||\
++ (BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 8 && __GCC_ATOMIC_WCHAR_T_LOCK_FREE != BOOST_ATOMIC_WCHAR_T_LOCK_FREE)
++
++#define BOOST_ATOMIC_DETAIL_INT64_EXTENDED
++
++template< bool Signed >
++struct operations< 8u, Signed > :
++ public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 16u, Signed >::type >, 8u, Signed >
+ {
+ };
++
++#else
++
++template< bool Signed >
++struct operations< 8u, Signed > :
++ public gcc_atomic_operations< typename make_storage_type< 8u, Signed >::type >
++{
++};
++
++#endif
+ #endif
+
+ #if BOOST_ATOMIC_INT32_LOCK_FREE > 0
++#if (BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 4 && __GCC_ATOMIC_LLONG_LOCK_FREE != BOOST_ATOMIC_LLONG_LOCK_FREE) ||\
++ (BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 4 && __GCC_ATOMIC_LONG_LOCK_FREE != BOOST_ATOMIC_LONG_LOCK_FREE) ||\
++ (BOOST_ATOMIC_DETAIL_SIZEOF_INT == 4 && __GCC_ATOMIC_INT_LOCK_FREE != BOOST_ATOMIC_INT_LOCK_FREE) ||\
++ (BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 4 && __GCC_ATOMIC_SHORT_LOCK_FREE != BOOST_ATOMIC_SHORT_LOCK_FREE) ||\
++ (BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 4 && __GCC_ATOMIC_WCHAR_T_LOCK_FREE != BOOST_ATOMIC_WCHAR_T_LOCK_FREE)
++
++#define BOOST_ATOMIC_DETAIL_INT32_EXTENDED
++
++#if !defined(BOOST_ATOMIC_DETAIL_INT64_EXTENDED)
++
++template< bool Signed >
++struct operations< 4u, Signed > :
++ public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 8u, Signed >::type >, 4u, Signed >
++{
++};
++
++#else // !defined(BOOST_ATOMIC_DETAIL_INT64_EXTENDED)
++
++template< bool Signed >
++struct operations< 4u, Signed > :
++ public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 16u, Signed >::type >, 4u, Signed >
++{
++};
++
++#endif // !defined(BOOST_ATOMIC_DETAIL_INT64_EXTENDED)
++
++#else
++
+ template< bool Signed >
+ struct operations< 4u, Signed > :
+ public gcc_atomic_operations< typename make_storage_type< 4u, Signed >::type >
+ {
+ };
++
++#endif
+ #endif
+
+-#if BOOST_ATOMIC_INT64_LOCK_FREE > 0
+-#if defined(__clang__) && defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B)
++#if BOOST_ATOMIC_INT16_LOCK_FREE > 0
++#if (BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 2 && __GCC_ATOMIC_LLONG_LOCK_FREE != BOOST_ATOMIC_LLONG_LOCK_FREE) ||\
++ (BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 2 && __GCC_ATOMIC_LONG_LOCK_FREE != BOOST_ATOMIC_LONG_LOCK_FREE) ||\
++ (BOOST_ATOMIC_DETAIL_SIZEOF_INT == 2 && __GCC_ATOMIC_INT_LOCK_FREE != BOOST_ATOMIC_INT_LOCK_FREE) ||\
++ (BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 2 && __GCC_ATOMIC_SHORT_LOCK_FREE != BOOST_ATOMIC_SHORT_LOCK_FREE) ||\
++ (BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 2 && __GCC_ATOMIC_WCHAR_T_LOCK_FREE != BOOST_ATOMIC_WCHAR_T_LOCK_FREE)
++
++#define BOOST_ATOMIC_DETAIL_INT16_EXTENDED
++
++#if !defined(BOOST_ATOMIC_DETAIL_INT32_EXTENDED)
+
+-// Workaround for clang bug http://llvm.org/bugs/show_bug.cgi?id=19355
+ template< bool Signed >
+-struct operations< 8u, Signed > :
+- public cas_based_operations< gcc_dcas_x86< Signed > >
++struct operations< 2u, Signed > :
++ public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 4u, Signed >::type >, 2u, Signed >
++{
++};
++
++#elif !defined(BOOST_ATOMIC_DETAIL_INT64_EXTENDED)
++
++template< bool Signed >
++struct operations< 2u, Signed > :
++ public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 8u, Signed >::type >, 2u, Signed >
+ {
+ };
+
+ #else
+
+ template< bool Signed >
+-struct operations< 8u, Signed > :
+- public gcc_atomic_operations< typename make_storage_type< 8u, Signed >::type >
++struct operations< 2u, Signed > :
++ public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 16u, Signed >::type >, 2u, Signed >
++{
++};
++
++#endif
++
++#else
++
++template< bool Signed >
++struct operations< 2u, Signed > :
++ public gcc_atomic_operations< typename make_storage_type< 2u, Signed >::type >
+ {
+ };
+
+ #endif
+ #endif
+
+-#if BOOST_ATOMIC_INT128_LOCK_FREE > 0
+-#if defined(__clang__) && defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B)
++#if BOOST_ATOMIC_INT8_LOCK_FREE > 0
++#if (BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 1 && __GCC_ATOMIC_LLONG_LOCK_FREE != BOOST_ATOMIC_LLONG_LOCK_FREE) ||\
++ (BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 1 && __GCC_ATOMIC_LONG_LOCK_FREE != BOOST_ATOMIC_LONG_LOCK_FREE) ||\
++ (BOOST_ATOMIC_DETAIL_SIZEOF_INT == 1 && __GCC_ATOMIC_INT_LOCK_FREE != BOOST_ATOMIC_INT_LOCK_FREE) ||\
++ (BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 1 && __GCC_ATOMIC_SHORT_LOCK_FREE != BOOST_ATOMIC_SHORT_LOCK_FREE) ||\
++ (BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 1 && __GCC_ATOMIC_WCHAR_T_LOCK_FREE != BOOST_ATOMIC_WCHAR_T_LOCK_FREE) ||\
++ (__GCC_ATOMIC_CHAR_LOCK_FREE != BOOST_ATOMIC_CHAR_LOCK_FREE) ||\
++ (__GCC_ATOMIC_BOOL_LOCK_FREE != BOOST_ATOMIC_BOOL_LOCK_FREE)
++
++#if !defined(BOOST_ATOMIC_DETAIL_INT16_EXTENDED)
+
+-// Workaround for clang bug: http://llvm.org/bugs/show_bug.cgi?id=19149
+-// Clang 3.4 does not implement 128-bit __atomic* intrinsics even though it defines __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16
+ template< bool Signed >
+-struct operations< 16u, Signed > :
+- public cas_based_operations< gcc_dcas_x86_64< Signed > >
++struct operations< 1u, Signed > :
++ public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 2u, Signed >::type >, 1u, Signed >
++{
++};
++
++#elif !defined(BOOST_ATOMIC_DETAIL_INT32_EXTENDED)
++
++template< bool Signed >
++struct operations< 1u, Signed > :
++ public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 4u, Signed >::type >, 1u, Signed >
++{
++};
++
++#elif !defined(BOOST_ATOMIC_DETAIL_INT64_EXTENDED)
++
++template< bool Signed >
++struct operations< 1u, Signed > :
++ public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 8u, Signed >::type >, 1u, Signed >
+ {
+ };
+
+ #else
+
+ template< bool Signed >
+-struct operations< 16u, Signed > :
+- public gcc_atomic_operations< typename make_storage_type< 16u, Signed >::type >
++struct operations< 1u, Signed > :
++ public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 16u, Signed >::type >, 1u, Signed >
++{
++};
++
++#endif
++
++#else
++
++template< bool Signed >
++struct operations< 1u, Signed > :
++ public gcc_atomic_operations< typename make_storage_type< 1u, Signed >::type >
+ {
+ };
+
+ #endif
+ #endif
+
++#undef BOOST_ATOMIC_DETAIL_INT16_EXTENDED
++#undef BOOST_ATOMIC_DETAIL_INT32_EXTENDED
++#undef BOOST_ATOMIC_DETAIL_INT64_EXTENDED
++
+ BOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT
+ {
+ __atomic_thread_fence(atomics::detail::convert_memory_order_to_gcc(order));