* 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
|
.frame $30,0,$26,0
|
||||||
.prologue 0
|
.prologue 0
|
||||||
.set macro
|
.set macro
|
||||||
1: ldl_l $0, 0($16)
|
1: ldl_l $0, 0($16)
|
||||||
cmpeq $0, $17, $0
|
cmpeq $0, $17, $0
|
||||||
beq $0, 2f
|
beq $0, 2f
|
||||||
mov $18, $0
|
mov $18, $0
|
||||||
stl_c $0, 0($16)
|
stl_c $0, 0($16)
|
||||||
beq $0, 3f
|
beq $0, 1b
|
||||||
2:
|
jmp 3f
|
||||||
3: br 1b
|
2: mov $31, $0
|
||||||
|
3:
|
||||||
|
|
||||||
.set nomacro
|
.set nomacro
|
||||||
addl $31,$0,$0
|
addl $31,$0,$0
|
||||||
@ -78,14 +79,15 @@ opal_atomic_cmpset_acq_32:
|
|||||||
.frame $30,0,$26,0
|
.frame $30,0,$26,0
|
||||||
.prologue 0
|
.prologue 0
|
||||||
.set macro
|
.set macro
|
||||||
1: ldl_l $0, 0($16)
|
1: ldl_l $0, 0($16)
|
||||||
cmpeq $0, $17, $0
|
cmpeq $0, $17, $0
|
||||||
beq $0, 2f
|
beq $0, 2f
|
||||||
mov $18, $0
|
mov $18, $0
|
||||||
stl_c $0, 0($16)
|
stl_c $0, 0($16)
|
||||||
beq $0, 3f
|
beq $0, 1b
|
||||||
2:
|
jmp 3f
|
||||||
3: br 1b
|
2: mov $31, $0
|
||||||
|
3:
|
||||||
|
|
||||||
.set nomacro
|
.set nomacro
|
||||||
addl $31,$0,$0
|
addl $31,$0,$0
|
||||||
@ -105,14 +107,15 @@ opal_atomic_cmpset_rel_32:
|
|||||||
.prologue 0
|
.prologue 0
|
||||||
.set macro
|
.set macro
|
||||||
wmb
|
wmb
|
||||||
1: ldl_l $0, 0($16)
|
1: ldl_l $0, 0($16)
|
||||||
cmpeq $0, $17, $0
|
cmpeq $0, $17, $0
|
||||||
beq $0, 2f
|
beq $0, 2f
|
||||||
mov $18, $0
|
mov $18, $0
|
||||||
stl_c $0, 0($16)
|
stl_c $0, 0($16)
|
||||||
beq $0, 3f
|
beq $0, 1b
|
||||||
2:
|
jmp 3f
|
||||||
3: br 1b
|
2: mov $31, $0
|
||||||
|
3:
|
||||||
|
|
||||||
.set nomacro
|
.set nomacro
|
||||||
addl $31,$0,$0
|
addl $31,$0,$0
|
||||||
@ -128,14 +131,15 @@ opal_atomic_cmpset_64:
|
|||||||
.frame $30,0,$26,0
|
.frame $30,0,$26,0
|
||||||
.prologue 0
|
.prologue 0
|
||||||
.set macro
|
.set macro
|
||||||
1: ldq_l $0, 0($16)
|
1: ldq_l $0, 0($16)
|
||||||
cmpeq $0, $17, $0
|
cmpeq $0, $17, $0
|
||||||
beq $0, 2f
|
beq $0, 2f
|
||||||
mov $18, $0
|
mov $18, $0
|
||||||
stq_c $0, 0($16)
|
stq_c $0, 0($16)
|
||||||
beq $0, 3f
|
beq $0, 1b
|
||||||
2:
|
jmp 3f
|
||||||
3: br 1b
|
2: mov $31, $0
|
||||||
|
3:
|
||||||
|
|
||||||
.set nomacro
|
.set nomacro
|
||||||
addl $31,$0,$0
|
addl $31,$0,$0
|
||||||
@ -151,14 +155,15 @@ opal_atomic_cmpset_acq_64:
|
|||||||
.frame $30,0,$26,0
|
.frame $30,0,$26,0
|
||||||
.prologue 0
|
.prologue 0
|
||||||
.set macro
|
.set macro
|
||||||
1: ldq_l $0, 0($16)
|
1: ldq_l $0, 0($16)
|
||||||
cmpeq $0, $17, $0
|
cmpeq $0, $17, $0
|
||||||
beq $0, 2f
|
beq $0, 2f
|
||||||
mov $18, $0
|
mov $18, $0
|
||||||
stq_c $0, 0($16)
|
stq_c $0, 0($16)
|
||||||
beq $0, 3f
|
beq $0, 1b
|
||||||
2:
|
jmp 3f
|
||||||
3: br 1b
|
2: mov $31, $0
|
||||||
|
3:
|
||||||
|
|
||||||
.set nomacro
|
.set nomacro
|
||||||
addl $31,$0,$0
|
addl $31,$0,$0
|
||||||
@ -178,33 +183,19 @@ opal_atomic_cmpset_rel_64:
|
|||||||
.prologue 0
|
.prologue 0
|
||||||
.set macro
|
.set macro
|
||||||
wmb
|
wmb
|
||||||
1: ldq_l $0, 0($16)
|
1: ldq_l $0, 0($16)
|
||||||
cmpeq $0, $17, $0
|
cmpeq $0, $17, $0
|
||||||
beq $0, 2f
|
beq $0, 2f
|
||||||
mov $18, $0
|
mov $18, $0
|
||||||
stq_c $0, 0($16)
|
stq_c $0, 0($16)
|
||||||
beq $0, 3f
|
beq $0, 1b
|
||||||
2:
|
jmp 3f
|
||||||
3: br 1b
|
2: mov $31, $0
|
||||||
|
3:
|
||||||
|
|
||||||
.set nomacro
|
.set nomacro
|
||||||
addl $31,$0,$0
|
addl $31,$0,$0
|
||||||
ret $31,($26),1
|
ret $31,($26),1
|
||||||
.end opal_atomic_cmpset_rel_64
|
.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
|
.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)"
|
.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;
|
int32_t ret;
|
||||||
|
|
||||||
__asm __volatile__ (
|
__asm __volatile__ (
|
||||||
"1: ldl_l %0, %1 \n\
|
"1: ldl_l %0, %1 \n\t"
|
||||||
cmpeq %0, %2, %0 \n\
|
"cmpeq %0, %2, %0 \n\t"
|
||||||
beq %0, 2f \n\
|
"beq %0, 2f \n\t"
|
||||||
mov %3, %0 \n\
|
"mov %3, %0 \n\t"
|
||||||
stl_c %0, %1 \n\
|
"stl_c %0, %1 \n\t"
|
||||||
beq %0, 3f \n\
|
"beq %0, 1b \n\t"
|
||||||
2: \n\
|
"jmp 3f \n"
|
||||||
3: br 1b \n"
|
"2: mov $31, %0 \n"
|
||||||
: "=&r" (ret), "+m" (*addr)
|
"3: \n"
|
||||||
: "r" (oldval), "r" (newval)
|
: "=&r" (ret), "+m" (*addr)
|
||||||
: "memory");
|
: "r" (oldval), "r" (newval)
|
||||||
|
: "memory");
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -134,17 +135,18 @@ static inline int opal_atomic_cmpset_64( volatile int64_t *addr,
|
|||||||
int32_t ret;
|
int32_t ret;
|
||||||
|
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
"1: ldq_l %0, %1 \n\
|
"1: ldq_l %0, %1 \n\t"
|
||||||
cmpeq %0, %2, %0 \n\
|
"cmpeq %0, %2, %0 \n\t"
|
||||||
beq %0, 2f \n\
|
"beq %0, 2f \n\t"
|
||||||
mov %3, %0 \n\
|
"mov %3, %0 \n\t"
|
||||||
stq_c %0, %1 \n\
|
"stq_c %0, %1 \n\t"
|
||||||
beq %0, 3f \n\
|
"beq %0, 1b \n\t"
|
||||||
2: \n\
|
"jmp 3f \n"
|
||||||
3: br 1b \n"
|
"2: mov $31, %0 \n"
|
||||||
: "=&r" (ret), "+m" (*addr)
|
"3: \n"
|
||||||
: "r" (oldval), "r" (newval)
|
: "=&r" (ret), "+m" (*addr)
|
||||||
: "memory");
|
: "r" (oldval), "r" (newval)
|
||||||
|
: "memory");
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ CFILE=/tmp/opal_atomic_$$.c
|
|||||||
|
|
||||||
trap "/bin/rm -f $CFILE; exit 0" 0 1 2 15
|
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
|
cat > $CFILE<<EOF
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -31,7 +31,6 @@ cat > $CFILE<<EOF
|
|||||||
#define OMPI_GCC_INLINE_ASSEMBLY 1
|
#define OMPI_GCC_INLINE_ASSEMBLY 1
|
||||||
#define OMPI_WANT_SMP_LOCKS 1
|
#define OMPI_WANT_SMP_LOCKS 1
|
||||||
#include "atomic.h"
|
#include "atomic.h"
|
||||||
#include "timer.h"
|
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
gcc -O3 -I. -S $CFILE -o asm.s
|
gcc -O3 -I. -S $CFILE -o asm.s
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user