84499e2c72f9f17297fdac9a7f682158731349be
[musl] / arch / aarch64 / atomic_arch.h
1 #define a_ll a_ll
2 static inline int a_ll(volatile int *p)
3 {
4         int v;
5         __asm__ __volatile__ ("ldxr %0, %1" : "=r"(v) : "Q"(*p));
6         return v;
7 }
8
9 #define a_sc a_sc
10 static inline int a_sc(volatile int *p, int v)
11 {
12         int r;
13         __asm__ __volatile__ ("stxr %w0,%1,%2" : "=&r"(r) : "r"(v), "Q"(*p) : "memory");
14         return !r;
15 }
16
17 #define a_barrier a_barrier
18 static inline void a_barrier()
19 {
20         __asm__ __volatile__ ("dmb ish" : : : "memory");
21 }
22
23 #define a_pre_llsc a_barrier
24 #define a_post_llsc a_barrier
25
26 #define a_cas_p a_cas_p
27 static inline void *a_cas_p(volatile void *p, void *t, void *s)
28 {
29         void *old;
30         __asm__ __volatile__(
31                 "       dmb ish\n"
32                 "1:     ldxr %0,%3\n"
33                 "       cmp %0,%1\n"
34                 "       b.ne 1f\n"
35                 "       stxr %w0,%2,%3\n"
36                 "       cbnz %w0,1b\n"
37                 "       mov %0,%1\n"
38                 "1:     dmb ish\n"
39                 : "=&r"(old)
40                 : "r"(t), "r"(s), "Q"(*(void *volatile *)p)
41                 : "memory", "cc");
42         return old;
43 }
44
45 #define a_ctz_64 a_ctz_64
46 static inline int a_ctz_64(uint64_t x)
47 {
48         __asm__(
49                 "       rbit %0, %1\n"
50                 "       clz %0, %0\n"
51                 : "=r"(x) : "r"(x));
52         return x;
53 }