mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-25 14:30:06 +00:00
Update.
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:
parent
b5ef404e08
commit
5c1159b6a9
19
ChangeLog
19
ChangeLog
@ -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>.
|
||||
|
@ -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)
|
||||
|
@ -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");
|
||||
|
||||
|
@ -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");
|
||||
|
||||
|
@ -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");
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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");
|
||||
|
Loading…
Reference in New Issue
Block a user