27 #ifndef ZYCORE_ATOMIC_GNU_H
28 #define ZYCORE_ATOMIC_GNU_H
41 #if defined(ZYAN_CLANG) || defined(ZYAN_GCC) || defined(ZYAN_ICC)
47 ZYAN_INLINE ZyanUPointer ZyanAtomicCompareExchange(
ZyanAtomicPointer* destination,
48 ZyanUPointer comparand, ZyanUPointer value)
50 return (ZyanUPointer)(__sync_val_compare_and_swap(
51 &destination->value, (
void*)comparand, (
void*)value, &destination->value));
56 return (ZyanUPointer)(__sync_fetch_and_add(&destination->value, (
void*)1,
57 &destination->value)) + 1;
62 return (ZyanUPointer)(__sync_sub_and_fetch(&destination->value, (
void*)1, &destination->value));
69 ZYAN_INLINE ZyanU32 ZyanAtomicCompareExchange32(
ZyanAtomic32* destination,
70 ZyanU32 comparand, ZyanU32 value)
72 return (ZyanU32)(__sync_val_compare_and_swap(&destination->value, comparand, value,
73 &destination->value));
76 ZYAN_INLINE ZyanU32 ZyanAtomicIncrement32(
ZyanAtomic32* destination)
78 return (ZyanU32)(__sync_fetch_and_add(&destination->value, 1, &destination->value)) + 1;
81 ZYAN_INLINE ZyanU32 ZyanAtomicDecrement32(
ZyanAtomic32* destination)
83 return (ZyanU32)(__sync_sub_and_fetch(&destination->value, 1, &destination->value));
90 ZYAN_INLINE ZyanU64 ZyanAtomicCompareExchange64(
ZyanAtomic64* destination,
91 ZyanU64 comparand, ZyanU64 value)
93 return (ZyanU64)(__sync_val_compare_and_swap(&destination->value, comparand, value,
94 &destination->value));
97 ZYAN_INLINE ZyanU64 ZyanAtomicIncrement64(
ZyanAtomic64* destination)
99 return (ZyanU64)(__sync_fetch_and_add(&destination->value, 1, &destination->value)) + 1;
102 ZYAN_INLINE ZyanU64 ZyanAtomicDecrement64(
ZyanAtomic64* destination)
104 return (ZyanU64)(__sync_sub_and_fetch(&destination->value, 1, &destination->value));