///////////////////////////////////////////////////////////////////////////// // Copyright (c) Electronic Arts Inc. All rights reserved. ///////////////////////////////////////////////////////////////////////////// #include "EASTLTest.h" #include #include 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 atomic; atomic.store(1, eastl::memory_order_relaxed); eastl::compiler_barrier_data_dependency(atomic); } EA_NO_INLINE static void TestAtomicU32StoreRelease() { eastl::atomic atomic; atomic.store(1, eastl::memory_order_release); eastl::compiler_barrier_data_dependency(atomic); } EA_NO_INLINE static void TestAtomicU32StoreSeqCst() { eastl::atomic atomic; atomic.store(1, eastl::memory_order_seq_cst); eastl::compiler_barrier_data_dependency(atomic); } EA_NO_INLINE static void TestAtomicU32Store() { eastl::atomic 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 atomic; atomic.store(1, eastl::memory_order_relaxed); eastl::compiler_barrier_data_dependency(atomic); } EA_NO_INLINE static void TestAtomicU64StoreRelease() { eastl::atomic atomic; atomic.store(1, eastl::memory_order_release); eastl::compiler_barrier_data_dependency(atomic); } EA_NO_INLINE static void TestAtomicU64StoreSeqCst() { eastl::atomic atomic; atomic.store(1, eastl::memory_order_seq_cst); eastl::compiler_barrier_data_dependency(atomic); } EA_NO_INLINE static void TestAtomicU64Store() { eastl::atomic 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 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 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 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 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 atomic; uint32_t load = atomic.load(eastl::memory_order_relaxed); eastl::compiler_barrier_data_dependency(load); } EA_NO_INLINE static void TestAtomicU32LoadAcquire() { eastl::atomic atomic; uint32_t load = atomic.load(eastl::memory_order_acquire); eastl::compiler_barrier_data_dependency(load); } EA_NO_INLINE static void TestAtomicU32LoadSeqCst() { eastl::atomic 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 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 atomic; uint64_t load = atomic.load(eastl::memory_order_relaxed); eastl::compiler_barrier_data_dependency(load); } EA_NO_INLINE static void TestAtomicU64LoadAcquire() { eastl::atomic atomic; uint64_t load = atomic.load(eastl::memory_order_acquire); eastl::compiler_barrier_data_dependency(load); } EA_NO_INLINE static void TestAtomicU64LoadSeqCst() { eastl::atomic 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 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 atomic; UserType128 load = atomic.load(eastl::memory_order_relaxed); eastl::compiler_barrier_data_dependency(load); } EA_NO_INLINE static void TestAtomic128LoadAcquire() { eastl::atomic atomic; UserType128 load = atomic.load(eastl::memory_order_acquire); eastl::compiler_barrier_data_dependency(load); } EA_NO_INLINE static void TestAtomic128LoadSeqCst() { eastl::atomic atomic; UserType128 load = atomic.load(eastl::memory_order_seq_cst); eastl::compiler_barrier_data_dependency(load); } EA_NO_INLINE static void TestAtomic128Load() { eastl::atomic 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 atomic; atomic = 1; eastl::compiler_barrier_data_dependency(atomic); } #endif #if defined(EASTL_ATOMIC_HAS_64BIT) EA_NO_INLINE static void TestAtomicU64OperatorEqual() { eastl::atomic atomic; atomic = 1; eastl::compiler_barrier_data_dependency(atomic); } #endif #if defined(EASTL_ATOMIC_HAS_128BIT) EA_NO_INLINE static void TestAtomic128OperatorEqual() { eastl::atomic 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 atomic; void* p = atomic.load(eastl::memory_order_read_depends); eastl::compiler_barrier_data_dependency(p); } struct ReadDependsStruct { int a; int b; }; eastl::atomic 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 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 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 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; }