2002-02-01  H.J. Lu  <hjl@gnu.org>

	* sysdeps/mips/atomicity.h (exchange_and_add): Use branch
	likely.
	(atomic_add): Likewise.
	(compare_and_swap): Return 0 only when failed to compare. Use
	branch likely.

	* sysdeps/unix/sysv/linux/mips/sys/tas.h (_test_and_set): Use
	branch likely.

2002-02-03  kaz Kojima  <kkojima@rr.iij4u.or.jp>

	* sysdeps/sh/dl-machine.h (elf_machine_rela): Fix a typo.

2002-02-02  Ulrich Drepper  <drepper@redhat.com>

	* elf/dl-minimal.c (__strsep): New minimal implementation.
This commit is contained in:
Ulrich Drepper 2002-02-03 02:26:37 +00:00
parent b5ef404e08
commit 5c1159b6a9
7 changed files with 112 additions and 65 deletions

View File

@ -1,3 +1,22 @@
2002-02-01 H.J. Lu <hjl@gnu.org>
* sysdeps/mips/atomicity.h (exchange_and_add): Use branch
likely.
(atomic_add): Likewise.
(compare_and_swap): Return 0 only when failed to compare. Use
branch likely.
* sysdeps/unix/sysv/linux/mips/sys/tas.h (_test_and_set): Use
branch likely.
2002-02-03 kaz Kojima <kkojima@rr.iij4u.or.jp>
* sysdeps/sh/dl-machine.h (elf_machine_rela): Fix a typo.
2002-02-02 Ulrich Drepper <drepper@redhat.com>
* elf/dl-minimal.c (__strsep): New minimal implementation.
2002-02-02 Paul Eggert <eggert@twinsun.com>
* src/mktime.c [defined DEBUG && STDC_HEADERS]: Include <string.h>.

View File

@ -291,3 +291,45 @@ _itoa (value, buflim, base, upper_case)
return bp;
}
#endif
/* The following is not a complete strsep implementation. It cannot
handle empty delimiter strings. But this isn't necessary for the
execution of ld.so. */
#undef strsep
#undef __strsep
char *
__strsep (char **stringp, const char *delim)
{
char *begin;
begin = *stringp;
if (begin != NULL)
{
char *end = begin;
while (*end != '\0' || (end = NULL))
{
const char *dp = delim;
do
if (*dp == *end)
break;
while (*++dp != '\0');
if (*dp != '\0')
{
*end++ = '\0';
break;
}
++end;
}
*stringp = end;
}
return begin;
}
weak_alias (__strsep, strsep)
strong_alias (__strsep, __strsep_g)

View File

@ -29,20 +29,21 @@
int
__pthread_spin_lock (pthread_spinlock_t *lock)
{
unsigned int tmp;
unsigned int tmp1, tmp2;
asm volatile
("\t\t\t# spin_lock\n\t"
"ll %1,%3\n"
"1:\n\t"
"ll %1,%2\n\t"
".set push\n\t"
".set noreorder\n\t"
"bnez %1,1b\n\t"
" li %1,1\n\t"
".set pop\n\t"
"sc %1,%0\n\t"
"beqz %1,1b"
: "=m" (*lock), "=&r" (tmp)
" li %2,1\n\t"
"sc %2,%0\n\t"
"beqzl %2,1b\n\t"
" ll %1,%3\n\t"
".set pop"
: "=m" (*lock), "=&r" (tmp1), "=&r" (tmp2)
: "m" (*lock)
: "memory");

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");

View File

@ -33,11 +33,15 @@ exchange_and_add (volatile uint32_t *mem, int val)
__asm__ __volatile__
("/* Inline exchange & add */\n\t"
"ll %0,%3\n"
"1:\n\t"
"ll %0,%3\n\t"
"addu %1,%4,%0\n\t"
"sc %1,%2\n\t"
"beqz %1,1b\n\t"
".set push\n\t"
".set noreorder\n\t"
"beqzl %1,1b\n\t"
" ll %0,%3\n\t"
".set pop\n\t"
"/* End exchange & add */"
: "=&r"(result), "=&r"(tmp), "=m"(*mem)
: "m" (*mem), "r"(val)
@ -54,11 +58,15 @@ atomic_add (volatile uint32_t *mem, int val)
__asm__ __volatile__
("/* Inline atomic add */\n\t"
"ll %0,%2\n"
"1:\n\t"
"ll %0,%2\n\t"
"addu %0,%3,%0\n\t"
"sc %0,%1\n\t"
"beqz %0,1b\n\t"
".set push\n\t"
".set noreorder\n\t"
"beqzl %0,1b\n\t"
" ll %0,%2\n\t"
".set pop\n\t"
"/* End atomic add */"
: "=&r"(result), "=m"(*mem)
: "m" (*mem), "r"(val)
@ -69,22 +77,24 @@ static inline int
__attribute__ ((unused))
compare_and_swap (volatile 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");

View File

@ -513,7 +513,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
found. */
break;
if (sym->st_size > refsym->st_size
|| (sym->st_size < erefsym->st_size && GL(dl_verbose)))
|| (sym->st_size < refsym->st_size && GL(dl_verbose)))
{
const char *strtab;

View File

@ -42,16 +42,19 @@ _test_and_set (int *p, int v) __THROW
int r, t;
__asm__ __volatile__
("1:\n\t"
"ll %0,%3\n\t"
("/* Inline test and set */\n\t"
"ll %0,%3\n"
"1:\n\t"
".set push\n\t"
".set noreorder\n\t"
"beq %0,%4,2f\n\t"
" move %1,%4\n\t"
".set pop\n\t"
"sc %1,%2\n\t"
"beqz %1,1b\n"
"2:\n"
"beqzl %1,1b\n\t"
" ll %0,%3\n\t"
".set pop\n"
"2:\n\t"
"/* End test and set */"
: "=&r" (r), "=&r" (t), "=m" (*p)
: "m" (*p), "r" (v)
: "memory");