xref: /aosp_15_r20/external/musl/arch/aarch64/atomic_arch.h (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #define a_ll a_ll
a_ll(volatile int * p)2*c9945492SAndroid Build Coastguard Worker static inline int a_ll(volatile int *p)
3*c9945492SAndroid Build Coastguard Worker {
4*c9945492SAndroid Build Coastguard Worker 	int v;
5*c9945492SAndroid Build Coastguard Worker 	__asm__ __volatile__ ("ldaxr %w0,%1" : "=r"(v) : "Q"(*p));
6*c9945492SAndroid Build Coastguard Worker 	return v;
7*c9945492SAndroid Build Coastguard Worker }
8*c9945492SAndroid Build Coastguard Worker 
9*c9945492SAndroid Build Coastguard Worker #define a_sc a_sc
a_sc(volatile int * p,int v)10*c9945492SAndroid Build Coastguard Worker static inline int a_sc(volatile int *p, int v)
11*c9945492SAndroid Build Coastguard Worker {
12*c9945492SAndroid Build Coastguard Worker 	int r;
13*c9945492SAndroid Build Coastguard Worker 	__asm__ __volatile__ ("stlxr %w0,%w2,%1" : "=&r"(r), "=Q"(*p) : "r"(v) : "memory");
14*c9945492SAndroid Build Coastguard Worker 	return !r;
15*c9945492SAndroid Build Coastguard Worker }
16*c9945492SAndroid Build Coastguard Worker 
17*c9945492SAndroid Build Coastguard Worker #define a_barrier a_barrier
a_barrier()18*c9945492SAndroid Build Coastguard Worker static inline void a_barrier()
19*c9945492SAndroid Build Coastguard Worker {
20*c9945492SAndroid Build Coastguard Worker 	__asm__ __volatile__ ("dmb ish" : : : "memory");
21*c9945492SAndroid Build Coastguard Worker }
22*c9945492SAndroid Build Coastguard Worker 
23*c9945492SAndroid Build Coastguard Worker #define a_cas a_cas
a_cas(volatile int * p,int t,int s)24*c9945492SAndroid Build Coastguard Worker static inline int a_cas(volatile int *p, int t, int s)
25*c9945492SAndroid Build Coastguard Worker {
26*c9945492SAndroid Build Coastguard Worker 	int old;
27*c9945492SAndroid Build Coastguard Worker 	do {
28*c9945492SAndroid Build Coastguard Worker 		old = a_ll(p);
29*c9945492SAndroid Build Coastguard Worker 		if (old != t) {
30*c9945492SAndroid Build Coastguard Worker 			a_barrier();
31*c9945492SAndroid Build Coastguard Worker 			break;
32*c9945492SAndroid Build Coastguard Worker 		}
33*c9945492SAndroid Build Coastguard Worker 	} while (!a_sc(p, s));
34*c9945492SAndroid Build Coastguard Worker 	return old;
35*c9945492SAndroid Build Coastguard Worker }
36*c9945492SAndroid Build Coastguard Worker 
37*c9945492SAndroid Build Coastguard Worker #define a_ll_p a_ll_p
a_ll_p(volatile void * p)38*c9945492SAndroid Build Coastguard Worker static inline void *a_ll_p(volatile void *p)
39*c9945492SAndroid Build Coastguard Worker {
40*c9945492SAndroid Build Coastguard Worker 	void *v;
41*c9945492SAndroid Build Coastguard Worker 	__asm__ __volatile__ ("ldaxr %0, %1" : "=r"(v) : "Q"(*(void *volatile *)p));
42*c9945492SAndroid Build Coastguard Worker 	return v;
43*c9945492SAndroid Build Coastguard Worker }
44*c9945492SAndroid Build Coastguard Worker 
45*c9945492SAndroid Build Coastguard Worker #define a_sc_p a_sc_p
a_sc_p(volatile int * p,void * v)46*c9945492SAndroid Build Coastguard Worker static inline int a_sc_p(volatile int *p, void *v)
47*c9945492SAndroid Build Coastguard Worker {
48*c9945492SAndroid Build Coastguard Worker 	int r;
49*c9945492SAndroid Build Coastguard Worker 	__asm__ __volatile__ ("stlxr %w0,%2,%1" : "=&r"(r), "=Q"(*(void *volatile *)p) : "r"(v) : "memory");
50*c9945492SAndroid Build Coastguard Worker 	return !r;
51*c9945492SAndroid Build Coastguard Worker }
52*c9945492SAndroid Build Coastguard Worker 
53*c9945492SAndroid Build Coastguard Worker #define a_cas_p a_cas_p
a_cas_p(volatile void * p,void * t,void * s)54*c9945492SAndroid Build Coastguard Worker static inline void *a_cas_p(volatile void *p, void *t, void *s)
55*c9945492SAndroid Build Coastguard Worker {
56*c9945492SAndroid Build Coastguard Worker 	void *old;
57*c9945492SAndroid Build Coastguard Worker 	do {
58*c9945492SAndroid Build Coastguard Worker 		old = a_ll_p(p);
59*c9945492SAndroid Build Coastguard Worker 		if (old != t) {
60*c9945492SAndroid Build Coastguard Worker 			a_barrier();
61*c9945492SAndroid Build Coastguard Worker 			break;
62*c9945492SAndroid Build Coastguard Worker 		}
63*c9945492SAndroid Build Coastguard Worker 	} while (!a_sc_p(p, s));
64*c9945492SAndroid Build Coastguard Worker 	return old;
65*c9945492SAndroid Build Coastguard Worker }
66*c9945492SAndroid Build Coastguard Worker 
67*c9945492SAndroid Build Coastguard Worker #define a_ctz_64 a_ctz_64
a_ctz_64(uint64_t x)68*c9945492SAndroid Build Coastguard Worker static inline int a_ctz_64(uint64_t x)
69*c9945492SAndroid Build Coastguard Worker {
70*c9945492SAndroid Build Coastguard Worker 	__asm__(
71*c9945492SAndroid Build Coastguard Worker 		"	rbit %0, %1\n"
72*c9945492SAndroid Build Coastguard Worker 		"	clz %0, %0\n"
73*c9945492SAndroid Build Coastguard Worker 		: "=r"(x) : "r"(x));
74*c9945492SAndroid Build Coastguard Worker 	return x;
75*c9945492SAndroid Build Coastguard Worker }
76*c9945492SAndroid Build Coastguard Worker 
77*c9945492SAndroid Build Coastguard Worker #define a_clz_64 a_clz_64
a_clz_64(uint64_t x)78*c9945492SAndroid Build Coastguard Worker static inline int a_clz_64(uint64_t x)
79*c9945492SAndroid Build Coastguard Worker {
80*c9945492SAndroid Build Coastguard Worker 	__asm__("clz %0, %1" : "=r"(x) : "r"(x));
81*c9945492SAndroid Build Coastguard Worker 	return x;
82*c9945492SAndroid Build Coastguard Worker }
83