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