1 #include <libcflat.h> 2 #include "atomic.h" 3 4 #ifdef __i386__ 5 6 u64 atomic64_cmpxchg(atomic64_t *v, u64 old, u64 new) 7 { 8 u32 low = new; 9 u32 high = new >> 32; 10 11 asm volatile("lock cmpxchg8b %1\n" 12 : "+A" (old), 13 "+m" (*(volatile long long *)&v->counter) 14 : "b" (low), "c" (high) 15 : "memory" 16 ); 17 18 return old; 19 } 20 21 #else 22 23 u64 atomic64_cmpxchg(atomic64_t *v, u64 old, u64 new) 24 { 25 u64 ret; 26 u64 _old = old; 27 u64 _new = new; 28 29 asm volatile("lock cmpxchgq %2,%1" 30 : "=a" (ret), "+m" (*(volatile long *)&v->counter) 31 : "r" (_new), "0" (_old) 32 : "memory" 33 ); 34 return ret; 35 } 36 37 #endif 38