xref: /aosp_15_r20/external/musl/arch/mips64/atomic_arch.h (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #if __mips_isa_rev < 6
2*c9945492SAndroid Build Coastguard Worker #define LLSC_M "m"
3*c9945492SAndroid Build Coastguard Worker #else
4*c9945492SAndroid Build Coastguard Worker #define LLSC_M "ZC"
5*c9945492SAndroid Build Coastguard Worker #endif
6*c9945492SAndroid Build Coastguard Worker 
7*c9945492SAndroid Build Coastguard Worker #define a_ll a_ll
a_ll(volatile int * p)8*c9945492SAndroid Build Coastguard Worker static inline int a_ll(volatile int *p)
9*c9945492SAndroid Build Coastguard Worker {
10*c9945492SAndroid Build Coastguard Worker 	int v;
11*c9945492SAndroid Build Coastguard Worker 	__asm__ __volatile__ (
12*c9945492SAndroid Build Coastguard Worker 		"ll %0, %1"
13*c9945492SAndroid Build Coastguard Worker 		: "=r"(v) : LLSC_M(*p));
14*c9945492SAndroid Build Coastguard Worker 	return v;
15*c9945492SAndroid Build Coastguard Worker }
16*c9945492SAndroid Build Coastguard Worker 
17*c9945492SAndroid Build Coastguard Worker #define a_sc a_sc
a_sc(volatile int * p,int v)18*c9945492SAndroid Build Coastguard Worker static inline int a_sc(volatile int *p, int v)
19*c9945492SAndroid Build Coastguard Worker {
20*c9945492SAndroid Build Coastguard Worker 	int r;
21*c9945492SAndroid Build Coastguard Worker 	__asm__ __volatile__ (
22*c9945492SAndroid Build Coastguard Worker 		"sc %0, %1"
23*c9945492SAndroid Build Coastguard Worker 		: "=r"(r), "="LLSC_M(*p) : "0"(v) : "memory");
24*c9945492SAndroid Build Coastguard Worker 	return r;
25*c9945492SAndroid Build Coastguard Worker }
26*c9945492SAndroid Build Coastguard Worker 
27*c9945492SAndroid Build Coastguard Worker #define a_ll_p a_ll_p
a_ll_p(volatile void * p)28*c9945492SAndroid Build Coastguard Worker static inline void *a_ll_p(volatile void *p)
29*c9945492SAndroid Build Coastguard Worker {
30*c9945492SAndroid Build Coastguard Worker 	void *v;
31*c9945492SAndroid Build Coastguard Worker 	__asm__ __volatile__ (
32*c9945492SAndroid Build Coastguard Worker 		"lld %0, %1"
33*c9945492SAndroid Build Coastguard Worker 		: "=r"(v) : LLSC_M(*(void *volatile *)p));
34*c9945492SAndroid Build Coastguard Worker 	return v;
35*c9945492SAndroid Build Coastguard Worker }
36*c9945492SAndroid Build Coastguard Worker 
37*c9945492SAndroid Build Coastguard Worker #define a_sc_p a_sc_p
a_sc_p(volatile void * p,void * v)38*c9945492SAndroid Build Coastguard Worker static inline int a_sc_p(volatile void *p, void *v)
39*c9945492SAndroid Build Coastguard Worker {
40*c9945492SAndroid Build Coastguard Worker 	long r;
41*c9945492SAndroid Build Coastguard Worker 	__asm__ __volatile__ (
42*c9945492SAndroid Build Coastguard Worker 		"scd %0, %1"
43*c9945492SAndroid Build Coastguard Worker 		: "=r"(r), "="LLSC_M(*(void *volatile *)p) : "0"(v) : "memory");
44*c9945492SAndroid Build Coastguard Worker 	return r;
45*c9945492SAndroid Build Coastguard Worker }
46*c9945492SAndroid Build Coastguard Worker 
47*c9945492SAndroid Build Coastguard Worker #define a_barrier a_barrier
a_barrier()48*c9945492SAndroid Build Coastguard Worker static inline void a_barrier()
49*c9945492SAndroid Build Coastguard Worker {
50*c9945492SAndroid Build Coastguard Worker 	__asm__ __volatile__ ("sync" : : : "memory");
51*c9945492SAndroid Build Coastguard Worker }
52*c9945492SAndroid Build Coastguard Worker 
53*c9945492SAndroid Build Coastguard Worker #define a_pre_llsc a_barrier
54*c9945492SAndroid Build Coastguard Worker #define a_post_llsc a_barrier
55*c9945492SAndroid Build Coastguard Worker 
56*c9945492SAndroid Build Coastguard Worker #undef LLSC_M
57