update from main archive 961010

This commit is contained in:
Ulrich Drepper 1996-10-11 03:12:39 +00:00
parent 81e25b608d
commit 05e860710a
3 changed files with 18 additions and 100 deletions

View File

@ -1,84 +0,0 @@
/* Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <string.h>
/* Return the length of the null-terminated string STR. Scan for
the null terminator quickly by testing eight bytes at a time. */
char *
strchr (const char *str, int c)
{
const char *char_ptr;
const unsigned long int *longword_ptr;
unsigned long int charmask;
c = (unsigned char) c;
/* Handle the first few characters by reading one character at a time.
Do this until STR is aligned on a 8-byte border. */
for (char_ptr = str; ((unsigned long int) char_ptr & 7) != 0; ++char_ptr)
if (*char_ptr == c)
return (char *) char_ptr;
else if (*char_ptr == '\0')
return NULL;
longword_ptr = (unsigned long int *) char_ptr;
/* Set up a longword, each of whose bytes is C. */
charmask = c | (c << 8);
charmask |= charmask << 16;
charmask |= charmask << 32;
for (;;)
{
const unsigned long int longword = *longword_ptr++;
int ge, le, zero;
/* Set bits in ZERO if bytes in LONGWORD are zero. */
asm ("cmpbge $31, %1, %0" : "=r" (zero) : "r" (longword));
/* Set bits in GE if bytes in CHARMASK are >= bytes in LONGWORD. */
asm ("cmpbge %1, %2, %0" : "=r" (ge) : "r" (charmask), "r" (longword));
/* Set bits in LE if bytes in CHARMASK are <= bytes in LONGWORD. */
asm ("cmpbge %2, %1, %0" : "=r" (le) : "r" (charmask), "r" (longword));
/* Bytes that are both <= and >= are == to C. */
if (zero || (ge & le))
{
/* Which of the bytes was the C? */
char *cp = (char *) (longword_ptr - 1);
int i;
for (i = 0; i < 8; i++)
{
if (cp[i] == c)
return &cp[i];
if (cp[i] == 0)
return NULL;
}
return NULL;
}
}
}
#ifdef weak_alias
#undef index
weak_alias (strchr, index)
#endif

View File

@ -36,7 +36,7 @@ Cambridge, MA 02139, USA. */
Furthermore, v0, a3-a5, t11, and t12 are untouched.
*/
/* This is generally scheduled for the EV5, but should still be pretty
/* This is generally scheduled for the EV5, but should still be pretty
good for the EV4 too. */
#include <sysdep.h>
@ -65,7 +65,7 @@ stxcpy_aligned:
lda t2, -1 # e1 : build a mask against false zero
mskqh t2, a1, t2 # e0 : detection in the src word
mskqh t1, a1, t3 # e0 :
ornot t1, t2, t2 # .. e1 :
ornot t1, t2, t2 # .. e1 :
mskql t0, a1, t0 # e0 : assemble the first output word
cmpbge zero, t2, t7 # .. e1 : bits set iff null found
or t0, t3, t1 # e0 :
@ -99,9 +99,9 @@ $a_eos:
/* We're doing a partial word store and so need to combine
our source and original destination words. */
ldq_u t0, 0(a0) # e0 :
subq t8, 1, t6 # .. e1 :
subq t8, 1, t6 # .. e1 :
zapnot t1, t6, t1 # e0 : clear src bytes >= null
or t8, t6, t7 # .. e1 :
or t8, t6, t7 # .. e1 :
zap t0, t7, t0 # e0 : clear dst bytes <= null
or t0, t1, t1 # e1 :
@ -156,13 +156,13 @@ $u_head:
or t1, t4, t1 # .. e1 :
mskqh t1, a0, t1 # e0 :
or t0, t1, t1 # e1 :
or t1, t6, t6 # e0 :
cmpbge zero, t6, t7 # .. e1 :
lda t6, -1 # e0 : for masking just below
bne t7, $u_final # .. e1 :
mskql t6, a1, t6 # e0 : mask out the bits we have
mskql t6, a1, t6 # e0 : mask out the bits we have
or t6, t2, t2 # e1 : already extracted before
cmpbge zero, t2, t7 # e0 : testing eos
bne t7, $u_late_head_exit # .. e1 (zdb)
@ -181,7 +181,7 @@ $u_head:
/* Unaligned copy main loop. In order to avoid reading too much,
the loop is structured to detect zeros in aligned source words.
This has, unfortunately, effectively pulled half of a loop
This has, unfortunately, effectively pulled half of a loop
iteration out into the head and half into the tail, but it does
prevent nastiness from accumulating in the very thing we want
to run as fast as possible.
@ -207,7 +207,7 @@ $u_loop:
/* We've found a zero somewhere in the source word we just read.
If it resides in the lower half, we have one (probably partial)
word to write out, and if it resides in the upper half, we
word to write out, and if it resides in the upper half, we
have one full and one partial word left to write out.
On entry to this basic block:
@ -234,7 +234,7 @@ $u_final:
negq t7, t6 # e0 : isolate low bit set
and t6, t7, t8 # e1 :
and t8, 0x80, t6 # e0 : avoid dest word load if we can
and t8, 0x80, t6 # e0 : avoid dest word load if we can
bne t6, 1f # .. e1 (zdb)
ldq_u t0, 0(a0) # e0 :
@ -256,7 +256,7 @@ $unaligned:
and a0, 7, t4 # .. e1 : find dest misalignment
and a1, 7, t5 # e0 : find src misalignment
/* Conditionally load the first destination word and a bytemask
/* Conditionally load the first destination word and a bytemask
with 0xff indicating that the destination byte is sacrosanct. */
mov zero, t0 # .. e1 :
@ -290,18 +290,19 @@ $unaligned:
negq t7, t6 # .. e1 : build bitmask of bytes <= zero
and t6, t7, t8 # e0 :
nop # .. e1 :
and a1, 7, t5 # .. e1 :
subq t8, 1, t6 # e0 :
or t6, t8, t7 # e1 :
srl t8, t5, t8 # e0 : adjust final null return value
zapnot t2, t7, t2 # e0 : prepare source word; mirror changes
zapnot t2, t7, t2 # .. e1 : prepare source word; mirror changes
and t1, t2, t1 # e1 : to source validity mask
extql t2, a1, t2 # e0 :
extql t2, a1, t2 # .. e0 :
extql t1, a1, t1 # e0 :
andnot t0, t2, t0 # e0 : zero place for source to reside
andnot t0, t2, t0 # .. e1 : zero place for source to reside
or t0, t1, t1 # e1 : and put it there
stq_u t1, 0(a0) # e0 :
ret (t9) # .. e1 :
stq_u t1, 0(a0) # .. e0 :
ret (t9)
.end __stxcpy

View File

@ -21,6 +21,7 @@ error. Instead, the error condition is indicated by returning the old
break value (instead of the new, requested one). */
#include <sysdep.h>
#define _ERRNO_H
#include <errnos.h>
#ifdef PIC