SDL: atomic: Use __atomic_thread_fence() when available (ef425)

From ef425def66128d0d802066611bd60f71431ac3c4 Mon Sep 17 00:00:00 2001
From: Cameron Gutman <[EMAIL REDACTED]>
Date: Thu, 23 Apr 2026 18:25:38 -0500
Subject: [PATCH] atomic: Use __atomic_thread_fence() when available

This avoids requiring inline assembly for each architecture.

It also fixes some weakly ordered architectures which lacked
said inline assembly (RISC-V, MIPS, LoongArch, etc) and were
thus disasterously broken.

(cherry picked from commit 2858a32723924f2015ce44452b45505b02994103)
---
 include/SDL3/SDL_atomic.h | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/include/SDL3/SDL_atomic.h b/include/SDL3/SDL_atomic.h
index 1ec0753da3461..bbd5828df3c1e 100644
--- a/include/SDL3/SDL_atomic.h
+++ b/include/SDL3/SDL_atomic.h
@@ -275,6 +275,9 @@ extern SDL_DECLSPEC void SDLCALL SDL_MemoryBarrierAcquireFunction(void);
  */
 #define SDL_MemoryBarrierAcquire() SDL_MemoryBarrierAcquireFunction()
 
+#elif SDL_HAS_BUILTIN(__atomic_thread_fence) || (defined(__GNUC__) && (__GNUC__ >= 5))
+#define SDL_MemoryBarrierRelease()   __atomic_thread_fence(__ATOMIC_RELEASE)
+#define SDL_MemoryBarrierAcquire()   __atomic_thread_fence(__ATOMIC_ACQUIRE)
 #elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
 #define SDL_MemoryBarrierRelease()   __asm__ __volatile__ ("lwsync" : : : "memory")
 #define SDL_MemoryBarrierAcquire()   __asm__ __volatile__ ("lwsync" : : : "memory")