X-Git-Url: http://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=arch_atomic_x86.h;h=fdd3d6b58ecd28eaf620e10001920eae0193a073;hp=a762a5ce8b366b74bbff3333607f776c0d18fbcb;hb=87322fe8f9e201f9018dba7dfcf786b932cd899c;hpb=cc1be41b8a8881208b8372389793d2c680707e36 diff --git a/arch_atomic_x86.h b/arch_atomic_x86.h index a762a5c..fdd3d6b 100644 --- a/arch_atomic_x86.h +++ b/arch_atomic_x86.h @@ -159,7 +159,7 @@ unsigned long _atomic_exchange(volatile void *addr, unsigned long val, int len) /* atomic_add */ static inline __attribute__((always_inline)) -unsigned long _atomic_add(volatile void *addr, unsigned long val, int len) +void _atomic_add(volatile void *addr, unsigned long val, int len) { switch (len) { case 1: @@ -167,7 +167,8 @@ unsigned long _atomic_add(volatile void *addr, unsigned long val, int len) __asm__ __volatile__( "lock; addb %1, %0" : "=m"(*__hp(addr)) - : "q" ((unsigned char)val)); + : "iq" ((unsigned char)val) + : "memory"); return; } case 2: @@ -175,7 +176,8 @@ unsigned long _atomic_add(volatile void *addr, unsigned long val, int len) __asm__ __volatile__( "lock; addw %1, %0" : "=m"(*__hp(addr)) - : "r" ((unsigned short)val)); + : "ir" ((unsigned short)val) + : "memory"); return; } case 4: @@ -183,7 +185,8 @@ unsigned long _atomic_add(volatile void *addr, unsigned long val, int len) __asm__ __volatile__( "lock; addl %1, %0" : "=m"(*__hp(addr)) - : "r" ((unsigned int)val)); + : "ir" ((unsigned int)val) + : "memory"); return; } #if (BITS_PER_LONG == 64) @@ -192,7 +195,8 @@ unsigned long _atomic_add(volatile void *addr, unsigned long val, int len) __asm__ __volatile__( "lock; addq %1, %0" : "=m"(*__hp(addr)) - : "r" ((unsigned long)val)); + : "er" ((unsigned long)val) + : "memory"); return; } #endif @@ -200,7 +204,7 @@ unsigned long _atomic_add(volatile void *addr, unsigned long val, int len) /* generate an illegal instruction. Cannot catch this with linker tricks * when optimizations are disabled. */ __asm__ __volatile__("ud2"); - return 0; + return; } #define atomic_add(addr, v) \