* Fix cmpset_32 / 64 so that ret always returns the right value and
there is an exit path out of the loop * Reformat assembly to match other platforms * Update base file for non-inline assembly to match changes in the inline version This commit was SVN r11803.
Этот коммит содержится в:
родитель
d0ec0558e4
Коммит
77ceee3bf2
@ -55,14 +55,15 @@ opal_atomic_cmpset_32:
|
||||
.frame $30,0,$26,0
|
||||
.prologue 0
|
||||
.set macro
|
||||
1: ldl_l $0, 0($16)
|
||||
cmpeq $0, $17, $0
|
||||
beq $0, 2f
|
||||
mov $18, $0
|
||||
stl_c $0, 0($16)
|
||||
beq $0, 3f
|
||||
2:
|
||||
3: br 1b
|
||||
1: ldl_l $0, 0($16)
|
||||
cmpeq $0, $17, $0
|
||||
beq $0, 2f
|
||||
mov $18, $0
|
||||
stl_c $0, 0($16)
|
||||
beq $0, 1b
|
||||
jmp 3f
|
||||
2: mov $31, $0
|
||||
3:
|
||||
|
||||
.set nomacro
|
||||
addl $31,$0,$0
|
||||
@ -78,14 +79,15 @@ opal_atomic_cmpset_acq_32:
|
||||
.frame $30,0,$26,0
|
||||
.prologue 0
|
||||
.set macro
|
||||
1: ldl_l $0, 0($16)
|
||||
cmpeq $0, $17, $0
|
||||
beq $0, 2f
|
||||
mov $18, $0
|
||||
stl_c $0, 0($16)
|
||||
beq $0, 3f
|
||||
2:
|
||||
3: br 1b
|
||||
1: ldl_l $0, 0($16)
|
||||
cmpeq $0, $17, $0
|
||||
beq $0, 2f
|
||||
mov $18, $0
|
||||
stl_c $0, 0($16)
|
||||
beq $0, 1b
|
||||
jmp 3f
|
||||
2: mov $31, $0
|
||||
3:
|
||||
|
||||
.set nomacro
|
||||
addl $31,$0,$0
|
||||
@ -105,14 +107,15 @@ opal_atomic_cmpset_rel_32:
|
||||
.prologue 0
|
||||
.set macro
|
||||
wmb
|
||||
1: ldl_l $0, 0($16)
|
||||
cmpeq $0, $17, $0
|
||||
beq $0, 2f
|
||||
mov $18, $0
|
||||
stl_c $0, 0($16)
|
||||
beq $0, 3f
|
||||
2:
|
||||
3: br 1b
|
||||
1: ldl_l $0, 0($16)
|
||||
cmpeq $0, $17, $0
|
||||
beq $0, 2f
|
||||
mov $18, $0
|
||||
stl_c $0, 0($16)
|
||||
beq $0, 1b
|
||||
jmp 3f
|
||||
2: mov $31, $0
|
||||
3:
|
||||
|
||||
.set nomacro
|
||||
addl $31,$0,$0
|
||||
@ -128,14 +131,15 @@ opal_atomic_cmpset_64:
|
||||
.frame $30,0,$26,0
|
||||
.prologue 0
|
||||
.set macro
|
||||
1: ldq_l $0, 0($16)
|
||||
cmpeq $0, $17, $0
|
||||
beq $0, 2f
|
||||
mov $18, $0
|
||||
stq_c $0, 0($16)
|
||||
beq $0, 3f
|
||||
2:
|
||||
3: br 1b
|
||||
1: ldq_l $0, 0($16)
|
||||
cmpeq $0, $17, $0
|
||||
beq $0, 2f
|
||||
mov $18, $0
|
||||
stq_c $0, 0($16)
|
||||
beq $0, 1b
|
||||
jmp 3f
|
||||
2: mov $31, $0
|
||||
3:
|
||||
|
||||
.set nomacro
|
||||
addl $31,$0,$0
|
||||
@ -151,14 +155,15 @@ opal_atomic_cmpset_acq_64:
|
||||
.frame $30,0,$26,0
|
||||
.prologue 0
|
||||
.set macro
|
||||
1: ldq_l $0, 0($16)
|
||||
cmpeq $0, $17, $0
|
||||
beq $0, 2f
|
||||
mov $18, $0
|
||||
stq_c $0, 0($16)
|
||||
beq $0, 3f
|
||||
2:
|
||||
3: br 1b
|
||||
1: ldq_l $0, 0($16)
|
||||
cmpeq $0, $17, $0
|
||||
beq $0, 2f
|
||||
mov $18, $0
|
||||
stq_c $0, 0($16)
|
||||
beq $0, 1b
|
||||
jmp 3f
|
||||
2: mov $31, $0
|
||||
3:
|
||||
|
||||
.set nomacro
|
||||
addl $31,$0,$0
|
||||
@ -178,33 +183,19 @@ opal_atomic_cmpset_rel_64:
|
||||
.prologue 0
|
||||
.set macro
|
||||
wmb
|
||||
1: ldq_l $0, 0($16)
|
||||
cmpeq $0, $17, $0
|
||||
beq $0, 2f
|
||||
mov $18, $0
|
||||
stq_c $0, 0($16)
|
||||
beq $0, 3f
|
||||
2:
|
||||
3: br 1b
|
||||
1: ldq_l $0, 0($16)
|
||||
cmpeq $0, $17, $0
|
||||
beq $0, 2f
|
||||
mov $18, $0
|
||||
stq_c $0, 0($16)
|
||||
beq $0, 1b
|
||||
jmp 3f
|
||||
2: mov $31, $0
|
||||
3:
|
||||
|
||||
.set nomacro
|
||||
addl $31,$0,$0
|
||||
ret $31,($26),1
|
||||
.end opal_atomic_cmpset_rel_64
|
||||
.align 2
|
||||
.align 4
|
||||
.globl opal_sys_timer_get_cycles
|
||||
.ent opal_sys_timer_get_cycles
|
||||
$opal_sys_timer_get_cycles..ng:
|
||||
opal_sys_timer_get_cycles:
|
||||
.eflag 48
|
||||
.frame $30,0,$26,0
|
||||
.prologue 0
|
||||
.set macro
|
||||
rpcc $0
|
||||
.set nomacro
|
||||
addl $31,$0,$0
|
||||
ret $31,($26),1
|
||||
.end opal_sys_timer_get_cycles
|
||||
.section .note.GNU-stack,"",@progbits
|
||||
.ident "GCC: (GNU) 3.4.6 (Gentoo 3.4.6-r1, ssp-3.4.5-1.0, pie-8.7.9)"
|
||||
|
@ -90,17 +90,18 @@ static inline int opal_atomic_cmpset_32( volatile int32_t *addr,
|
||||
int32_t ret;
|
||||
|
||||
__asm __volatile__ (
|
||||
"1: ldl_l %0, %1 \n\
|
||||
cmpeq %0, %2, %0 \n\
|
||||
beq %0, 2f \n\
|
||||
mov %3, %0 \n\
|
||||
stl_c %0, %1 \n\
|
||||
beq %0, 3f \n\
|
||||
2: \n\
|
||||
3: br 1b \n"
|
||||
: "=&r" (ret), "+m" (*addr)
|
||||
: "r" (oldval), "r" (newval)
|
||||
: "memory");
|
||||
"1: ldl_l %0, %1 \n\t"
|
||||
"cmpeq %0, %2, %0 \n\t"
|
||||
"beq %0, 2f \n\t"
|
||||
"mov %3, %0 \n\t"
|
||||
"stl_c %0, %1 \n\t"
|
||||
"beq %0, 1b \n\t"
|
||||
"jmp 3f \n"
|
||||
"2: mov $31, %0 \n"
|
||||
"3: \n"
|
||||
: "=&r" (ret), "+m" (*addr)
|
||||
: "r" (oldval), "r" (newval)
|
||||
: "memory");
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -134,17 +135,18 @@ static inline int opal_atomic_cmpset_64( volatile int64_t *addr,
|
||||
int32_t ret;
|
||||
|
||||
__asm__ __volatile__ (
|
||||
"1: ldq_l %0, %1 \n\
|
||||
cmpeq %0, %2, %0 \n\
|
||||
beq %0, 2f \n\
|
||||
mov %3, %0 \n\
|
||||
stq_c %0, %1 \n\
|
||||
beq %0, 3f \n\
|
||||
2: \n\
|
||||
3: br 1b \n"
|
||||
: "=&r" (ret), "+m" (*addr)
|
||||
: "r" (oldval), "r" (newval)
|
||||
: "memory");
|
||||
"1: ldq_l %0, %1 \n\t"
|
||||
"cmpeq %0, %2, %0 \n\t"
|
||||
"beq %0, 2f \n\t"
|
||||
"mov %3, %0 \n\t"
|
||||
"stq_c %0, %1 \n\t"
|
||||
"beq %0, 1b \n\t"
|
||||
"jmp 3f \n"
|
||||
"2: mov $31, %0 \n"
|
||||
"3: \n"
|
||||
: "=&r" (ret), "+m" (*addr)
|
||||
: "r" (oldval), "r" (newval)
|
||||
: "memory");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -21,7 +21,7 @@ CFILE=/tmp/opal_atomic_$$.c
|
||||
|
||||
trap "/bin/rm -f $CFILE; exit 0" 0 1 2 15
|
||||
|
||||
echo Updating asm.s from atomic.h and timer.h using gcc
|
||||
echo Updating asm.s from atomic.h using gcc
|
||||
|
||||
cat > $CFILE<<EOF
|
||||
#include <stdlib.h>
|
||||
@ -31,7 +31,6 @@ cat > $CFILE<<EOF
|
||||
#define OMPI_GCC_INLINE_ASSEMBLY 1
|
||||
#define OMPI_WANT_SMP_LOCKS 1
|
||||
#include "atomic.h"
|
||||
#include "timer.h"
|
||||
EOF
|
||||
|
||||
gcc -O3 -I. -S $CFILE -o asm.s
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user