aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/alpha
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/alpha')
-rw-r--r--sysdeps/alpha/Dist2
-rw-r--r--sysdeps/alpha/strchr.c84
-rw-r--r--sysdeps/alpha/stxcpy.S33
3 files changed, 19 insertions, 100 deletions
diff --git a/sysdeps/alpha/Dist b/sysdeps/alpha/Dist
index c9419e6..3cc9595 100644
--- a/sysdeps/alpha/Dist
+++ b/sysdeps/alpha/Dist
@@ -3,3 +3,5 @@ DEFS.h
divrem.h
divl.S divlu.S divq.S divqu.S reml.S remlu.S remq.S remqu.S
_mcount.S
+stxcpy.S
+stxncpy.S
diff --git a/sysdeps/alpha/strchr.c b/sysdeps/alpha/strchr.c
deleted file mode 100644
index 69afa4b..0000000
--- a/sysdeps/alpha/strchr.c
+++ /dev/null
@@ -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
diff --git a/sysdeps/alpha/stxcpy.S b/sysdeps/alpha/stxcpy.S
index e381b70..49dd8e5 100644
--- a/sysdeps/alpha/stxcpy.S
+++ b/sysdeps/alpha/stxcpy.S
@@ -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