atomic: let Clang always use atomic_load_n if available.

(Apple's Clang reports itself as GCC 4.2.1 in preprocessor macros--the final
GNU C compiler Apple shipped--as of the macOS 10.12 SDK.)
Ryan C. Gordon 2017-04-13 13:22:23 -04:00
parent 2bf79c2e0e
commit 8c00de57f6
1 changed files with 15 additions and 2 deletions

View File

@ -35,6 +35,19 @@
#include <atomic.h> #include <atomic.h>
#endif #endif
/* The __atomic_load_n() intrinsic showed up in different times for different compilers. */
#if defined(HAVE_GCC_ATOMICS)
# if defined(__clang__)
# if __has_builtin(__atomic_load_n)
# define HAVE_ATOMIC_LOAD_N 1
# endif
# elif defined(__GNUC__)
# if (__GNUC__ >= 5)
# define HAVE_ATOMIC_LOAD_N 1
# endif
# endif
#endif
/* /*
If any of the operations are not provided then we must emulate some If any of the operations are not provided then we must emulate some
of them. That means we need a nice implementation of spin locks of them. That means we need a nice implementation of spin locks
@ -211,7 +224,7 @@ SDL_AtomicAdd(SDL_atomic_t *a, int v)
int int
SDL_AtomicGet(SDL_atomic_t *a) SDL_AtomicGet(SDL_atomic_t *a)
{ {
#if defined(HAVE_GCC_ATOMICS) && (__GNUC__ >= 5) #ifdef HAVE_ATOMIC_LOAD_N
return __atomic_load_n(&a->value, __ATOMIC_SEQ_CST); return __atomic_load_n(&a->value, __ATOMIC_SEQ_CST);
#else #else
int value; int value;
@ -225,7 +238,7 @@ SDL_AtomicGet(SDL_atomic_t *a)
void * void *
SDL_AtomicGetPtr(void **a) SDL_AtomicGetPtr(void **a)
{ {
#if defined(HAVE_GCC_ATOMICS) && (__GNUC__ >= 5) #ifdef HAVE_ATOMIC_LOAD_N
return __atomic_load_n(a, __ATOMIC_SEQ_CST); return __atomic_load_n(a, __ATOMIC_SEQ_CST);
#else #else
void *value; void *value;