X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=include%2Furcu%2Fuatomic%2Fx86.h;h=03a0b2f06afef335822dbf3009233c19461edc55;hb=f97344e0254e1157bfcc8969b67332c1d5bfec57;hp=129a2f5670385880870912235a14a63a6d0ea99e;hpb=6893800a4d1cc14dff0395ddcd660a5138db183d;p=urcu.git diff --git a/include/urcu/uatomic/x86.h b/include/urcu/uatomic/x86.h index 129a2f5..03a0b2f 100644 --- a/include/urcu/uatomic/x86.h +++ b/include/urcu/uatomic/x86.h @@ -20,6 +20,7 @@ * Boehm-Demers-Weiser conservative garbage collector. */ +#include #include #include @@ -34,10 +35,14 @@ extern "C" { * Derived from AO_compare_and_swap() and AO_test_and_set_full(). */ -struct __uatomic_dummy { - unsigned long v[10]; -}; -#define __hp(x) ((struct __uatomic_dummy *)(x)) +/* + * The __hp() macro casts the void pointer "x" to a pointer to a structure + * containing an array of char of the specified size. This allows passing the + * @addr arguments of the following inline functions as "m" and "+m" operands + * to the assembly. + */ + +#define __hp(size, x) ((struct { char v[size]; } *)(x)) #define _uatomic_set(addr, v) ((void) CMM_STORE_SHARED(*(addr), (v))) @@ -54,7 +59,7 @@ unsigned long __uatomic_cmpxchg(void *addr, unsigned long old, __asm__ __volatile__( "lock; cmpxchgb %2, %1" - : "+a"(result), "+m"(*__hp(addr)) + : "+a"(result), "+m"(*__hp(len, addr)) : "q"((unsigned char)_new) : "memory"); return result; @@ -65,7 +70,7 @@ unsigned long __uatomic_cmpxchg(void *addr, unsigned long old, __asm__ __volatile__( "lock; cmpxchgw %2, %1" - : "+a"(result), "+m"(*__hp(addr)) + : "+a"(result), "+m"(*__hp(len, addr)) : "r"((unsigned short)_new) : "memory"); return result; @@ -76,7 +81,7 @@ unsigned long __uatomic_cmpxchg(void *addr, unsigned long old, __asm__ __volatile__( "lock; cmpxchgl %2, %1" - : "+a"(result), "+m"(*__hp(addr)) + : "+a"(result), "+m"(*__hp(len, addr)) : "r"((unsigned int)_new) : "memory"); return result; @@ -88,7 +93,7 @@ unsigned long __uatomic_cmpxchg(void *addr, unsigned long old, __asm__ __volatile__( "lock; cmpxchgq %2, %1" - : "+a"(result), "+m"(*__hp(addr)) + : "+a"(result), "+m"(*__hp(len, addr)) : "r"((unsigned long)_new) : "memory"); return result; @@ -121,7 +126,7 @@ unsigned long __uatomic_exchange(void *addr, unsigned long val, int len) unsigned char result; __asm__ __volatile__( "xchgb %0, %1" - : "=q"(result), "+m"(*__hp(addr)) + : "=q"(result), "+m"(*__hp(len, addr)) : "0" ((unsigned char)val) : "memory"); return result; @@ -131,7 +136,7 @@ unsigned long __uatomic_exchange(void *addr, unsigned long val, int len) unsigned short result; __asm__ __volatile__( "xchgw %0, %1" - : "=r"(result), "+m"(*__hp(addr)) + : "=r"(result), "+m"(*__hp(len, addr)) : "0" ((unsigned short)val) : "memory"); return result; @@ -141,7 +146,7 @@ unsigned long __uatomic_exchange(void *addr, unsigned long val, int len) unsigned int result; __asm__ __volatile__( "xchgl %0, %1" - : "=r"(result), "+m"(*__hp(addr)) + : "=r"(result), "+m"(*__hp(len, addr)) : "0" ((unsigned int)val) : "memory"); return result; @@ -152,7 +157,7 @@ unsigned long __uatomic_exchange(void *addr, unsigned long val, int len) unsigned long result; __asm__ __volatile__( "xchgq %0, %1" - : "=r"(result), "+m"(*__hp(addr)) + : "=r"(result), "+m"(*__hp(len, addr)) : "0" ((unsigned long)val) : "memory"); return result; @@ -185,7 +190,7 @@ unsigned long __uatomic_add_return(void *addr, unsigned long val, __asm__ __volatile__( "lock; xaddb %1, %0" - : "+m"(*__hp(addr)), "+q" (result) + : "+m"(*__hp(len, addr)), "+q" (result) : : "memory"); return result + (unsigned char)val; @@ -196,7 +201,7 @@ unsigned long __uatomic_add_return(void *addr, unsigned long val, __asm__ __volatile__( "lock; xaddw %1, %0" - : "+m"(*__hp(addr)), "+r" (result) + : "+m"(*__hp(len, addr)), "+r" (result) : : "memory"); return result + (unsigned short)val; @@ -207,7 +212,7 @@ unsigned long __uatomic_add_return(void *addr, unsigned long val, __asm__ __volatile__( "lock; xaddl %1, %0" - : "+m"(*__hp(addr)), "+r" (result) + : "+m"(*__hp(len, addr)), "+r" (result) : : "memory"); return result + (unsigned int)val; @@ -219,7 +224,7 @@ unsigned long __uatomic_add_return(void *addr, unsigned long val, __asm__ __volatile__( "lock; xaddq %1, %0" - : "+m"(*__hp(addr)), "+r" (result) + : "+m"(*__hp(len, addr)), "+r" (result) : : "memory"); return result + (unsigned long)val; @@ -249,7 +254,7 @@ void __uatomic_and(void *addr, unsigned long val, int len) { __asm__ __volatile__( "lock; andb %1, %0" - : "=m"(*__hp(addr)) + : "=m"(*__hp(len, addr)) : "iq" ((unsigned char)val) : "memory"); return; @@ -258,7 +263,7 @@ void __uatomic_and(void *addr, unsigned long val, int len) { __asm__ __volatile__( "lock; andw %1, %0" - : "=m"(*__hp(addr)) + : "=m"(*__hp(len, addr)) : "ir" ((unsigned short)val) : "memory"); return; @@ -267,7 +272,7 @@ void __uatomic_and(void *addr, unsigned long val, int len) { __asm__ __volatile__( "lock; andl %1, %0" - : "=m"(*__hp(addr)) + : "=m"(*__hp(len, addr)) : "ir" ((unsigned int)val) : "memory"); return; @@ -277,7 +282,7 @@ void __uatomic_and(void *addr, unsigned long val, int len) { __asm__ __volatile__( "lock; andq %1, %0" - : "=m"(*__hp(addr)) + : "=m"(*__hp(len, addr)) : "er" ((unsigned long)val) : "memory"); return; @@ -305,7 +310,7 @@ void __uatomic_or(void *addr, unsigned long val, int len) { __asm__ __volatile__( "lock; orb %1, %0" - : "=m"(*__hp(addr)) + : "=m"(*__hp(len, addr)) : "iq" ((unsigned char)val) : "memory"); return; @@ -314,7 +319,7 @@ void __uatomic_or(void *addr, unsigned long val, int len) { __asm__ __volatile__( "lock; orw %1, %0" - : "=m"(*__hp(addr)) + : "=m"(*__hp(len, addr)) : "ir" ((unsigned short)val) : "memory"); return; @@ -323,7 +328,7 @@ void __uatomic_or(void *addr, unsigned long val, int len) { __asm__ __volatile__( "lock; orl %1, %0" - : "=m"(*__hp(addr)) + : "=m"(*__hp(len, addr)) : "ir" ((unsigned int)val) : "memory"); return; @@ -333,7 +338,7 @@ void __uatomic_or(void *addr, unsigned long val, int len) { __asm__ __volatile__( "lock; orq %1, %0" - : "=m"(*__hp(addr)) + : "=m"(*__hp(len, addr)) : "er" ((unsigned long)val) : "memory"); return; @@ -361,7 +366,7 @@ void __uatomic_add(void *addr, unsigned long val, int len) { __asm__ __volatile__( "lock; addb %1, %0" - : "=m"(*__hp(addr)) + : "=m"(*__hp(len, addr)) : "iq" ((unsigned char)val) : "memory"); return; @@ -370,7 +375,7 @@ void __uatomic_add(void *addr, unsigned long val, int len) { __asm__ __volatile__( "lock; addw %1, %0" - : "=m"(*__hp(addr)) + : "=m"(*__hp(len, addr)) : "ir" ((unsigned short)val) : "memory"); return; @@ -379,7 +384,7 @@ void __uatomic_add(void *addr, unsigned long val, int len) { __asm__ __volatile__( "lock; addl %1, %0" - : "=m"(*__hp(addr)) + : "=m"(*__hp(len, addr)) : "ir" ((unsigned int)val) : "memory"); return; @@ -389,7 +394,7 @@ void __uatomic_add(void *addr, unsigned long val, int len) { __asm__ __volatile__( "lock; addq %1, %0" - : "=m"(*__hp(addr)) + : "=m"(*__hp(len, addr)) : "er" ((unsigned long)val) : "memory"); return; @@ -418,7 +423,7 @@ void __uatomic_inc(void *addr, int len) { __asm__ __volatile__( "lock; incb %0" - : "=m"(*__hp(addr)) + : "=m"(*__hp(len, addr)) : : "memory"); return; @@ -427,7 +432,7 @@ void __uatomic_inc(void *addr, int len) { __asm__ __volatile__( "lock; incw %0" - : "=m"(*__hp(addr)) + : "=m"(*__hp(len, addr)) : : "memory"); return; @@ -436,7 +441,7 @@ void __uatomic_inc(void *addr, int len) { __asm__ __volatile__( "lock; incl %0" - : "=m"(*__hp(addr)) + : "=m"(*__hp(len, addr)) : : "memory"); return; @@ -446,7 +451,7 @@ void __uatomic_inc(void *addr, int len) { __asm__ __volatile__( "lock; incq %0" - : "=m"(*__hp(addr)) + : "=m"(*__hp(len, addr)) : : "memory"); return; @@ -471,7 +476,7 @@ void __uatomic_dec(void *addr, int len) { __asm__ __volatile__( "lock; decb %0" - : "=m"(*__hp(addr)) + : "=m"(*__hp(len, addr)) : : "memory"); return; @@ -480,7 +485,7 @@ void __uatomic_dec(void *addr, int len) { __asm__ __volatile__( "lock; decw %0" - : "=m"(*__hp(addr)) + : "=m"(*__hp(len, addr)) : : "memory"); return; @@ -489,7 +494,7 @@ void __uatomic_dec(void *addr, int len) { __asm__ __volatile__( "lock; decl %0" - : "=m"(*__hp(addr)) + : "=m"(*__hp(len, addr)) : : "memory"); return; @@ -499,7 +504,7 @@ void __uatomic_dec(void *addr, int len) { __asm__ __volatile__( "lock; decq %0" - : "=m"(*__hp(addr)) + : "=m"(*__hp(len, addr)) : : "memory"); return;