#define atomic_exchange_and_add(mem, value) \
({ __typeof (*mem) result; \
+ __typeof (value) addval = (value); \
if (sizeof (*mem) == 1) \
- __asm __volatile (LOCK "xaddb %b0, %1" \
- : "=r" (result), "=m" (*mem) \
- : "0" (value), "1" (*mem)); \
+ { \
+ __asm __volatile (LOCK "xaddb %b0, %1" \
+ : "=r" (result), "=m" (*mem) \
+ : "0" (addval), "1" (*mem)); \
+ result += addval; \
+ } \
else if (sizeof (*mem) == 2) \
- __asm __volatile (LOCK "xaddw %w0, %1" \
- : "=r" (result), "=m" (*mem) \
- : "0" (value), "1" (*mem)); \
+ { \
+ __asm __volatile (LOCK "xaddw %w0, %1" \
+ : "=r" (result), "=m" (*mem) \
+ : "0" (addval), "1" (*mem)); \
+ result += addval; \
+ } \
else if (sizeof (*mem) == 4) \
- __asm __volatile (LOCK "xaddl %0, %1" \
- : "=r" (result), "=m" (*mem) \
- : "0" (value), "1" (*mem)); \
+ { \
+ __asm __volatile (LOCK "xaddl %0, %1" \
+ : "=r" (result), "=m" (*mem) \
+ : "0" (addval), "1" (*mem)); \
+ result += addval; \
+ } \
else \
{ \
- __typeof (value) addval = (value); \
__typeof (*mem) oldval; \
__typeof (mem) memp = (mem); \
do \
result = (oldval = *memp) + addval; \
- while (! __arch_compare_and_exchange_64_acq (memp, result, oldval)); \
+ while (__arch_compare_and_exchange_64_acq (memp, result, oldval)); \
} \
result; })
__typeof (mem) memp = (mem); \
do \
oldval = *memp; \
- while (! __arch_compare_and_exchange_64_acq (memp, \
- oldval + addval, \
- oldval)); \
+ while (__arch_compare_and_exchange_64_acq (memp, \
+ oldval + addval, \
+ oldval)); \
} \
})
__typeof (mem) memp = (mem); \
do \
oldval = *memp; \
- while (! __arch_compare_and_exchange_64_acq (memp, \
- oldval + 1, \
- oldval)); \
+ while (__arch_compare_and_exchange_64_acq (memp, oldval + 1, \
+ oldval)); \
} \
})
__typeof (mem) memp = (mem); \
do \
oldval = *memp; \
- while (! __arch_compare_and_exchange_64_acq (memp, \
- oldval - 1, \
- oldval)); \
+ while (__arch_compare_and_exchange_64_acq (memp, oldval - 1, \
+ oldval)); \
} \
})