refactor internal atomic.h
[musl] / arch / mips / atomic_arch.h
1 #define a_cas a_cas
2 static inline int a_cas(volatile int *p, int t, int s)
3 {
4         int dummy;
5         __asm__ __volatile__(
6                 ".set push\n"
7                 ".set mips2\n"
8                 ".set noreorder\n"
9                 "       sync\n"
10                 "1:     ll %0, %2\n"
11                 "       bne %0, %3, 1f\n"
12                 "       addu %1, %4, $0\n"
13                 "       sc %1, %2\n"
14                 "       beq %1, $0, 1b\n"
15                 "       nop\n"
16                 "       sync\n"
17                 "1:     \n"
18                 ".set pop\n"
19                 : "=&r"(t), "=&r"(dummy), "+m"(*p) : "r"(t), "r"(s) : "memory" );
20         return t;
21 }
22
23 #define a_swap a_swap
24 static inline int a_swap(volatile int *x, int v)
25 {
26         int old, dummy;
27         __asm__ __volatile__(
28                 ".set push\n"
29                 ".set mips2\n"
30                 ".set noreorder\n"
31                 "       sync\n"
32                 "1:     ll %0, %2\n"
33                 "       addu %1, %3, $0\n"
34                 "       sc %1, %2\n"
35                 "       beq %1, $0, 1b\n"
36                 "       nop\n"
37                 "       sync\n"
38                 ".set pop\n"
39                 : "=&r"(old), "=&r"(dummy), "+m"(*x) : "r"(v) : "memory" );
40         return old;
41 }
42
43 #define a_fetch_add a_fetch_add
44 static inline int a_fetch_add(volatile int *x, int v)
45 {
46         int old, dummy;
47         __asm__ __volatile__(
48                 ".set push\n"
49                 ".set mips2\n"
50                 ".set noreorder\n"
51                 "       sync\n"
52                 "1:     ll %0, %2\n"
53                 "       addu %1, %0, %3\n"
54                 "       sc %1, %2\n"
55                 "       beq %1, $0, 1b\n"
56                 "       nop\n"
57                 "       sync\n"
58                 ".set pop\n"
59                 : "=&r"(old), "=&r"(dummy), "+m"(*x) : "r"(v) : "memory" );
60         return old;
61 }