(testandset): Call _test_and_set.

(__compare_and_swap): Return 0 only when failed to compare. Use branch likely.
This commit is contained in:
Ulrich Drepper 2002-02-03 02:27:34 +00:00
parent 2bcefeb887
commit 0933de63a1

View File

@ -33,41 +33,11 @@
/* Spinlock implementation; required. */
#if (_MIPS_ISA >= _MIPS_ISA_MIPS2)
PT_EI long int
testandset (int *spinlock)
{
long int ret, temp;
__asm__ __volatile__
("/* Inline spinlock test & set */\n\t"
"1:\n\t"
"ll %0,%3\n\t"
".set push\n\t"
".set noreorder\n\t"
"bnez %0,2f\n\t"
" li %1,1\n\t"
".set pop\n\t"
"sc %1,%2\n\t"
"beqz %1,1b\n"
"2:\n\t"
"/* End spinlock test & set */"
: "=&r" (ret), "=&r" (temp), "=m" (*spinlock)
: "m" (*spinlock)
: "memory");
return ret;
}
#else /* !(_MIPS_ISA >= _MIPS_ISA_MIPS2) */
PT_EI long int
testandset (int *spinlock)
{
return _test_and_set (spinlock, 1);
}
#endif /* !(_MIPS_ISA >= _MIPS_ISA_MIPS2) */
/* Get some notion of the current stack. Need not be exactly the top
@ -84,22 +54,24 @@ register char * stack_pointer __asm__ ("$29");
PT_EI int
__compare_and_swap (long int *p, long int oldval, long int newval)
{
long int ret;
long int ret, temp;
__asm__ __volatile__
("/* Inline compare & swap */\n\t"
"ll %1,%5\n"
"1:\n\t"
"ll %0,%4\n\t"
".set push\n"
".set push\n\t"
".set noreorder\n\t"
"bne %0,%2,2f\n\t"
" move %0,%3\n\t"
".set pop\n\t"
"sc %0,%1\n\t"
"beqz %0,1b\n"
"bne %1,%3,2f\n\t"
" move %0,$0\n\t"
"move %0,%4\n\t"
"sc %0,%2\n\t"
"beqzl %0,1b\n\t"
" ll %1,%5\n\t"
".set pop\n"
"2:\n\t"
"/* End compare & swap */"
: "=&r" (ret), "=m" (*p)
: "=&r" (ret), "=&r" (temp), "=m" (*p)
: "r" (oldval), "r" (newval), "m" (*p)
: "memory");