| --- a/boost/smart_ptr/detail/spinlock_gcc_arm.hpp 2009-03-02 08:22:16.000000000 -0800 |
| +++ b/boost/smart_ptr/detail/spinlock_gcc_arm.hpp 2012-06-28 16:39:55.000000000 -0700 |
| @@ -2,7 +2,7 @@ |
| #define BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED |
| |
| // |
| -// Copyright (c) 2008 Peter Dimov |
| +// Copyright (c) 2008, 2011 Peter Dimov |
| // |
| // Distributed under the Boost Software License, Version 1.0. |
| // See accompanying file LICENSE_1_0.txt or copy at |
| @@ -11,6 +11,20 @@ |
| |
| #include <boost/smart_ptr/detail/yield_k.hpp> |
| |
| +#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) |
| + |
| +# define BOOST_SP_ARM_BARRIER "dmb" |
| + |
| +#elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) |
| + |
| +# define BOOST_SP_ARM_BARRIER "mcr p15, 0, r0, c7, c10, 5" |
| + |
| +#else |
| + |
| +# define BOOST_SP_ARM_BARRIER "" |
| + |
| +#endif |
| + |
| namespace boost |
| { |
| |
| @@ -29,12 +43,38 @@ |
| { |
| int r; |
| |
| +#if defined(__ARM_ARCH_6__) \ |
| + || defined(__ARM_ARCH_6J__) \ |
| + || defined(__ARM_ARCH_6K__) \ |
| + || defined(__ARM_ARCH_6Z__) \ |
| + || defined(__ARM_ARCH_6ZK__) \ |
| + || defined(__ARM_ARCH_6T2__) \ |
| + || defined(__ARM_ARCH_7__) \ |
| + || defined(__ARM_ARCH_7A__) \ |
| + || defined(__ARM_ARCH_7R__) \ |
| + || defined(__ARM_ARCH_7M__) \ |
| + || defined(__ARM_ARCH_7EM__) |
| + |
| __asm__ __volatile__( |
| - "swp %0, %1, [%2]": |
| + "ldrex %0, [%2]; \n" |
| + "cmp %0, %1; \n" |
| + "strexne %0, %1, [%2]; \n" |
| + BOOST_SP_ARM_BARRIER : |
| "=&r"( r ): // outputs |
| "r"( 1 ), "r"( &v_ ): // inputs |
| "memory", "cc" ); |
| |
| +#else |
| + |
| + __asm__ __volatile__( |
| + "swp %0, %1, [%2];\n" |
| + BOOST_SP_ARM_BARRIER : |
| + "=&r"( r ): // outputs |
| + "r"( 1 ), "r"( &v_ ): // inputs |
| + "memory", "cc" ); |
| + |
| +#endif |
| + |
| return r == 0; |
| } |
| |
| @@ -48,7 +88,7 @@ |
| |
| void unlock() |
| { |
| - __asm__ __volatile__( "" ::: "memory" ); |
| + __asm__ __volatile__( BOOST_SP_ARM_BARRIER ::: "memory" ); |
| *const_cast< int volatile* >( &v_ ) = 0; |
| } |
| |
| @@ -82,4 +122,6 @@ |
| |
| #define BOOST_DETAIL_SPINLOCK_INIT {0} |
| |
| +#undef BOOST_SP_ARM_BARRIER |
| + |
| #endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED |