138#if _SDL_HAS_BUILTIN(__atomic_signal_fence) || (defined(__GNUC__) && (__GNUC__ >= 5))
139#define SDL_CompilerBarrier() __atomic_signal_fence(__ATOMIC_SEQ_CST)
140#elif defined(_MSC_VER) && (_MSC_VER > 1200) && !defined(__clang__)
141void _ReadWriteBarrier(
void);
142#pragma intrinsic(_ReadWriteBarrier)
143#define SDL_CompilerBarrier() _ReadWriteBarrier()
144#elif (defined(__GNUC__) && !defined(__EMSCRIPTEN__)) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5120))
146#define SDL_CompilerBarrier() __asm__ __volatile__ ("" : : : "memory")
147#elif defined(__WATCOMC__)
149#pragma aux SDL_CompilerBarrier = "" parm [] modify exact [];
152#define SDL_CompilerBarrier() \
153{ SDL_SpinLock _tmp = 0; SDL_AtomicLock(&_tmp); }
180#if _SDL_HAS_BUILTIN(__atomic_thread_fence) || (defined(__GNUC__) && (__GNUC__ >= 5))
181#define SDL_MemoryBarrierRelease() __atomic_thread_fence(__ATOMIC_RELEASE)
182#define SDL_MemoryBarrierAcquire() __atomic_thread_fence(__ATOMIC_ACQUIRE)
183#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
184#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("lwsync" : : : "memory")
185#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("lwsync" : : : "memory")
186#elif defined(__GNUC__) && defined(__aarch64__)
187#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("dmb ish" : : : "memory")
188#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("dmb ishld" : : : "memory")
189#elif defined(_MSC_VER) && (defined(_M_ARM64) || defined(_M_ARM64EC))
190#include <arm64intr.h>
191#define SDL_MemoryBarrierRelease() __dmb(_ARM64_BARRIER_ISH)
192#define SDL_MemoryBarrierAcquire() __dmb(_ARM64_BARRIER_ISHLD)
193#elif defined(_MSC_VER) && defined(_M_ARM)
195#define SDL_MemoryBarrierRelease() __dmb(_ARM_BARRIER_ISH)
196#define SDL_MemoryBarrierAcquire() __dmb(_ARM_BARRIER_ISH)
197#elif defined(__GNUC__) && defined(__arm__)
205typedef void (*SDL_KernelMemoryBarrierFunc)();
206#define SDL_MemoryBarrierRelease() ((SDL_KernelMemoryBarrierFunc)0xffff0fa0)()
207#define SDL_MemoryBarrierAcquire() ((SDL_KernelMemoryBarrierFunc)0xffff0fa0)()
209#include <sys/cpuinline.h>
211#define SDL_MemoryBarrierRelease() __cpu_membarrier()
212#define SDL_MemoryBarrierAcquire() __cpu_membarrier()
214#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) || defined(__ARM_ARCH_8A__)
215#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("dmb ish" : : : "memory")
216#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("dmb ish" : : : "memory")
217#elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__)
220#define SDL_MEMORY_BARRIER_USES_FUNCTION
221#define SDL_MemoryBarrierRelease() SDL_MemoryBarrierReleaseFunction()
222#define SDL_MemoryBarrierAcquire() SDL_MemoryBarrierAcquireFunction()
224#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r"(0) : "memory")
225#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r"(0) : "memory")
228#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("" : : : "memory")
229#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("" : : : "memory")
233#if (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5120))
236#define SDL_MemoryBarrierRelease() __machine_rel_barrier()
237#define SDL_MemoryBarrierAcquire() __machine_acq_barrier()
240#define SDL_MemoryBarrierRelease() SDL_CompilerBarrier()
241#define SDL_MemoryBarrierAcquire() SDL_CompilerBarrier()
246#if (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__))
247 #define SDL_CPUPauseInstruction() __asm__ __volatile__("pause\n")
248#elif (defined(__arm__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7) || defined(__aarch64__)
249 #define SDL_CPUPauseInstruction() __asm__ __volatile__("yield" ::: "memory")
250#elif (defined(__powerpc__) || defined(__powerpc64__))
251 #define SDL_CPUPauseInstruction() __asm__ __volatile__("or 27,27,27");
252#elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))
253 #define SDL_CPUPauseInstruction() _mm_pause()
254#elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_ARM64))
255 #define SDL_CPUPauseInstruction() __yield()
256#elif defined(__WATCOMC__) && defined(__386__)
258 #pragma aux SDL_CPUPauseInstruction = ".686p" ".xmm2" "pause"
260 #define SDL_CPUPauseInstruction()
347#ifndef SDL_AtomicIncRef
348#define SDL_AtomicIncRef(a) SDL_AtomicAdd(a, 1)
357#ifndef SDL_AtomicDecRef
358#define SDL_AtomicDecRef(a) (SDL_AtomicAdd(a, -1) == 1)
SDL_bool SDL_AtomicCAS(SDL_atomic_t *a, int oldval, int newval)
void SDL_MemoryBarrierAcquireFunction(void)
SDL_bool SDL_AtomicCASPtr(void **a, void *oldval, void *newval)
void * SDL_AtomicGetPtr(void **a)
#define SDL_CompilerBarrier()
void SDL_MemoryBarrierReleaseFunction(void)
int SDL_AtomicGet(SDL_atomic_t *a)
#define SDL_CPUPauseInstruction()
SDL_bool SDL_AtomicTryLock(SDL_SpinLock *lock)
void SDL_AtomicUnlock(SDL_SpinLock *lock)
int SDL_AtomicAdd(SDL_atomic_t *a, int v)
void * SDL_AtomicSetPtr(void **a, void *v)
int SDL_AtomicSet(SDL_atomic_t *a, int v)
void SDL_AtomicLock(SDL_SpinLock *lock)