OLD | NEW |
| (Empty) |
1 #define a_ll a_ll | |
2 static inline int a_ll(volatile int* p) { | |
3 int v; | |
4 __asm__ __volatile__("lwarx %0, 0, %2" : "=r"(v) : "m"(*p), "r"(p)); | |
5 return v; | |
6 } | |
7 | |
8 #define a_sc a_sc | |
9 static inline int a_sc(volatile int* p, int v) { | |
10 int r; | |
11 __asm__ __volatile__("stwcx. %2, 0, %3 ; mfcr %0" | |
12 : "=r"(r), "=m"(*p) | |
13 : "r"(v), "r"(p) | |
14 : "memory", "cc"); | |
15 return r & 0x20000000; /* "bit 2" of "cr0" (backwards bit order) */ | |
16 } | |
17 | |
18 #define a_barrier a_barrier | |
19 static inline void a_barrier() { | |
20 __asm__ __volatile__("sync" : : : "memory"); | |
21 } | |
22 | |
23 #define a_pre_llsc a_barrier | |
24 | |
25 #define a_post_llsc a_post_llsc | |
26 static inline void a_post_llsc() { | |
27 __asm__ __volatile__("isync" : : : "memory"); | |
28 } | |
29 | |
30 #define a_store a_store | |
31 static inline void a_store(volatile int* p, int v) { | |
32 a_pre_llsc(); | |
33 *p = v; | |
34 a_post_llsc(); | |
35 } | |
OLD | NEW |