diff options
Diffstat (limited to 'include/atomic/x86-gcc.h')
-rw-r--r-- | include/atomic/x86-gcc.h | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/include/atomic/x86-gcc.h b/include/atomic/x86-gcc.h index df6fcdc5ad2..5a72f318a61 100644 --- a/include/atomic/x86-gcc.h +++ b/include/atomic/x86-gcc.h @@ -20,19 +20,25 @@ architectures support double-word (128-bit) cas. */ -#define MY_ATOMIC_MODE "gcc-x86" ## LOCK +#ifdef MY_ATOMIC_NO_XADD +#define MY_ATOMIC_MODE "gcc-x86" LOCK "-no-xadd" +#else +#define MY_ATOMIC_MODE "gcc-x86" LOCK +#endif /* fix -ansi errors while maintaining readability */ #ifndef asm #define asm __asm__ #endif +#ifndef MY_ATOMIC_NO_XADD #define make_atomic_add_body(S) \ - asm volatile (LOCK "xadd %0, %1;" : "+r" (v) , "+m" (*a)) + asm volatile (LOCK "; xadd %0, %1;" : "+r" (v) , "+m" (*a)) +#endif #define make_atomic_swap_body(S) \ - asm volatile ("xchg %0, %1;" : "+r" (v) , "+m" (*a)) + asm volatile ("; xchg %0, %1;" : "+r" (v) , "+m" (*a)) #define make_atomic_cas_body(S) \ - asm volatile (LOCK "cmpxchg %3, %0; setz %2;" \ + asm volatile (LOCK "; cmpxchg %3, %0; setz %2;" \ : "+m" (*a), "+a" (*cmp), "=q" (ret): "r" (set)) #ifdef MY_ATOMIC_MODE_DUMMY @@ -45,9 +51,9 @@ */ #define make_atomic_load_body(S) \ ret=0; \ - asm volatile (LOCK "cmpxchg %2, %0" \ + asm volatile (LOCK "; cmpxchg %2, %0" \ : "+m" (*a), "+a" (ret): "r" (ret)) #define make_atomic_store_body(S) \ - asm volatile ("xchg %0, %1;" : "+m" (*a) : "r" (v)) + asm volatile ("; xchg %0, %1;" : "+m" (*a) : "r" (v)) #endif |