START_FILE
+#ifdef __linux__
#include <sys/asm.h>
+#else
+#include <asm.h>
+#endif
#include <regdef.h>
TEXT
ALIGN(8)
LEAF(opal_atomic_mb)
+#ifdef __linux__
+ .set mips2
+#endif
sync
+#ifdef __linux__
+ .set mips0
+#endif
j ra
END(opal_atomic_mb)
ALIGN(8)
LEAF(opal_atomic_rmb)
+#ifdef __linux__
+ .set mips2
+#endif
sync
+#ifdef __linux__
+ .set mips0
+#endif
j ra
END(opal_atomic_rmb)
LEAF(opal_atomic_wmb)
+#ifdef __linux__
+ .set mips2
+#endif
sync
+#ifdef __linux__
+ .set mips0
+#endif
j ra
END(opal_atomic_wmb)
LEAF(opal_atomic_cmpset_32)
.set noreorder
retry1:
+#ifdef __linux__
+ .set mips2
+#endif
ll $3, 0($4)
+#ifdef __linux__
+ .set mips0
+#endif
bne $3, $5, done1
or $2, $6, 0
+#ifdef __linux__
+ .set mips2
+#endif
sc $2, 0($4)
+#ifdef __linux__
+ .set mips0
+#endif
beqz $2, retry1
done1:
.set reorder
LEAF(opal_atomic_cmpset_acq_32)
.set noreorder
retry2:
+#ifdef __linux__
+ .set mips2
+#endif
ll $3, 0($4)
+#ifdef __linux__
+ .set mips0
+#endif
bne $3, $5, done2
or $2, $6, 0
+#ifdef __linux__
+ .set mips2
+#endif
sc $2, 0($4)
+#ifdef __linux__
+ .set mips0
+#endif
beqz $2, retry2
done2:
+#ifdef __linux__
+ .set mips2
+#endif
sync
+#ifdef __linux__
+ .set mips0
+#endif
.set reorder
xor $3,$3,$5
LEAF(opal_atomic_cmpset_rel_32)
.set noreorder
+#ifdef __linux__
+ .set mips2
+#endif
sync
+#ifdef __linux__
+ .set mips0
+#endif
retry3:
+#ifdef __linux__
+ .set mips2
+#endif
ll $3, 0($4)
+#ifdef __linux__
+ .set mips0
+#endif
bne $3, $5, done3
or $2, $6, 0
+#ifdef __linux__
+ .set mips2
+#endif
sc $2, 0($4)
+#ifdef __linux__
+ .set mips0
+#endif
beqz $2, retry3
done3:
.set reorder
sltu $2,$3,1
END(opal_atomic_cmpset_rel_32)
-
+#ifdef __mips64
LEAF(opal_atomic_cmpset_64)
.set noreorder
retry4:
j ra
sltu $3,$4,1
END(opal_atomic_cmpset_rel_64)
+#endif /* __mips64 */
#if OPAL_WANT_SMP_LOCKS
/* BWB - FIX ME! */
+#ifdef __linux__
+#define MB() __asm__ __volatile__(".set mips2; sync; .set mips0": : :"memory")
+#define RMB() __asm__ __volatile__(".set mips2; sync; .set mips0": : :"memory")
+#define WMB() __asm__ __volatile__(".set mips2; sync; .set mips0": : :"memory")
+#define SMP_SYNC ".set mips2; sync; .set mips0"
+#else
#define MB() __asm__ __volatile__("sync": : :"memory")
#define RMB() __asm__ __volatile__("sync": : :"memory")
#define WMB() __asm__ __volatile__("sync": : :"memory")
#define SMP_SYNC "sync"
+#endif
#else
#define OPAL_HAVE_ATOMIC_MEM_BARRIER 1
#define OPAL_HAVE_ATOMIC_CMPSET_32 1
-#define OPAL_HAVE_ATOMIC_CMPSET_64 1
+#ifdef __mips64
+#define OPAL_HAVE_ATOMIC_CMPSET_64 1
+#endif
/**********************************************************************
*
__asm__ __volatile__ (".set noreorder \n"
".set noat \n"
"1: \n"
+#ifdef __linux__
+ ".set mips2 \n\t"
+#endif
"ll %0, %2 \n" /* load *addr into ret */
"bne %0, %z3, 2f \n" /* done if oldval != ret */
"or $1, %z4, 0 \n" /* tmp = newval (delay slot) */
"sc $1, %2 \n" /* store tmp in *addr */
+#ifdef __linux__
+ ".set mips0 \n\t"
+#endif
/* note: ret will be 0 if failed, 1 if succeeded */
"beqz $1, 1b \n" /* if 0 jump back to 1b */
"nop \n" /* fill delay slots */
return opal_atomic_cmpset_32(addr, oldval, newval);
}
-
+#ifdef OPAL_HAVE_ATOMIC_CMPSET_64
static inline int opal_atomic_cmpset_64(volatile int64_t *addr,
int64_t oldval, int64_t newval)
{
opal_atomic_wmb();
return opal_atomic_cmpset_64(addr, oldval, newval);
}
+#endif /* OPAL_HAVE_ATOMIC_CMPSET_64 */
#endif /* OMPI_GCC_INLINE_ASSEMBLY */