2004-05-05 19:19:47 +00:00
|
|
|
/*
|
|
|
|
* $HEADER$
|
|
|
|
*/
|
|
|
|
|
2004-08-16 01:13:25 +00:00
|
|
|
#ifndef OMPI_SYS_ARCH_ATOMIC_H
|
|
|
|
#define OMPI_SYS_ARCH_ATOMIC_H 1
|
2004-05-05 19:19:47 +00:00
|
|
|
|
2004-05-05 23:19:32 +00:00
|
|
|
/*
|
|
|
|
* On amd64, we use cmpxchg.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_SMP
|
2004-06-24 21:09:55 +00:00
|
|
|
#define SMPLOCK "lock; "
|
2004-05-05 23:19:32 +00:00
|
|
|
#define MB() __asm__ __volatile__("": : :"memory")
|
2004-05-05 19:19:47 +00:00
|
|
|
#else
|
2004-06-24 21:09:55 +00:00
|
|
|
#define SMPLOCK
|
2004-05-05 23:19:32 +00:00
|
|
|
#define MB()
|
2004-05-05 19:19:47 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
2004-06-16 17:10:18 +00:00
|
|
|
static inline void ompi_atomic_mb(void)
|
2004-05-05 23:19:32 +00:00
|
|
|
{
|
|
|
|
MB();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-06-16 17:10:18 +00:00
|
|
|
static inline void ompi_atomic_rmb(void)
|
2004-05-05 19:19:47 +00:00
|
|
|
{
|
2004-05-05 23:19:32 +00:00
|
|
|
MB();
|
|
|
|
}
|
2004-05-05 19:19:47 +00:00
|
|
|
|
|
|
|
|
2004-06-16 17:10:18 +00:00
|
|
|
static inline void ompi_atomic_wmb(void)
|
2004-05-05 23:19:32 +00:00
|
|
|
{
|
|
|
|
MB();
|
|
|
|
}
|
|
|
|
|
2004-10-28 20:32:12 +00:00
|
|
|
#define OMPI_ARCHITECTURE_DEFINE_ATOMIC_CMPSET_32
|
|
|
|
static inline int ompi_atomic_cmpset_32( volatile int32_t *addr,
|
|
|
|
int32_t oldval, int32_t newval)
|
2004-05-05 23:19:32 +00:00
|
|
|
{
|
2004-08-26 20:20:10 +00:00
|
|
|
unsigned long prev;
|
|
|
|
__asm__ __volatile__(SMPLOCK "cmpxchgl %k1,%2"
|
2004-10-28 17:32:27 +00:00
|
|
|
: "=a"(prev)
|
|
|
|
: "q"(newval), "m"(*addr), "0"(oldval)
|
|
|
|
: "memory");
|
2004-08-26 20:20:10 +00:00
|
|
|
return prev == oldval;
|
2004-05-05 19:19:47 +00:00
|
|
|
}
|
|
|
|
|
2004-10-28 17:32:27 +00:00
|
|
|
#define ompi_atomic_cmpset_acq_32 ompi_atomic_cmpset_32
|
|
|
|
#define ompi_atomic_cmpset_rel_32 ompi_atomic_cmpset_32
|
2004-05-05 19:19:47 +00:00
|
|
|
|
2004-10-28 20:32:12 +00:00
|
|
|
#define OMPI_ARCHITECTURE_DEFINE_ATOMIC_CMPSET_64
|
|
|
|
static inline int ompi_atomic_cmpset_64( volatile int64_t *addr,
|
|
|
|
int64_t oldval, int64_t newval)
|
2004-05-05 19:19:47 +00:00
|
|
|
{
|
2004-10-28 20:32:12 +00:00
|
|
|
int64_t ret = oldval;
|
2004-05-05 23:19:32 +00:00
|
|
|
|
2004-10-28 17:32:27 +00:00
|
|
|
__asm__ __volatile (
|
|
|
|
SMPLOCK "cmpxchgq %1,%2 \n\t"
|
|
|
|
"setz %%al \n\t"
|
|
|
|
"movzbl %%al,%0 \n\t"
|
|
|
|
: "+a" (ret)
|
|
|
|
: "r" (newval), "m" (*(addr))
|
|
|
|
: "memory");
|
|
|
|
|
|
|
|
return (ret == oldval);
|
2004-05-05 19:19:47 +00:00
|
|
|
}
|
|
|
|
|
2004-10-28 17:32:27 +00:00
|
|
|
#define ompi_atomic_cmpset_acq_64 ompi_atomic_cmpset_64
|
|
|
|
#define ompi_atomic_cmpset_rel_64 ompi_atomic_cmpset_64
|
2004-05-05 19:19:47 +00:00
|
|
|
|
2004-08-16 01:13:25 +00:00
|
|
|
#endif /* ! OMPI_SYS_ARCH_ATOMIC_H */
|