diff --git a/include/boost/atomic/detail/pause.hpp b/include/boost/atomic/detail/pause.hpp index 37aa5ca..1cb5686 100644 --- a/include/boost/atomic/detail/pause.hpp +++ b/include/boost/atomic/detail/pause.hpp @@ -4,7 +4,7 @@ * http://www.boost.org/LICENSE_1_0.txt) * * (C) Copyright 2013 Tim Blechmann - * (C) Copyright 2013 Andrey Semashev + * (C) Copyright 2013, 2020 Andrey Semashev */ #ifndef BOOST_ATOMIC_DETAIL_PAUSE_HPP_INCLUDED_ @@ -16,11 +16,18 @@ #pragma once #endif -#if defined(_MSC_VER) && (defined(_M_AMD64) || defined(_M_IX86)) +#if defined(_MSC_VER) +#if defined(_M_AMD64) || defined(_M_IX86) extern "C" void _mm_pause(void); #if defined(BOOST_MSVC) #pragma intrinsic(_mm_pause) #endif +#elif defined(_M_ARM64) || defined(_M_ARM) +extern "C" void __yield(void); +#if defined(BOOST_MSVC) +#pragma intrinsic(__yield) +#endif +#endif #endif namespace boost { @@ -29,10 +36,18 @@ namespace detail { BOOST_FORCEINLINE void pause() BOOST_NOEXCEPT { -#if defined(_MSC_VER) && (defined(_M_AMD64) || defined(_M_IX86)) +#if defined(_MSC_VER) +#if defined(_M_AMD64) || defined(_M_IX86) _mm_pause(); -#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) - __asm__ __volatile__("pause;"); +#elif defined(_M_ARM64) || defined(_M_ARM) + __yield(); +#endif +#elif defined(__GNUC__) +#if defined(__i386__) || defined(__x86_64__) + __asm__ __volatile__("pause;" : : : "memory"); +#elif (defined(__ARM_ARCH) && __ARM_ARCH >= 8) || defined(__ARM_ARCH_8A__) || defined(__aarch64__) + __asm__ __volatile__("yield;" : : : "memory"); +#endif #endif }