VSF Documented
xatomic.h
Go to the documentation of this file.
1#include "../../atomic"
2
3// Interlocked intrinsic mapping for _nf/_acq/_rel
4#if defined(_M_CEE_PURE) || (defined(_M_IX86) && !defined(_M_HYBRID_X86_ARM64)) \
5 || (defined(_M_X64) && !defined(_M_ARM64EC))
6#define _INTRIN_RELAXED(x) x
7#define _INTRIN_ACQUIRE(x) x
8#define _INTRIN_RELEASE(x) x
9#define _INTRIN_ACQ_REL(x) x
10#ifdef _M_CEE_PURE
11//#define _YIELD_PROCESSOR()
12#else // ^^^ defined(_M_CEE_PURE) / !defined(_M_CEE_PURE) vvv
13//#define _YIELD_PROCESSOR() _mm_pause()
14#endif // ^^^ !defined(_M_CEE_PURE) ^^^
15
16#elif defined(_M_ARM64) || defined(_M_ARM64EC) || defined(_M_HYBRID_X86_ARM64)
17#define _INTRIN_RELAXED(x) VSF_MCONNECT(x, _nf)
18#define _INTRIN_ACQUIRE(x) VSF_MCONNECT(x, _acq)
19#define _INTRIN_RELEASE(x) VSF_MCONNECT(x, _rel)
20// We don't have interlocked intrinsics for acquire-release ordering, even on
21// ARM64, so fall back to sequentially consistent.
22#define _INTRIN_ACQ_REL(x) x
23//#define _YIELD_PROCESSOR() __yield()
24
25#else // ^^^ ARM64/ARM64EC/HYBRID_X86_ARM64 / unsupported hardware vvv
26#error Unsupported hardware
27#endif // hardware
28
29#define _MT_INCR(x) _INTRIN_RELAXED(_InterlockedIncrement)(reinterpret_cast<volatile long*>(&x))
30#define _MT_DECR(x) _INTRIN_ACQ_REL(_InterlockedDecrement)(reinterpret_cast<volatile long*>(&x))
31
32namespace std {
33 using _Atomic_counter_t = unsigned long;
34}
Definition xatomic.h:32
unsigned long _Atomic_counter_t
Definition xatomic.h:33
Generated from commit: vsfteam/vsf@85be636