6 #ifndef EASTL_ATOMIC_INTERNAL_ARCH_X86_XOR_FETCH_H
7 #define EASTL_ATOMIC_INTERNAL_ARCH_X86_XOR_FETCH_H
9 #if defined(EA_PRAGMA_ONCE_SUPPORTED)
18 #if defined(EA_COMPILER_MSVC) && defined(EA_PROCESSOR_X86)
21 #define EASTL_ARCH_ATOMIC_X86_XOR_FETCH_PRE_COMPUTE_DESIRED(ret, observed, val) \
22 ret = ((observed) ^ (val))
24 #define EASTL_ARCH_ATOMIC_X86_XOR_FETCH_POST_COMPUTE_RET(ret, prevObserved, val) \
25 ret = ((prevObserved) ^ (val))
28 #define EASTL_ARCH_ATOMIC_XOR_FETCH_RELAXED_64(type, ret, ptr, val) \
29 EASTL_ARCH_ATOMIC_X86_OP_64_IMPL(type, ret, ptr, val, RELAXED, \
30 EASTL_ARCH_ATOMIC_X86_XOR_FETCH_PRE_COMPUTE_DESIRED, \
31 EASTL_ARCH_ATOMIC_X86_XOR_FETCH_POST_COMPUTE_RET)
33 #define EASTL_ARCH_ATOMIC_XOR_FETCH_ACQUIRE_64(type, ret, ptr, val) \
34 EASTL_ARCH_ATOMIC_X86_OP_64_IMPL(type, ret, ptr, val, ACQUIRE, \
35 EASTL_ARCH_ATOMIC_X86_XOR_FETCH_PRE_COMPUTE_DESIRED, \
36 EASTL_ARCH_ATOMIC_X86_XOR_FETCH_POST_COMPUTE_RET)
38 #define EASTL_ARCH_ATOMIC_XOR_FETCH_RELEASE_64(type, ret, ptr, val) \
39 EASTL_ARCH_ATOMIC_X86_OP_64_IMPL(type, ret, ptr, val, RELEASE, \
40 EASTL_ARCH_ATOMIC_X86_XOR_FETCH_PRE_COMPUTE_DESIRED, \
41 EASTL_ARCH_ATOMIC_X86_XOR_FETCH_POST_COMPUTE_RET)
43 #define EASTL_ARCH_ATOMIC_XOR_FETCH_ACQ_REL_64(type, ret, ptr, val) \
44 EASTL_ARCH_ATOMIC_X86_OP_64_IMPL(type, ret, ptr, val, ACQ_REL, \
45 EASTL_ARCH_ATOMIC_X86_XOR_FETCH_PRE_COMPUTE_DESIRED, \
46 EASTL_ARCH_ATOMIC_X86_XOR_FETCH_POST_COMPUTE_RET)
48 #define EASTL_ARCH_ATOMIC_XOR_FETCH_SEQ_CST_64(type, ret, ptr, val) \
49 EASTL_ARCH_ATOMIC_X86_OP_64_IMPL(type, ret, ptr, val, SEQ_CST, \
50 EASTL_ARCH_ATOMIC_X86_XOR_FETCH_PRE_COMPUTE_DESIRED, \
51 EASTL_ARCH_ATOMIC_X86_XOR_FETCH_POST_COMPUTE_RET)
57 #if ((defined(__clang__) || defined(EA_COMPILER_GNUC)) && defined(EA_PROCESSOR_X86_64))
60 #define EASTL_ARCH_ATOMIC_X86_XOR_FETCH_PRE_COMPUTE_DESIRED(ret, observed, val) \
61 ret = ((observed) ^ (val))
63 #define EASTL_ARCH_ATOMIC_X86_XOR_FETCH_POST_COMPUTE_RET(ret, prevObserved, val) \
64 ret = ((prevObserved) ^ (val))
67 #define EASTL_ARCH_ATOMIC_XOR_FETCH_RELAXED_128(type, ret, ptr, val) \
68 EASTL_ARCH_ATOMIC_X86_OP_128_IMPL(type, ret, ptr, val, RELAXED, \
69 EASTL_ARCH_ATOMIC_X86_XOR_FETCH_PRE_COMPUTE_DESIRED, \
70 EASTL_ARCH_ATOMIC_X86_XOR_FETCH_POST_COMPUTE_RET)
72 #define EASTL_ARCH_ATOMIC_XOR_FETCH_ACQUIRE_128(type, ret, ptr, val) \
73 EASTL_ARCH_ATOMIC_X86_OP_128_IMPL(type, ret, ptr, val, ACQUIRE, \
74 EASTL_ARCH_ATOMIC_X86_XOR_FETCH_PRE_COMPUTE_DESIRED, \
75 EASTL_ARCH_ATOMIC_X86_XOR_FETCH_POST_COMPUTE_RET)
77 #define EASTL_ARCH_ATOMIC_XOR_FETCH_RELEASE_128(type, ret, ptr, val) \
78 EASTL_ARCH_ATOMIC_X86_OP_128_IMPL(type, ret, ptr, val, RELEASE, \
79 EASTL_ARCH_ATOMIC_X86_XOR_FETCH_PRE_COMPUTE_DESIRED, \
80 EASTL_ARCH_ATOMIC_X86_XOR_FETCH_POST_COMPUTE_RET)
82 #define EASTL_ARCH_ATOMIC_XOR_FETCH_ACQ_REL_128(type, ret, ptr, val) \
83 EASTL_ARCH_ATOMIC_X86_OP_128_IMPL(type, ret, ptr, val, ACQ_REL, \
84 EASTL_ARCH_ATOMIC_X86_XOR_FETCH_PRE_COMPUTE_DESIRED, \
85 EASTL_ARCH_ATOMIC_X86_XOR_FETCH_POST_COMPUTE_RET)
87 #define EASTL_ARCH_ATOMIC_XOR_FETCH_SEQ_CST_128(type, ret, ptr, val) \
88 EASTL_ARCH_ATOMIC_X86_OP_128_IMPL(type, ret, ptr, val, SEQ_CST, \
89 EASTL_ARCH_ATOMIC_X86_XOR_FETCH_PRE_COMPUTE_DESIRED, \
90 EASTL_ARCH_ATOMIC_X86_XOR_FETCH_POST_COMPUTE_RET)