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