29 #ifndef __ATOMIC_OPS_MSVC_H__
30 #define __ATOMIC_OPS_MSVC_H__
38 #define WIN32_LEAN_AND_MEAN
43 #if defined(__clang__)
44 # pragma GCC diagnostic push
45 # pragma GCC diagnostic ignored "-Wincompatible-pointer-types"
62 return InterlockedCompareExchange64((
int64_t *)
v, _new, old);
78 return InterlockedExchangeAdd64(p,
x) +
x;
83 return InterlockedExchangeAdd64(p, -
x) -
x;
88 return InterlockedCompareExchange64(
v, _new, old);
93 return InterlockedExchangeAdd64(p,
x);
98 return InterlockedExchangeAdd64(p, -
x);
106 return InterlockedExchangeAdd(p,
x) +
x;
111 return InterlockedExchangeAdd(p, -((
int32_t)
x)) -
x;
116 return InterlockedCompareExchange((
long *)
v, _new, old);
121 return InterlockedExchangeAdd(p,
x);
126 return InterlockedOr((
long *)p,
x);
131 return InterlockedAnd((
long *)p,
x);
137 return InterlockedExchangeAdd((
long *)p,
x) +
x;
142 return InterlockedExchangeAdd((
long *)p, -
x) -
x;
147 return InterlockedCompareExchange((
long *)
v, _new, old);
152 return InterlockedExchangeAdd((
long *)p,
x);
157 return InterlockedOr((
long *)p,
x);
162 return InterlockedAnd((
long *)p,
x);
171 return InterlockedOr16((
short *)p,
x);
176 return InterlockedAnd16((
short *)p,
x);
183 #pragma intrinsic(_InterlockedAnd8)
186 #if (LG_SIZEOF_PTR == 8 || LG_SIZEOF_INT == 8)
187 return InterlockedAnd8((
char *)p, (
char)b);
189 return _InterlockedAnd8((
char *)p, (
char)b);
193 #pragma intrinsic(_InterlockedOr8)
196 #if (LG_SIZEOF_PTR == 8 || LG_SIZEOF_INT == 8)
197 return InterlockedOr8((
char *)p, (
char)b);
199 return _InterlockedOr8((
char *)p, (
char)b);
204 #pragma intrinsic(_InterlockedAnd8)
207 #if (LG_SIZEOF_PTR == 8 || LG_SIZEOF_INT == 8)
208 return InterlockedAnd8((
char *)p, (
char)b);
210 return _InterlockedAnd8((
char *)p, (
char)b);
214 #pragma intrinsic(_InterlockedOr8)
217 #if (LG_SIZEOF_PTR == 8 || LG_SIZEOF_INT == 8)
218 return InterlockedOr8((
char *)p, (
char)b);
220 return _InterlockedOr8((
char *)p, (
char)b);
224 #if defined(__clang__)
225 # pragma GCC diagnostic pop
ATOMIC_INLINE uint32_t atomic_fetch_and_or_uint32(uint32_t *p, uint32_t x)
ATOMIC_INLINE int32_t atomic_add_and_fetch_int32(int32_t *p, int32_t x)
ATOMIC_INLINE uint64_t atomic_fetch_and_sub_uint64(uint64_t *p, uint64_t x)
ATOMIC_INLINE int64_t atomic_sub_and_fetch_int64(int64_t *p, int64_t x)
ATOMIC_INLINE uint8_t atomic_fetch_and_and_uint8(uint8_t *p, uint8_t b)
ATOMIC_INLINE int64_t atomic_cas_int64(int64_t *v, int64_t old, int64_t _new)
ATOMIC_INLINE uint32_t atomic_fetch_and_add_uint32(uint32_t *p, uint32_t x)
ATOMIC_INLINE uint8_t atomic_fetch_and_or_uint8(uint8_t *p, uint8_t b)
ATOMIC_INLINE int32_t atomic_fetch_and_or_int32(int32_t *p, int32_t x)
ATOMIC_INLINE uint32_t atomic_fetch_and_and_uint32(uint32_t *p, uint32_t x)
ATOMIC_INLINE int64_t atomic_fetch_and_add_int64(int64_t *p, int64_t x)
ATOMIC_INLINE uint32_t atomic_add_and_fetch_uint32(uint32_t *p, uint32_t x)
ATOMIC_INLINE int32_t atomic_fetch_and_add_int32(int32_t *p, int32_t x)
ATOMIC_INLINE uint64_t atomic_cas_uint64(uint64_t *v, uint64_t old, uint64_t _new)
ATOMIC_INLINE uint64_t atomic_fetch_and_add_uint64(uint64_t *p, uint64_t x)
ATOMIC_INLINE uint32_t atomic_sub_and_fetch_uint32(uint32_t *p, uint32_t x)
ATOMIC_INLINE int64_t atomic_add_and_fetch_int64(int64_t *p, int64_t x)
ATOMIC_INLINE uint64_t atomic_add_and_fetch_uint64(uint64_t *p, uint64_t x)
ATOMIC_INLINE uint64_t atomic_sub_and_fetch_uint64(uint64_t *p, uint64_t x)
ATOMIC_INLINE int32_t atomic_cas_int32(int32_t *v, int32_t old, int32_t _new)
ATOMIC_INLINE int32_t atomic_fetch_and_and_int32(int32_t *p, int32_t x)
ATOMIC_INLINE int8_t atomic_fetch_and_or_int8(int8_t *p, int8_t b)
ATOMIC_INLINE int16_t atomic_fetch_and_and_int16(int16_t *p, int16_t x)
ATOMIC_INLINE int32_t atomic_sub_and_fetch_int32(int32_t *p, int32_t x)
ATOMIC_INLINE int16_t atomic_fetch_and_or_int16(int16_t *p, int16_t x)
ATOMIC_INLINE int8_t atomic_fetch_and_and_int8(int8_t *p, int8_t b)
ATOMIC_INLINE int64_t atomic_fetch_and_sub_int64(int64_t *p, int64_t x)
ATOMIC_INLINE uint32_t atomic_cas_uint32(uint32_t *v, uint32_t old, uint32_t _new)
ATTR_WARN_UNUSED_RESULT const BMVert * v
unsigned __int64 uint64_t