Index: src/atomic.h ================================================================== --- src/atomic.h +++ src/atomic.h @@ -497,17 +497,17 @@ return NO; #elif defined(OF_X86_ASM) || defined(OF_AMD64_ASM) int r; __asm__ ( + "xorl %0, %0\n\t" "lock\n\t" "cmpxchg %2, %3\n\t" - "lahf\n\t" - "andb $64, %%ah\n\t" - "shrb $6, %%ah\n\t" - "movzx %%ah, %0\n\t" - : "=a"(r) + "jne .1\n\t" + "incl %0\n" + ".1:" + : "=&r"(r) : "a"(o), "r"(n), "m"(*p) ); return r; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) @@ -526,20 +526,20 @@ return YES; } return NO; #elif defined(OF_X86_ASM) || defined(OF_AMD64_ASM) - uint32_t r; + int r; __asm__ ( + "xorl %0, %0\n\t" "lock\n\t" "cmpxchg %2, %3\n\t" - "lahf\n\t" - "andb $64, %%ah\n\t" - "shrb $6, %%ah\n\t" - "movzx %%ah, %0\n\t" - : "=a"(r) + "jne .1\n\t" + "incl %0\n" + ".1:" + : "=&r"(r) : "a"(o), "r"(n), "m"(*p) ); return r; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) @@ -558,25 +558,25 @@ return YES; } return NO; #elif defined(OF_X86_ASM) || defined(OF_AMD64_ASM) - uint32_t r; + int r; __asm__ ( + "xorl %0, %0\n\t" "lock\n\t" "cmpxchg %2, %3\n\t" - "lahf\n\t" - "andb $64, %%ah\n\t" - "shrb $6, %%ah\n\t" - "movzx %%ah, %0\n\t" - : "=a"(r) - : "a"(o), "q"(n), "m"(*p) + "jne .1\n\t" + "incl %0\n" + ".1:" + : "=&r"(r) + : "a"(o), "r"(n), "m"(*p) ); return r; #elif defined(OF_HAVE_GCC_ATOMIC_OPS) return __sync_bool_compare_and_swap(p, o, n); #elif defined(OF_HAVE_OSATOMIC) return OSAtomicCompareAndSwapPtrBarrier(o, n, p); #endif }