21 #ifndef OMPI_SYS_ARCH_ATOMIC_H
22 #define OMPI_SYS_ARCH_ATOMIC_H 1
24 #if OPAL_WANT_SMP_LOCKS
26 #define MB() __asm__ __volatile__ ("dmb" : : : "memory")
27 #define RMB() __asm__ __volatile__ ("dmb" : : : "memory")
28 #define WMB() __asm__ __volatile__ ("dmb" : : : "memory")
44 #define OPAL_HAVE_ATOMIC_MEM_BARRIER 1
46 #define OPAL_HAVE_ATOMIC_CMPSET_32 1
48 #define OPAL_HAVE_ATOMIC_CMPSET_64 1
50 #define OPAL_HAVE_ATOMIC_MATH_32 1
51 #define OPAL_HAVE_ATOMIC_ADD_32 1
52 #define OPAL_HAVE_ATOMIC_SUB_32 1
60 #if OMPI_GCC_INLINE_ASSEMBLY
89 static inline int opal_atomic_cmpset_32(
volatile int32_t *addr,
90 int32_t oldval, int32_t newval)
94 __asm__ __volatile__ (
95 "1: ldrex %0, [%2] \n"
98 " strex %1, %4, [%2] \n"
103 :
"=&r" (ret),
"=&r" (tmp)
104 :
"r" (addr),
"r" (oldval),
"r" (newval)
107 return (ret == oldval);
115 static inline int opal_atomic_cmpset_acq_32(
volatile int32_t *addr,
116 int32_t oldval, int32_t newval)
120 rc = opal_atomic_cmpset_32(addr, oldval, newval);
127 static inline int opal_atomic_cmpset_rel_32(
volatile int32_t *addr,
128 int32_t oldval, int32_t newval)
131 return opal_atomic_cmpset_32(addr, oldval, newval);
135 static inline int opal_atomic_cmpset_64(
volatile int64_t *addr,
136 int64_t oldval, int64_t newval)
142 __asm__ __volatile__ (
143 "1: ldrexd %0, %H0, [%2] \n"
148 " strexd %1, %4, %H4, [%2] \n"
153 :
"=&r" (ret),
"=&r" (tmp)
154 :
"r" (addr),
"r" (oldval),
"r" (newval)
157 return (ret == oldval);
165 static inline int opal_atomic_cmpset_acq_64(
volatile int64_t *addr,
166 int64_t oldval, int64_t newval)
170 rc = opal_atomic_cmpset_64(addr, oldval, newval);
177 static inline int opal_atomic_cmpset_rel_64(
volatile int64_t *addr,
178 int64_t oldval, int64_t newval)
181 return opal_atomic_cmpset_64(addr, oldval, newval);
185 static inline int32_t opal_atomic_add_32(
volatile int32_t* v,
int inc)
190 __asm__ __volatile__(
191 "1: ldrex %0, [%2] \n"
193 " strex %1, %0, [%2] \n"
197 :
"=&r" (t),
"=&r" (tmp)
206 static inline int32_t opal_atomic_sub_32(
volatile int32_t* v,
int dec)
211 __asm__ __volatile__(
212 "1: ldrex %0, [%2] \n"
214 " strex %1, %0, [%2] \n"
218 :
"=&r" (t),
"=&r" (tmp)
void opal_atomic_rmb(void)
Read memory barrier.
void opal_atomic_mb(void)
Memory barrier.
void opal_atomic_wmb(void)
Write memory barrier.