OLD | NEW |
1 #define a_ll a_ll | 1 #define a_ll a_ll |
2 static inline int a_ll(volatile int *p) | 2 static inline int a_ll(volatile int* p) { |
3 { | 3 int v; |
4 » int v; | 4 __asm__ __volatile__( |
5 » __asm__ __volatile__ ( | 5 ".set push ; .set mips2\n\t" |
6 » » ".set push ; .set mips2\n\t" | 6 "ll %0, %1" |
7 » » "ll %0, %1" | 7 "\n\t.set pop" |
8 » » "\n\t.set pop" | 8 : "=r"(v) |
9 » » : "=r"(v) : "m"(*p)); | 9 : "m"(*p)); |
10 » return v; | 10 return v; |
11 } | 11 } |
12 | 12 |
13 #define a_sc a_sc | 13 #define a_sc a_sc |
14 static inline int a_sc(volatile int *p, int v) | 14 static inline int a_sc(volatile int* p, int v) { |
15 { | 15 int r; |
16 » int r; | 16 __asm__ __volatile__( |
17 » __asm__ __volatile__ ( | 17 ".set push ; .set mips2\n\t" |
18 » » ".set push ; .set mips2\n\t" | 18 "sc %0, %1" |
19 » » "sc %0, %1" | 19 "\n\t.set pop" |
20 » » "\n\t.set pop" | 20 : "=r"(r), "=m"(*p) |
21 » » : "=r"(r), "=m"(*p) : "0"(v) : "memory"); | 21 : "0"(v) |
22 » return r; | 22 : "memory"); |
| 23 return r; |
23 } | 24 } |
24 | 25 |
25 #define a_barrier a_barrier | 26 #define a_barrier a_barrier |
26 static inline void a_barrier() | 27 static inline void a_barrier() { |
27 { | 28 /* mips2 sync, but using too many directives causes |
28 » /* mips2 sync, but using too many directives causes | 29 * gcc not to inline it, so encode with .long instead. */ |
29 » * gcc not to inline it, so encode with .long instead. */ | 30 __asm__ __volatile__(".long 0xf" : : : "memory"); |
30 » __asm__ __volatile__ (".long 0xf" : : : "memory"); | |
31 #if 0 | 31 #if 0 |
32 __asm__ __volatile__ ( | 32 __asm__ __volatile__ ( |
33 ".set push ; .set mips2 ; sync ; .set pop" | 33 ".set push ; .set mips2 ; sync ; .set pop" |
34 : : : "memory"); | 34 : : : "memory"); |
35 #endif | 35 #endif |
36 } | 36 } |
37 | 37 |
38 #define a_pre_llsc a_barrier | 38 #define a_pre_llsc a_barrier |
39 #define a_post_llsc a_barrier | 39 #define a_post_llsc a_barrier |
OLD | NEW |