#include #include "atomic.h" #ifdef __i386__ u64 atomic64_cmpxchg(atomic64_t *v, u64 old, u64 new) { u32 low = new; u32 high = new >> 32; asm volatile("lock cmpxchg8b %1\n" : "+A" (old), "+m" (*(volatile long long *)&v->counter) : "b" (low), "c" (high) : "memory" ); return old; } #else u64 atomic64_cmpxchg(atomic64_t *v, u64 old, u64 new) { u64 ret; u64 _old = old; u64 _new = new; asm volatile("lock cmpxchgq %2,%1" : "=a" (ret), "+m" (*(volatile long *)&v->counter) : "r" (_new), "0" (_old) : "memory" ); return ret; } #endif