aboutsummaryrefslogtreecommitdiff
path: root/EASTL/test/source/TestAtomicAsm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'EASTL/test/source/TestAtomicAsm.cpp')
-rw-r--r--EASTL/test/source/TestAtomicAsm.cpp4921
1 files changed, 4921 insertions, 0 deletions
diff --git a/EASTL/test/source/TestAtomicAsm.cpp b/EASTL/test/source/TestAtomicAsm.cpp
new file mode 100644
index 0000000..d4db04e
--- /dev/null
+++ b/EASTL/test/source/TestAtomicAsm.cpp
@@ -0,0 +1,4921 @@
+/////////////////////////////////////////////////////////////////////////////
+// Copyright (c) Electronic Arts Inc. All rights reserved.
+/////////////////////////////////////////////////////////////////////////////
+
+
+#include "EASTLTest.h"
+
+#include <EASTL/atomic.h>
+
+#include <cstddef>
+
+
+struct UserType128
+{
+ uint32_t a,b,c,d;
+
+ friend bool operator==(const UserType128& a, const UserType128& b)
+ {
+ return (a.a == b.a) && (a.b == b.b) && (a.c == b.c) && (a.d == b.d);
+ }
+};
+
+
+/**
+ * There is no nice way to verify the emitted asm for each of the given operations.
+ * This test file is meant to put each operation into its own function so its easy
+ * to verify in a disassembler for manual inspection.
+ */
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32StoreRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ atomic.store(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(atomic);
+}
+
+EA_NO_INLINE static void TestAtomicU32StoreRelease()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ atomic.store(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(atomic);
+}
+
+EA_NO_INLINE static void TestAtomicU32StoreSeqCst()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ atomic.store(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(atomic);
+}
+
+EA_NO_INLINE static void TestAtomicU32Store()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ atomic.store(1);
+
+ eastl::compiler_barrier_data_dependency(atomic);
+}
+
+EA_NO_INLINE static void TestAtomicU32StoreOrders()
+{
+ TestAtomicU32StoreRelaxed();
+
+ TestAtomicU32StoreRelease();
+
+ TestAtomicU32StoreSeqCst();
+
+ TestAtomicU32Store();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64StoreRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ atomic.store(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(atomic);
+}
+
+EA_NO_INLINE static void TestAtomicU64StoreRelease()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ atomic.store(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(atomic);
+}
+
+EA_NO_INLINE static void TestAtomicU64StoreSeqCst()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ atomic.store(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(atomic);
+}
+
+EA_NO_INLINE static void TestAtomicU64Store()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ atomic.store(1);
+
+ eastl::compiler_barrier_data_dependency(atomic);
+}
+
+EA_NO_INLINE static void TestAtomicU64StoreOrders()
+{
+ TestAtomicU64StoreRelaxed();
+
+ TestAtomicU64StoreRelease();
+
+ TestAtomicU64StoreSeqCst();
+
+ TestAtomicU64Store();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT)
+
+EA_NO_INLINE static void TestAtomic128StoreRelaxed()
+{
+ eastl::atomic<UserType128> atomic;
+
+ atomic.store(UserType128{1, 1, 1, 1}, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(atomic);
+}
+
+EA_NO_INLINE static void TestAtomic128StoreRelease()
+{
+ eastl::atomic<UserType128> atomic;
+
+ atomic.store(UserType128{1, 1, 1, 1}, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(atomic);
+}
+
+EA_NO_INLINE static void TestAtomic128StoreSeqCst()
+{
+ eastl::atomic<UserType128> atomic;
+
+ atomic.store(UserType128{1, 1, 1, 1}, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(atomic);
+}
+
+EA_NO_INLINE static void TestAtomic128Store()
+{
+ eastl::atomic<UserType128> atomic;
+
+ atomic.store(UserType128{1, 1, 1, 1});
+
+ eastl::compiler_barrier_data_dependency(atomic);
+}
+
+EA_NO_INLINE static void TestAtomic128StoreOrders()
+{
+ TestAtomic128StoreRelaxed();
+
+ TestAtomic128StoreRelease();
+
+ TestAtomic128StoreSeqCst();
+
+ TestAtomic128Store();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32LoadRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t load = atomic.load(eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(load);
+}
+
+EA_NO_INLINE static void TestAtomicU32LoadAcquire()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t load = atomic.load(eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(load);
+}
+
+EA_NO_INLINE static void TestAtomicU32LoadSeqCst()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t load = atomic.load(eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(load);
+}
+
+EA_NO_INLINE static void TestAtomicU32Load()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t load = atomic.load();
+
+ eastl::compiler_barrier_data_dependency(load);
+}
+
+EA_NO_INLINE static void TestAtomicU32LoadOrders()
+{
+ TestAtomicU32LoadRelaxed();
+
+ TestAtomicU32LoadAcquire();
+
+ TestAtomicU32LoadSeqCst();
+
+ TestAtomicU32Load();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64LoadRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t load = atomic.load(eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(load);
+}
+
+EA_NO_INLINE static void TestAtomicU64LoadAcquire()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t load = atomic.load(eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(load);
+}
+
+EA_NO_INLINE static void TestAtomicU64LoadSeqCst()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t load = atomic.load(eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(load);
+}
+
+EA_NO_INLINE static void TestAtomicU64Load()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t load = atomic.load();
+
+ eastl::compiler_barrier_data_dependency(load);
+}
+
+EA_NO_INLINE static void TestAtomicU64LoadOrders()
+{
+ TestAtomicU64LoadRelaxed();
+
+ TestAtomicU64LoadAcquire();
+
+ TestAtomicU64LoadSeqCst();
+
+ TestAtomicU64Load();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT)
+
+EA_NO_INLINE static void TestAtomic128LoadRelaxed()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 load = atomic.load(eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(load);
+}
+
+EA_NO_INLINE static void TestAtomic128LoadAcquire()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 load = atomic.load(eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(load);
+}
+
+EA_NO_INLINE static void TestAtomic128LoadSeqCst()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 load = atomic.load(eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(load);
+}
+
+EA_NO_INLINE static void TestAtomic128Load()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 load = atomic.load();
+
+ eastl::compiler_barrier_data_dependency(load);
+}
+
+EA_NO_INLINE static void TestAtomic128LoadOrders()
+{
+ TestAtomic128LoadRelaxed();
+
+ TestAtomic128LoadAcquire();
+
+ TestAtomic128LoadSeqCst();
+
+ TestAtomic128Load();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32ExchangeRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t exchange = atomic.exchange(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(exchange);
+}
+
+EA_NO_INLINE static void TestAtomicU32ExchangeAcquire()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t exchange = atomic.exchange(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(exchange);
+}
+
+EA_NO_INLINE static void TestAtomicU32ExchangeRelease()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t exchange = atomic.exchange(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(exchange);
+}
+
+EA_NO_INLINE static void TestAtomicU32ExchangeAcqRel()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t exchange = atomic.exchange(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(exchange);
+}
+
+EA_NO_INLINE static void TestAtomicU32ExchangeSeqCst()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t exchange = atomic.exchange(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(exchange);
+}
+
+EA_NO_INLINE static void TestAtomicU32Exchange()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t exchange = atomic.exchange(1);
+
+ eastl::compiler_barrier_data_dependency(exchange);
+}
+
+EA_NO_INLINE static void TestAtomicU32ExchangeOrders()
+{
+ TestAtomicU32ExchangeRelaxed();
+
+ TestAtomicU32ExchangeAcquire();
+
+ TestAtomicU32ExchangeRelease();
+
+ TestAtomicU32ExchangeAcqRel();
+
+ TestAtomicU32ExchangeSeqCst();
+
+ TestAtomicU32Exchange();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64ExchangeRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t exchange = atomic.exchange(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(exchange);
+}
+
+EA_NO_INLINE static void TestAtomicU64ExchangeAcquire()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t exchange = atomic.exchange(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(exchange);
+}
+
+EA_NO_INLINE static void TestAtomicU64ExchangeRelease()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t exchange = atomic.exchange(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(exchange);
+}
+
+EA_NO_INLINE static void TestAtomicU64ExchangeAcqRel()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t exchange = atomic.exchange(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(exchange);
+}
+
+EA_NO_INLINE static void TestAtomicU64ExchangeSeqCst()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t exchange = atomic.exchange(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(exchange);
+}
+
+EA_NO_INLINE static void TestAtomicU64Exchange()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t exchange = atomic.exchange(1);
+
+ eastl::compiler_barrier_data_dependency(exchange);
+}
+
+EA_NO_INLINE static void TestAtomicU64ExchangeOrders()
+{
+ TestAtomicU64ExchangeRelaxed();
+
+ TestAtomicU64ExchangeAcquire();
+
+ TestAtomicU64ExchangeRelease();
+
+ TestAtomicU64ExchangeAcqRel();
+
+ TestAtomicU64ExchangeSeqCst();
+
+ TestAtomicU64Exchange();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT)
+
+EA_NO_INLINE static void TestAtomic128ExchangeRelaxed()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 exchange = atomic.exchange(UserType128{1, 1, 1, 1}, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(exchange);
+}
+
+EA_NO_INLINE static void TestAtomic128ExchangeAcquire()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 exchange = atomic.exchange(UserType128{1, 1, 1, 1}, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(exchange);
+}
+
+EA_NO_INLINE static void TestAtomic128ExchangeRelease()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 exchange = atomic.exchange(UserType128{1, 1, 1, 1}, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(exchange);
+}
+
+EA_NO_INLINE static void TestAtomic128ExchangeAcqRel()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 exchange = atomic.exchange(UserType128{1, 1, 1, 1}, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(exchange);
+}
+
+EA_NO_INLINE static void TestAtomic128ExchangeSeqCst()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 exchange = atomic.exchange(UserType128{1, 1, 1, 1}, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(exchange);
+}
+
+EA_NO_INLINE static void TestAtomic128Exchange()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 exchange = atomic.exchange(UserType128{1, 1, 1, 1});
+
+ eastl::compiler_barrier_data_dependency(exchange);
+}
+
+EA_NO_INLINE static void TestAtomic128ExchangeOrders()
+{
+ TestAtomic128ExchangeRelaxed();
+
+ TestAtomic128ExchangeAcquire();
+
+ TestAtomic128ExchangeRelease();
+
+ TestAtomic128ExchangeAcqRel();
+
+ TestAtomic128ExchangeSeqCst();
+
+ TestAtomic128Exchange();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32OperatorT()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t load = atomic;
+
+ eastl::compiler_barrier_data_dependency(load);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64OperatorT()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t load = atomic;
+
+ eastl::compiler_barrier_data_dependency(load);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT)
+
+EA_NO_INLINE static void TestAtomic128OperatorT()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 load = atomic;
+
+ eastl::compiler_barrier_data_dependency(load);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32OperatorEqual()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ atomic = 1;
+
+ eastl::compiler_barrier_data_dependency(atomic);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64OperatorEqual()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ atomic = 1;
+
+ eastl::compiler_barrier_data_dependency(atomic);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT)
+
+EA_NO_INLINE static void TestAtomic128OperatorEqual()
+{
+ eastl::atomic<UserType128> atomic;
+
+ atomic = UserType128{1, 1, 1, 1};
+
+ eastl::compiler_barrier_data_dependency(atomic);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeStrongRelaxedRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_relaxed, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeStrongAcquireRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_acquire, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeStrongAcquireAcquire()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_acquire, eastl::memory_order_acquire);
+
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeStrongReleaseRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_release, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeStrongAcqRelRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_acq_rel, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeStrongAcqRelAcquire()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_acq_rel, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeStrongSeqCstRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_seq_cst, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeStrongSeqCstAcquire()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_seq_cst, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeStrongSeqCstSeqCst()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_seq_cst, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeStrongRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeStrongAcquire()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeStrongRelease()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeStrongAcqRel()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeStrongSeqCst()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeStrong()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeStrongOrders()
+{
+ TestAtomicU32CompareExchangeStrongRelaxedRelaxed();
+
+ TestAtomicU32CompareExchangeStrongAcquireRelaxed();
+
+ TestAtomicU32CompareExchangeStrongAcquireAcquire();
+
+ TestAtomicU32CompareExchangeStrongReleaseRelaxed();
+
+ TestAtomicU32CompareExchangeStrongAcqRelRelaxed();
+
+ TestAtomicU32CompareExchangeStrongAcqRelAcquire();
+
+ TestAtomicU32CompareExchangeStrongSeqCstRelaxed();
+
+ TestAtomicU32CompareExchangeStrongSeqCstAcquire();
+
+ TestAtomicU32CompareExchangeStrongSeqCstSeqCst();
+
+ TestAtomicU32CompareExchangeStrongRelaxed();
+
+ TestAtomicU32CompareExchangeStrongAcquire();
+
+ TestAtomicU32CompareExchangeStrongRelease();
+
+ TestAtomicU32CompareExchangeStrongAcqRel();
+
+ TestAtomicU32CompareExchangeStrongSeqCst();
+
+ TestAtomicU32CompareExchangeStrong();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeStrongRelaxedRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_relaxed, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeStrongAcquireRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_acquire, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeStrongAcquireAcquire()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_acquire, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeStrongReleaseRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_release, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeStrongAcqRelRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_acq_rel, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeStrongAcqRelAcquire()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_acq_rel, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeStrongSeqCstRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_seq_cst, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeStrongSeqCstAcquire()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_seq_cst, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeStrongSeqCstSeqCst()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_seq_cst, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeStrongRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeStrongAcquire()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeStrongRelease()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeStrongAcqRel()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeStrongSeqCst()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeStrong()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_strong(expected, 1);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeStrongOrders()
+{
+ TestAtomicU64CompareExchangeStrongRelaxedRelaxed();
+
+ TestAtomicU64CompareExchangeStrongAcquireRelaxed();
+
+ TestAtomicU64CompareExchangeStrongAcquireAcquire();
+
+ TestAtomicU64CompareExchangeStrongReleaseRelaxed();
+
+ TestAtomicU64CompareExchangeStrongAcqRelRelaxed();
+
+ TestAtomicU64CompareExchangeStrongAcqRelAcquire();
+
+ TestAtomicU64CompareExchangeStrongSeqCstRelaxed();
+
+ TestAtomicU64CompareExchangeStrongSeqCstAcquire();
+
+ TestAtomicU64CompareExchangeStrongSeqCstSeqCst();
+
+ TestAtomicU64CompareExchangeStrongRelaxed();
+
+ TestAtomicU64CompareExchangeStrongAcquire();
+
+ TestAtomicU64CompareExchangeStrongRelease();
+
+ TestAtomicU64CompareExchangeStrongAcqRel();
+
+ TestAtomicU64CompareExchangeStrongSeqCst();
+
+ TestAtomicU64CompareExchangeStrong();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT)
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeStrongRelaxedRelaxed()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_strong(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_relaxed, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeStrongAcquireRelaxed()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_strong(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_acquire, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeStrongAcquireAcquire()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_strong(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_acquire, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeStrongReleaseRelaxed()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_strong(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_release, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeStrongAcqRelRelaxed()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_strong(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_acq_rel, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeStrongAcqRelAcquire()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_strong(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_acq_rel, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeStrongSeqCstRelaxed()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_strong(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_seq_cst, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeStrongSeqCstAcquire()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_strong(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_seq_cst, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeStrongSeqCstSeqCst()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_strong(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_seq_cst, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeStrongRelaxed()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_strong(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeStrongAcquire()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_strong(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeStrongRelease()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_strong(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeStrongAcqRel()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_strong(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeStrongSeqCst()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_strong(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeStrong()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_strong(expected, UserType128{1, 1, 1, 1});
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeStrongOrders()
+{
+ TestAtomic128CompareExchangeStrongRelaxedRelaxed();
+
+ TestAtomic128CompareExchangeStrongAcquireRelaxed();
+
+ TestAtomic128CompareExchangeStrongAcquireAcquire();
+
+ TestAtomic128CompareExchangeStrongReleaseRelaxed();
+
+ TestAtomic128CompareExchangeStrongAcqRelRelaxed();
+
+ TestAtomic128CompareExchangeStrongAcqRelAcquire();
+
+ TestAtomic128CompareExchangeStrongSeqCstRelaxed();
+
+ TestAtomic128CompareExchangeStrongSeqCstAcquire();
+
+ TestAtomic128CompareExchangeStrongSeqCstSeqCst();
+
+ TestAtomic128CompareExchangeStrongRelaxed();
+
+ TestAtomic128CompareExchangeStrongAcquire();
+
+ TestAtomic128CompareExchangeStrongRelease();
+
+ TestAtomic128CompareExchangeStrongAcqRel();
+
+ TestAtomic128CompareExchangeStrongSeqCst();
+
+ TestAtomic128CompareExchangeStrong();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeWeakRelaxedRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_relaxed, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeWeakAcquireRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_acquire, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeWeakAcquireAcquire()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_acquire, eastl::memory_order_acquire);
+
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeWeakReleaseRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_release, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeWeakAcqRelRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_acq_rel, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeWeakAcqRelAcquire()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_acq_rel, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeWeakSeqCstRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_seq_cst, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeWeakSeqCstAcquire()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_seq_cst, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeWeakSeqCstSeqCst()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_seq_cst, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeWeakRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeWeakAcquire()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeWeakRelease()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeWeakAcqRel()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeWeakSeqCst()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeWeak()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU32CompareExchangeWeakOrders()
+{
+ TestAtomicU32CompareExchangeWeakRelaxedRelaxed();
+
+ TestAtomicU32CompareExchangeWeakAcquireRelaxed();
+
+ TestAtomicU32CompareExchangeWeakAcquireAcquire();
+
+ TestAtomicU32CompareExchangeWeakReleaseRelaxed();
+
+ TestAtomicU32CompareExchangeWeakAcqRelRelaxed();
+
+ TestAtomicU32CompareExchangeWeakAcqRelAcquire();
+
+ TestAtomicU32CompareExchangeWeakSeqCstRelaxed();
+
+ TestAtomicU32CompareExchangeWeakSeqCstAcquire();
+
+ TestAtomicU32CompareExchangeWeakSeqCstSeqCst();
+
+ TestAtomicU32CompareExchangeWeakRelaxed();
+
+ TestAtomicU32CompareExchangeWeakAcquire();
+
+ TestAtomicU32CompareExchangeWeakRelease();
+
+ TestAtomicU32CompareExchangeWeakAcqRel();
+
+ TestAtomicU32CompareExchangeWeakSeqCst();
+
+ TestAtomicU32CompareExchangeWeak();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeWeakRelaxedRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_relaxed, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeWeakAcquireRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_acquire, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeWeakAcquireAcquire()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_acquire, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeWeakReleaseRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_release, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeWeakAcqRelRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_acq_rel, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeWeakAcqRelAcquire()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_acq_rel, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeWeakSeqCstRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_seq_cst, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeWeakSeqCstAcquire()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_seq_cst, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeWeakSeqCstSeqCst()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_seq_cst, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeWeakRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeWeakAcquire()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeWeakRelease()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeWeakAcqRel()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeWeakSeqCst()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeWeak()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t expected = 0;
+ bool ret = atomic.compare_exchange_weak(expected, 1);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomicU64CompareExchangeWeakOrders()
+{
+ TestAtomicU64CompareExchangeWeakRelaxedRelaxed();
+
+ TestAtomicU64CompareExchangeWeakAcquireRelaxed();
+
+ TestAtomicU64CompareExchangeWeakAcquireAcquire();
+
+ TestAtomicU64CompareExchangeWeakReleaseRelaxed();
+
+ TestAtomicU64CompareExchangeWeakAcqRelRelaxed();
+
+ TestAtomicU64CompareExchangeWeakAcqRelAcquire();
+
+ TestAtomicU64CompareExchangeWeakSeqCstRelaxed();
+
+ TestAtomicU64CompareExchangeWeakSeqCstAcquire();
+
+ TestAtomicU64CompareExchangeWeakSeqCstSeqCst();
+
+ TestAtomicU64CompareExchangeWeakRelaxed();
+
+ TestAtomicU64CompareExchangeWeakAcquire();
+
+ TestAtomicU64CompareExchangeWeakRelease();
+
+ TestAtomicU64CompareExchangeWeakAcqRel();
+
+ TestAtomicU64CompareExchangeWeakSeqCst();
+
+ TestAtomicU64CompareExchangeWeak();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT)
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeWeakRelaxedRelaxed()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_weak(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_relaxed, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeWeakAcquireRelaxed()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_weak(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_acquire, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeWeakAcquireAcquire()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_weak(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_acquire, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeWeakReleaseRelaxed()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_weak(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_release, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeWeakAcqRelRelaxed()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_weak(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_acq_rel, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeWeakAcqRelAcquire()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_weak(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_acq_rel, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeWeakSeqCstRelaxed()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_weak(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_seq_cst, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeWeakSeqCstAcquire()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_weak(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_seq_cst, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeWeakSeqCstSeqCst()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_weak(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_seq_cst, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeWeakRelaxed()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_weak(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeWeakAcquire()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_weak(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeWeakRelease()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_weak(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeWeakAcqRel()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_weak(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeWeakSeqCst()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_weak(expected, UserType128{1, 1, 1, 1}, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeWeak()
+{
+ eastl::atomic<UserType128> atomic;
+
+ UserType128 expected = UserType128{0, 0, 0, 0};
+ bool ret = atomic.compare_exchange_weak(expected, UserType128{1, 1, 1, 1});
+
+ eastl::compiler_barrier_data_dependency(ret);
+}
+
+EA_NO_INLINE static void TestAtomic128CompareExchangeWeakOrders()
+{
+ TestAtomic128CompareExchangeWeakRelaxedRelaxed();
+
+ TestAtomic128CompareExchangeWeakAcquireRelaxed();
+
+ TestAtomic128CompareExchangeWeakAcquireAcquire();
+
+ TestAtomic128CompareExchangeWeakReleaseRelaxed();
+
+ TestAtomic128CompareExchangeWeakAcqRelRelaxed();
+
+ TestAtomic128CompareExchangeWeakAcqRelAcquire();
+
+ TestAtomic128CompareExchangeWeakSeqCstRelaxed();
+
+ TestAtomic128CompareExchangeWeakSeqCstAcquire();
+
+ TestAtomic128CompareExchangeWeakSeqCstSeqCst();
+
+ TestAtomic128CompareExchangeWeakRelaxed();
+
+ TestAtomic128CompareExchangeWeakAcquire();
+
+ TestAtomic128CompareExchangeWeakRelease();
+
+ TestAtomic128CompareExchangeWeakAcqRel();
+
+ TestAtomic128CompareExchangeWeakSeqCst();
+
+ TestAtomic128CompareExchangeWeak();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32FetchAddRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_add(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchAddAcquire()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_add(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchAddRelease()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_add(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchAddAcqRel()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_add(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchAddSeqCst()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_add(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchAdd()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_add(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchAddOrders()
+{
+ TestAtomicU32FetchAddRelaxed();
+
+ TestAtomicU32FetchAddAcquire();
+
+ TestAtomicU32FetchAddRelease();
+
+ TestAtomicU32FetchAddAcqRel();
+
+ TestAtomicU32FetchAddSeqCst();
+
+ TestAtomicU32FetchAdd();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64FetchAddRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_add(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchAddAcquire()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_add(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchAddRelease()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_add(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchAddAcqRel()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_add(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchAddSeqCst()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_add(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchAdd()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_add(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchAddOrders()
+{
+ TestAtomicU64FetchAddRelaxed();
+
+ TestAtomicU64FetchAddAcquire();
+
+ TestAtomicU64FetchAddRelease();
+
+ TestAtomicU64FetchAddAcqRel();
+
+ TestAtomicU64FetchAddSeqCst();
+
+ TestAtomicU64FetchAdd();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+
+EA_NO_INLINE static void TestAtomic128FetchAddRelaxed()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_add(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchAddAcquire()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_add(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchAddRelease()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_add(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchAddAcqRel()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_add(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchAddSeqCst()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_add(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchAdd()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_add(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchAddOrders()
+{
+ TestAtomic128FetchAddRelaxed();
+
+ TestAtomic128FetchAddAcquire();
+
+ TestAtomic128FetchAddRelease();
+
+ TestAtomic128FetchAddAcqRel();
+
+ TestAtomic128FetchAddSeqCst();
+
+ TestAtomic128FetchAdd();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32AddFetchRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.add_fetch(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32AddFetchAcquire()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.add_fetch(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32AddFetchRelease()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.add_fetch(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32AddFetchAcqRel()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.add_fetch(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32AddFetchSeqCst()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.add_fetch(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32AddFetch()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.add_fetch(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32AddFetchOrders()
+{
+ TestAtomicU32AddFetchRelaxed();
+
+ TestAtomicU32AddFetchAcquire();
+
+ TestAtomicU32AddFetchRelease();
+
+ TestAtomicU32AddFetchAcqRel();
+
+ TestAtomicU32AddFetchSeqCst();
+
+ TestAtomicU32AddFetch();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64AddFetchRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.add_fetch(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64AddFetchAcquire()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.add_fetch(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64AddFetchRelease()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.add_fetch(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64AddFetchAcqRel()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.add_fetch(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64AddFetchSeqCst()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.add_fetch(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64AddFetch()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.add_fetch(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64AddFetchOrders()
+{
+ TestAtomicU64AddFetchRelaxed();
+
+ TestAtomicU64AddFetchAcquire();
+
+ TestAtomicU64AddFetchRelease();
+
+ TestAtomicU64AddFetchAcqRel();
+
+ TestAtomicU64AddFetchSeqCst();
+
+ TestAtomicU64AddFetch();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+
+EA_NO_INLINE static void TestAtomic128AddFetchRelaxed()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.add_fetch(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128AddFetchAcquire()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.add_fetch(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128AddFetchRelease()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.add_fetch(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128AddFetchAcqRel()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.add_fetch(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128AddFetchSeqCst()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.add_fetch(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128AddFetch()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.add_fetch(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128AddFetchOrders()
+{
+ TestAtomic128AddFetchRelaxed();
+
+ TestAtomic128AddFetchAcquire();
+
+ TestAtomic128AddFetchRelease();
+
+ TestAtomic128AddFetchAcqRel();
+
+ TestAtomic128AddFetchSeqCst();
+
+ TestAtomic128AddFetch();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32FetchSubRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_sub(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchSubAcquire()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_sub(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchSubRelease()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_sub(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchSubAcqRel()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_sub(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchSubSeqCst()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_sub(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchSub()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_sub(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchSubOrders()
+{
+ TestAtomicU32FetchSubRelaxed();
+
+ TestAtomicU32FetchSubAcquire();
+
+ TestAtomicU32FetchSubRelease();
+
+ TestAtomicU32FetchSubAcqRel();
+
+ TestAtomicU32FetchSubSeqCst();
+
+ TestAtomicU32FetchSub();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64FetchSubRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_sub(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchSubAcquire()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_sub(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchSubRelease()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_sub(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchSubAcqRel()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_sub(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchSubSeqCst()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_sub(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchSub()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_sub(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchSubOrders()
+{
+ TestAtomicU64FetchSubRelaxed();
+
+ TestAtomicU64FetchSubAcquire();
+
+ TestAtomicU64FetchSubRelease();
+
+ TestAtomicU64FetchSubAcqRel();
+
+ TestAtomicU64FetchSubSeqCst();
+
+ TestAtomicU64FetchSub();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+
+EA_NO_INLINE static void TestAtomic128FetchSubRelaxed()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_sub(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchSubAcquire()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_sub(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchSubRelease()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_sub(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchSubAcqRel()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_sub(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchSubSeqCst()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_sub(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchSub()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_sub(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchSubOrders()
+{
+ TestAtomic128FetchSubRelaxed();
+
+ TestAtomic128FetchSubAcquire();
+
+ TestAtomic128FetchSubRelease();
+
+ TestAtomic128FetchSubAcqRel();
+
+ TestAtomic128FetchSubSeqCst();
+
+ TestAtomic128FetchSub();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32SubFetchRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.sub_fetch(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32SubFetchAcquire()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.sub_fetch(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32SubFetchRelease()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.sub_fetch(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32SubFetchAcqRel()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.sub_fetch(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32SubFetchSeqCst()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.sub_fetch(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32SubFetch()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.sub_fetch(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32SubFetchOrders()
+{
+ TestAtomicU32SubFetchRelaxed();
+
+ TestAtomicU32SubFetchAcquire();
+
+ TestAtomicU32SubFetchRelease();
+
+ TestAtomicU32SubFetchAcqRel();
+
+ TestAtomicU32SubFetchSeqCst();
+
+ TestAtomicU32SubFetch();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64SubFetchRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.sub_fetch(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64SubFetchAcquire()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.sub_fetch(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64SubFetchRelease()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.sub_fetch(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64SubFetchAcqRel()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.sub_fetch(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64SubFetchSeqCst()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.sub_fetch(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64SubFetch()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.sub_fetch(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64SubFetchOrders()
+{
+ TestAtomicU64SubFetchRelaxed();
+
+ TestAtomicU64SubFetchAcquire();
+
+ TestAtomicU64SubFetchRelease();
+
+ TestAtomicU64SubFetchAcqRel();
+
+ TestAtomicU64SubFetchSeqCst();
+
+ TestAtomicU64SubFetch();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+
+EA_NO_INLINE static void TestAtomic128SubFetchRelaxed()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.sub_fetch(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128SubFetchAcquire()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.sub_fetch(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128SubFetchRelease()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.sub_fetch(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128SubFetchAcqRel()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.sub_fetch(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128SubFetchSeqCst()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.sub_fetch(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128SubFetch()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.sub_fetch(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128SubFetchOrders()
+{
+ TestAtomic128SubFetchRelaxed();
+
+ TestAtomic128SubFetchAcquire();
+
+ TestAtomic128SubFetchRelease();
+
+ TestAtomic128SubFetchAcqRel();
+
+ TestAtomic128SubFetchSeqCst();
+
+ TestAtomic128SubFetch();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32FetchAndRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_and(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchAndAcquire()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_and(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchAndRelease()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_and(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchAndAcqRel()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_and(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchAndSeqCst()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_and(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchAnd()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_and(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchAndOrders()
+{
+ TestAtomicU32FetchAndRelaxed();
+
+ TestAtomicU32FetchAndAcquire();
+
+ TestAtomicU32FetchAndRelease();
+
+ TestAtomicU32FetchAndAcqRel();
+
+ TestAtomicU32FetchAndSeqCst();
+
+ TestAtomicU32FetchAnd();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64FetchAndRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_and(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchAndAcquire()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_and(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchAndRelease()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_and(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchAndAcqRel()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_and(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchAndSeqCst()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_and(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchAnd()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_and(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchAndOrders()
+{
+ TestAtomicU64FetchAndRelaxed();
+
+ TestAtomicU64FetchAndAcquire();
+
+ TestAtomicU64FetchAndRelease();
+
+ TestAtomicU64FetchAndAcqRel();
+
+ TestAtomicU64FetchAndSeqCst();
+
+ TestAtomicU64FetchAnd();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+
+EA_NO_INLINE static void TestAtomic128FetchAndRelaxed()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_and(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchAndAcquire()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_and(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchAndRelease()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_and(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchAndAcqRel()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_and(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchAndSeqCst()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_and(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchAnd()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_and(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchAndOrders()
+{
+ TestAtomic128FetchAndRelaxed();
+
+ TestAtomic128FetchAndAcquire();
+
+ TestAtomic128FetchAndRelease();
+
+ TestAtomic128FetchAndAcqRel();
+
+ TestAtomic128FetchAndSeqCst();
+
+ TestAtomic128FetchAnd();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32AndFetchRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.and_fetch(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32AndFetchAcquire()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.and_fetch(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32AndFetchRelease()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.and_fetch(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32AndFetchAcqRel()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.and_fetch(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32AndFetchSeqCst()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.and_fetch(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32AndFetch()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.and_fetch(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32AndFetchOrders()
+{
+ TestAtomicU32AndFetchRelaxed();
+
+ TestAtomicU32AndFetchAcquire();
+
+ TestAtomicU32AndFetchRelease();
+
+ TestAtomicU32AndFetchAcqRel();
+
+ TestAtomicU32AndFetchSeqCst();
+
+ TestAtomicU32AndFetch();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64AndFetchRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.and_fetch(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64AndFetchAcquire()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.and_fetch(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64AndFetchRelease()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.and_fetch(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64AndFetchAcqRel()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.and_fetch(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64AndFetchSeqCst()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.and_fetch(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64AndFetch()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.and_fetch(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64AndFetchOrders()
+{
+ TestAtomicU64AndFetchRelaxed();
+
+ TestAtomicU64AndFetchAcquire();
+
+ TestAtomicU64AndFetchRelease();
+
+ TestAtomicU64AndFetchAcqRel();
+
+ TestAtomicU64AndFetchSeqCst();
+
+ TestAtomicU64AndFetch();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+
+EA_NO_INLINE static void TestAtomic128AndFetchRelaxed()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.and_fetch(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128AndFetchAcquire()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.and_fetch(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128AndFetchRelease()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.and_fetch(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128AndFetchAcqRel()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.and_fetch(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128AndFetchSeqCst()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.and_fetch(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128AndFetch()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.and_fetch(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128AndFetchOrders()
+{
+ TestAtomic128AndFetchRelaxed();
+
+ TestAtomic128AndFetchAcquire();
+
+ TestAtomic128AndFetchRelease();
+
+ TestAtomic128AndFetchAcqRel();
+
+ TestAtomic128AndFetchSeqCst();
+
+ TestAtomic128AndFetch();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32OrFetchRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.or_fetch(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32OrFetchAcquire()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.or_fetch(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32OrFetchRelease()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.or_fetch(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32OrFetchAcqRel()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.or_fetch(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32OrFetchSeqCst()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.or_fetch(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32OrFetch()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.or_fetch(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32OrFetchOrders()
+{
+ TestAtomicU32OrFetchRelaxed();
+
+ TestAtomicU32OrFetchAcquire();
+
+ TestAtomicU32OrFetchRelease();
+
+ TestAtomicU32OrFetchAcqRel();
+
+ TestAtomicU32OrFetchSeqCst();
+
+ TestAtomicU32OrFetch();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64OrFetchRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.or_fetch(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64OrFetchAcquire()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.or_fetch(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64OrFetchRelease()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.or_fetch(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64OrFetchAcqRel()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.or_fetch(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64OrFetchSeqCst()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.or_fetch(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64OrFetch()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.or_fetch(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64OrFetchOrders()
+{
+ TestAtomicU64OrFetchRelaxed();
+
+ TestAtomicU64OrFetchAcquire();
+
+ TestAtomicU64OrFetchRelease();
+
+ TestAtomicU64OrFetchAcqRel();
+
+ TestAtomicU64OrFetchSeqCst();
+
+ TestAtomicU64OrFetch();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+
+EA_NO_INLINE static void TestAtomic128OrFetchRelaxed()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.or_fetch(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128OrFetchAcquire()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.or_fetch(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128OrFetchRelease()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.or_fetch(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128OrFetchAcqRel()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.or_fetch(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128OrFetchSeqCst()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.or_fetch(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128OrFetch()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.or_fetch(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128OrFetchOrders()
+{
+ TestAtomic128OrFetchRelaxed();
+
+ TestAtomic128OrFetchAcquire();
+
+ TestAtomic128OrFetchRelease();
+
+ TestAtomic128OrFetchAcqRel();
+
+ TestAtomic128OrFetchSeqCst();
+
+ TestAtomic128OrFetch();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32FetchOrRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_or(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchOrAcquire()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_or(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchOrRelease()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_or(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchOrAcqRel()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_or(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchOrSeqCst()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_or(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchOr()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_or(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchOrOrders()
+{
+ TestAtomicU32FetchOrRelaxed();
+
+ TestAtomicU32FetchOrAcquire();
+
+ TestAtomicU32FetchOrRelease();
+
+ TestAtomicU32FetchOrAcqRel();
+
+ TestAtomicU32FetchOrSeqCst();
+
+ TestAtomicU32FetchOr();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64FetchOrRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_or(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchOrAcquire()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_or(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchOrRelease()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_or(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchOrAcqRel()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_or(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchOrSeqCst()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_or(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchOr()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_or(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchOrOrders()
+{
+ TestAtomicU64FetchOrRelaxed();
+
+ TestAtomicU64FetchOrAcquire();
+
+ TestAtomicU64FetchOrRelease();
+
+ TestAtomicU64FetchOrAcqRel();
+
+ TestAtomicU64FetchOrSeqCst();
+
+ TestAtomicU64FetchOr();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+
+EA_NO_INLINE static void TestAtomic128FetchOrRelaxed()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_or(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchOrAcquire()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_or(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchOrRelease()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_or(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchOrAcqRel()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_or(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchOrSeqCst()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_or(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchOr()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_or(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchOrOrders()
+{
+ TestAtomic128FetchOrRelaxed();
+
+ TestAtomic128FetchOrAcquire();
+
+ TestAtomic128FetchOrRelease();
+
+ TestAtomic128FetchOrAcqRel();
+
+ TestAtomic128FetchOrSeqCst();
+
+ TestAtomic128FetchOr();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32FetchXorRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_xor(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchXorAcquire()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_xor(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchXorRelease()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_xor(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchXorAcqRel()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_xor(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchXorSeqCst()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_xor(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchXor()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.fetch_xor(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32FetchXorOrders()
+{
+ TestAtomicU32FetchXorRelaxed();
+
+ TestAtomicU32FetchXorAcquire();
+
+ TestAtomicU32FetchXorRelease();
+
+ TestAtomicU32FetchXorAcqRel();
+
+ TestAtomicU32FetchXorSeqCst();
+
+ TestAtomicU32FetchXor();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64FetchXorRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_xor(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchXorAcquire()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_xor(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchXorRelease()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_xor(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchXorAcqRel()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_xor(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchXorSeqCst()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_add(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchXor()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.fetch_xor(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64FetchXorOrders()
+{
+ TestAtomicU64FetchXorRelaxed();
+
+ TestAtomicU64FetchXorAcquire();
+
+ TestAtomicU64FetchXorRelease();
+
+ TestAtomicU64FetchXorAcqRel();
+
+ TestAtomicU64FetchXorSeqCst();
+
+ TestAtomicU64FetchXor();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+
+EA_NO_INLINE static void TestAtomic128FetchXorRelaxed()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_xor(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchXorAcquire()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_xor(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchXorRelease()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_xor(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchXorAcqRel()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_xor(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchXorSeqCst()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_xor(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchXor()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.fetch_xor(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128FetchXorOrders()
+{
+ TestAtomic128FetchXorRelaxed();
+
+ TestAtomic128FetchXorAcquire();
+
+ TestAtomic128FetchXorRelease();
+
+ TestAtomic128FetchXorAcqRel();
+
+ TestAtomic128FetchXorSeqCst();
+
+ TestAtomic128FetchXor();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32XorFetchRelaxed()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.xor_fetch(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32XorFetchAcquire()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.xor_fetch(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32XorFetchRelease()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.xor_fetch(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32XorFetchAcqRel()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.xor_fetch(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32XorFetchSeqCst()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.xor_fetch(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32XorFetch()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic.xor_fetch(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU32XorFetchOrders()
+{
+ TestAtomicU32XorFetchRelaxed();
+
+ TestAtomicU32XorFetchAcquire();
+
+ TestAtomicU32XorFetchRelease();
+
+ TestAtomicU32XorFetchAcqRel();
+
+ TestAtomicU32XorFetchSeqCst();
+
+ TestAtomicU32XorFetch();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64XorFetchRelaxed()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.xor_fetch(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64XorFetchAcquire()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.xor_fetch(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64XorFetchRelease()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.xor_fetch(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64XorFetchAcqRel()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.xor_fetch(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64XorFetchSeqCst()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.xor_fetch(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64XorFetch()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic.xor_fetch(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomicU64XorFetchOrders()
+{
+ TestAtomicU64XorFetchRelaxed();
+
+ TestAtomicU64XorFetchAcquire();
+
+ TestAtomicU64XorFetchRelease();
+
+ TestAtomicU64XorFetchAcqRel();
+
+ TestAtomicU64XorFetchSeqCst();
+
+ TestAtomicU64XorFetch();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+
+EA_NO_INLINE static void TestAtomic128XorFetchRelaxed()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.xor_fetch(1, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128XorFetchAcquire()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.xor_fetch(1, eastl::memory_order_acquire);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128XorFetchRelease()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.xor_fetch(1, eastl::memory_order_release);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128XorFetchAcqRel()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.xor_fetch(1, eastl::memory_order_acq_rel);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128XorFetchSeqCst()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.xor_fetch(1, eastl::memory_order_seq_cst);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128XorFetch()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic.xor_fetch(1);
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+EA_NO_INLINE static void TestAtomic128XorFetchOrders()
+{
+ TestAtomic128XorFetchRelaxed();
+
+ TestAtomic128XorFetchAcquire();
+
+ TestAtomic128XorFetchRelease();
+
+ TestAtomic128XorFetchAcqRel();
+
+ TestAtomic128XorFetchSeqCst();
+
+ TestAtomic128XorFetch();
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32OperatorPlusPlus()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic++;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64OperatorPlusPlus()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic++;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+
+EA_NO_INLINE static void TestAtomic128OperatorPlusPlus()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic++;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32PlusPlusOperator()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = ++atomic;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64PlusPlusOperator()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = ++atomic;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+
+EA_NO_INLINE static void TestAtomic128PlusPlusOperator()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = ++atomic;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32OperatorMinusMinus()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic--;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64OperatorMinusMinus()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic--;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+
+EA_NO_INLINE static void TestAtomic128OperatorMinusMinus()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic--;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32MinusMinusOperator()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = --atomic;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64MinusMinusOperator()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = --atomic;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+
+EA_NO_INLINE static void TestAtomic128MinusMinusOperator()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = --atomic;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32OperatorPlusAssignment()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic += 1;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64OperatorPlusAssignment()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic += 1;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+
+EA_NO_INLINE static void TestAtomic128OperatorPlusAssignment()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic += 1;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32OperatorMinusAssignment()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic -= 1;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64OperatorMinusAssignment()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic -= 1;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+
+EA_NO_INLINE static void TestAtomic128OperatorMinusAssignment()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic -= 1;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32OperatorAndAssignment()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic &= 1;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64OperatorAndAssignment()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic &= 1;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+
+EA_NO_INLINE static void TestAtomic128OperatorAndAssignment()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic &= 1;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32OperatorOrAssignment()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic |= 1;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64OperatorOrAssignment()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic |= 1;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+
+EA_NO_INLINE static void TestAtomic128OperatorOrAssignment()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic |= 1;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomicU32OperatorXorAssignment()
+{
+ eastl::atomic<uint32_t> atomic;
+
+ uint32_t val = atomic ^= 1;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_64BIT)
+
+EA_NO_INLINE static void TestAtomicU64OperatorXorAssignment()
+{
+ eastl::atomic<uint64_t> atomic;
+
+ uint64_t val = atomic ^= 1;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+
+EA_NO_INLINE static void TestAtomic128OperatorXorAssignment()
+{
+ eastl::atomic<__uint128_t> atomic;
+
+ __uint128_t val = atomic ^= 1;
+
+ eastl::compiler_barrier_data_dependency(val);
+}
+
+#endif
+
+EA_NO_INLINE static void TestAtomicSignalFenceRelaxed()
+{
+ eastl::atomic_signal_fence(eastl::memory_order_relaxed);
+}
+
+EA_NO_INLINE static void TestAtomicSignalFenceAcquire()
+{
+ eastl::atomic_signal_fence(eastl::memory_order_acquire);
+}
+
+EA_NO_INLINE static void TestAtomicSignalFenceRelease()
+{
+ eastl::atomic_signal_fence(eastl::memory_order_release);
+}
+
+EA_NO_INLINE static void TestAtomicSignalFenceAcqRel()
+{
+ eastl::atomic_signal_fence(eastl::memory_order_acq_rel);
+}
+
+EA_NO_INLINE static void TestAtomicSignalFenceSeqCst()
+{
+ eastl::atomic_signal_fence(eastl::memory_order_seq_cst);
+}
+
+EA_NO_INLINE static void TestAtomicThreadFenceRelaxed()
+{
+ eastl::atomic_thread_fence(eastl::memory_order_relaxed);
+}
+
+EA_NO_INLINE static void TestAtomicThreadFenceAcquire()
+{
+ eastl::atomic_thread_fence(eastl::memory_order_acquire);
+}
+
+EA_NO_INLINE static void TestAtomicThreadFenceRelease()
+{
+ eastl::atomic_thread_fence(eastl::memory_order_release);
+}
+
+EA_NO_INLINE static void TestAtomicThreadFenceAcqRel()
+{
+ eastl::atomic_thread_fence(eastl::memory_order_acq_rel);
+}
+
+EA_NO_INLINE static void TestAtomicThreadFenceSeqCst()
+{
+ eastl::atomic_thread_fence(eastl::memory_order_seq_cst);
+}
+
+EA_NO_INLINE static void TestAtomicPointerReadDepends()
+{
+ eastl::atomic<void*> atomic;
+
+ void* p = atomic.load(eastl::memory_order_read_depends);
+
+ eastl::compiler_barrier_data_dependency(p);
+}
+
+struct ReadDependsStruct
+{
+ int a;
+ int b;
+};
+
+eastl::atomic<ReadDependsStruct*> gAtomicPtr;
+
+EA_NO_INLINE int TestAtomicReadDependsStruct()
+{
+ ReadDependsStruct* p = gAtomicPtr.load(eastl::memory_order_read_depends);
+
+ int a = p->a;
+ int b = p->b;
+
+ return a + b;
+}
+
+EA_NO_INLINE static void TestCompilerBarrierDataDependency()
+{
+ {
+ UserType128 t{4, 5, 7, 8};
+
+ eastl::compiler_barrier_data_dependency(t);
+ }
+
+ {
+ void* p = (void*)0xdeadbeef;
+
+ eastl::compiler_barrier_data_dependency(p);
+ }
+
+ {
+ bool b = false;
+
+ eastl::compiler_barrier_data_dependency(b);
+ }
+}
+
+struct ReadDependsIntrusive
+{
+ int a;
+ int b;
+ struct ReadDependsIntrusive* next;
+ int c;
+ int d;
+};
+
+eastl::atomic<ReadDependsIntrusive**> gListHead;
+
+EA_NO_INLINE static int TestAtomicReadDependsIntrusive()
+{
+ ReadDependsIntrusive** intrusivePtr = gListHead.load(eastl::memory_order_read_depends);
+ ReadDependsIntrusive* ptr = ((ReadDependsIntrusive*)(((char*)intrusivePtr) - offsetof(ReadDependsIntrusive, next)));
+
+ int a = ptr->a;
+ int b = ptr->b;
+ int c = ptr->c;
+ int d = ptr->d;
+
+ return a + b + c + d;
+}
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+EA_NO_INLINE static void TestAtomic32LoadStoreSameAddressSeqCst()
+{
+ eastl::atomic<uint32_t> atomic{0};
+
+ uint32_t ret1 = atomic.load(eastl::memory_order_relaxed);
+
+ atomic.store(4, eastl::memory_order_relaxed);
+
+ uint32_t ret2 = atomic.load(eastl::memory_order_relaxed);
+
+ uint32_t ret3 = atomic.load(eastl::memory_order_relaxed);
+
+ atomic.store(5, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret1);
+ eastl::compiler_barrier_data_dependency(ret2);
+ eastl::compiler_barrier_data_dependency(ret3);
+}
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT)
+
+EA_NO_INLINE static void TestAtomic128LoadStoreSameAddressSeqCst()
+{
+ eastl::atomic<UserType128> atomic{UserType128{0, 0, 0, 0}};
+
+ UserType128 ret1 = atomic.load(eastl::memory_order_relaxed);
+
+ atomic.store(UserType128{1, 0, 2, 4}, eastl::memory_order_relaxed);
+
+ UserType128 ret2 = atomic.load(eastl::memory_order_relaxed);
+
+ UserType128 ret3 = atomic.load(eastl::memory_order_relaxed);
+
+ atomic.store(UserType128{1, 1, 2, 4}, eastl::memory_order_relaxed);
+
+ eastl::compiler_barrier_data_dependency(ret1);
+ eastl::compiler_barrier_data_dependency(ret2);
+ eastl::compiler_barrier_data_dependency(ret3);
+}
+
+#endif
+
+int TestAtomicAsm()
+{
+ int nErrorCount = 0;
+
+ // Stores
+ {
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32StoreOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64StoreOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT)
+ TestAtomic128StoreOrders();
+ #endif
+ }
+
+ // Loads
+ {
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32LoadOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64LoadOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT)
+ TestAtomic128LoadOrders();
+ #endif
+ }
+
+ // exchange
+ {
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32ExchangeOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64ExchangeOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT)
+ TestAtomic128ExchangeOrders();
+ #endif
+ }
+
+ // operator T
+ {
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32OperatorT();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64OperatorT();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT)
+ TestAtomic128OperatorT();
+ #endif
+ }
+
+ // operator=
+ {
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32OperatorEqual();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64OperatorEqual();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT)
+ TestAtomic128OperatorEqual();
+ #endif
+ }
+
+ // compare_exchange_weak
+ {
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32CompareExchangeWeakOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64CompareExchangeWeakOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT)
+ TestAtomic128CompareExchangeWeakOrders();
+ #endif
+ }
+
+ // compare_exchange_strong
+ {
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32CompareExchangeStrongOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64CompareExchangeStrongOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT)
+ TestAtomic128CompareExchangeStrongOrders();
+ #endif
+ }
+
+ // fetch_add
+ {
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32FetchAddOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64FetchAddOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+ TestAtomic128FetchAddOrders();
+ #endif
+ }
+
+ // add_fetch
+ {
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32AddFetchOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64AddFetchOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+ TestAtomic128AddFetchOrders();
+ #endif
+ }
+
+ // fetch_sub
+ {
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32FetchSubOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64FetchSubOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+ TestAtomic128FetchSubOrders();
+ #endif
+ }
+
+ // sub_fetch
+ {
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32SubFetchOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64SubFetchOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+ TestAtomic128SubFetchOrders();
+ #endif
+ }
+
+ // fetch_and
+ {
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32FetchAndOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64FetchAndOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+ TestAtomic128FetchAndOrders();
+ #endif
+ }
+
+ // and_fetch
+ {
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32AndFetchOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64AndFetchOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+ TestAtomic128AndFetchOrders();
+ #endif
+ }
+
+ // fetch_or
+ {
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32FetchOrOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64FetchOrOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+ TestAtomic128FetchOrOrders();
+ #endif
+ }
+
+ // or_fetch
+ {
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32OrFetchOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64OrFetchOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+ TestAtomic128OrFetchOrders();
+ #endif
+ }
+
+ // fetch_xor
+ {
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32FetchXorOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64FetchXorOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+ TestAtomic128FetchXorOrders();
+ #endif
+ }
+
+ // xor_fetch
+ {
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32XorFetchOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64XorFetchOrders();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+ TestAtomic128XorFetchOrders();
+ #endif
+ }
+
+ // operator++/++operator
+ {
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32OperatorPlusPlus();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64OperatorPlusPlus();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+ TestAtomic128OperatorPlusPlus();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32PlusPlusOperator();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64PlusPlusOperator();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+ TestAtomic128PlusPlusOperator();
+ #endif
+ }
+
+ // operator--/--operator
+ {
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32OperatorMinusMinus();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64OperatorMinusMinus();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+ TestAtomic128OperatorMinusMinus();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32MinusMinusOperator();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64MinusMinusOperator();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+ TestAtomic128MinusMinusOperator();
+ #endif
+ }
+
+ // operator+=
+ {
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32OperatorPlusAssignment();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64OperatorPlusAssignment();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+ TestAtomic128OperatorPlusAssignment();
+ #endif
+ }
+
+ // operator-=
+ {
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32OperatorMinusAssignment();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64OperatorMinusAssignment();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+ TestAtomic128OperatorMinusAssignment();
+ #endif
+ }
+
+ // operator&=
+ {
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32OperatorAndAssignment();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64OperatorAndAssignment();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+ TestAtomic128OperatorAndAssignment();
+ #endif
+ }
+
+ // operator|=
+ {
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32OperatorOrAssignment();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64OperatorOrAssignment();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+ TestAtomic128OperatorOrAssignment();
+ #endif
+ }
+
+ // operator^=
+ {
+ #if defined(EASTL_ATOMIC_HAS_32BIT)
+ TestAtomicU32OperatorXorAssignment();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_64BIT)
+ TestAtomicU64OperatorXorAssignment();
+ #endif
+
+ #if defined(EASTL_ATOMIC_HAS_128BIT) && (defined(EA_COMPILER_GNUC) || defined(EA_COMPILER_CLANG))
+ TestAtomic128OperatorXorAssignment();
+ #endif
+ }
+
+ // atomic_signal_fence
+ {
+ TestAtomicSignalFenceRelaxed();
+
+ TestAtomicSignalFenceAcquire();
+
+ TestAtomicSignalFenceRelease();
+
+ TestAtomicSignalFenceAcqRel();
+
+ TestAtomicSignalFenceSeqCst();
+ }
+
+ // atomic_thread_fence
+ {
+ TestAtomicThreadFenceRelaxed();
+
+ TestAtomicThreadFenceAcquire();
+
+ TestAtomicThreadFenceRelease();
+
+ TestAtomicThreadFenceAcqRel();
+
+ TestAtomicThreadFenceSeqCst();
+ }
+
+ // atomic pointer read depends
+ {
+ TestAtomicPointerReadDepends();
+ }
+
+ // atomic pointer read depends
+ {
+ ReadDependsStruct rds {3, 2};
+
+ gAtomicPtr.store(&rds, eastl::memory_order_release);
+
+ int ret = TestAtomicReadDependsStruct();
+ eastl::compiler_barrier_data_dependency(ret);
+ }
+
+ {
+ ReadDependsIntrusive rdi {3, 2, &rdi, 1, 0};
+
+ gListHead.store(&(rdi.next), eastl::memory_order_release);
+
+ int ret = TestAtomicReadDependsIntrusive();
+ eastl::compiler_barrier_data_dependency(ret);
+ }
+
+ {
+ TestCompilerBarrierDataDependency();
+ }
+
+#if defined(EASTL_ATOMIC_HAS_32BIT)
+
+ TestAtomic32LoadStoreSameAddressSeqCst();
+
+#endif
+
+#if defined(EASTL_ATOMIC_HAS_128BIT)
+
+ TestAtomic128LoadStoreSameAddressSeqCst();
+
+#endif
+
+ return nErrorCount;
+}