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