6 #ifndef EASTL_ATOMIC_INTERNAL_ARCH_ARM_STORE_H
7 #define EASTL_ATOMIC_INTERNAL_ARCH_ARM_STORE_H
9 #if defined(EA_PRAGMA_ONCE_SUPPORTED)
18 #if defined(EA_COMPILER_MSVC)
21 #define EASTL_ARCH_ATOMIC_ARM_STORE_N(integralType, bits, type, ptr, val) \
22 EA_PREPROCESSOR_JOIN(__iso_volatile_store, bits)(EASTL_ATOMIC_VOLATILE_INTEGRAL_CAST(integralType, (ptr)), EASTL_ATOMIC_TYPE_PUN_CAST(integralType, (val)))
25 #define EASTL_ARCH_ATOMIC_ARM_STORE_8(type, ptr, val) \
26 EASTL_ARCH_ATOMIC_ARM_STORE_N(__int8, 8, type, ptr, val)
28 #define EASTL_ARCH_ATOMIC_ARM_STORE_16(type, ptr, val) \
29 EASTL_ARCH_ATOMIC_ARM_STORE_N(__int16, 16, type, ptr, val)
31 #define EASTL_ARCH_ATOMIC_ARM_STORE_32(type, ptr, val) \
32 EASTL_ARCH_ATOMIC_ARM_STORE_N(__int32, 32, type, ptr, val)
35 #if defined(EA_PROCESSOR_ARM64)
37 #define EASTL_ARCH_ATOMIC_ARM_STORE_64(type, ptr, val) \
38 EASTL_ARCH_ATOMIC_ARM_STORE_N(__int64, 64, type, ptr, val)
43 #define EASTL_ARCH_ATOMIC_ARM_STORE_128(type, ptr, val, MemoryOrder) \
45 type exchange128; EA_UNUSED(exchange128); \
46 EA_PREPROCESSOR_JOIN(EA_PREPROCESSOR_JOIN(EASTL_ATOMIC_EXCHANGE_, MemoryOrder), _128)(type, exchange128, ptr, val); \
50 #define EASTL_ARCH_ATOMIC_STORE_RELAXED_8(type, ptr, val) \
51 EASTL_ARCH_ATOMIC_ARM_STORE_8(type, ptr, val)
53 #define EASTL_ARCH_ATOMIC_STORE_RELAXED_16(type, ptr, val) \
54 EASTL_ARCH_ATOMIC_ARM_STORE_16(type, ptr, val)
56 #define EASTL_ARCH_ATOMIC_STORE_RELAXED_32(type, ptr, val) \
57 EASTL_ARCH_ATOMIC_ARM_STORE_32(type, ptr, val)
59 #define EASTL_ARCH_ATOMIC_STORE_RELAXED_128(type, ptr, val) \
60 EASTL_ARCH_ATOMIC_ARM_STORE_128(type, ptr, val, RELAXED)
63 #define EASTL_ARCH_ATOMIC_STORE_RELEASE_8(type, ptr, val) \
64 EASTL_ATOMIC_CPU_MB(); \
65 EASTL_ARCH_ATOMIC_ARM_STORE_8(type, ptr, val)
67 #define EASTL_ARCH_ATOMIC_STORE_RELEASE_16(type, ptr, val) \
68 EASTL_ATOMIC_CPU_MB(); \
69 EASTL_ARCH_ATOMIC_ARM_STORE_16(type, ptr, val)
71 #define EASTL_ARCH_ATOMIC_STORE_RELEASE_32(type, ptr, val) \
72 EASTL_ATOMIC_CPU_MB(); \
73 EASTL_ARCH_ATOMIC_ARM_STORE_32(type, ptr, val)
75 #define EASTL_ARCH_ATOMIC_STORE_RELEASE_128(type, ptr, val) \
76 EASTL_ARCH_ATOMIC_ARM_STORE_128(type, ptr, val, RELEASE)
79 #define EASTL_ARCH_ATOMIC_STORE_SEQ_CST_8(type, ptr, val) \
80 EASTL_ATOMIC_CPU_MB(); \
81 EASTL_ARCH_ATOMIC_ARM_STORE_8(type, ptr, val) ; \
84 #define EASTL_ARCH_ATOMIC_STORE_SEQ_CST_16(type, ptr, val) \
85 EASTL_ATOMIC_CPU_MB(); \
86 EASTL_ARCH_ATOMIC_ARM_STORE_16(type, ptr, val); \
89 #define EASTL_ARCH_ATOMIC_STORE_SEQ_CST_32(type, ptr, val) \
90 EASTL_ATOMIC_CPU_MB(); \
91 EASTL_ARCH_ATOMIC_ARM_STORE_32(type, ptr, val); \
94 #define EASTL_ARCH_ATOMIC_STORE_SEQ_CST_128(type, ptr, val) \
95 EASTL_ARCH_ATOMIC_ARM_STORE_128(type, ptr, val, SEQ_CST)
98 #if defined(EA_PROCESSOR_ARM32)
101 #define EASTL_ARCH_ATOMIC_STORE_RELAXED_64(type, ptr, val) \
103 type retExchange64; EA_UNUSED(retExchange64); \
104 EASTL_ATOMIC_EXCHANGE_RELAXED_64(type, retExchange64, ptr, val); \
107 #define EASTL_ARCH_ATOMIC_STORE_RELEASE_64(type, ptr, val) \
109 type retExchange64; EA_UNUSED(retExchange64); \
110 EASTL_ATOMIC_EXCHANGE_RELEASE_64(type, retExchange64, ptr, val); \
113 #define EASTL_ARCH_ATOMIC_STORE_SEQ_CST_64(type, ptr, val) \
115 type retExchange64; EA_UNUSED(retExchange64); \
116 EASTL_ATOMIC_EXCHANGE_SEQ_CST_64(type, retExchange64, ptr, val); \
120 #elif defined(EA_PROCESSOR_ARM64)
123 #define EASTL_ARCH_ATOMIC_STORE_RELAXED_64(type, ptr, val) \
124 EASTL_ARCH_ATOMIC_ARM_STORE_64(type, ptr, val)
126 #define EASTL_ARCH_ATOMIC_STORE_RELEASE_64(type, ptr, val) \
127 EASTL_ATOMIC_CPU_MB(); \
128 EASTL_ARCH_ATOMIC_ARM_STORE_64(type, ptr, val)
130 #define EASTL_ARCH_ATOMIC_STORE_SEQ_CST_64(type, ptr, val) \
131 EASTL_ATOMIC_CPU_MB(); \
132 EASTL_ARCH_ATOMIC_ARM_STORE_64(type, ptr, val); \
133 EASTL_ATOMIC_CPU_MB()