This source file includes following definitions.
- pmix_atomic_mb
- pmix_atomic_rmb
- pmix_atomic_wmb
- pmix_atomic_isync
- pmix_atomic_compare_exchange_strong_32
- pmix_atomic_swap_32
- pmix_atomic_fetch_add_32
- pmix_atomic_fetch_sub_32
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 #ifndef PMIX_SYS_ARCH_ATOMIC_H
27 #define PMIX_SYS_ARCH_ATOMIC_H 1
28
29
30
31
32
33 #define SMPLOCK "lock; "
34 #define PMIXMB() __asm__ __volatile__("": : :"memory")
35
36
37
38
39
40
41
42 #define PMIX_HAVE_ATOMIC_MEM_BARRIER 1
43
44 #define PMIX_HAVE_ATOMIC_COMPARE_EXCHANGE_32 1
45
46 #define PMIX_HAVE_ATOMIC_MATH_32 1
47 #define PMIX_HAVE_ATOMIC_ADD_32 1
48 #define PMIX_HAVE_ATOMIC_SUB_32 1
49
50
51
52
53
54
55 #if PMIX_GCC_INLINE_ASSEMBLY
56
57 static inline void pmix_atomic_mb(void)
58 {
59 PMIXMB();
60 }
61
62
63 static inline void pmix_atomic_rmb(void)
64 {
65 PMIXMB();
66 }
67
68
69 static inline void pmix_atomic_wmb(void)
70 {
71 PMIXMB();
72 }
73
74 static inline void pmix_atomic_isync(void)
75 {
76 }
77
78 #endif
79
80
81
82
83
84
85
86 #if PMIX_GCC_INLINE_ASSEMBLY
87
88 static inline bool pmix_atomic_compare_exchange_strong_32 (pmix_atomic_int32_t *addr, int32_t *oldval, int32_t newval)
89 {
90 unsigned char ret;
91 __asm__ __volatile__ (
92 SMPLOCK "cmpxchgl %3,%2 \n\t"
93 "sete %0 \n\t"
94 : "=qm" (ret), "+a" (*oldval), "+m" (*addr)
95 : "q"(newval)
96 : "memory", "cc");
97
98 return (bool) ret;
99 }
100
101 #endif
102
103 #define pmix_atomic_compare_exchange_strong_acq_32 pmix_atomic_compare_exchange_strong_32
104 #define pmix_atomic_compare_exchange_strong_rel_32 pmix_atomic_compare_exchange_strong_32
105
106 #if PMIX_GCC_INLINE_ASSEMBLY
107
108 #define PMIX_HAVE_ATOMIC_SWAP_32 1
109
110 static inline int32_t pmix_atomic_swap_32( pmix_atomic_int32_t *addr,
111 int32_t newval)
112 {
113 int32_t oldval;
114
115 __asm__ __volatile__("xchg %1, %0" :
116 "=r" (oldval), "=m" (*addr) :
117 "0" (newval), "m" (*addr) :
118 "memory");
119 return oldval;
120 }
121
122 #endif
123
124
125 #if PMIX_GCC_INLINE_ASSEMBLY
126
127
128
129
130
131
132
133
134 static inline int32_t pmix_atomic_fetch_add_32(pmix_atomic_int32_t* v, int i)
135 {
136 int ret = i;
137 __asm__ __volatile__(
138 SMPLOCK "xaddl %1,%0"
139 :"+m" (*v), "+r" (ret)
140 :
141 :"memory", "cc"
142 );
143 return ret;
144 }
145
146
147
148
149
150
151
152
153
154 static inline int32_t pmix_atomic_fetch_sub_32(pmix_atomic_int32_t* v, int i)
155 {
156 int ret = -i;
157 __asm__ __volatile__(
158 SMPLOCK "xaddl %1,%0"
159 :"+m" (*v), "+r" (ret)
160 :
161 :"memory", "cc"
162 );
163 return ret;
164 }
165
166 #endif
167
168 #endif