139#ifdef SDL_WIKI_DOCUMENTATION_SECTION
157#define SDL_CompilerBarrier() DoCompilerSpecificReadWriteBarrier()
159#elif SDL_HAS_BUILTIN(__atomic_signal_fence) || (defined(__GNUC__) && (__GNUC__ >= 5))
160#define SDL_CompilerBarrier() __atomic_signal_fence(__ATOMIC_SEQ_CST)
161#elif defined(_MSC_VER) && (_MSC_VER > 1200) && !defined(__clang__)
162void _ReadWriteBarrier(
void);
163#pragma intrinsic(_ReadWriteBarrier)
164#define SDL_CompilerBarrier() _ReadWriteBarrier()
165#elif (defined(__GNUC__) && !defined(SDL_PLATFORM_EMSCRIPTEN)) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5120))
167#define SDL_CompilerBarrier() __asm__ __volatile__ ("" : : : "memory")
168#elif defined(__WATCOMC__)
170#pragma aux SDL_CompilerBarrier = "" parm [] modify exact [];
173#define SDL_CompilerBarrier() \
174{ SDL_SpinLock _tmp = 0; SDL_LockSpinlock(&_tmp); }
218#ifdef SDL_WIKI_DOCUMENTATION_SECTION
256#define SDL_MemoryBarrierRelease() SDL_MemoryBarrierReleaseFunction()
279#define SDL_MemoryBarrierAcquire() SDL_MemoryBarrierAcquireFunction()
281#elif SDL_HAS_BUILTIN(__atomic_thread_fence) || (defined(__GNUC__) && (__GNUC__ >= 5))
282#define SDL_MemoryBarrierRelease() __atomic_thread_fence(__ATOMIC_RELEASE)
283#define SDL_MemoryBarrierAcquire() __atomic_thread_fence(__ATOMIC_ACQUIRE)
284#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
285#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("lwsync" : : : "memory")
286#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("lwsync" : : : "memory")
287#elif defined(__GNUC__) && defined(__aarch64__)
288#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("dmb ish" : : : "memory")
289#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("dmb ishld" : : : "memory")
290#elif defined(_MSC_VER) && (defined(_M_ARM64) || defined(_M_ARM64EC))
291#include <arm64intr.h>
292#define SDL_MemoryBarrierRelease() __dmb(_ARM64_BARRIER_ISH)
293#define SDL_MemoryBarrierAcquire() __dmb(_ARM64_BARRIER_ISHLD)
294#elif defined(__GNUC__) && defined(__arm__)
302typedef void (*SDL_KernelMemoryBarrierFunc)();
303#define SDL_MemoryBarrierRelease() ((SDL_KernelMemoryBarrierFunc)0xffff0fa0)()
304#define SDL_MemoryBarrierAcquire() ((SDL_KernelMemoryBarrierFunc)0xffff0fa0)()
306#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__)
307#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("dmb ish" : : : "memory")
308#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("dmb ish" : : : "memory")
309#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__)
312#define SDL_MEMORY_BARRIER_USES_FUNCTION
313#define SDL_MemoryBarrierRelease() SDL_MemoryBarrierReleaseFunction()
314#define SDL_MemoryBarrierAcquire() SDL_MemoryBarrierAcquireFunction()
316#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r"(0) : "memory")
317#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r"(0) : "memory")
320#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("" : : : "memory")
321#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("" : : : "memory")
325#if (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5120))
328#define SDL_MemoryBarrierRelease() __machine_rel_barrier()
329#define SDL_MemoryBarrierAcquire() __machine_acq_barrier()
332#define SDL_MemoryBarrierRelease() SDL_CompilerBarrier()
333#define SDL_MemoryBarrierAcquire() SDL_CompilerBarrier()
338#ifdef SDL_WIKI_DOCUMENTATION_SECTION
356#define SDL_CPUPauseInstruction() DoACPUPauseInACompilerAndArchitectureSpecificWay
358#elif (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__))
359 #define SDL_CPUPauseInstruction() __asm__ __volatile__("pause\n")
360#elif (defined(__arm__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7) || defined(__aarch64__)
361 #define SDL_CPUPauseInstruction() __asm__ __volatile__("yield" ::: "memory")
362#elif (defined(__powerpc__) || defined(__powerpc64__))
363 #define SDL_CPUPauseInstruction() __asm__ __volatile__("or 27,27,27");
364#elif (defined(__riscv) && __riscv_xlen == 64)
365 #define SDL_CPUPauseInstruction() __asm__ __volatile__(".insn i 0x0F, 0, x0, x0, 0x010");
366#elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))
367 #define SDL_CPUPauseInstruction() _mm_pause()
368#elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_ARM64))
369 #define SDL_CPUPauseInstruction() __yield()
370#elif defined(__WATCOMC__) && defined(__386__)
372 #pragma aux SDL_CPUPauseInstruction = ".686p" ".xmm2" "pause"
374 #define SDL_CPUPauseInstruction()
485#ifndef SDL_AtomicIncRef
501#define SDL_AtomicIncRef(a) SDL_AddAtomicInt(a, 1)
504#ifndef SDL_AtomicDecRef
521#define SDL_AtomicDecRef(a) (SDL_AddAtomicInt(a, -1) == 1)
Uint32 SDL_GetAtomicU32(SDL_AtomicU32 *a)
void SDL_MemoryBarrierAcquireFunction(void)
bool SDL_CompareAndSwapAtomicInt(SDL_AtomicInt *a, int oldval, int newval)
void * SDL_GetAtomicPointer(void **a)
Uint32 SDL_AddAtomicU32(SDL_AtomicU32 *a, int v)
#define SDL_CompilerBarrier()
bool SDL_CompareAndSwapAtomicPointer(void **a, void *oldval, void *newval)
void SDL_MemoryBarrierReleaseFunction(void)
#define SDL_CPUPauseInstruction()
int SDL_SetAtomicInt(SDL_AtomicInt *a, int v)
void SDL_LockSpinlock(SDL_SpinLock *lock)
bool SDL_CompareAndSwapAtomicU32(SDL_AtomicU32 *a, Uint32 oldval, Uint32 newval)
void SDL_UnlockSpinlock(SDL_SpinLock *lock)
Uint32 SDL_SetAtomicU32(SDL_AtomicU32 *a, Uint32 v)
int SDL_AddAtomicInt(SDL_AtomicInt *a, int v)
bool SDL_TryLockSpinlock(SDL_SpinLock *lock)
void * SDL_SetAtomicPointer(void **a, void *v)
int SDL_GetAtomicInt(SDL_AtomicInt *a)