mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-13 23:00:22 +00:00
(testandset): Call _test_and_set.
(__compare_and_swap): Return 0 only when failed to compare. Use branch likely.
This commit is contained in:
parent
2bcefeb887
commit
0933de63a1
@ -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");
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user