diff --git a/rpcs3/util/atomic.hpp b/rpcs3/util/atomic.hpp index f885b1e190..a01095a4e7 100644 --- a/rpcs3/util/atomic.hpp +++ b/rpcs3/util/atomic.hpp @@ -248,6 +248,7 @@ struct atomic_storage : atomic_storage static inline T load(const T& dest) { + std::atomic_thread_fence(std::memory_order_acquire); const char value = *reinterpret_cast(&dest); std::atomic_thread_fence(std::memory_order_acquire); return std::bit_cast(value); @@ -257,6 +258,7 @@ struct atomic_storage : atomic_storage { std::atomic_thread_fence(std::memory_order_release); *reinterpret_cast(&dest) = std::bit_cast(value); + std::atomic_thread_fence(std::memory_order_release); } static inline T exchange(T& dest, T value) @@ -310,6 +312,7 @@ struct atomic_storage : atomic_storage static inline T load(const T& dest) { + std::atomic_thread_fence(std::memory_order_acquire); const short value = *reinterpret_cast(&dest); std::atomic_thread_fence(std::memory_order_acquire); return std::bit_cast(value); @@ -319,6 +322,7 @@ struct atomic_storage : atomic_storage { std::atomic_thread_fence(std::memory_order_release); *reinterpret_cast(&dest) = std::bit_cast(value); + std::atomic_thread_fence(std::memory_order_release); } static inline T exchange(T& dest, T value) @@ -416,6 +420,7 @@ struct atomic_storage : atomic_storage static inline T load(const T& dest) { + std::atomic_thread_fence(std::memory_order_acquire); const long value = *reinterpret_cast(&dest); std::atomic_thread_fence(std::memory_order_acquire); return std::bit_cast(value); @@ -425,6 +430,7 @@ struct atomic_storage : atomic_storage { std::atomic_thread_fence(std::memory_order_release); *reinterpret_cast(&dest) = std::bit_cast(value); + std::atomic_thread_fence(std::memory_order_release); } static inline T exchange(T& dest, T value) @@ -535,6 +541,7 @@ struct atomic_storage : atomic_storage static inline T load(const T& dest) { + std::atomic_thread_fence(std::memory_order_acquire); const llong value = *reinterpret_cast(&dest); std::atomic_thread_fence(std::memory_order_acquire); return std::bit_cast(value); @@ -544,6 +551,7 @@ struct atomic_storage : atomic_storage { std::atomic_thread_fence(std::memory_order_release); *reinterpret_cast(&dest) = std::bit_cast(value); + std::atomic_thread_fence(std::memory_order_release); } static inline T exchange(T& dest, T value) @@ -641,6 +649,7 @@ struct atomic_storage : atomic_storage #ifdef _MSC_VER static inline T load(const T& dest) { + std::atomic_thread_fence(std::memory_order_acquire); __m128i val = _mm_load_si128(reinterpret_cast(&dest)); std::atomic_thread_fence(std::memory_order_acquire); return std::bit_cast(val); @@ -673,10 +682,12 @@ struct atomic_storage : atomic_storage { std::atomic_thread_fence(std::memory_order_release); _mm_store_si128(reinterpret_cast<__m128i*>(&dest), std::bit_cast<__m128i>(value)); + std::atomic_thread_fence(std::memory_order_release); } #else static inline T load(const T& dest) { + __atomic_thread_fence(__ATOMIC_ACQUIRE); __m128i val = _mm_load_si128(reinterpret_cast(&dest)); __atomic_thread_fence(__ATOMIC_ACQUIRE); return std::bit_cast(val); @@ -741,6 +752,7 @@ struct atomic_storage : atomic_storage { __atomic_thread_fence(__ATOMIC_RELEASE); _mm_store_si128(reinterpret_cast<__m128i*>(&dest), std::bit_cast<__m128i>(value)); + __atomic_thread_fence(__ATOMIC_RELEASE); } #endif