xref: /aosp_15_r20/external/musl/arch/sh/atomic_arch.h (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include "libc.h"
2*c9945492SAndroid Build Coastguard Worker 
3*c9945492SAndroid Build Coastguard Worker #if defined(__SH4A__)
4*c9945492SAndroid Build Coastguard Worker 
5*c9945492SAndroid Build Coastguard Worker #define a_ll a_ll
a_ll(volatile int * p)6*c9945492SAndroid Build Coastguard Worker static inline int a_ll(volatile int *p)
7*c9945492SAndroid Build Coastguard Worker {
8*c9945492SAndroid Build Coastguard Worker 	int v;
9*c9945492SAndroid Build Coastguard Worker 	__asm__ __volatile__ ("movli.l @%1, %0" : "=z"(v) : "r"(p), "m"(*p));
10*c9945492SAndroid Build Coastguard Worker 	return v;
11*c9945492SAndroid Build Coastguard Worker }
12*c9945492SAndroid Build Coastguard Worker 
13*c9945492SAndroid Build Coastguard Worker #define a_sc a_sc
a_sc(volatile int * p,int v)14*c9945492SAndroid Build Coastguard Worker static inline int a_sc(volatile int *p, int v)
15*c9945492SAndroid Build Coastguard Worker {
16*c9945492SAndroid Build Coastguard Worker 	int r;
17*c9945492SAndroid Build Coastguard Worker 	__asm__ __volatile__ (
18*c9945492SAndroid Build Coastguard Worker 		"movco.l %2, @%3 ; movt %0"
19*c9945492SAndroid Build Coastguard Worker 		: "=r"(r), "=m"(*p) : "z"(v), "r"(p) : "memory", "cc");
20*c9945492SAndroid Build Coastguard Worker 	return r;
21*c9945492SAndroid Build Coastguard Worker }
22*c9945492SAndroid Build Coastguard Worker 
23*c9945492SAndroid Build Coastguard Worker #define a_barrier a_barrier
a_barrier()24*c9945492SAndroid Build Coastguard Worker static inline void a_barrier()
25*c9945492SAndroid Build Coastguard Worker {
26*c9945492SAndroid Build Coastguard Worker 	__asm__ __volatile__ ("synco" ::: "memory");
27*c9945492SAndroid Build Coastguard Worker }
28*c9945492SAndroid Build Coastguard Worker 
29*c9945492SAndroid Build Coastguard Worker #define a_pre_llsc a_barrier
30*c9945492SAndroid Build Coastguard Worker #define a_post_llsc a_barrier
31*c9945492SAndroid Build Coastguard Worker 
32*c9945492SAndroid Build Coastguard Worker #else
33*c9945492SAndroid Build Coastguard Worker 
34*c9945492SAndroid Build Coastguard Worker #define a_cas a_cas
35*c9945492SAndroid Build Coastguard Worker extern hidden const void *__sh_cas_ptr;
a_cas(volatile int * p,int t,int s)36*c9945492SAndroid Build Coastguard Worker static inline int a_cas(volatile int *p, int t, int s)
37*c9945492SAndroid Build Coastguard Worker {
38*c9945492SAndroid Build Coastguard Worker 	register int r1 __asm__("r1");
39*c9945492SAndroid Build Coastguard Worker 	register int r2 __asm__("r2") = t;
40*c9945492SAndroid Build Coastguard Worker 	register int r3 __asm__("r3") = s;
41*c9945492SAndroid Build Coastguard Worker 	__asm__ __volatile__ (
42*c9945492SAndroid Build Coastguard Worker 		"jsr @%4 ; nop"
43*c9945492SAndroid Build Coastguard Worker 		: "=r"(r1), "+r"(r3) : "z"(p), "r"(r2), "r"(__sh_cas_ptr)
44*c9945492SAndroid Build Coastguard Worker 		: "memory", "pr", "cc");
45*c9945492SAndroid Build Coastguard Worker 	return r3;
46*c9945492SAndroid Build Coastguard Worker }
47*c9945492SAndroid Build Coastguard Worker 
48*c9945492SAndroid Build Coastguard Worker #endif
49