]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/boost/boost/atomic/detail/extra_ops_msvc_x86.hpp
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / boost / boost / atomic / detail / extra_ops_msvc_x86.hpp
index 17451a83d612bfe0683a6326cc3b02b04efebe6f..75edc83a71a3f334a555238986a3dae1e2502fbf 100644 (file)
@@ -18,7 +18,7 @@
 #include <boost/memory_order.hpp>
 #include <boost/atomic/detail/config.hpp>
 #include <boost/atomic/detail/interlocked.hpp>
-#include <boost/atomic/detail/storage_type.hpp>
+#include <boost/atomic/detail/storage_traits.hpp>
 #include <boost/atomic/detail/extra_operations_fwd.hpp>
 #include <boost/atomic/detail/extra_ops_generic.hpp>
 #include <boost/atomic/capabilities.hpp>
@@ -37,85 +37,15 @@ namespace boost {
 namespace atomics {
 namespace detail {
 
-#if defined(_M_IX86) || (defined(BOOST_ATOMIC_INTERLOCKED_BTS) && defined(BOOST_ATOMIC_INTERLOCKED_BTR))
-
-template< typename Base, std::size_t Size, bool Signed >
-struct msvc_x86_extra_operations_common :
-    public generic_extra_operations< Base, Size, Signed >
-{
-    typedef generic_extra_operations< Base, Size, Signed > base_type;
-    typedef typename base_type::storage_type storage_type;
-
-#if defined(BOOST_ATOMIC_INTERLOCKED_BTS)
-    static BOOST_FORCEINLINE bool bit_test_and_set(storage_type volatile& storage, unsigned int bit_number, memory_order) BOOST_NOEXCEPT
-    {
-        return !!BOOST_ATOMIC_INTERLOCKED_BTS(&storage, bit_number);
-    }
-#else
-    static BOOST_FORCEINLINE bool bit_test_and_set(storage_type volatile& storage, unsigned int bit_number, memory_order order) BOOST_NOEXCEPT
-    {
-        base_type::fence_before(order);
-        bool result;
-        __asm
-        {
-            mov edx, storage
-            mov eax, bit_number
-            lock bts [edx], eax
-            setc result
-        };
-        base_type::fence_after(order);
-        return result;
-    }
-#endif
-
-#if defined(BOOST_ATOMIC_INTERLOCKED_BTR)
-    static BOOST_FORCEINLINE bool bit_test_and_reset(storage_type volatile& storage, unsigned int bit_number, memory_order) BOOST_NOEXCEPT
-    {
-        return !!BOOST_ATOMIC_INTERLOCKED_BTR(&storage, bit_number);
-    }
-#else
-    static BOOST_FORCEINLINE bool bit_test_and_reset(storage_type volatile& storage, unsigned int bit_number, memory_order order) BOOST_NOEXCEPT
-    {
-        base_type::fence_before(order);
-        bool result;
-        __asm
-        {
-            mov edx, storage
-            mov eax, bit_number
-            lock btr [edx], eax
-            setc result
-        };
-        base_type::fence_after(order);
-        return result;
-    }
-#endif
-
 #if defined(_M_IX86)
-    static BOOST_FORCEINLINE bool bit_test_and_complement(storage_type volatile& storage, unsigned int bit_number, memory_order order) BOOST_NOEXCEPT
-    {
-        base_type::fence_before(order);
-        bool result;
-        __asm
-        {
-            mov edx, storage
-            mov eax, bit_number
-            lock btc [edx], eax
-            setc result
-        };
-        base_type::fence_after(order);
-        return result;
-    }
-#endif
-};
 
 template< typename Base, bool Signed >
 struct extra_operations< Base, 1u, Signed, true > :
-    public msvc_x86_extra_operations_common< Base, 1u, Signed >
+    public generic_extra_operations< Base, 1u, Signed >
 {
-    typedef msvc_x86_extra_operations_common< Base, 1u, Signed > base_type;
+    typedef generic_extra_operations< Base, 1u, Signed > base_type;
     typedef typename base_type::storage_type storage_type;
 
-#if defined(_M_IX86)
     static BOOST_FORCEINLINE storage_type fetch_negate(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
     {
         base_type::fence_before(order);
@@ -491,17 +421,15 @@ struct extra_operations< Base, 1u, Signed, true > :
         base_type::fence_after(order);
         return result;
     }
-#endif // defined(_M_IX86)
 };
 
 template< typename Base, bool Signed >
 struct extra_operations< Base, 2u, Signed, true > :
-    public msvc_x86_extra_operations_common< Base, 2u, Signed >
+    public generic_extra_operations< Base, 2u, Signed >
 {
-    typedef msvc_x86_extra_operations_common< Base, 2u, Signed > base_type;
+    typedef generic_extra_operations< Base, 2u, Signed > base_type;
     typedef typename base_type::storage_type storage_type;
 
-#if defined(_M_IX86)
     static BOOST_FORCEINLINE storage_type fetch_negate(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
     {
         base_type::fence_before(order);
@@ -877,14 +805,62 @@ struct extra_operations< Base, 2u, Signed, true > :
         base_type::fence_after(order);
         return result;
     }
-#endif // defined(_M_IX86)
+
+    static BOOST_FORCEINLINE bool bit_test_and_set(storage_type volatile& storage, unsigned int bit_number, memory_order order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before(order);
+        bool result;
+        __asm
+        {
+            mov edx, storage
+            mov eax, bit_number
+            lock bts word ptr [edx], ax
+            setc result
+        };
+        base_type::fence_after(order);
+        return result;
+    }
+
+    static BOOST_FORCEINLINE bool bit_test_and_reset(storage_type volatile& storage, unsigned int bit_number, memory_order order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before(order);
+        bool result;
+        __asm
+        {
+            mov edx, storage
+            mov eax, bit_number
+            lock btr word ptr [edx], ax
+            setc result
+        };
+        base_type::fence_after(order);
+        return result;
+    }
+
+    static BOOST_FORCEINLINE bool bit_test_and_complement(storage_type volatile& storage, unsigned int bit_number, memory_order order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before(order);
+        bool result;
+        __asm
+        {
+            mov edx, storage
+            mov eax, bit_number
+            lock btc word ptr [edx], ax
+            setc result
+        };
+        base_type::fence_after(order);
+        return result;
+    }
 };
 
+#endif // defined(_M_IX86)
+
+#if defined(_M_IX86) || (defined(BOOST_ATOMIC_INTERLOCKED_BTS) && defined(BOOST_ATOMIC_INTERLOCKED_BTR))
+
 template< typename Base, bool Signed >
 struct extra_operations< Base, 4u, Signed, true > :
-    public msvc_x86_extra_operations_common< Base, 4u, Signed >
+    public generic_extra_operations< Base, 4u, Signed >
 {
-    typedef msvc_x86_extra_operations_common< Base, 4u, Signed > base_type;
+    typedef generic_extra_operations< Base, 4u, Signed > base_type;
     typedef typename base_type::storage_type storage_type;
 
 #if defined(_M_IX86)
@@ -1263,7 +1239,66 @@ struct extra_operations< Base, 4u, Signed, true > :
         base_type::fence_after(order);
         return result;
     }
+
+    static BOOST_FORCEINLINE bool bit_test_and_complement(storage_type volatile& storage, unsigned int bit_number, memory_order order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before(order);
+        bool result;
+        __asm
+        {
+            mov edx, storage
+            mov eax, bit_number
+            lock btc dword ptr [edx], eax
+            setc result
+        };
+        base_type::fence_after(order);
+        return result;
+    }
 #endif // defined(_M_IX86)
+
+#if defined(BOOST_ATOMIC_INTERLOCKED_BTS)
+    static BOOST_FORCEINLINE bool bit_test_and_set(storage_type volatile& storage, unsigned int bit_number, memory_order) BOOST_NOEXCEPT
+    {
+        return !!BOOST_ATOMIC_INTERLOCKED_BTS(&storage, bit_number);
+    }
+#elif defined(_M_IX86)
+    static BOOST_FORCEINLINE bool bit_test_and_set(storage_type volatile& storage, unsigned int bit_number, memory_order order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before(order);
+        bool result;
+        __asm
+        {
+            mov edx, storage
+            mov eax, bit_number
+            lock bts dword ptr [edx], eax
+            setc result
+        };
+        base_type::fence_after(order);
+        return result;
+    }
+#endif
+
+#if defined(BOOST_ATOMIC_INTERLOCKED_BTR)
+    static BOOST_FORCEINLINE bool bit_test_and_reset(storage_type volatile& storage, unsigned int bit_number, memory_order) BOOST_NOEXCEPT
+    {
+        return !!BOOST_ATOMIC_INTERLOCKED_BTR(&storage, bit_number);
+    }
+#elif defined(_M_IX86)
+    static BOOST_FORCEINLINE bool bit_test_and_reset(storage_type volatile& storage, unsigned int bit_number, memory_order order) BOOST_NOEXCEPT
+    {
+        base_type::fence_before(order);
+        bool result;
+        __asm
+        {
+            mov edx, storage
+            mov eax, bit_number
+            lock btr dword ptr [edx], eax
+            setc result
+        };
+        base_type::fence_after(order);
+        return result;
+    }
+#endif
 };
 
 #endif // defined(_M_IX86) || (defined(BOOST_ATOMIC_INTERLOCKED_BTS) && defined(BOOST_ATOMIC_INTERLOCKED_BTR))