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.)

--HG--
extra : histedit_source : 79ad10ee762abab0eb71ba57b188636282d24757
This commit is contained in:
Ryan C. Gordon 2017-04-13 13:22:23 -04:00
parent 247b447a14
commit 3cab758c71

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;