27#ifndef ZYCORE_ATOMIC_GNU_H
28#define ZYCORE_ATOMIC_GNU_H
41#if defined(ZYAN_CLANG) || defined(ZYAN_GCC) || defined(ZYAN_ICC)
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));
69ZYAN_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));
76ZYAN_INLINE ZyanU32 ZyanAtomicIncrement32(
ZyanAtomic32* destination)
78 return (ZyanU32)(__sync_fetch_and_add(&destination->value, 1, &destination->value)) + 1;
81ZYAN_INLINE ZyanU32 ZyanAtomicDecrement32(
ZyanAtomic32* destination)
83 return (ZyanU32)(__sync_sub_and_fetch(&destination->value, 1, &destination->value));
90ZYAN_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));
97ZYAN_INLINE ZyanU64 ZyanAtomicIncrement64(
ZyanAtomic64* destination)
99 return (ZyanU64)(__sync_fetch_and_add(&destination->value, 1, &destination->value)) + 1;
102ZYAN_INLINE ZyanU64 ZyanAtomicDecrement64(
ZyanAtomic64* destination)
104 return (ZyanU64)(__sync_sub_and_fetch(&destination->value, 1, &destination->value));