From 33a10b48605f8bb419487a03125815ad6ee00a70 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 12 Dec 2020 12:06:24 +0000 Subject: [PATCH] Restricts cpu yield instructions a little. adding clobber for ARM and preventing older 32 bits chips not supporting this instruction. --- include/mimalloc-atomic.h | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/include/mimalloc-atomic.h b/include/mimalloc-atomic.h index b6506075..9f464593 100644 --- a/include/mimalloc-atomic.h +++ b/include/mimalloc-atomic.h @@ -282,16 +282,22 @@ static inline void mi_atomic_yield(void) { YieldProcessor(); } #elif (defined(__GNUC__) || defined(__clang__)) && \ - (defined(__x86_64__) || defined(__i386__) || defined(__arm__) || defined(__aarch64__)) + (defined(__x86_64__) || defined(__i386__) || (defined(__arm__) && __ARM_ARCH__ >= 7) || defined(__aarch64__)) #if defined(__x86_64__) || defined(__i386__) static inline void mi_atomic_yield(void) { __asm__ volatile ("pause" ::: "memory"); } -#elif defined(__arm__) || defined(__aarch64__) +#elif (defined(__arm__) && __ARM_ARCH__ >= 7) || defined(__aarch64__) static inline void mi_atomic_yield(void) { - __asm__ volatile("yield"); + __asm__ volatile("yield" ::: "memory"); } #endif +#elif defined(__sun) +// Fallback for other archs +#include +static inline void mi_atomic_yield(void) { + smt_pause(); +} #elif defined(__wasi__) #include static inline void mi_atomic_yield(void) { @@ -305,4 +311,4 @@ static inline void mi_atomic_yield(void) { #endif -#endif // __MIMALLOC_ATOMIC_H \ No newline at end of file +#endif // __MIMALLOC_ATOMIC_H