1
1

* 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.
Этот коммит содержится в:
Brian Barrett 2006-09-25 22:17:04 +00:00
родитель d0ec0558e4
Коммит 77ceee3bf2
3 изменённых файлов: 79 добавлений и 87 удалений

Просмотреть файл

@ -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