2
0
mirror of https://github.com/boostorg/atomic.git synced 2026-02-02 20:32:09 +00:00

Added support for yield ARMv8-A instruction.

Also, added "memory" clobber for pause instruction to prevent the compiler
to reorder memory loads and stores across pause().
This commit is contained in:
Andrey Semashev
2020-05-28 20:26:51 +03:00
parent 8e387475a5
commit 7497d41fa7

View File

@@ -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
}