1 #include <libcflat.h>
2 #include "atomic.h"
3
4 #ifdef __i386__
5
atomic64_cmpxchg(atomic64_t * v,u64 old,u64 new)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
atomic64_cmpxchg(atomic64_t * v,u64 old,u64 new)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