xref: /aosp_15_r20/external/musl/arch/microblaze/atomic_arch.h (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #define a_cas a_cas
a_cas(volatile int * p,int t,int s)2*c9945492SAndroid Build Coastguard Worker static inline int a_cas(volatile int *p, int t, int s)
3*c9945492SAndroid Build Coastguard Worker {
4*c9945492SAndroid Build Coastguard Worker 	register int old, tmp;
5*c9945492SAndroid Build Coastguard Worker 	__asm__ __volatile__ (
6*c9945492SAndroid Build Coastguard Worker 		"	addi %0, r0, 0\n"
7*c9945492SAndroid Build Coastguard Worker 		"1:	lwx %0, %2, r0\n"
8*c9945492SAndroid Build Coastguard Worker 		"	rsubk %1, %0, %3\n"
9*c9945492SAndroid Build Coastguard Worker 		"	bnei %1, 1f\n"
10*c9945492SAndroid Build Coastguard Worker 		"	swx %4, %2, r0\n"
11*c9945492SAndroid Build Coastguard Worker 		"	addic %1, r0, 0\n"
12*c9945492SAndroid Build Coastguard Worker 		"	bnei %1, 1b\n"
13*c9945492SAndroid Build Coastguard Worker 		"1:	"
14*c9945492SAndroid Build Coastguard Worker 		: "=&r"(old), "=&r"(tmp)
15*c9945492SAndroid Build Coastguard Worker 		: "r"(p), "r"(t), "r"(s)
16*c9945492SAndroid Build Coastguard Worker 		: "cc", "memory" );
17*c9945492SAndroid Build Coastguard Worker 	return old;
18*c9945492SAndroid Build Coastguard Worker }
19*c9945492SAndroid Build Coastguard Worker 
20*c9945492SAndroid Build Coastguard Worker #define a_swap a_swap
a_swap(volatile int * x,int v)21*c9945492SAndroid Build Coastguard Worker static inline int a_swap(volatile int *x, int v)
22*c9945492SAndroid Build Coastguard Worker {
23*c9945492SAndroid Build Coastguard Worker 	register int old, tmp;
24*c9945492SAndroid Build Coastguard Worker 	__asm__ __volatile__ (
25*c9945492SAndroid Build Coastguard Worker 		"	addi %0, r0, 0\n"
26*c9945492SAndroid Build Coastguard Worker 		"1:	lwx %0, %2, r0\n"
27*c9945492SAndroid Build Coastguard Worker 		"	swx %3, %2, r0\n"
28*c9945492SAndroid Build Coastguard Worker 		"	addic %1, r0, 0\n"
29*c9945492SAndroid Build Coastguard Worker 		"	bnei %1, 1b\n"
30*c9945492SAndroid Build Coastguard Worker 		"1:	"
31*c9945492SAndroid Build Coastguard Worker 		: "=&r"(old), "=&r"(tmp)
32*c9945492SAndroid Build Coastguard Worker 		: "r"(x), "r"(v)
33*c9945492SAndroid Build Coastguard Worker 		: "cc", "memory" );
34*c9945492SAndroid Build Coastguard Worker 	return old;
35*c9945492SAndroid Build Coastguard Worker }
36*c9945492SAndroid Build Coastguard Worker 
37*c9945492SAndroid Build Coastguard Worker #define a_fetch_add a_fetch_add
a_fetch_add(volatile int * x,int v)38*c9945492SAndroid Build Coastguard Worker static inline int a_fetch_add(volatile int *x, int v)
39*c9945492SAndroid Build Coastguard Worker {
40*c9945492SAndroid Build Coastguard Worker 	register int new, tmp;
41*c9945492SAndroid Build Coastguard Worker 	__asm__ __volatile__ (
42*c9945492SAndroid Build Coastguard Worker 		"	addi %0, r0, 0\n"
43*c9945492SAndroid Build Coastguard Worker 		"1:	lwx %0, %2, r0\n"
44*c9945492SAndroid Build Coastguard Worker 		"	addk %0, %0, %3\n"
45*c9945492SAndroid Build Coastguard Worker 		"	swx %0, %2, r0\n"
46*c9945492SAndroid Build Coastguard Worker 		"	addic %1, r0, 0\n"
47*c9945492SAndroid Build Coastguard Worker 		"	bnei %1, 1b\n"
48*c9945492SAndroid Build Coastguard Worker 		"1:	"
49*c9945492SAndroid Build Coastguard Worker 		: "=&r"(new), "=&r"(tmp)
50*c9945492SAndroid Build Coastguard Worker 		: "r"(x), "r"(v)
51*c9945492SAndroid Build Coastguard Worker 		: "cc", "memory" );
52*c9945492SAndroid Build Coastguard Worker 	return new-v;
53*c9945492SAndroid Build Coastguard Worker }
54