134#ifdef SDL_WIKI_DOCUMENTATION_SECTION
152#define SDL_CompilerBarrier() DoCompilerSpecificReadWriteBarrier()
153#elif defined(_MSC_VER) && (_MSC_VER > 1200) && !defined(__clang__)
154void _ReadWriteBarrier(
void);
155#pragma intrinsic(_ReadWriteBarrier)
156#define SDL_CompilerBarrier() _ReadWriteBarrier()
157#elif (defined(__GNUC__) && !defined(SDL_PLATFORM_EMSCRIPTEN)) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5120))
159#define SDL_CompilerBarrier() __asm__ __volatile__ ("" : : : "memory")
160#elif defined(__WATCOMC__)
162#pragma aux SDL_CompilerBarrier = "" parm [] modify exact [];
164#define SDL_CompilerBarrier() \
165{ SDL_SpinLock _tmp = 0; SDL_LockSpinlock(&_tmp); SDL_UnlockSpinlock(&_tmp); }
213#if defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
214#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("lwsync" : : : "memory")
215#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("lwsync" : : : "memory")
216#elif defined(__GNUC__) && defined(__aarch64__)
217#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("dmb ish" : : : "memory")
218#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("dmb ish" : : : "memory")
219#elif defined(__GNUC__) && defined(__arm__)
227typedef void (*SDL_KernelMemoryBarrierFunc)();
228#define SDL_MemoryBarrierRelease() ((SDL_KernelMemoryBarrierFunc)0xffff0fa0)()
229#define SDL_MemoryBarrierAcquire() ((SDL_KernelMemoryBarrierFunc)0xffff0fa0)()
231#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__)
232#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("dmb ish" : : : "memory")
233#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("dmb ish" : : : "memory")
234#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__)
237#define SDL_MEMORY_BARRIER_USES_FUNCTION
238#define SDL_MemoryBarrierRelease() SDL_MemoryBarrierReleaseFunction()
239#define SDL_MemoryBarrierAcquire() SDL_MemoryBarrierAcquireFunction()
241#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r"(0) : "memory")
242#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r"(0) : "memory")
245#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("" : : : "memory")
246#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("" : : : "memory")
250#if (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5120))
253#define SDL_MemoryBarrierRelease() __machine_rel_barrier()
254#define SDL_MemoryBarrierAcquire() __machine_acq_barrier()
257#define SDL_MemoryBarrierRelease() SDL_CompilerBarrier()
258#define SDL_MemoryBarrierAcquire() SDL_CompilerBarrier()
263#ifdef SDL_WIKI_DOCUMENTATION_SECTION
281#define SDL_CPUPauseInstruction() DoACPUPauseInACompilerAndArchitectureSpecificWay
282#elif (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__))
283 #define SDL_CPUPauseInstruction() __asm__ __volatile__("pause\n")
284#elif (defined(__arm__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7) || defined(__aarch64__)
285 #define SDL_CPUPauseInstruction() __asm__ __volatile__("yield" ::: "memory")
286#elif (defined(__powerpc__) || defined(__powerpc64__))
287 #define SDL_CPUPauseInstruction() __asm__ __volatile__("or 27,27,27");
288#elif (defined(__riscv) && __riscv_xlen == 64)
289 #define SDL_CPUPauseInstruction() __asm__ __volatile__(".insn i 0x0F, 0, x0, x0, 0x010");
290#elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))
291 #define SDL_CPUPauseInstruction() _mm_pause()
292#elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_ARM64))
293 #define SDL_CPUPauseInstruction() __yield()
294#elif defined(__WATCOMC__) && defined(__386__)
296 #pragma aux SDL_CPUPauseInstruction = ".686p" ".xmm2" "pause"
298 #define SDL_CPUPauseInstruction()
407#ifndef SDL_AtomicIncRef
421#define SDL_AtomicIncRef(a) SDL_AtomicAdd(a, 1)
424#ifndef SDL_AtomicDecRef
439#define SDL_AtomicDecRef(a) (SDL_AtomicAdd(a, -1) == 1)
void SDL_MemoryBarrierAcquireFunction(void)
int SDL_AtomicSet(SDL_AtomicInt *a, int v)
void * SDL_AtomicGetPtr(void **a)
#define SDL_CompilerBarrier()
void SDL_MemoryBarrierReleaseFunction(void)
int SDL_AtomicGet(SDL_AtomicInt *a)
SDL_bool SDL_AtomicCompareAndSwap(SDL_AtomicInt *a, int oldval, int newval)
#define SDL_CPUPauseInstruction()
SDL_bool SDL_AtomicCompareAndSwapPointer(void **a, void *oldval, void *newval)
void SDL_LockSpinlock(SDL_SpinLock *lock)
int SDL_AtomicAdd(SDL_AtomicInt *a, int v)
void SDL_UnlockSpinlock(SDL_SpinLock *lock)
SDL_bool SDL_TryLockSpinlock(SDL_SpinLock *lock)
void * SDL_AtomicSetPtr(void **a, void *v)