Pushing the Debian patch (based on Manuel Prinz modifications).
This commit was SVN r24061.
Этот коммит содержится в:
родитель
d997ef4f49
Коммит
96abaf2e17
@ -127,3 +127,7 @@ SPARCV9_64 default-.text-.globl-:--.L-#-1-0-1-1-0 sparcv9-64-solaris
|
|||||||
|
|
||||||
MIPS default-.text-.globl-:--L--1-1-1-1-0 mips-irix
|
MIPS default-.text-.globl-:--L--1-1-1-1-0 mips-irix
|
||||||
MIPS default-.text-.globl-:--L--1-1-1-1-0 mips64el
|
MIPS default-.text-.globl-:--L--1-1-1-1-0 mips64el
|
||||||
|
MIPS default-.text-.globl-:--L-@-1-1-1-1-1 mips64-linux
|
||||||
|
|
||||||
|
# However, this doesn't hold true for 32-bit MIPS as used on Linux.
|
||||||
|
MIPS default-.text-.globl-:--L-@-1-1-1-0-1 mips-linux
|
||||||
|
@ -1,26 +1,48 @@
|
|||||||
START_FILE
|
START_FILE
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
#include <sys/asm.h>
|
#include <sys/asm.h>
|
||||||
|
#else
|
||||||
|
#include <asm.h>
|
||||||
|
#endif
|
||||||
#include <regdef.h>
|
#include <regdef.h>
|
||||||
|
|
||||||
TEXT
|
TEXT
|
||||||
|
|
||||||
ALIGN(8)
|
ALIGN(8)
|
||||||
LEAF(opal_atomic_mb)
|
LEAF(opal_atomic_mb)
|
||||||
|
#ifdef __linux__
|
||||||
|
.set mips2
|
||||||
|
#endif
|
||||||
sync
|
sync
|
||||||
|
#ifdef __linux__
|
||||||
|
.set mips0
|
||||||
|
#endif
|
||||||
j ra
|
j ra
|
||||||
END(opal_atomic_mb)
|
END(opal_atomic_mb)
|
||||||
|
|
||||||
|
|
||||||
ALIGN(8)
|
ALIGN(8)
|
||||||
LEAF(opal_atomic_rmb)
|
LEAF(opal_atomic_rmb)
|
||||||
|
#ifdef __linux__
|
||||||
|
.set mips2
|
||||||
|
#endif
|
||||||
sync
|
sync
|
||||||
|
#ifdef __linux__
|
||||||
|
.set mips0
|
||||||
|
#endif
|
||||||
j ra
|
j ra
|
||||||
END(opal_atomic_rmb)
|
END(opal_atomic_rmb)
|
||||||
|
|
||||||
|
|
||||||
LEAF(opal_atomic_wmb)
|
LEAF(opal_atomic_wmb)
|
||||||
|
#ifdef __linux__
|
||||||
|
.set mips2
|
||||||
|
#endif
|
||||||
sync
|
sync
|
||||||
|
#ifdef __linux__
|
||||||
|
.set mips0
|
||||||
|
#endif
|
||||||
j ra
|
j ra
|
||||||
END(opal_atomic_wmb)
|
END(opal_atomic_wmb)
|
||||||
|
|
||||||
@ -28,7 +50,13 @@ END(opal_atomic_wmb)
|
|||||||
LEAF(opal_atomic_cmpset_32)
|
LEAF(opal_atomic_cmpset_32)
|
||||||
.set noreorder
|
.set noreorder
|
||||||
retry1:
|
retry1:
|
||||||
|
#ifdef __linux__
|
||||||
|
.set mips2
|
||||||
|
#endif
|
||||||
ll $3, 0($4)
|
ll $3, 0($4)
|
||||||
|
#ifdef __linux__
|
||||||
|
.set mips0
|
||||||
|
#endif
|
||||||
bne $3, $5, done1
|
bne $3, $5, done1
|
||||||
or $2, $6, 0
|
or $2, $6, 0
|
||||||
sc $2, 0($4)
|
sc $2, 0($4)
|
||||||
@ -45,13 +73,31 @@ END(opal_atomic_cmpset_32)
|
|||||||
LEAF(opal_atomic_cmpset_acq_32)
|
LEAF(opal_atomic_cmpset_acq_32)
|
||||||
.set noreorder
|
.set noreorder
|
||||||
retry2:
|
retry2:
|
||||||
|
#ifdef __linux__
|
||||||
|
.set mips2
|
||||||
|
#endif
|
||||||
ll $3, 0($4)
|
ll $3, 0($4)
|
||||||
|
#ifdef __linux__
|
||||||
|
.set mips0
|
||||||
|
#endif
|
||||||
bne $3, $5, done2
|
bne $3, $5, done2
|
||||||
or $2, $6, 0
|
or $2, $6, 0
|
||||||
|
#ifdef __linux__
|
||||||
|
.set mips2
|
||||||
|
#endif
|
||||||
sc $2, 0($4)
|
sc $2, 0($4)
|
||||||
|
#ifdef __linux__
|
||||||
|
.set mips0
|
||||||
|
#endif
|
||||||
beqz $2, retry2
|
beqz $2, retry2
|
||||||
done2:
|
done2:
|
||||||
|
#ifdef __linux__
|
||||||
|
.set mips2
|
||||||
|
#endif
|
||||||
sync
|
sync
|
||||||
|
#ifdef __linux__
|
||||||
|
.set mips0
|
||||||
|
#endif
|
||||||
.set reorder
|
.set reorder
|
||||||
|
|
||||||
xor $3,$3,$5
|
xor $3,$3,$5
|
||||||
@ -62,12 +108,30 @@ END(opal_atomic_cmpset_acq_32)
|
|||||||
|
|
||||||
LEAF(opal_atomic_cmpset_rel_32)
|
LEAF(opal_atomic_cmpset_rel_32)
|
||||||
.set noreorder
|
.set noreorder
|
||||||
|
#ifdef __linux__
|
||||||
|
.set mips2
|
||||||
|
#endif
|
||||||
sync
|
sync
|
||||||
|
#ifdef __linux__
|
||||||
|
.set mips0
|
||||||
|
#endif
|
||||||
retry3:
|
retry3:
|
||||||
|
#ifdef __linux__
|
||||||
|
.set mips2
|
||||||
|
#endif
|
||||||
ll $3, 0($4)
|
ll $3, 0($4)
|
||||||
|
#ifdef __linux__
|
||||||
|
.set mips0
|
||||||
|
#endif
|
||||||
bne $3, $5, done3
|
bne $3, $5, done3
|
||||||
or $2, $6, 0
|
or $2, $6, 0
|
||||||
|
#ifdef __linux__
|
||||||
|
.set mips2
|
||||||
|
#endif
|
||||||
sc $2, 0($4)
|
sc $2, 0($4)
|
||||||
|
#ifdef __linux__
|
||||||
|
.set mips0
|
||||||
|
#endif
|
||||||
beqz $2, retry3
|
beqz $2, retry3
|
||||||
done3:
|
done3:
|
||||||
.set reorder
|
.set reorder
|
||||||
@ -77,7 +141,7 @@ done3:
|
|||||||
sltu $2,$3,1
|
sltu $2,$3,1
|
||||||
END(opal_atomic_cmpset_rel_32)
|
END(opal_atomic_cmpset_rel_32)
|
||||||
|
|
||||||
|
#ifdef __mips64
|
||||||
LEAF(opal_atomic_cmpset_64)
|
LEAF(opal_atomic_cmpset_64)
|
||||||
.set noreorder
|
.set noreorder
|
||||||
retry4:
|
retry4:
|
||||||
@ -128,3 +192,4 @@ done6:
|
|||||||
j ra
|
j ra
|
||||||
sltu $3,$4,1
|
sltu $3,$4,1
|
||||||
END(opal_atomic_cmpset_rel_64)
|
END(opal_atomic_cmpset_rel_64)
|
||||||
|
#endif /* __mips64 */
|
||||||
|
@ -23,10 +23,17 @@
|
|||||||
#if OPAL_WANT_SMP_LOCKS
|
#if OPAL_WANT_SMP_LOCKS
|
||||||
|
|
||||||
/* BWB - FIX ME! */
|
/* 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 MB() __asm__ __volatile__("sync": : :"memory")
|
||||||
#define RMB() __asm__ __volatile__("sync": : :"memory")
|
#define RMB() __asm__ __volatile__("sync": : :"memory")
|
||||||
#define WMB() __asm__ __volatile__("sync": : :"memory")
|
#define WMB() __asm__ __volatile__("sync": : :"memory")
|
||||||
#define SMP_SYNC "sync"
|
#define SMP_SYNC "sync"
|
||||||
|
#endif
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@ -46,8 +53,10 @@
|
|||||||
#define OPAL_HAVE_ATOMIC_MEM_BARRIER 1
|
#define OPAL_HAVE_ATOMIC_MEM_BARRIER 1
|
||||||
|
|
||||||
#define OPAL_HAVE_ATOMIC_CMPSET_32 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
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
*
|
*
|
||||||
@ -93,10 +102,16 @@ static inline int opal_atomic_cmpset_32(volatile int32_t *addr,
|
|||||||
__asm__ __volatile__ (".set noreorder \n"
|
__asm__ __volatile__ (".set noreorder \n"
|
||||||
".set noat \n"
|
".set noat \n"
|
||||||
"1: \n"
|
"1: \n"
|
||||||
|
#ifdef __linux__
|
||||||
|
".set mips2 \n\t"
|
||||||
|
#endif
|
||||||
"ll %0, %2 \n" /* load *addr into ret */
|
"ll %0, %2 \n" /* load *addr into ret */
|
||||||
"bne %0, %z3, 2f \n" /* done if oldval != ret */
|
"bne %0, %z3, 2f \n" /* done if oldval != ret */
|
||||||
"or $1, %z4, 0 \n" /* tmp = newval (delay slot) */
|
"or $1, %z4, 0 \n" /* tmp = newval (delay slot) */
|
||||||
"sc $1, %2 \n" /* store tmp in *addr */
|
"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 */
|
/* note: ret will be 0 if failed, 1 if succeeded */
|
||||||
"beqz $1, 1b \n" /* if 0 jump back to 1b */
|
"beqz $1, 1b \n" /* if 0 jump back to 1b */
|
||||||
"nop \n" /* fill delay slots */
|
"nop \n" /* fill delay slots */
|
||||||
@ -133,7 +148,7 @@ static inline int opal_atomic_cmpset_rel_32(volatile int32_t *addr,
|
|||||||
return opal_atomic_cmpset_32(addr, oldval, newval);
|
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,
|
static inline int opal_atomic_cmpset_64(volatile int64_t *addr,
|
||||||
int64_t oldval, int64_t newval)
|
int64_t oldval, int64_t newval)
|
||||||
{
|
{
|
||||||
@ -182,6 +197,7 @@ static inline int opal_atomic_cmpset_rel_64(volatile int64_t *addr,
|
|||||||
opal_atomic_wmb();
|
opal_atomic_wmb();
|
||||||
return opal_atomic_cmpset_64(addr, oldval, newval);
|
return opal_atomic_cmpset_64(addr, oldval, newval);
|
||||||
}
|
}
|
||||||
|
#endif /* OPAL_HAVE_ATOMIC_CMPSET_64 */
|
||||||
|
|
||||||
#endif /* OMPI_GCC_INLINE_ASSEMBLY */
|
#endif /* OMPI_GCC_INLINE_ASSEMBLY */
|
||||||
|
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user