19 #ifndef OMPI_SYS_ARCH_ATOMIC_H
20 #define OMPI_SYS_ARCH_ATOMIC_H 1
23 #if OPAL_WANT_SMP_LOCKS
27 #define MB() __asm__ __volatile__(".set mips2; sync; .set mips0": : :"memory")
28 #define RMB() __asm__ __volatile__(".set mips2; sync; .set mips0": : :"memory")
29 #define WMB() __asm__ __volatile__(".set mips2; sync; .set mips0": : :"memory")
30 #define SMP_SYNC ".set mips2; sync; .set mips0"
32 #define MB() __asm__ __volatile__("sync": : :"memory")
33 #define RMB() __asm__ __volatile__("sync": : :"memory")
34 #define WMB() __asm__ __volatile__("sync": : :"memory")
35 #define SMP_SYNC "sync"
53 #define OPAL_HAVE_ATOMIC_MEM_BARRIER 1
55 #define OPAL_HAVE_ATOMIC_CMPSET_32 1
58 #define OPAL_HAVE_ATOMIC_CMPSET_64 1
66 #if OMPI_GCC_INLINE_ASSEMBLY
95 #if OMPI_GCC_INLINE_ASSEMBLY
97 static inline int opal_atomic_cmpset_32(
volatile int32_t *addr,
98 int32_t oldval, int32_t newval)
102 __asm__ __volatile__ (
".set noreorder \n"
120 :
"=&r"(ret),
"=m"(*addr)
121 :
"m"(*addr),
"r"(oldval),
"r"(newval)
123 return (ret == oldval);
132 static inline int opal_atomic_cmpset_acq_32(
volatile int32_t *addr,
133 int32_t oldval, int32_t newval)
137 rc = opal_atomic_cmpset_32(addr, oldval, newval);
144 static inline int opal_atomic_cmpset_rel_32(
volatile int32_t *addr,
145 int32_t oldval, int32_t newval)
148 return opal_atomic_cmpset_32(addr, oldval, newval);
151 #ifdef OPAL_HAVE_ATOMIC_CMPSET_64
152 static inline int opal_atomic_cmpset_64(
volatile int64_t *addr,
153 int64_t oldval, int64_t newval)
157 __asm__ __volatile__ (
".set noreorder \n"
161 "bne %0, %z3, 2f \n\t"
169 :
"=&r" (ret),
"=m" (*addr)
170 :
"m" (*addr),
"r" (oldval),
"r" (newval)
173 return (ret == oldval);
182 static inline int opal_atomic_cmpset_acq_64(
volatile int64_t *addr,
183 int64_t oldval, int64_t newval)
187 rc = opal_atomic_cmpset_64(addr, oldval, newval);
194 static inline int opal_atomic_cmpset_rel_64(
volatile int64_t *addr,
195 int64_t oldval, int64_t newval)
198 return opal_atomic_cmpset_64(addr, oldval, newval);
void opal_atomic_rmb(void)
Read memory barrier.
void opal_atomic_mb(void)
Memory barrier.
void opal_atomic_wmb(void)
Write memory barrier.