-static inline
-SilcUInt32 silc_atomic_add_int32(SilcAtomic32 *atomic, SilcInt32 value)
-{
- SilcUInt32 ret;
-
-#if !defined(SILC_THREADS)
- /* No atomic operations */
- ret = atomic->value;
- atomic->value += value;
-
-#elif defined(SILC_WIN32)
- /* Windows */
- ret = InterlockedExchangeAdd(&atomic->value, (LONG)value);
-
-#elif defined(__GNUC__) && (defined(SILC_I486) || defined(SILC_X86_64))
- /* GCC + i486 or x86_64 */
- __asm __volatile("lock; xaddl %0, %1"
- : "=r" (ret), "+m" (atomic->value)
- : "0" (value));
-
-#elif defined(__GNUC__) && defined(SILC_IA64)
- /* GCC + IA64 (GCC builtin atomic operations) */
- ret = __sync_fetch_and_add(&atomic->value, value);
-
-#elif defined(__GNUC__) && defined(SILC_POWERPC)
- /* GCC + PowerPC (code adapted from IBM's documentation) */
- __asm __volatile("0: lwarx %0, 0, %2\n"
- " add %0, %1, %0\n"
- " stwcx. %0, 0, %2\n"
- " bne- 0b"
- : "=&r" (ret)
- : "r" (value), "r" (&atomic->value)
- : "cc");
- return ret;
-
-#else
- /* Mutex */
- silc_mutex_lock(atomic->lock);
- ret = atomic->value;
- atomic->value += value;
- silc_mutex_unlock(atomic->lock);
-#endif
-
- return ret + value;
-}
-
-/****f* silcutil/SilcAtomicAPI/silc_atomic_add_int32