1570af302Sopenharmony_ci#define a_cas a_cas
2570af302Sopenharmony_cistatic inline int a_cas(volatile int *p, int t, int s)
3570af302Sopenharmony_ci{
4570af302Sopenharmony_ci	register int old, tmp;
5570af302Sopenharmony_ci	__asm__ __volatile__ (
6570af302Sopenharmony_ci		"	addi %0, r0, 0\n"
7570af302Sopenharmony_ci		"1:	lwx %0, %2, r0\n"
8570af302Sopenharmony_ci		"	rsubk %1, %0, %3\n"
9570af302Sopenharmony_ci		"	bnei %1, 1f\n"
10570af302Sopenharmony_ci		"	swx %4, %2, r0\n"
11570af302Sopenharmony_ci		"	addic %1, r0, 0\n"
12570af302Sopenharmony_ci		"	bnei %1, 1b\n"
13570af302Sopenharmony_ci		"1:	"
14570af302Sopenharmony_ci		: "=&r"(old), "=&r"(tmp)
15570af302Sopenharmony_ci		: "r"(p), "r"(t), "r"(s)
16570af302Sopenharmony_ci		: "cc", "memory" );
17570af302Sopenharmony_ci	return old;
18570af302Sopenharmony_ci}
19570af302Sopenharmony_ci
20570af302Sopenharmony_ci#define a_swap a_swap
21570af302Sopenharmony_cistatic inline int a_swap(volatile int *x, int v)
22570af302Sopenharmony_ci{
23570af302Sopenharmony_ci	register int old, tmp;
24570af302Sopenharmony_ci	__asm__ __volatile__ (
25570af302Sopenharmony_ci		"	addi %0, r0, 0\n"
26570af302Sopenharmony_ci		"1:	lwx %0, %2, r0\n"
27570af302Sopenharmony_ci		"	swx %3, %2, r0\n"
28570af302Sopenharmony_ci		"	addic %1, r0, 0\n"
29570af302Sopenharmony_ci		"	bnei %1, 1b\n"
30570af302Sopenharmony_ci		"1:	"
31570af302Sopenharmony_ci		: "=&r"(old), "=&r"(tmp)
32570af302Sopenharmony_ci		: "r"(x), "r"(v)
33570af302Sopenharmony_ci		: "cc", "memory" );
34570af302Sopenharmony_ci	return old;
35570af302Sopenharmony_ci}
36570af302Sopenharmony_ci
37570af302Sopenharmony_ci#define a_fetch_add a_fetch_add
38570af302Sopenharmony_cistatic inline int a_fetch_add(volatile int *x, int v)
39570af302Sopenharmony_ci{
40570af302Sopenharmony_ci	register int new, tmp;
41570af302Sopenharmony_ci	__asm__ __volatile__ (
42570af302Sopenharmony_ci		"	addi %0, r0, 0\n"
43570af302Sopenharmony_ci		"1:	lwx %0, %2, r0\n"
44570af302Sopenharmony_ci		"	addk %0, %0, %3\n"
45570af302Sopenharmony_ci		"	swx %0, %2, r0\n"
46570af302Sopenharmony_ci		"	addic %1, r0, 0\n"
47570af302Sopenharmony_ci		"	bnei %1, 1b\n"
48570af302Sopenharmony_ci		"1:	"
49570af302Sopenharmony_ci		: "=&r"(new), "=&r"(tmp)
50570af302Sopenharmony_ci		: "r"(x), "r"(v)
51570af302Sopenharmony_ci		: "cc", "memory" );
52570af302Sopenharmony_ci	return new-v;
53570af302Sopenharmony_ci}
54