mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-03 14:09:31 +03:00
atomic: fix mi_atomic_yield for big-endian arm32
Previously, `mi_atomic_yield` would not be defined on ARM32 big-endian architectures if they were pre-ARMv7. Rework the #ifdef guard to be more readable and collapse the ARM guards so both little and big endian are handled via the same mechanism. Now, ARMv7+ will utilize `yield` while older targets will use `nop` regardless of endianness. Signed-off-by: Vincent Fazio <vfazio@gmail.com>
This commit is contained in:
parent
632eab958b
commit
23fbee7ec6
1 changed files with 10 additions and 7 deletions
|
@ -370,8 +370,9 @@ static inline void mi_atomic_yield(void) {
|
||||||
_mm_pause();
|
_mm_pause();
|
||||||
}
|
}
|
||||||
#elif (defined(__GNUC__) || defined(__clang__)) && \
|
#elif (defined(__GNUC__) || defined(__clang__)) && \
|
||||||
(defined(__x86_64__) || defined(__i386__) || defined(__arm__) || defined(__armel__) || defined(__ARMEL__) || \
|
(defined(__x86_64__) || defined(__i386__) || \
|
||||||
defined(__aarch64__) || defined(__powerpc__) || defined(__ppc__) || defined(__PPC__)) || defined(__POWERPC__)
|
defined(__aarch64__) || defined(__arm__) || \
|
||||||
|
defined(__powerpc__) || defined(__ppc__) || defined(__PPC__)) || defined(__POWERPC__)
|
||||||
#if defined(__x86_64__) || defined(__i386__)
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
static inline void mi_atomic_yield(void) {
|
static inline void mi_atomic_yield(void) {
|
||||||
__asm__ volatile ("pause" ::: "memory");
|
__asm__ volatile ("pause" ::: "memory");
|
||||||
|
@ -380,10 +381,16 @@ static inline void mi_atomic_yield(void) {
|
||||||
static inline void mi_atomic_yield(void) {
|
static inline void mi_atomic_yield(void) {
|
||||||
__asm__ volatile("wfe");
|
__asm__ volatile("wfe");
|
||||||
}
|
}
|
||||||
#elif (defined(__arm__) && __ARM_ARCH >= 7)
|
#elif defined(__arm__)
|
||||||
|
#if __ARM_ARCH >= 7
|
||||||
static inline void mi_atomic_yield(void) {
|
static inline void mi_atomic_yield(void) {
|
||||||
__asm__ volatile("yield" ::: "memory");
|
__asm__ volatile("yield" ::: "memory");
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
static inline void mi_atomic_yield(void) {
|
||||||
|
__asm__ volatile ("nop" ::: "memory");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#elif defined(__powerpc__) || defined(__ppc__) || defined(__PPC__) || defined(__POWERPC__)
|
#elif defined(__powerpc__) || defined(__ppc__) || defined(__PPC__) || defined(__POWERPC__)
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
static inline void mi_atomic_yield(void) {
|
static inline void mi_atomic_yield(void) {
|
||||||
|
@ -394,10 +401,6 @@ static inline void mi_atomic_yield(void) {
|
||||||
__asm__ __volatile__ ("or 27,27,27" ::: "memory");
|
__asm__ __volatile__ ("or 27,27,27" ::: "memory");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#elif defined(__armel__) || defined(__ARMEL__)
|
|
||||||
static inline void mi_atomic_yield(void) {
|
|
||||||
__asm__ volatile ("nop" ::: "memory");
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
#elif defined(__sun)
|
#elif defined(__sun)
|
||||||
// Fallback for other archs
|
// Fallback for other archs
|
||||||
|
|
Loading…
Add table
Reference in a new issue