OLD | NEW |
1 __attribute__((__visibility__("hidden"))) | 1 __attribute__((__visibility__( |
2 extern const void *__arm_atomics[3]; /* gettp, cas, barrier */ | 2 "hidden"))) extern const void* __arm_atomics[3]; /* gettp, cas, barrier */ |
3 | 3 |
4 #if ((__ARM_ARCH_6__ || __ARM_ARCH_6K__ || __ARM_ARCH_6ZK__) && !__thumb__) \ | 4 #if ((__ARM_ARCH_6__ || __ARM_ARCH_6K__ || __ARM_ARCH_6ZK__) && !__thumb__) || \ |
5 || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7 | 5 __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7 |
6 | 6 |
7 #define a_ll a_ll | 7 #define a_ll a_ll |
8 static inline int a_ll(volatile int *p) | 8 static inline int a_ll(volatile int* p) { |
9 { | 9 int v; |
10 » int v; | 10 __asm__ __volatile__("ldrex %0, %1" : "=r"(v) : "Q"(*p)); |
11 » __asm__ __volatile__ ("ldrex %0, %1" : "=r"(v) : "Q"(*p)); | 11 return v; |
12 » return v; | |
13 } | 12 } |
14 | 13 |
15 #define a_sc a_sc | 14 #define a_sc a_sc |
16 static inline int a_sc(volatile int *p, int v) | 15 static inline int a_sc(volatile int* p, int v) { |
17 { | 16 int r; |
18 » int r; | 17 __asm__ __volatile__("strex %0,%2,%1" |
19 » __asm__ __volatile__ ("strex %0,%2,%1" : "=&r"(r), "=Q"(*p) : "r"(v) : "
memory"); | 18 : "=&r"(r), "=Q"(*p) |
20 » return !r; | 19 : "r"(v) |
| 20 : "memory"); |
| 21 return !r; |
21 } | 22 } |
22 | 23 |
23 #if __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7 | 24 #if __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH >= 7 |
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 __asm__ __volatile__("dmb ish" : : : "memory"); |
28 » __asm__ __volatile__ ("dmb ish" : : : "memory"); | |
29 } | 29 } |
30 | 30 |
31 #endif | 31 #endif |
32 | 32 |
33 #define a_pre_llsc a_barrier | 33 #define a_pre_llsc a_barrier |
34 #define a_post_llsc a_barrier | 34 #define a_post_llsc a_barrier |
35 | 35 |
36 #else | 36 #else |
37 | 37 |
38 #define a_cas a_cas | 38 #define a_cas a_cas |
39 static inline int a_cas(volatile int *p, int t, int s) | 39 static inline int a_cas(volatile int* p, int t, int s) { |
40 { | 40 for (;;) { |
41 » for (;;) { | 41 register int r0 __asm__("r0") = t; |
42 » » register int r0 __asm__("r0") = t; | 42 register int r1 __asm__("r1") = s; |
43 » » register int r1 __asm__("r1") = s; | 43 register volatile int* r2 __asm__("r2") = p; |
44 » » register volatile int *r2 __asm__("r2") = p; | 44 int old; |
45 » » int old; | 45 __asm__ __volatile__("bl __a_cas" |
46 » » __asm__ __volatile__ ( | 46 : "+r"(r0) |
47 » » » "bl __a_cas" | 47 : "r"(r1), "r"(r2) |
48 » » » : "+r"(r0) : "r"(r1), "r"(r2) | 48 : "memory", "r3", "lr", "ip", "cc"); |
49 » » » : "memory", "r3", "lr", "ip", "cc" ); | 49 if (!r0) |
50 » » if (!r0) return t; | 50 return t; |
51 » » if ((old=*p)!=t) return old; | 51 if ((old = *p) != t) |
52 » } | 52 return old; |
| 53 } |
53 } | 54 } |
54 | 55 |
55 #endif | 56 #endif |
56 | 57 |
57 #ifndef a_barrier | 58 #ifndef a_barrier |
58 #define a_barrier a_barrier | 59 #define a_barrier a_barrier |
59 static inline void a_barrier() | 60 static inline void a_barrier() { |
60 { | 61 __asm__ __volatile__("bl __a_barrier" : : : "memory", "cc", "ip", "lr"); |
61 » __asm__ __volatile__("bl __a_barrier" | |
62 » » : : : "memory", "cc", "ip", "lr" ); | |
63 } | 62 } |
64 #endif | 63 #endif |
65 | 64 |
66 #define a_crash a_crash | 65 #define a_crash a_crash |
67 static inline void a_crash() | 66 static inline void a_crash() { |
68 { | 67 __asm__ __volatile__( |
69 » __asm__ __volatile__( | |
70 #ifndef __thumb__ | 68 #ifndef __thumb__ |
71 » » ".word 0xe7f000f0" | 69 ".word 0xe7f000f0" |
72 #else | 70 #else |
73 » » ".short 0xdeff" | 71 ".short 0xdeff" |
74 #endif | 72 #endif |
75 » » : : : "memory"); | 73 : |
| 74 : |
| 75 : "memory"); |
76 } | 76 } |
OLD | NEW |