mirror of
git://sourceware.org/git/glibc.git
synced 2025-03-19 13:40:59 +08:00
Sparc string routines from Jakub.
1999-03-29 Jakub Jelinek <jj@ultra.linux.cz> * sysdeps/sparc/sparc32/sparcv8/Makefile: New file. * sysdeps/sparc/sparc32/sparcv8/rem.S: Delay after write %y. * sysdeps/sparc/sparc32/sparcv8/sdiv.S: Likewise. * sysdeps/sparc/sparc32/sparcv8/udiv.S: Likewise. * sysdeps/sparc/sparc32/sparcv8/urem.S: Likewise. * sysdeps/sparc/sparc32/sparcv9/bcopy.c: New file. * sysdeps/sparc/sparc32/sparcv9/bzero.c: New file. * sysdeps/sparc/sparc32/sparcv9/memchr.S: New file. * sysdeps/sparc/sparc32/sparcv9/memcmp.S: New file. * sysdeps/sparc/sparc32/sparcv9/memcpy.S: New file. * sysdeps/sparc/sparc32/sparcv9/memset.S: New file. * sysdeps/sparc/sparc32/sparcv9/stpcpy.S: New file. * sysdeps/sparc/sparc32/sparcv9/strcat.S: New file. * sysdeps/sparc/sparc32/sparcv9/strchr.S: New file. * sysdeps/sparc/sparc32/sparcv9/strcmp.S: New file. * sysdeps/sparc/sparc32/sparcv9/strcpy.S: New file. * sysdeps/sparc/sparc32/sparcv9/strcspn.S: New file. * sysdeps/sparc/sparc32/sparcv9/strlen.S: New file. * sysdeps/sparc/sparc32/sparcv9/strncpy.S: New file. * sysdeps/sparc/sparc32/sparcv9/strpbrk.S: New file. * sysdeps/sparc/sparc32/sparcv9/strrchr.c: New file. * sysdeps/sparc/sparc32/sparcv9/strspn.S: New file. * sysdeps/sparc/sparc32/sparcv9/dotmul.S: New file. * sysdeps/sparc/sparc32/sparcv9/rem.S: New file. * sysdeps/sparc/sparc32/sparcv9/sdiv.S: New file. * sysdeps/sparc/sparc32/sparcv9/udiv.S: New file. * sysdeps/sparc/sparc32/sparcv9/umul.S: New file. * sysdeps/sparc/sparc32/sparcv9/urem.S: New file. * sysdeps/sparc/sparc32/sparcv9/Makefile: New file. * sysdeps/sparc/sparc32/sparcv9/stpncpy.S: New file. * sysdeps/sparc/sparc32/sparcv9/strncmp.S: New file. * sysdeps/sparc/sparc32/bcopy.c: New file. * sysdeps/sparc/sparc32/bzero.c: New file. * sysdeps/sparc/sparc32/memchr.S: New file. * sysdeps/sparc/sparc32/memcpy.S: New file. * sysdeps/sparc/sparc32/memmove.c: New file. * sysdeps/sparc/sparc32/memset.S: New file. * sysdeps/sparc/sparc32/stpcpy.S: New file. * sysdeps/sparc/sparc32/strchr.S: New file. * sysdeps/sparc/sparc32/strrchr.c: New file. * sysdeps/sparc/sparc32/strcpy.S: New file. * sysdeps/sparc/sparc32/strlen.S: New file. * sysdeps/sparc/sparc32/strcat.S: New file. * sysdeps/sparc/sparc32/strcmp.S: New file. * sysdeps/sparc/sparc64/bcopy.c: New file. * sysdeps/sparc/sparc64/bzero.c: New file. * sysdeps/sparc/sparc64/memchr.S: New file. * sysdeps/sparc/sparc64/memcmp.S: New file. * sysdeps/sparc/sparc64/memcpy.S: New file. * sysdeps/sparc/sparc64/memset.S: New file. * sysdeps/sparc/sparc64/stpcpy.S: New file. * sysdeps/sparc/sparc64/strcat.S: New file. * sysdeps/sparc/sparc64/strchr.S: New file. * sysdeps/sparc/sparc64/strcmp.S: New file. * sysdeps/sparc/sparc64/strcpy.S: New file. * sysdeps/sparc/sparc64/strcspn.S: New file. * sysdeps/sparc/sparc64/strlen.S: New file. * sysdeps/sparc/sparc64/strncpy.S: New file. * sysdeps/sparc/sparc64/strpbrk.S: New file. * sysdeps/sparc/sparc64/strrchr.c: New file. * sysdeps/sparc/sparc64/strspn.S: New file. * sysdeps/sparc/sparc64/stpncpy.S: New file. * sysdeps/sparc/sparc64/strncmp.S: New file. * sysdeps/unix/sysv/linux/sparc/sparc32/Makefile (ASFLAGS-.os): Append -fPIC, don't replace. * configure.in: Recognize sparcv8plus / sparcv9.
This commit is contained in:
parent
b47516084b
commit
ae6b873031
ChangeLogconfigureconfigure.in
sysdeps
sparc
sparc32
bcopy.cbzero.cmemchr.Smemcpy.Smemmove.cmemset.S
sparcv8
sparcv9
Makefilebcopy.cbzero.cdotmul.Smemchr.Smemcmp.Smemcpy.Smemset.Srem.Ssdiv.Sstpcpy.Sstpncpy.Sstrcat.Sstrchr.Sstrcmp.Sstrcpy.Sstrcspn.Sstrlen.Sstrncmp.Sstrncpy.Sstrpbrk.Sstrrchr.cstrspn.Sudiv.Sumul.Surem.S
stpcpy.Sstrcat.Sstrchr.Sstrcmp.Sstrcpy.Sstrlen.Sstrrchr.csparc64
unix/sysv/linux/sparc/sparc32
74
ChangeLog
74
ChangeLog
@ -1,3 +1,77 @@
|
||||
1999-03-29 Jakub Jelinek <jj@ultra.linux.cz>
|
||||
|
||||
* sysdeps/sparc/sparc32/sparcv8/Makefile: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv8/rem.S: Delay after write %y.
|
||||
* sysdeps/sparc/sparc32/sparcv8/sdiv.S: Likewise.
|
||||
* sysdeps/sparc/sparc32/sparcv8/udiv.S: Likewise.
|
||||
* sysdeps/sparc/sparc32/sparcv8/urem.S: Likewise.
|
||||
|
||||
* sysdeps/sparc/sparc32/sparcv9/bcopy.c: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/bzero.c: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/memchr.S: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/memcmp.S: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/memcpy.S: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/memset.S: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/stpcpy.S: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/strcat.S: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/strchr.S: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/strcmp.S: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/strcpy.S: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/strcspn.S: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/strlen.S: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/strncpy.S: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/strpbrk.S: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/strrchr.c: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/strspn.S: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/dotmul.S: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/rem.S: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/sdiv.S: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/udiv.S: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/umul.S: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/urem.S: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/Makefile: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/stpncpy.S: New file.
|
||||
* sysdeps/sparc/sparc32/sparcv9/strncmp.S: New file.
|
||||
|
||||
* sysdeps/sparc/sparc32/bcopy.c: New file.
|
||||
* sysdeps/sparc/sparc32/bzero.c: New file.
|
||||
* sysdeps/sparc/sparc32/memchr.S: New file.
|
||||
* sysdeps/sparc/sparc32/memcpy.S: New file.
|
||||
* sysdeps/sparc/sparc32/memmove.c: New file.
|
||||
* sysdeps/sparc/sparc32/memset.S: New file.
|
||||
* sysdeps/sparc/sparc32/stpcpy.S: New file.
|
||||
* sysdeps/sparc/sparc32/strchr.S: New file.
|
||||
* sysdeps/sparc/sparc32/strrchr.c: New file.
|
||||
* sysdeps/sparc/sparc32/strcpy.S: New file.
|
||||
* sysdeps/sparc/sparc32/strlen.S: New file.
|
||||
* sysdeps/sparc/sparc32/strcat.S: New file.
|
||||
* sysdeps/sparc/sparc32/strcmp.S: New file.
|
||||
|
||||
* sysdeps/sparc/sparc64/bcopy.c: New file.
|
||||
* sysdeps/sparc/sparc64/bzero.c: New file.
|
||||
* sysdeps/sparc/sparc64/memchr.S: New file.
|
||||
* sysdeps/sparc/sparc64/memcmp.S: New file.
|
||||
* sysdeps/sparc/sparc64/memcpy.S: New file.
|
||||
* sysdeps/sparc/sparc64/memset.S: New file.
|
||||
* sysdeps/sparc/sparc64/stpcpy.S: New file.
|
||||
* sysdeps/sparc/sparc64/strcat.S: New file.
|
||||
* sysdeps/sparc/sparc64/strchr.S: New file.
|
||||
* sysdeps/sparc/sparc64/strcmp.S: New file.
|
||||
* sysdeps/sparc/sparc64/strcpy.S: New file.
|
||||
* sysdeps/sparc/sparc64/strcspn.S: New file.
|
||||
* sysdeps/sparc/sparc64/strlen.S: New file.
|
||||
* sysdeps/sparc/sparc64/strncpy.S: New file.
|
||||
* sysdeps/sparc/sparc64/strpbrk.S: New file.
|
||||
* sysdeps/sparc/sparc64/strrchr.c: New file.
|
||||
* sysdeps/sparc/sparc64/strspn.S: New file.
|
||||
* sysdeps/sparc/sparc64/stpncpy.S: New file.
|
||||
* sysdeps/sparc/sparc64/strncmp.S: New file.
|
||||
|
||||
* sysdeps/unix/sysv/linux/sparc/sparc32/Makefile (ASFLAGS-.os):
|
||||
Append -fPIC, don't replace.
|
||||
|
||||
* configure.in: Recognize sparcv8plus / sparcv9.
|
||||
|
||||
1999-03-27 Andreas Jaeger <aj@arthur.rhein-neckar.de>
|
||||
|
||||
* malloc/obstack.h (obstack_free): Explicitly convert __obj to
|
||||
|
4
configure
vendored
4
configure
vendored
@ -907,6 +907,8 @@ sparc | sparcv[67])
|
||||
base_machine=sparc machine=sparc/sparc32 ;;
|
||||
sparcv8 | supersparc | hypersparc)
|
||||
base_machine=sparc machine=sparc/sparc32/sparcv8 ;;
|
||||
sparcv8plus | sparcv8plusa | sparcv9)
|
||||
base_machine=sparc machine=sparc/sparc32/sparcv9 ;;
|
||||
sparc64 | ultrasparc)
|
||||
base_machine=sparc machine=sparc/sparc64 ;;
|
||||
esac
|
||||
@ -972,7 +974,7 @@ while b=`echo $tail | sed 's@^\(.*\)/\([^/]*\)$@& \1@'`; test -n "$b"; do
|
||||
tail="$2"
|
||||
done
|
||||
|
||||
# For sparc/sparc9, try sparc/sparc9 and then sparc.
|
||||
# For sparc/sparc32, try sparc/sparc32 and then sparc.
|
||||
mach=
|
||||
tail=$machine
|
||||
while m=`echo $tail | sed 's@^\(.*\)/\([^/]*\)$@& \1@'`; test -n "$m"; do
|
||||
|
@ -223,6 +223,8 @@ sparc | sparcv[67])
|
||||
base_machine=sparc machine=sparc/sparc32 ;;
|
||||
sparcv8 | supersparc | hypersparc)
|
||||
base_machine=sparc machine=sparc/sparc32/sparcv8 ;;
|
||||
sparcv8plus | sparcv8plusa | sparcv9)
|
||||
base_machine=sparc machine=sparc/sparc32/sparcv9 ;;
|
||||
sparc64 | ultrasparc)
|
||||
base_machine=sparc machine=sparc/sparc64 ;;
|
||||
esac
|
||||
@ -287,7 +289,7 @@ while b=`echo $tail | sed 's@^\(.*\)/\([^/]*\)$@& \1@'`; test -n "$b"; do
|
||||
tail="$2"
|
||||
done
|
||||
|
||||
# For sparc/sparc9, try sparc/sparc9 and then sparc.
|
||||
# For sparc/sparc32, try sparc/sparc32 and then sparc.
|
||||
mach=
|
||||
tail=$machine
|
||||
while m=`echo $tail | sed 's@^\(.*\)/\([^/]*\)$@& \1@'`; test -n "$m"; do
|
||||
|
1
sysdeps/sparc/sparc32/bcopy.c
Normal file
1
sysdeps/sparc/sparc32/bcopy.c
Normal file
@ -0,0 +1 @@
|
||||
/* bcopy is in memcpy.S */
|
1
sysdeps/sparc/sparc32/bzero.c
Normal file
1
sysdeps/sparc/sparc32/bzero.c
Normal file
@ -0,0 +1 @@
|
||||
/* bzero is in memset.S */
|
143
sysdeps/sparc/sparc32/memchr.S
Normal file
143
sysdeps/sparc/sparc32/memchr.S
Normal file
@ -0,0 +1,143 @@
|
||||
/* memchr (str, ch, n) -- Return pointer to first occurrence of CH in STR less
|
||||
than N.
|
||||
For SPARC v7.
|
||||
Copyright (C) 1996,1999 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jj@ultra.linux.cz> and
|
||||
David S. Miller <davem@caip.rutgers.edu>.
|
||||
|
||||
This version is developed using the same algorithm as the fast C
|
||||
version which carries the following introduction:
|
||||
|
||||
Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
|
||||
with help from Dan Sahlin (dan@sics.se) and
|
||||
commentary by Jim Blandy (jimb@ai.mit.edu);
|
||||
adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu),
|
||||
and implemented by Roland McGrath (roland@ai.mit.edu).
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
.align 4
|
||||
0: cmp %o2, 0
|
||||
be 9f
|
||||
sethi %hi(0x80808080), %o4
|
||||
ldub [%o0], %g4
|
||||
cmp %g4, %o1
|
||||
be 1f
|
||||
add %o0, 1, %o0
|
||||
subcc %o2, 1, %o2
|
||||
be 9f
|
||||
andcc %o0, 3, %g0
|
||||
be 4f
|
||||
or %o4, %lo(0x80808080), %o3
|
||||
ldub [%o0], %g4
|
||||
cmp %g4, %o1
|
||||
be 1f
|
||||
add %o0, 1, %o0
|
||||
subcc %o2, 1, %o2
|
||||
be 9f
|
||||
andcc %o0, 3, %g0
|
||||
be 5f
|
||||
sethi %hi(0x01010101), %o5
|
||||
ldub [%o0], %g4
|
||||
cmp %g4, %o1
|
||||
be 1f
|
||||
add %o0, 1, %o0
|
||||
subcc %o2, 1, %o2
|
||||
bne,a 7f
|
||||
and %o2, 3, %g1
|
||||
retl
|
||||
clr %o0
|
||||
1: retl
|
||||
sub %o0, 1, %o0
|
||||
|
||||
ENTRY(memchr)
|
||||
andcc %o1, 0xff, %o1
|
||||
sll %o1, 8, %g7
|
||||
andcc %o0, 3, %g0
|
||||
or %o1, %g7, %g7
|
||||
sll %g7, 16, %o3
|
||||
bne 0b
|
||||
or %o3, %g7, %g2
|
||||
sethi %hi(0x80808080), %o4
|
||||
or %o4, %lo(0x80808080), %o3
|
||||
4: sethi %hi(0x01010101), %o5
|
||||
5: and %o2, 3, %g1
|
||||
7: andcc %o2, 0xfffffffc, %o2
|
||||
be 0f
|
||||
or %o5, %lo(0x01010101), %g7
|
||||
ld [%o0], %g4
|
||||
6: xor %g4, %g2, %g5
|
||||
add %o0, 4, %o0
|
||||
sub %g5, %g7, %g5
|
||||
andcc %g5, %o3, %g0
|
||||
bne 8f
|
||||
subcc %o2, 4, %o2
|
||||
bne,a 6b
|
||||
ld [%o0], %g4
|
||||
0: cmp %g1, 0
|
||||
1: be 9f
|
||||
add %o0, 4, %o0
|
||||
ldub [%o0 - 4], %g4
|
||||
cmp %g4, %o1
|
||||
be 4f
|
||||
cmp %g1, 1
|
||||
be 9f
|
||||
ldub [%o0 - 3], %g4
|
||||
cmp %g4, %o1
|
||||
be 3f
|
||||
cmp %g1, 2
|
||||
be 9f
|
||||
ldub [%o0 - 2], %g4
|
||||
cmp %g4, %o1
|
||||
be 2f
|
||||
nop
|
||||
9: retl
|
||||
clr %o0
|
||||
|
||||
/* Check every byte. */
|
||||
8: srl %g4, 24, %g5
|
||||
and %g5, 0xff, %g5
|
||||
cmp %g5, %o1
|
||||
be 4f
|
||||
srl %g4, 16, %g5
|
||||
and %g5, 0xff, %g5
|
||||
cmp %g5, %o1
|
||||
be 3f
|
||||
srl %g4, 8, %g5
|
||||
and %g5, 0xff, %g5
|
||||
cmp %g5, %o1
|
||||
be 2f
|
||||
and %g4, 0xff, %g5
|
||||
cmp %g5, %o1
|
||||
be 1f
|
||||
cmp %o2, 0
|
||||
bne,a 6b
|
||||
ld [%o0], %g4
|
||||
b 1b
|
||||
cmp %g1, 0
|
||||
1: retl
|
||||
sub %o0, 1, %o0
|
||||
2: retl
|
||||
sub %o0, 2, %o0
|
||||
3: retl
|
||||
sub %o0, 3, %o0
|
||||
4: retl
|
||||
sub %o0, 4, %o0
|
||||
END(memchr)
|
974
sysdeps/sparc/sparc32/memcpy.S
Normal file
974
sysdeps/sparc/sparc32/memcpy.S
Normal file
@ -0,0 +1,974 @@
|
||||
/* Copy SIZE bytes from SRC to DEST.
|
||||
For SPARC v7.
|
||||
Copyright (C) 1996, 1999 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by David S. Miller <davem@caip.rutgers.edu>,
|
||||
Eddie C. Dost <ecd@skynet.be> and
|
||||
Jakub Jelinek <jj@ultra.linux.cz>.
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
/* Both these macros have to start with exactly the same insn */
|
||||
#define MOVE_BIGCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \
|
||||
ldd [%src + offset + 0x00], %t0; \
|
||||
ldd [%src + offset + 0x08], %t2; \
|
||||
ldd [%src + offset + 0x10], %t4; \
|
||||
ldd [%src + offset + 0x18], %t6; \
|
||||
st %t0, [%dst + offset + 0x00]; \
|
||||
st %t1, [%dst + offset + 0x04]; \
|
||||
st %t2, [%dst + offset + 0x08]; \
|
||||
st %t3, [%dst + offset + 0x0c]; \
|
||||
st %t4, [%dst + offset + 0x10]; \
|
||||
st %t5, [%dst + offset + 0x14]; \
|
||||
st %t6, [%dst + offset + 0x18]; \
|
||||
st %t7, [%dst + offset + 0x1c];
|
||||
|
||||
#define MOVE_BIGALIGNCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \
|
||||
ldd [%src + offset + 0x00], %t0; \
|
||||
ldd [%src + offset + 0x08], %t2; \
|
||||
ldd [%src + offset + 0x10], %t4; \
|
||||
ldd [%src + offset + 0x18], %t6; \
|
||||
std %t0, [%dst + offset + 0x00]; \
|
||||
std %t2, [%dst + offset + 0x08]; \
|
||||
std %t4, [%dst + offset + 0x10]; \
|
||||
std %t6, [%dst + offset + 0x18];
|
||||
|
||||
#define MOVE_LASTCHUNK(src, dst, offset, t0, t1, t2, t3) \
|
||||
ldd [%src - offset - 0x10], %t0; \
|
||||
ldd [%src - offset - 0x08], %t2; \
|
||||
st %t0, [%dst - offset - 0x10]; \
|
||||
st %t1, [%dst - offset - 0x0c]; \
|
||||
st %t2, [%dst - offset - 0x08]; \
|
||||
st %t3, [%dst - offset - 0x04];
|
||||
|
||||
#define MOVE_LASTALIGNCHUNK(src, dst, offset, t0, t1, t2, t3) \
|
||||
ldd [%src - offset - 0x10], %t0; \
|
||||
ldd [%src - offset - 0x08], %t2; \
|
||||
std %t0, [%dst - offset - 0x10]; \
|
||||
std %t2, [%dst - offset - 0x08];
|
||||
|
||||
#define MOVE_SHORTCHUNK(src, dst, offset, t0, t1) \
|
||||
ldub [%src - offset - 0x02], %t0; \
|
||||
ldub [%src - offset - 0x01], %t1; \
|
||||
stb %t0, [%dst - offset - 0x02]; \
|
||||
stb %t1, [%dst - offset - 0x01];
|
||||
|
||||
/* Both these macros have to start with exactly the same insn */
|
||||
#define RMOVE_BIGCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \
|
||||
ldd [%src - offset - 0x20], %t0; \
|
||||
ldd [%src - offset - 0x18], %t2; \
|
||||
ldd [%src - offset - 0x10], %t4; \
|
||||
ldd [%src - offset - 0x08], %t6; \
|
||||
st %t0, [%dst - offset - 0x20]; \
|
||||
st %t1, [%dst - offset - 0x1c]; \
|
||||
st %t2, [%dst - offset - 0x18]; \
|
||||
st %t3, [%dst - offset - 0x14]; \
|
||||
st %t4, [%dst - offset - 0x10]; \
|
||||
st %t5, [%dst - offset - 0x0c]; \
|
||||
st %t6, [%dst - offset - 0x08]; \
|
||||
st %t7, [%dst - offset - 0x04];
|
||||
|
||||
#define RMOVE_BIGALIGNCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \
|
||||
ldd [%src - offset - 0x20], %t0; \
|
||||
ldd [%src - offset - 0x18], %t2; \
|
||||
ldd [%src - offset - 0x10], %t4; \
|
||||
ldd [%src - offset - 0x08], %t6; \
|
||||
std %t0, [%dst - offset - 0x20]; \
|
||||
std %t2, [%dst - offset - 0x18]; \
|
||||
std %t4, [%dst - offset - 0x10]; \
|
||||
std %t6, [%dst - offset - 0x08];
|
||||
|
||||
#define RMOVE_LASTCHUNK(src, dst, offset, t0, t1, t2, t3) \
|
||||
ldd [%src + offset + 0x00], %t0; \
|
||||
ldd [%src + offset + 0x08], %t2; \
|
||||
st %t0, [%dst + offset + 0x00]; \
|
||||
st %t1, [%dst + offset + 0x04]; \
|
||||
st %t2, [%dst + offset + 0x08]; \
|
||||
st %t3, [%dst + offset + 0x0c];
|
||||
|
||||
#define RMOVE_SHORTCHUNK(src, dst, offset, t0, t1) \
|
||||
ldub [%src + offset + 0x00], %t0; \
|
||||
ldub [%src + offset + 0x01], %t1; \
|
||||
stb %t0, [%dst + offset + 0x00]; \
|
||||
stb %t1, [%dst + offset + 0x01];
|
||||
|
||||
#define SMOVE_CHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, prev, shil, shir, offset2) \
|
||||
ldd [%src + offset + 0x00], %t0; \
|
||||
ldd [%src + offset + 0x08], %t2; \
|
||||
srl %t0, shir, %t5; \
|
||||
srl %t1, shir, %t6; \
|
||||
sll %t0, shil, %t0; \
|
||||
or %t5, %prev, %t5; \
|
||||
sll %t1, shil, %prev; \
|
||||
or %t6, %t0, %t0; \
|
||||
srl %t2, shir, %t1; \
|
||||
srl %t3, shir, %t6; \
|
||||
sll %t2, shil, %t2; \
|
||||
or %t1, %prev, %t1; \
|
||||
std %t4, [%dst + offset + offset2 - 0x04]; \
|
||||
std %t0, [%dst + offset + offset2 + 0x04]; \
|
||||
sll %t3, shil, %prev; \
|
||||
or %t6, %t2, %t4;
|
||||
|
||||
#define SMOVE_ALIGNCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, prev, shil, shir, offset2) \
|
||||
ldd [%src + offset + 0x00], %t0; \
|
||||
ldd [%src + offset + 0x08], %t2; \
|
||||
srl %t0, shir, %t4; \
|
||||
srl %t1, shir, %t5; \
|
||||
sll %t0, shil, %t6; \
|
||||
or %t4, %prev, %t0; \
|
||||
sll %t1, shil, %prev; \
|
||||
or %t5, %t6, %t1; \
|
||||
srl %t2, shir, %t4; \
|
||||
srl %t3, shir, %t5; \
|
||||
sll %t2, shil, %t6; \
|
||||
or %t4, %prev, %t2; \
|
||||
sll %t3, shil, %prev; \
|
||||
or %t5, %t6, %t3; \
|
||||
std %t0, [%dst + offset + offset2 + 0x00]; \
|
||||
std %t2, [%dst + offset + offset2 + 0x08];
|
||||
|
||||
.text
|
||||
.align 4
|
||||
|
||||
70: andcc %o1, 1, %g0
|
||||
be 4f
|
||||
andcc %o1, 2, %g0
|
||||
|
||||
ldub [%o1 - 1], %g2
|
||||
sub %o1, 1, %o1
|
||||
stb %g2, [%o0 - 1]
|
||||
sub %o2, 1, %o2
|
||||
be 3f
|
||||
sub %o0, 1, %o0
|
||||
4: lduh [%o1 - 2], %g2
|
||||
sub %o1, 2, %o1
|
||||
sth %g2, [%o0 - 2]
|
||||
sub %o2, 2, %o2
|
||||
b 3f
|
||||
sub %o0, 2, %o0
|
||||
|
||||
0: retl
|
||||
nop ! Only bcopy returns here and it retuns void...
|
||||
|
||||
ENTRY(bcopy)
|
||||
mov %o0, %o3
|
||||
mov %o1, %o0
|
||||
mov %o3, %o1
|
||||
tst %o2
|
||||
bcs 0b
|
||||
/* Do the cmp in the delay slot */
|
||||
END(bcopy)
|
||||
ENTRY(memmove)
|
||||
cmp %o0, %o1
|
||||
st %o0, [%sp + 64]
|
||||
bleu 9f
|
||||
sub %o0, %o1, %o4
|
||||
|
||||
add %o1, %o2, %o3
|
||||
cmp %o3, %o0
|
||||
bleu 0f
|
||||
andcc %o4, 3, %o5
|
||||
|
||||
add %o1, %o2, %o1
|
||||
add %o0, %o2, %o0
|
||||
bne 77f
|
||||
cmp %o2, 15
|
||||
bleu 91f
|
||||
andcc %o1, 3, %g0
|
||||
bne 70b
|
||||
3: andcc %o1, 4, %g0
|
||||
|
||||
be 2f
|
||||
mov %o2, %g1
|
||||
|
||||
ld [%o1 - 4], %o4
|
||||
sub %g1, 4, %g1
|
||||
st %o4, [%o0 - 4]
|
||||
sub %o1, 4, %o1
|
||||
sub %o0, 4, %o0
|
||||
2: andcc %g1, 0xffffff80, %g7
|
||||
be 3f
|
||||
andcc %o0, 4, %g0
|
||||
|
||||
be 74f + 4
|
||||
5: RMOVE_BIGCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5)
|
||||
RMOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
|
||||
RMOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
|
||||
RMOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
|
||||
subcc %g7, 128, %g7
|
||||
sub %o1, 128, %o1
|
||||
bne 5b
|
||||
sub %o0, 128, %o0
|
||||
|
||||
3: andcc %g1, 0x70, %g7
|
||||
be 72f
|
||||
andcc %g1, 8, %g0
|
||||
|
||||
srl %g7, 1, %o4
|
||||
mov %o7, %g2
|
||||
add %g7, %o4, %o4
|
||||
101: call 100f
|
||||
sub %o1, %g7, %o1
|
||||
mov %g2, %o7
|
||||
jmpl %o5 + (72f - 101b), %g0
|
||||
sub %o0, %g7, %o0
|
||||
|
||||
71: RMOVE_LASTCHUNK(o1, o0, 0x60, g2, g3, g4, g5)
|
||||
RMOVE_LASTCHUNK(o1, o0, 0x50, g2, g3, g4, g5)
|
||||
RMOVE_LASTCHUNK(o1, o0, 0x40, g2, g3, g4, g5)
|
||||
RMOVE_LASTCHUNK(o1, o0, 0x30, g2, g3, g4, g5)
|
||||
RMOVE_LASTCHUNK(o1, o0, 0x20, g2, g3, g4, g5)
|
||||
RMOVE_LASTCHUNK(o1, o0, 0x10, g2, g3, g4, g5)
|
||||
RMOVE_LASTCHUNK(o1, o0, 0x00, g2, g3, g4, g5)
|
||||
72: be 73f
|
||||
andcc %g1, 4, %g0
|
||||
|
||||
ldd [%o1 - 0x08], %g2
|
||||
sub %o0, 8, %o0
|
||||
sub %o1, 8, %o1
|
||||
st %g2, [%o0]
|
||||
st %g3, [%o0 + 0x04]
|
||||
73: be 1f
|
||||
andcc %g1, 2, %g0
|
||||
|
||||
ld [%o1 - 4], %g2
|
||||
sub %o1, 4, %o1
|
||||
st %g2, [%o0 - 4]
|
||||
sub %o0, 4, %o0
|
||||
1: be 1f
|
||||
andcc %g1, 1, %g0
|
||||
|
||||
lduh [%o1 - 2], %g2
|
||||
sub %o1, 2, %o1
|
||||
sth %g2, [%o0 - 2]
|
||||
sub %o0, 2, %o0
|
||||
1: be 1f
|
||||
nop
|
||||
|
||||
ldub [%o1 - 1], %g2
|
||||
stb %g2, [%o0 - 1]
|
||||
1: retl
|
||||
ld [%sp + 64], %o0
|
||||
|
||||
74: RMOVE_BIGALIGNCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5)
|
||||
RMOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
|
||||
RMOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
|
||||
RMOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
|
||||
subcc %g7, 128, %g7
|
||||
sub %o1, 128, %o1
|
||||
bne 74b
|
||||
sub %o0, 128, %o0
|
||||
|
||||
andcc %g1, 0x70, %g7
|
||||
be 72b
|
||||
andcc %g1, 8, %g0
|
||||
|
||||
srl %g7, 1, %o4
|
||||
mov %o7, %g2
|
||||
add %g7, %o4, %o4
|
||||
102: call 100f
|
||||
sub %o1, %g7, %o1
|
||||
mov %g2, %o7
|
||||
jmpl %o5 + (72b - 102b), %g0
|
||||
sub %o0, %g7, %o0
|
||||
|
||||
75: and %o2, 0xe, %o3
|
||||
mov %o7, %g2
|
||||
sll %o3, 3, %o4
|
||||
sub %o0, %o3, %o0
|
||||
103: call 100f
|
||||
sub %o1, %o3, %o1
|
||||
mov %g2, %o7
|
||||
jmpl %o5 + (76f - 103b), %g0
|
||||
andcc %o2, 1, %g0
|
||||
|
||||
RMOVE_SHORTCHUNK(o1, o0, 0x0c, g2, g3)
|
||||
RMOVE_SHORTCHUNK(o1, o0, 0x0a, g2, g3)
|
||||
RMOVE_SHORTCHUNK(o1, o0, 0x08, g2, g3)
|
||||
RMOVE_SHORTCHUNK(o1, o0, 0x06, g2, g3)
|
||||
RMOVE_SHORTCHUNK(o1, o0, 0x04, g2, g3)
|
||||
RMOVE_SHORTCHUNK(o1, o0, 0x02, g2, g3)
|
||||
RMOVE_SHORTCHUNK(o1, o0, 0x00, g2, g3)
|
||||
|
||||
76: be 1f
|
||||
nop
|
||||
ldub [%o1 - 1], %g2
|
||||
stb %g2, [%o0 - 1]
|
||||
1: retl
|
||||
ld [%sp + 64], %o0
|
||||
|
||||
91: bne 75b
|
||||
andcc %o2, 8, %g0
|
||||
|
||||
be 1f
|
||||
andcc %o2, 4, %g0
|
||||
|
||||
ld [%o1 - 0x08], %g2
|
||||
ld [%o1 - 0x04], %g3
|
||||
sub %o1, 8, %o1
|
||||
st %g2, [%o0 - 0x08]
|
||||
st %g3, [%o0 - 0x04]
|
||||
sub %o0, 8, %o0
|
||||
1: b 73b
|
||||
mov %o2, %g1
|
||||
|
||||
77: cmp %o2, 15
|
||||
bleu 75b
|
||||
andcc %o0, 3, %g0
|
||||
be 64f
|
||||
andcc %o0, 1, %g0
|
||||
be 63f
|
||||
andcc %o0, 2, %g0
|
||||
ldub [%o1 - 1], %g5
|
||||
sub %o1, 1, %o1
|
||||
stb %g5, [%o0 - 1]
|
||||
sub %o0, 1, %o0
|
||||
be 64f
|
||||
sub %o2, 1, %o2
|
||||
|
||||
63: ldub [%o1 - 1], %g5
|
||||
sub %o1, 2, %o1
|
||||
stb %g5, [%o0 - 1]
|
||||
sub %o0, 2, %o0
|
||||
ldub [%o1], %g5
|
||||
sub %o2, 2, %o2
|
||||
stb %g5, [%o0]
|
||||
64: and %o1, 3, %g2
|
||||
and %o1, -4, %o1
|
||||
and %o2, 0xc, %g3
|
||||
add %o1, 4, %o1
|
||||
cmp %g3, 4
|
||||
sll %g2, 3, %g4
|
||||
mov 32, %g2
|
||||
be 4f
|
||||
sub %g2, %g4, %g7
|
||||
|
||||
blu 3f
|
||||
cmp %g3, 8
|
||||
|
||||
be 2f
|
||||
srl %o2, 2, %g3
|
||||
|
||||
ld [%o1 - 4], %o3
|
||||
add %o0, -8, %o0
|
||||
ld [%o1 - 8], %o4
|
||||
add %o1, -16, %o1
|
||||
b 7f
|
||||
add %g3, 1, %g3
|
||||
2: ld [%o1 - 4], %o4
|
||||
add %o0, -4, %o0
|
||||
ld [%o1 - 8], %g1
|
||||
add %o1, -12, %o1
|
||||
b 8f
|
||||
add %g3, 2, %g3
|
||||
3: ld [%o1 - 4], %o5
|
||||
add %o0, -12, %o0
|
||||
ld [%o1 - 8], %o3
|
||||
add %o1, -20, %o1
|
||||
b 6f
|
||||
srl %o2, 2, %g3
|
||||
4: ld [%o1 - 4], %g1
|
||||
srl %o2, 2, %g3
|
||||
ld [%o1 - 8], %o5
|
||||
add %o1, -24, %o1
|
||||
add %o0, -16, %o0
|
||||
add %g3, -1, %g3
|
||||
|
||||
ld [%o1 + 12], %o3
|
||||
5: sll %o5, %g4, %g2
|
||||
srl %g1, %g7, %g5
|
||||
or %g2, %g5, %g2
|
||||
st %g2, [%o0 + 12]
|
||||
6: ld [%o1 + 8], %o4
|
||||
sll %o3, %g4, %g2
|
||||
srl %o5, %g7, %g5
|
||||
or %g2, %g5, %g2
|
||||
st %g2, [%o0 + 8]
|
||||
7: ld [%o1 + 4], %g1
|
||||
sll %o4, %g4, %g2
|
||||
srl %o3, %g7, %g5
|
||||
or %g2, %g5, %g2
|
||||
st %g2, [%o0 + 4]
|
||||
8: ld [%o1], %o5
|
||||
sll %g1, %g4, %g2
|
||||
srl %o4, %g7, %g5
|
||||
addcc %g3, -4, %g3
|
||||
or %g2, %g5, %g2
|
||||
add %o1, -16, %o1
|
||||
st %g2, [%o0]
|
||||
add %o0, -16, %o0
|
||||
bne,a 5b
|
||||
ld [%o1 + 12], %o3
|
||||
sll %o5, %g4, %g2
|
||||
srl %g1, %g7, %g5
|
||||
srl %g4, 3, %g3
|
||||
or %g2, %g5, %g2
|
||||
add %o1, %g3, %o1
|
||||
andcc %o2, 2, %g0
|
||||
st %g2, [%o0 + 12]
|
||||
be 1f
|
||||
andcc %o2, 1, %g0
|
||||
|
||||
ldub [%o1 + 15], %g5
|
||||
add %o1, -2, %o1
|
||||
stb %g5, [%o0 + 11]
|
||||
add %o0, -2, %o0
|
||||
ldub [%o1 + 16], %g5
|
||||
stb %g5, [%o0 + 12]
|
||||
1: be 1f
|
||||
nop
|
||||
ldub [%o1 + 15], %g5
|
||||
stb %g5, [%o0 + 11]
|
||||
1: retl
|
||||
ld [%sp + 64], %o0
|
||||
|
||||
78: andcc %o1, 1, %g0
|
||||
be 4f
|
||||
andcc %o1, 2, %g0
|
||||
|
||||
ldub [%o1], %g2
|
||||
add %o1, 1, %o1
|
||||
stb %g2, [%o0]
|
||||
sub %o2, 1, %o2
|
||||
bne 3f
|
||||
add %o0, 1, %o0
|
||||
4: lduh [%o1], %g2
|
||||
add %o1, 2, %o1
|
||||
sth %g2, [%o0]
|
||||
sub %o2, 2, %o2
|
||||
b 3f
|
||||
add %o0, 2, %o0
|
||||
END(memmove)
|
||||
|
||||
ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */
|
||||
sub %o0, %o1, %o4
|
||||
st %o0, [%sp + 64]
|
||||
9: andcc %o4, 3, %o5
|
||||
0: bne 86f
|
||||
cmp %o2, 15
|
||||
|
||||
bleu 90f
|
||||
andcc %o1, 3, %g0
|
||||
|
||||
bne 78b
|
||||
3: andcc %o1, 4, %g0
|
||||
|
||||
be 2f
|
||||
mov %o2, %g1
|
||||
|
||||
ld [%o1], %o4
|
||||
sub %g1, 4, %g1
|
||||
st %o4, [%o0]
|
||||
add %o1, 4, %o1
|
||||
add %o0, 4, %o0
|
||||
2: andcc %g1, 0xffffff80, %g7
|
||||
be 3f
|
||||
andcc %o0, 4, %g0
|
||||
|
||||
be 82f + 4
|
||||
5: MOVE_BIGCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5)
|
||||
MOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
|
||||
MOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
|
||||
MOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
|
||||
subcc %g7, 128, %g7
|
||||
add %o1, 128, %o1
|
||||
bne 5b
|
||||
add %o0, 128, %o0
|
||||
3: andcc %g1, 0x70, %g7
|
||||
be 80f
|
||||
andcc %g1, 8, %g0
|
||||
|
||||
srl %g7, 1, %o4
|
||||
mov %o7, %g2
|
||||
add %g7, %o4, %o4
|
||||
add %o1, %g7, %o1
|
||||
104: call 100f
|
||||
add %o0, %g7, %o0
|
||||
jmpl %o5 + (80f - 104b), %g0
|
||||
mov %g2, %o7
|
||||
|
||||
79: MOVE_LASTCHUNK(o1, o0, 0x60, g2, g3, g4, g5)
|
||||
MOVE_LASTCHUNK(o1, o0, 0x50, g2, g3, g4, g5)
|
||||
MOVE_LASTCHUNK(o1, o0, 0x40, g2, g3, g4, g5)
|
||||
MOVE_LASTCHUNK(o1, o0, 0x30, g2, g3, g4, g5)
|
||||
MOVE_LASTCHUNK(o1, o0, 0x20, g2, g3, g4, g5)
|
||||
MOVE_LASTCHUNK(o1, o0, 0x10, g2, g3, g4, g5)
|
||||
MOVE_LASTCHUNK(o1, o0, 0x00, g2, g3, g4, g5)
|
||||
|
||||
80: be 81f
|
||||
andcc %g1, 4, %g0
|
||||
|
||||
ldd [%o1], %g2
|
||||
add %o0, 8, %o0
|
||||
st %g2, [%o0 - 0x08]
|
||||
add %o1, 8, %o1
|
||||
st %g3, [%o0 - 0x04]
|
||||
|
||||
81: be 1f
|
||||
andcc %g1, 2, %g0
|
||||
|
||||
ld [%o1], %g2
|
||||
add %o1, 4, %o1
|
||||
st %g2, [%o0]
|
||||
add %o0, 4, %o0
|
||||
1: be 1f
|
||||
andcc %g1, 1, %g0
|
||||
|
||||
lduh [%o1], %g2
|
||||
add %o1, 2, %o1
|
||||
sth %g2, [%o0]
|
||||
add %o0, 2, %o0
|
||||
1: be 1f
|
||||
nop
|
||||
|
||||
ldub [%o1], %g2
|
||||
stb %g2, [%o0]
|
||||
1: retl
|
||||
ld [%sp + 64], %o0
|
||||
|
||||
82: /* ldd_std */
|
||||
MOVE_BIGALIGNCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5)
|
||||
MOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
|
||||
MOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
|
||||
MOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
|
||||
subcc %g7, 128, %g7
|
||||
add %o1, 128, %o1
|
||||
bne 82b
|
||||
add %o0, 128, %o0
|
||||
|
||||
andcc %g1, 0x70, %g7
|
||||
be 84f
|
||||
andcc %g1, 8, %g0
|
||||
|
||||
mov %o7, %g2
|
||||
111: call 110f
|
||||
add %o1, %g7, %o1
|
||||
mov %g2, %o7
|
||||
jmpl %o5 + (84f - 111b), %g0
|
||||
add %o0, %g7, %o0
|
||||
|
||||
83: MOVE_LASTALIGNCHUNK(o1, o0, 0x60, g2, g3, g4, g5)
|
||||
MOVE_LASTALIGNCHUNK(o1, o0, 0x50, g2, g3, g4, g5)
|
||||
MOVE_LASTALIGNCHUNK(o1, o0, 0x40, g2, g3, g4, g5)
|
||||
MOVE_LASTALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5)
|
||||
MOVE_LASTALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5)
|
||||
MOVE_LASTALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5)
|
||||
MOVE_LASTALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5)
|
||||
|
||||
84: be 85f
|
||||
andcc %g1, 4, %g0
|
||||
|
||||
ldd [%o1], %g2
|
||||
add %o0, 8, %o0
|
||||
std %g2, [%o0 - 0x08]
|
||||
add %o1, 8, %o1
|
||||
85: be 1f
|
||||
andcc %g1, 2, %g0
|
||||
|
||||
ld [%o1], %g2
|
||||
add %o1, 4, %o1
|
||||
st %g2, [%o0]
|
||||
add %o0, 4, %o0
|
||||
1: be 1f
|
||||
andcc %g1, 1, %g0
|
||||
|
||||
lduh [%o1], %g2
|
||||
add %o1, 2, %o1
|
||||
sth %g2, [%o0]
|
||||
add %o0, 2, %o0
|
||||
1: be 1f
|
||||
nop
|
||||
|
||||
ldub [%o1], %g2
|
||||
stb %g2, [%o0]
|
||||
1: retl
|
||||
ld [%sp + 64], %o0
|
||||
|
||||
86: cmp %o2, 6
|
||||
bleu 88f
|
||||
|
||||
cmp %o2, 256
|
||||
bcc 87f
|
||||
|
||||
andcc %o0, 3, %g0
|
||||
be 61f
|
||||
andcc %o0, 1, %g0
|
||||
be 60f
|
||||
andcc %o0, 2, %g0
|
||||
|
||||
ldub [%o1], %g5
|
||||
add %o1, 1, %o1
|
||||
stb %g5, [%o0]
|
||||
sub %o2, 1, %o2
|
||||
bne 61f
|
||||
add %o0, 1, %o0
|
||||
60: ldub [%o1], %g3
|
||||
add %o1, 2, %o1
|
||||
stb %g3, [%o0]
|
||||
sub %o2, 2, %o2
|
||||
ldub [%o1 - 1], %g3
|
||||
add %o0, 2, %o0
|
||||
stb %g3, [%o0 - 1]
|
||||
61: and %o1, 3, %g2
|
||||
and %o2, 0xc, %g3
|
||||
and %o1, -4, %o1
|
||||
cmp %g3, 4
|
||||
sll %g2, 3, %g4
|
||||
mov 32, %g2
|
||||
be 4f
|
||||
sub %g2, %g4, %g7
|
||||
|
||||
blu 3f
|
||||
cmp %g3, 0x8
|
||||
|
||||
be 2f
|
||||
srl %o2, 2, %g3
|
||||
|
||||
ld [%o1], %o3
|
||||
add %o0, -8, %o0
|
||||
ld [%o1 + 4], %o4
|
||||
b 8f
|
||||
add %g3, 1, %g3
|
||||
2: ld [%o1], %o4
|
||||
add %o0, -12, %o0
|
||||
ld [%o1 + 4], %o5
|
||||
add %g3, 2, %g3
|
||||
b 9f
|
||||
add %o1, -4, %o1
|
||||
3: ld [%o1], %g1
|
||||
add %o0, -4, %o0
|
||||
ld [%o1 + 4], %o3
|
||||
srl %o2, 2, %g3
|
||||
b 7f
|
||||
add %o1, 4, %o1
|
||||
4: ld [%o1], %o5
|
||||
cmp %o2, 7
|
||||
ld [%o1 + 4], %g1
|
||||
srl %o2, 2, %g3
|
||||
bleu 10f
|
||||
add %o1, 8, %o1
|
||||
|
||||
ld [%o1], %o3
|
||||
add %g3, -1, %g3
|
||||
5: sll %o5, %g4, %g2
|
||||
srl %g1, %g7, %g5
|
||||
or %g2, %g5, %g2
|
||||
st %g2, [%o0]
|
||||
7: ld [%o1 + 4], %o4
|
||||
sll %g1, %g4, %g2
|
||||
srl %o3, %g7, %g5
|
||||
or %g2, %g5, %g2
|
||||
st %g2, [%o0 + 4]
|
||||
8: ld [%o1 + 8], %o5
|
||||
sll %o3, %g4, %g2
|
||||
srl %o4, %g7, %g5
|
||||
or %g2, %g5, %g2
|
||||
st %g2, [%o0 + 8]
|
||||
9: ld [%o1 + 12], %g1
|
||||
sll %o4, %g4, %g2
|
||||
srl %o5, %g7, %g5
|
||||
addcc %g3, -4, %g3
|
||||
or %g2, %g5, %g2
|
||||
add %o1, 16, %o1
|
||||
st %g2, [%o0 + 12]
|
||||
add %o0, 16, %o0
|
||||
bne,a 5b
|
||||
ld [%o1], %o3
|
||||
10: sll %o5, %g4, %g2
|
||||
srl %g1, %g7, %g5
|
||||
srl %g7, 3, %g3
|
||||
or %g2, %g5, %g2
|
||||
sub %o1, %g3, %o1
|
||||
andcc %o2, 2, %g0
|
||||
st %g2, [%o0]
|
||||
be 1f
|
||||
andcc %o2, 1, %g0
|
||||
|
||||
ldub [%o1], %g2
|
||||
add %o1, 2, %o1
|
||||
stb %g2, [%o0 + 4]
|
||||
add %o0, 2, %o0
|
||||
ldub [%o1 - 1], %g2
|
||||
stb %g2, [%o0 + 3]
|
||||
1: be 1f
|
||||
nop
|
||||
ldub [%o1], %g2
|
||||
stb %g2, [%o0 + 4]
|
||||
1: retl
|
||||
ld [%sp + 64], %o0
|
||||
|
||||
87: andcc %o1, 3, %g0
|
||||
be 3f
|
||||
andcc %o1, 1, %g0
|
||||
|
||||
be 4f
|
||||
andcc %o1, 2, %g0
|
||||
|
||||
ldub [%o1], %g2
|
||||
add %o1, 1, %o1
|
||||
stb %g2, [%o0]
|
||||
sub %o2, 1, %o2
|
||||
bne 3f
|
||||
add %o0, 1, %o0
|
||||
4: lduh [%o1], %g2
|
||||
add %o1, 2, %o1
|
||||
srl %g2, 8, %g3
|
||||
sub %o2, 2, %o2
|
||||
stb %g3, [%o0]
|
||||
add %o0, 2, %o0
|
||||
stb %g2, [%o0 - 1]
|
||||
3: andcc %o1, 4, %g0
|
||||
|
||||
bne 2f
|
||||
cmp %o5, 1
|
||||
|
||||
ld [%o1], %o4
|
||||
srl %o4, 24, %g2
|
||||
stb %g2, [%o0]
|
||||
srl %o4, 16, %g3
|
||||
stb %g3, [%o0 + 1]
|
||||
srl %o4, 8, %g2
|
||||
stb %g2, [%o0 + 2]
|
||||
sub %o2, 4, %o2
|
||||
stb %o4, [%o0 + 3]
|
||||
add %o1, 4, %o1
|
||||
add %o0, 4, %o0
|
||||
2: be 33f
|
||||
cmp %o5, 2
|
||||
be 32f
|
||||
sub %o2, 4, %o2
|
||||
31: ld [%o1], %g2
|
||||
add %o1, 4, %o1
|
||||
srl %g2, 24, %g3
|
||||
and %o0, 7, %g5
|
||||
stb %g3, [%o0]
|
||||
cmp %g5, 7
|
||||
sll %g2, 8, %g1
|
||||
add %o0, 4, %o0
|
||||
be 41f
|
||||
and %o2, 0xffffffc0, %o3
|
||||
ld [%o0 - 7], %o4
|
||||
4: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
|
||||
SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
|
||||
SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
|
||||
SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
|
||||
subcc %o3, 64, %o3
|
||||
add %o1, 64, %o1
|
||||
bne 4b
|
||||
add %o0, 64, %o0
|
||||
|
||||
andcc %o2, 0x30, %o3
|
||||
be,a 1f
|
||||
srl %g1, 16, %g2
|
||||
4: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
|
||||
subcc %o3, 16, %o3
|
||||
add %o1, 16, %o1
|
||||
bne 4b
|
||||
add %o0, 16, %o0
|
||||
|
||||
srl %g1, 16, %g2
|
||||
1: st %o4, [%o0 - 7]
|
||||
sth %g2, [%o0 - 3]
|
||||
srl %g1, 8, %g4
|
||||
b 88f
|
||||
stb %g4, [%o0 - 1]
|
||||
32: ld [%o1], %g2
|
||||
add %o1, 4, %o1
|
||||
srl %g2, 16, %g3
|
||||
and %o0, 7, %g5
|
||||
sth %g3, [%o0]
|
||||
cmp %g5, 6
|
||||
sll %g2, 16, %g1
|
||||
add %o0, 4, %o0
|
||||
be 42f
|
||||
and %o2, 0xffffffc0, %o3
|
||||
ld [%o0 - 6], %o4
|
||||
4: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
|
||||
SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
|
||||
SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
|
||||
SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
|
||||
subcc %o3, 64, %o3
|
||||
add %o1, 64, %o1
|
||||
bne 4b
|
||||
add %o0, 64, %o0
|
||||
|
||||
andcc %o2, 0x30, %o3
|
||||
be,a 1f
|
||||
srl %g1, 16, %g2
|
||||
4: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
|
||||
subcc %o3, 16, %o3
|
||||
add %o1, 16, %o1
|
||||
bne 4b
|
||||
add %o0, 16, %o0
|
||||
|
||||
srl %g1, 16, %g2
|
||||
1: st %o4, [%o0 - 6]
|
||||
b 88f
|
||||
sth %g2, [%o0 - 2]
|
||||
33: ld [%o1], %g2
|
||||
sub %o2, 4, %o2
|
||||
srl %g2, 24, %g3
|
||||
and %o0, 7, %g5
|
||||
stb %g3, [%o0]
|
||||
cmp %g5, 5
|
||||
srl %g2, 8, %g4
|
||||
sll %g2, 24, %g1
|
||||
sth %g4, [%o0 + 1]
|
||||
add %o1, 4, %o1
|
||||
be 43f
|
||||
and %o2, 0xffffffc0, %o3
|
||||
|
||||
ld [%o0 - 1], %o4
|
||||
add %o0, 4, %o0
|
||||
4: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1)
|
||||
SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1)
|
||||
SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1)
|
||||
SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1)
|
||||
subcc %o3, 64, %o3
|
||||
add %o1, 64, %o1
|
||||
bne 4b
|
||||
add %o0, 64, %o0
|
||||
|
||||
andcc %o2, 0x30, %o3
|
||||
be,a 1f
|
||||
srl %g1, 24, %g2
|
||||
4: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1)
|
||||
subcc %o3, 16, %o3
|
||||
add %o1, 16, %o1
|
||||
bne 4b
|
||||
add %o0, 16, %o0
|
||||
|
||||
srl %g1, 24, %g2
|
||||
1: st %o4, [%o0 - 5]
|
||||
b 88f
|
||||
stb %g2, [%o0 - 1]
|
||||
41: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
|
||||
SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
|
||||
SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
|
||||
SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
|
||||
subcc %o3, 64, %o3
|
||||
add %o1, 64, %o1
|
||||
bne 41b
|
||||
add %o0, 64, %o0
|
||||
|
||||
andcc %o2, 0x30, %o3
|
||||
be,a 1f
|
||||
srl %g1, 16, %g2
|
||||
4: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3)
|
||||
subcc %o3, 16, %o3
|
||||
add %o1, 16, %o1
|
||||
bne 4b
|
||||
add %o0, 16, %o0
|
||||
|
||||
srl %g1, 16, %g2
|
||||
1: sth %g2, [%o0 - 3]
|
||||
srl %g1, 8, %g4
|
||||
b 88f
|
||||
stb %g4, [%o0 - 1]
|
||||
43: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3)
|
||||
SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3)
|
||||
SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3)
|
||||
SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3)
|
||||
subcc %o3, 64, %o3
|
||||
add %o1, 64, %o1
|
||||
bne 43b
|
||||
add %o0, 64, %o0
|
||||
|
||||
andcc %o2, 0x30, %o3
|
||||
be,a 1f
|
||||
srl %g1, 24, %g2
|
||||
4: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3)
|
||||
subcc %o3, 16, %o3
|
||||
add %o1, 16, %o1
|
||||
bne 4b
|
||||
add %o0, 16, %o0
|
||||
|
||||
srl %g1, 24, %g2
|
||||
1: stb %g2, [%o0 + 3]
|
||||
b 88f
|
||||
add %o0, 4, %o0
|
||||
42: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
|
||||
SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
|
||||
SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
|
||||
SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
|
||||
subcc %o3, 64, %o3
|
||||
add %o1, 64, %o1
|
||||
bne 42b
|
||||
add %o0, 64, %o0
|
||||
|
||||
andcc %o2, 0x30, %o3
|
||||
be,a 1f
|
||||
srl %g1, 16, %g2
|
||||
4: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2)
|
||||
subcc %o3, 16, %o3
|
||||
add %o1, 16, %o1
|
||||
bne 4b
|
||||
add %o0, 16, %o0
|
||||
|
||||
srl %g1, 16, %g2
|
||||
1: sth %g2, [%o0 - 2]
|
||||
|
||||
/* Fall through */
|
||||
|
||||
88: and %o2, 0xe, %o3
|
||||
mov %o7, %g2
|
||||
sll %o3, 3, %o4
|
||||
add %o0, %o3, %o0
|
||||
106: call 100f
|
||||
add %o1, %o3, %o1
|
||||
mov %g2, %o7
|
||||
jmpl %o5 + (89f - 106b), %g0
|
||||
andcc %o2, 1, %g0
|
||||
|
||||
MOVE_SHORTCHUNK(o1, o0, 0x0c, g2, g3)
|
||||
MOVE_SHORTCHUNK(o1, o0, 0x0a, g2, g3)
|
||||
MOVE_SHORTCHUNK(o1, o0, 0x08, g2, g3)
|
||||
MOVE_SHORTCHUNK(o1, o0, 0x06, g2, g3)
|
||||
MOVE_SHORTCHUNK(o1, o0, 0x04, g2, g3)
|
||||
MOVE_SHORTCHUNK(o1, o0, 0x02, g2, g3)
|
||||
MOVE_SHORTCHUNK(o1, o0, 0x00, g2, g3)
|
||||
|
||||
89: be 1f
|
||||
nop
|
||||
|
||||
ldub [%o1], %g2
|
||||
stb %g2, [%o0]
|
||||
1: retl
|
||||
ld [%sp + 64], %o0
|
||||
|
||||
90: bne 88b
|
||||
andcc %o2, 8, %g0
|
||||
|
||||
be 1f
|
||||
andcc %o2, 4, %g0
|
||||
|
||||
ld [%o1 + 0x00], %g2
|
||||
ld [%o1 + 0x04], %g3
|
||||
add %o1, 8, %o1
|
||||
st %g2, [%o0 + 0x00]
|
||||
st %g3, [%o0 + 0x04]
|
||||
add %o0, 8, %o0
|
||||
1: b 81b
|
||||
mov %o2, %g1
|
||||
|
||||
100: retl
|
||||
sub %o7, %o4, %o5
|
||||
110: retl
|
||||
sub %o7, %g7, %o5
|
||||
END(memcpy)
|
1
sysdeps/sparc/sparc32/memmove.c
Normal file
1
sysdeps/sparc/sparc32/memmove.c
Normal file
@ -0,0 +1 @@
|
||||
/* memmove is in memcpy.S */
|
154
sysdeps/sparc/sparc32/memset.S
Normal file
154
sysdeps/sparc/sparc32/memset.S
Normal file
@ -0,0 +1,154 @@
|
||||
/* Set a block of memory to some byte value.
|
||||
For SPARC v7.
|
||||
Copyright (C) 1996, 1999 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by David S. Miller <davem@caip.rutgers.edu> and
|
||||
Jakub Jelinek <jj@ultra.linux.cz>.
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
/* Store 64 bytes at (BASE + OFFSET) using value SOURCE. */
|
||||
#define ZERO_BIG_BLOCK(base, offset, source) \
|
||||
std source, [base + offset + 0x00]; \
|
||||
std source, [base + offset + 0x08]; \
|
||||
std source, [base + offset + 0x10]; \
|
||||
std source, [base + offset + 0x18]; \
|
||||
std source, [base + offset + 0x20]; \
|
||||
std source, [base + offset + 0x28]; \
|
||||
std source, [base + offset + 0x30]; \
|
||||
std source, [base + offset + 0x38];
|
||||
|
||||
#define ZERO_LAST_BLOCKS(base, offset, source) \
|
||||
std source, [base - offset - 0x38]; \
|
||||
std source, [base - offset - 0x30]; \
|
||||
std source, [base - offset - 0x28]; \
|
||||
std source, [base - offset - 0x20]; \
|
||||
std source, [base - offset - 0x18]; \
|
||||
std source, [base - offset - 0x10]; \
|
||||
std source, [base - offset - 0x08]; \
|
||||
std source, [base - offset - 0x00];
|
||||
|
||||
.text
|
||||
.align 4
|
||||
ENTRY(__bzero)
|
||||
b 1f
|
||||
mov %g0, %g3
|
||||
|
||||
3: cmp %o2, 3
|
||||
be 2f
|
||||
stb %g3, [%o0]
|
||||
|
||||
cmp %o2, 2
|
||||
be 2f
|
||||
stb %g3, [%o0 + 0x01]
|
||||
|
||||
stb %g3, [%o0 + 0x02]
|
||||
2: sub %o2, 4, %o2
|
||||
add %o1, %o2, %o1
|
||||
b 4f
|
||||
sub %o0, %o2, %o0
|
||||
END(__bzero)
|
||||
|
||||
ENTRY(memset)
|
||||
and %o1, 0xff, %g3
|
||||
sll %g3, 8, %g2
|
||||
or %g3, %g2, %g3
|
||||
sll %g3, 16, %g2
|
||||
or %g3, %g2, %g3
|
||||
orcc %o2, %g0, %o1
|
||||
1: cmp %o1, 7
|
||||
bleu 7f
|
||||
mov %o0, %g1
|
||||
|
||||
andcc %o0, 3, %o2
|
||||
bne 3b
|
||||
4: andcc %o0, 4, %g0
|
||||
|
||||
be 2f
|
||||
mov %g3, %g2
|
||||
|
||||
st %g3, [%o0]
|
||||
sub %o1, 4, %o1
|
||||
add %o0, 4, %o0
|
||||
2: andcc %o1, 0xffffff80, %o3
|
||||
be 9f
|
||||
andcc %o1, 0x78, %o2
|
||||
4: ZERO_BIG_BLOCK (%o0, 0x00, %g2)
|
||||
subcc %o3, 128, %o3
|
||||
ZERO_BIG_BLOCK (%o0, 0x40, %g2)
|
||||
bne 4b
|
||||
add %o0, 128, %o0
|
||||
|
||||
orcc %o2, %g0, %g0
|
||||
9: be 6f
|
||||
andcc %o1, 7, %o1
|
||||
|
||||
mov %o7, %g4
|
||||
101: call 100f
|
||||
srl %o2, 1, %o3
|
||||
mov %g4, %o7
|
||||
jmpl %o4 + (20f + 64 - 101b), %g0
|
||||
add %o0, %o2, %o0
|
||||
|
||||
100: retl
|
||||
sub %o7, %o3, %o4
|
||||
|
||||
20: ZERO_LAST_BLOCKS(%o0, 0x48, %g2)
|
||||
ZERO_LAST_BLOCKS(%o0, 0x08, %g2)
|
||||
|
||||
6: be 8f
|
||||
andcc %o1, 4, %g0
|
||||
be 1f
|
||||
andcc %o1, 2, %g0
|
||||
st %g3, [%o0]
|
||||
add %o0, 4, %o0
|
||||
1: be 1f
|
||||
andcc %o1, 1, %g0
|
||||
sth %g3, [%o0]
|
||||
add %o0, 2, %o0
|
||||
1: bne,a 8f
|
||||
stb %g3, [%o0]
|
||||
8: retl
|
||||
mov %g1, %o0
|
||||
7: orcc %o1, 0, %g0
|
||||
be 0f
|
||||
subcc %o1, 1, %o1
|
||||
stb %g3, [%o0]
|
||||
be 0f
|
||||
subcc %o1, 1, %o1
|
||||
stb %g3, [%o0 + 1]
|
||||
be 0f
|
||||
subcc %o1, 1, %o1
|
||||
stb %g3, [%o0 + 2]
|
||||
be 0f
|
||||
subcc %o1, 1, %o1
|
||||
stb %g3, [%o0 + 3]
|
||||
be 0f
|
||||
subcc %o1, 1, %o1
|
||||
stb %g3, [%o0 + 4]
|
||||
be 0f
|
||||
subcc %o1, 1, %o1
|
||||
stb %g3, [%o0 + 5]
|
||||
be 0f
|
||||
subcc %o1, 1, %o1
|
||||
stb %g3, [%o0 + 6]
|
||||
0: retl
|
||||
nop
|
||||
END(memset)
|
||||
|
||||
weak_alias(__bzero, bzero)
|
1
sysdeps/sparc/sparc32/sparcv8/Makefile
Normal file
1
sysdeps/sparc/sparc32/sparcv8/Makefile
Normal file
@ -0,0 +1 @@
|
||||
CFLAGS += -mv8
|
@ -8,6 +8,9 @@ ENTRY(.rem)
|
||||
|
||||
sra %o0, 31, %o2
|
||||
wr %o2, 0, %y
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
sdivcc %o0, %o1, %o2
|
||||
bvs,a 1f
|
||||
xnor %o2, %g0, %o2
|
||||
|
@ -8,7 +8,13 @@ ENTRY(.div)
|
||||
|
||||
sra %o0, 31, %o2
|
||||
wr %o2, 0, %y
|
||||
ret
|
||||
sdiv %o0, %o1, %o0
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
sdivcc %o0, %o1, %o0
|
||||
bvs,a 1f
|
||||
xnor %o0, %g0, %o0
|
||||
1: retl
|
||||
nop
|
||||
|
||||
END(.div)
|
||||
|
@ -7,6 +7,8 @@
|
||||
ENTRY(.udiv)
|
||||
|
||||
wr %g0, 0, %y
|
||||
nop
|
||||
nop
|
||||
retl
|
||||
udiv %o0, %o1, %o0
|
||||
|
||||
|
@ -7,6 +7,9 @@
|
||||
ENTRY(.urem)
|
||||
|
||||
wr %g0, 0, %y
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
udiv %o0, %o1, %o2
|
||||
umul %o2, %o1, %o2
|
||||
retl
|
||||
|
1
sysdeps/sparc/sparc32/sparcv9/Makefile
Normal file
1
sysdeps/sparc/sparc32/sparcv9/Makefile
Normal file
@ -0,0 +1 @@
|
||||
CFLAGS += -mv8 -mtune=ultrasparc
|
1
sysdeps/sparc/sparc32/sparcv9/bcopy.c
Normal file
1
sysdeps/sparc/sparc32/sparcv9/bcopy.c
Normal file
@ -0,0 +1 @@
|
||||
/* bcopy is in memcpy.S */
|
1
sysdeps/sparc/sparc32/sparcv9/bzero.c
Normal file
1
sysdeps/sparc/sparc32/sparcv9/bzero.c
Normal file
@ -0,0 +1 @@
|
||||
/* bzero is in memset.S */
|
17
sysdeps/sparc/sparc32/sparcv9/dotmul.S
Normal file
17
sysdeps/sparc/sparc32/sparcv9/dotmul.S
Normal file
@ -0,0 +1,17 @@
|
||||
/*
|
||||
* Sparc v9 has multiply.
|
||||
*/
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
.align 32
|
||||
ENTRY(.mul)
|
||||
|
||||
sra %o0, 0, %o0
|
||||
sra %o1, 0, %o1
|
||||
mulx %o0, %o1, %o0
|
||||
retl
|
||||
srax %o0, 32, %o1
|
||||
|
||||
END(.mul)
|
4
sysdeps/sparc/sparc32/sparcv9/memchr.S
Normal file
4
sysdeps/sparc/sparc32/sparcv9/memchr.S
Normal file
@ -0,0 +1,4 @@
|
||||
#define ASI_PNF 0x82
|
||||
#define ASI_BLK_P 0xf0
|
||||
#define XCC icc
|
||||
#include <sparc64/memchr.S>
|
4
sysdeps/sparc/sparc32/sparcv9/memcmp.S
Normal file
4
sysdeps/sparc/sparc32/sparcv9/memcmp.S
Normal file
@ -0,0 +1,4 @@
|
||||
#define ASI_PNF 0x82
|
||||
#define ASI_BLK_P 0xf0
|
||||
#define XCC icc
|
||||
#include <sparc64/memcmp.S>
|
4
sysdeps/sparc/sparc32/sparcv9/memcpy.S
Normal file
4
sysdeps/sparc/sparc32/sparcv9/memcpy.S
Normal file
@ -0,0 +1,4 @@
|
||||
#define ASI_PNF 0x82
|
||||
#define ASI_BLK_P 0xf0
|
||||
#define XCC icc
|
||||
#include <sparc64/memcpy.S>
|
4
sysdeps/sparc/sparc32/sparcv9/memset.S
Normal file
4
sysdeps/sparc/sparc32/sparcv9/memset.S
Normal file
@ -0,0 +1,4 @@
|
||||
#define ASI_PNF 0x82
|
||||
#define ASI_BLK_P 0xf0
|
||||
#define XCC icc
|
||||
#include <sparc64/memset.S>
|
22
sysdeps/sparc/sparc32/sparcv9/rem.S
Normal file
22
sysdeps/sparc/sparc32/sparcv9/rem.S
Normal file
@ -0,0 +1,22 @@
|
||||
/*
|
||||
* Sparc v9 has divide.
|
||||
* As divx takes 68 cycles and sdivcc only 36,
|
||||
* we use sdivcc eventhough it is deprecated.
|
||||
*/
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
.align 32
|
||||
ENTRY(.rem)
|
||||
|
||||
sra %o0, 31, %o2
|
||||
wr %o2, 0, %y
|
||||
sdivcc %o0, %o1, %o2
|
||||
xnor %o2, %g0, %o3
|
||||
movvs %icc, %o3, %o2
|
||||
smul %o2, %o1, %o2
|
||||
retl
|
||||
sub %o0, %o2, %o0
|
||||
|
||||
END(.rem)
|
20
sysdeps/sparc/sparc32/sparcv9/sdiv.S
Normal file
20
sysdeps/sparc/sparc32/sparcv9/sdiv.S
Normal file
@ -0,0 +1,20 @@
|
||||
/*
|
||||
* Sparc v9 has divide.
|
||||
* As divx takes 68 cycles and sdivcc only 36,
|
||||
* we use sdivcc eventhough it is deprecated.
|
||||
*/
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
.align 32
|
||||
ENTRY(.div)
|
||||
|
||||
sra %o0, 31, %o2
|
||||
wr %o2, 0, %y
|
||||
sdivcc %o0, %o1, %o0
|
||||
xnor %o0, %g0, %o2
|
||||
retl
|
||||
movvs %icc, %o2, %o0
|
||||
|
||||
END(.div)
|
4
sysdeps/sparc/sparc32/sparcv9/stpcpy.S
Normal file
4
sysdeps/sparc/sparc32/sparcv9/stpcpy.S
Normal file
@ -0,0 +1,4 @@
|
||||
#define ASI_PNF 0x82
|
||||
#define ASI_BLK_P 0xf0
|
||||
#define XCC icc
|
||||
#include <sparc64/stpcpy.S>
|
4
sysdeps/sparc/sparc32/sparcv9/stpncpy.S
Normal file
4
sysdeps/sparc/sparc32/sparcv9/stpncpy.S
Normal file
@ -0,0 +1,4 @@
|
||||
#define ASI_PNF 0x82
|
||||
#define ASI_BLK_P 0xf0
|
||||
#define XCC icc
|
||||
#include <sparc64/stpncpy.S>
|
4
sysdeps/sparc/sparc32/sparcv9/strcat.S
Normal file
4
sysdeps/sparc/sparc32/sparcv9/strcat.S
Normal file
@ -0,0 +1,4 @@
|
||||
#define ASI_PNF 0x82
|
||||
#define ASI_BLK_P 0xf0
|
||||
#define XCC icc
|
||||
#include <sparc64/strcat.S>
|
4
sysdeps/sparc/sparc32/sparcv9/strchr.S
Normal file
4
sysdeps/sparc/sparc32/sparcv9/strchr.S
Normal file
@ -0,0 +1,4 @@
|
||||
#define ASI_PNF 0x82
|
||||
#define ASI_BLK_P 0xf0
|
||||
#define XCC icc
|
||||
#include <sparc64/strchr.S>
|
4
sysdeps/sparc/sparc32/sparcv9/strcmp.S
Normal file
4
sysdeps/sparc/sparc32/sparcv9/strcmp.S
Normal file
@ -0,0 +1,4 @@
|
||||
#define ASI_PNF 0x82
|
||||
#define ASI_BLK_P 0xf0
|
||||
#define XCC icc
|
||||
#include <sparc64/strcmp.S>
|
4
sysdeps/sparc/sparc32/sparcv9/strcpy.S
Normal file
4
sysdeps/sparc/sparc32/sparcv9/strcpy.S
Normal file
@ -0,0 +1,4 @@
|
||||
#define ASI_PNF 0x82
|
||||
#define ASI_BLK_P 0xf0
|
||||
#define XCC icc
|
||||
#include <sparc64/strcpy.S>
|
4
sysdeps/sparc/sparc32/sparcv9/strcspn.S
Normal file
4
sysdeps/sparc/sparc32/sparcv9/strcspn.S
Normal file
@ -0,0 +1,4 @@
|
||||
#define ASI_PNF 0x82
|
||||
#define ASI_BLK_P 0xf0
|
||||
#define XCC icc
|
||||
#include <sparc64/strcspn.S>
|
4
sysdeps/sparc/sparc32/sparcv9/strlen.S
Normal file
4
sysdeps/sparc/sparc32/sparcv9/strlen.S
Normal file
@ -0,0 +1,4 @@
|
||||
#define ASI_PNF 0x82
|
||||
#define ASI_BLK_P 0xf0
|
||||
#define XCC icc
|
||||
#include <sparc64/strlen.S>
|
4
sysdeps/sparc/sparc32/sparcv9/strncmp.S
Normal file
4
sysdeps/sparc/sparc32/sparcv9/strncmp.S
Normal file
@ -0,0 +1,4 @@
|
||||
#define ASI_PNF 0x82
|
||||
#define ASI_BLK_P 0xf0
|
||||
#define XCC icc
|
||||
#include <sparc64/strncmp.S>
|
4
sysdeps/sparc/sparc32/sparcv9/strncpy.S
Normal file
4
sysdeps/sparc/sparc32/sparcv9/strncpy.S
Normal file
@ -0,0 +1,4 @@
|
||||
#define ASI_PNF 0x82
|
||||
#define ASI_BLK_P 0xf0
|
||||
#define XCC icc
|
||||
#include <sparc64/strncpy.S>
|
4
sysdeps/sparc/sparc32/sparcv9/strpbrk.S
Normal file
4
sysdeps/sparc/sparc32/sparcv9/strpbrk.S
Normal file
@ -0,0 +1,4 @@
|
||||
#define ASI_PNF 0x82
|
||||
#define ASI_BLK_P 0xf0
|
||||
#define XCC icc
|
||||
#include <sparc64/strpbrk.S>
|
1
sysdeps/sparc/sparc32/sparcv9/strrchr.c
Normal file
1
sysdeps/sparc/sparc32/sparcv9/strrchr.c
Normal file
@ -0,0 +1 @@
|
||||
/* strrchr is in strchr.S */
|
4
sysdeps/sparc/sparc32/sparcv9/strspn.S
Normal file
4
sysdeps/sparc/sparc32/sparcv9/strspn.S
Normal file
@ -0,0 +1,4 @@
|
||||
#define ASI_PNF 0x82
|
||||
#define ASI_BLK_P 0xf0
|
||||
#define XCC icc
|
||||
#include <sparc64/strspn.S>
|
17
sysdeps/sparc/sparc32/sparcv9/udiv.S
Normal file
17
sysdeps/sparc/sparc32/sparcv9/udiv.S
Normal file
@ -0,0 +1,17 @@
|
||||
/*
|
||||
* Sparc v9 has divide.
|
||||
* As divx takes 68 cycles and udiv only 37,
|
||||
* we use udiv eventhough it is deprecated.
|
||||
*/
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
.align 32
|
||||
ENTRY(.udiv)
|
||||
|
||||
wr %g0, 0, %y
|
||||
retl
|
||||
udiv %o0, %o1, %o0
|
||||
|
||||
END(.udiv)
|
17
sysdeps/sparc/sparc32/sparcv9/umul.S
Normal file
17
sysdeps/sparc/sparc32/sparcv9/umul.S
Normal file
@ -0,0 +1,17 @@
|
||||
/*
|
||||
* Sparc v9 has multiply.
|
||||
*/
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
.align 32
|
||||
ENTRY(.umul)
|
||||
|
||||
srl %o0, 0, %o0
|
||||
srl %o1, 0, %o1
|
||||
mulx %o0, %o1, %o0
|
||||
retl
|
||||
srlx %o0, 32, %o1
|
||||
|
||||
END(.umul)
|
19
sysdeps/sparc/sparc32/sparcv9/urem.S
Normal file
19
sysdeps/sparc/sparc32/sparcv9/urem.S
Normal file
@ -0,0 +1,19 @@
|
||||
/*
|
||||
* Sparc v9 has divide.
|
||||
* As divx takes 68 cycles and udiv only 37,
|
||||
* we use udiv eventhough it is deprecated.
|
||||
*/
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
.text
|
||||
.align 32
|
||||
ENTRY(.urem)
|
||||
|
||||
wr %g0, 0, %y
|
||||
udiv %o0, %o1, %o2
|
||||
umul %o2, %o1, %o2
|
||||
retl
|
||||
sub %o0, %o2, %o0
|
||||
|
||||
END(.urem)
|
163
sysdeps/sparc/sparc32/stpcpy.S
Normal file
163
sysdeps/sparc/sparc32/stpcpy.S
Normal file
@ -0,0 +1,163 @@
|
||||
/* Copy SRC to DEST returning the address of the terminating '\0' in DEST.
|
||||
For SPARC v7.
|
||||
Copyright (C) 1996, 1999 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jj@ultra.linux.cz>.
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
/* Normally, this uses ((xword - 0x01010101) & 0x80808080) test
|
||||
to find out if any byte in xword could be zero. This is fast, but
|
||||
also gives false alarm for any byte in range 0x81-0xff. It does
|
||||
not matter for correctness, as if this test tells us there could
|
||||
be some zero byte, we check it byte by byte, but if bytes with
|
||||
high bits set are common in the strings, then this will give poor
|
||||
performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
|
||||
will use one tick slower, but more precise test
|
||||
((xword - 0x01010101) & (~xword) & 0x80808080),
|
||||
which does not give any false alarms (but if some bits are set,
|
||||
one cannot assume from it which bytes are zero and which are not).
|
||||
It is yet to be measured, what is the correct default for glibc
|
||||
in these days for an average user.
|
||||
*/
|
||||
|
||||
.text
|
||||
.align 4
|
||||
10: ldub [%o1], %o5
|
||||
stb %o5, [%o0]
|
||||
cmp %o5, 0
|
||||
add %o0, 1, %o0
|
||||
be 1f
|
||||
add %o1, 1, %o1
|
||||
andcc %o1, 3, %g0
|
||||
be 4f
|
||||
or %o4, %lo(0x80808080), %o3
|
||||
ldub [%o1], %o5
|
||||
stb %o5, [%o0]
|
||||
cmp %o5, 0
|
||||
add %o0, 1, %o0
|
||||
be 1f
|
||||
add %o1, 1, %o1
|
||||
andcc %o1, 3, %g0
|
||||
be 5f
|
||||
sethi %hi(0x01010101), %o4
|
||||
ldub [%o1], %o5
|
||||
stb %o5, [%o0]
|
||||
cmp %o5, 0
|
||||
add %o0, 1, %o0
|
||||
be 1f
|
||||
add %o1, 1, %o1
|
||||
b 6f
|
||||
or %o4, %lo(0x01010101), %o2
|
||||
1: retl
|
||||
add %o0, -1, %o0
|
||||
|
||||
ENTRY(__stpcpy)
|
||||
andcc %o1, 3, %g0
|
||||
bne 10b
|
||||
sethi %hi(0x80808080), %o4
|
||||
or %o4, %lo(0x80808080), %o3
|
||||
4: sethi %hi(0x01010101), %o4
|
||||
5: or %o4, %lo(0x01010101), %o2
|
||||
6: andcc %o0, 3, %g0
|
||||
bne 16f
|
||||
sub %g0, 4, %g1
|
||||
|
||||
11: add %g1, 4, %g1
|
||||
ld [%o1 + %g1], %o5
|
||||
sub %o5, %o2, %o4
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %o4, %o5, %o4
|
||||
#endif
|
||||
andcc %o4, %o3, %g0
|
||||
be,a 11b
|
||||
st %o5, [%o0 + %g1]
|
||||
|
||||
/* Check every byte. */
|
||||
srl %o5, 24, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
be 14f
|
||||
srl %o5, 16, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
be 13f
|
||||
srl %o5, 8, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
be 12f
|
||||
andcc %o5, 0xff, %g0
|
||||
bne 11b
|
||||
st %o5, [%o0 + %g1]
|
||||
add %o0, %g1, %o0
|
||||
retl
|
||||
add %o0, 3, %o0
|
||||
12: srl %o5, 16, %o5
|
||||
sth %o5, [%o0 + %g1]
|
||||
add %g1, 2, %g1
|
||||
stb %g0, [%o0 + %g1]
|
||||
retl
|
||||
add %o0, %g1, %o0
|
||||
13: srl %o5, 16, %o5
|
||||
sth %o5, [%o0 + %g1]
|
||||
add %g1, 1, %g1
|
||||
retl
|
||||
add %o0, %g1, %o0
|
||||
14: stb %g0, [%o0 + %g1]
|
||||
retl
|
||||
add %o0, %g1, %o0
|
||||
|
||||
15: srl %o5, 24, %o4
|
||||
srl %o5, 16, %g1
|
||||
stb %o4, [%o0]
|
||||
srl %o5, 8, %g4
|
||||
stb %g1, [%o0 + 1]
|
||||
stb %g4, [%o0 + 2]
|
||||
stb %o5, [%o0 + 3]
|
||||
add %o0, 4, %o0
|
||||
16: ld [%o1], %o5
|
||||
sub %o5, %o2, %o4
|
||||
andcc %o4, %o3, %g0
|
||||
be 15b
|
||||
add %o1, 4, %o1
|
||||
|
||||
/* Check every byte. */
|
||||
srl %o5, 24, %g5
|
||||
andcc %g5, 0xff, %g4
|
||||
be 19f
|
||||
stb %g4, [%o0]
|
||||
srl %o5, 16, %g5
|
||||
andcc %g5, 0xff, %g4
|
||||
be 18f
|
||||
stb %g4, [%o0 + 1]
|
||||
srl %o5, 8, %g5
|
||||
andcc %g5, 0xff, %g4
|
||||
be 17f
|
||||
stb %g4, [%o0 + 2]
|
||||
andcc %o5, 0xff, %g4
|
||||
stb %g4, [%o0 + 3]
|
||||
bne 16b
|
||||
add %o0, 4, %o0
|
||||
retl
|
||||
sub %o0, 1, %o0
|
||||
17: retl
|
||||
add %o0, 2, %o0
|
||||
18: retl
|
||||
add %o0, 1, %o0
|
||||
19: retl
|
||||
nop
|
||||
END(__stpcpy)
|
||||
|
||||
weak_alias(__stpcpy, stpcpy)
|
348
sysdeps/sparc/sparc32/strcat.S
Normal file
348
sysdeps/sparc/sparc32/strcat.S
Normal file
@ -0,0 +1,348 @@
|
||||
/* strcat (dest, src) -- Append SRC on the end of DEST.
|
||||
For SPARC v7.
|
||||
Copyright (C) 1996, 1999 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jj@ultra.linux.cz>.
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
/* Normally, this uses ((xword - 0x01010101) & 0x80808080) test
|
||||
to find out if any byte in xword could be zero. This is fast, but
|
||||
also gives false alarm for any byte in range 0x81-0xff. It does
|
||||
not matter for correctness, as if this test tells us there could
|
||||
be some zero byte, we check it byte by byte, but if bytes with
|
||||
high bits set are common in the strings, then this will give poor
|
||||
performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
|
||||
will use one tick slower, but more precise test
|
||||
((xword - 0x01010101) & (~xword) & 0x80808080),
|
||||
which does not give any false alarms (but if some bits are set,
|
||||
one cannot assume from it which bytes are zero and which are not).
|
||||
It is yet to be measured, what is the correct default for glibc
|
||||
in these days for an average user.
|
||||
*/
|
||||
|
||||
.text
|
||||
.align 4
|
||||
10: cmp %o4, 2
|
||||
be 1f
|
||||
cmp %o4, 3
|
||||
ldub [%o1], %o5
|
||||
add %o1, 1, %o1
|
||||
stb %o5, [%o0]
|
||||
be 3f
|
||||
cmp %o5, 0
|
||||
be 0f
|
||||
add %o0, 1, %o0
|
||||
1: lduh [%o1], %o5
|
||||
add %o1, 2, %o1
|
||||
srl %o5, 8, %o4
|
||||
cmp %o4, 0
|
||||
stb %o4, [%o0]
|
||||
bne,a 2f
|
||||
stb %o5, [%o0 + 1]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
2: andcc %o5, 0xff, %o5
|
||||
bne 4f
|
||||
add %o0, 2, %o0
|
||||
retl
|
||||
mov %g2, %o0
|
||||
3: bne 4f
|
||||
add %o0, 1, %o0
|
||||
retl
|
||||
mov %g2, %o0
|
||||
|
||||
11: ldub [%o0], %o5
|
||||
cmp %o5, 0
|
||||
be 1f
|
||||
add %o0, 1, %o0
|
||||
andcc %o0, 3, %g0
|
||||
be 7f
|
||||
or %o4, %lo(0x80808080), %o3
|
||||
ldub [%o0], %o5
|
||||
cmp %o5, 0
|
||||
be 2f
|
||||
add %o0, 1, %o0
|
||||
andcc %o0, 3, %g0
|
||||
be 8f
|
||||
sethi %hi(0x01010101), %o4
|
||||
ldub [%o0], %o5
|
||||
cmp %o5, 0
|
||||
be 3f
|
||||
add %o0, 1, %o0
|
||||
b 9f
|
||||
or %o4, %lo(0x01010101), %o2
|
||||
1: or %o4, %lo(0x80808080), %o3
|
||||
2: sethi %hi(0x01010101), %o4
|
||||
3: or %o4, %lo(0x01010101), %o2
|
||||
b 3f
|
||||
sub %o0, 1, %o0
|
||||
|
||||
ENTRY(strcat)
|
||||
mov %o0, %g2
|
||||
andcc %o0, 3, %g0
|
||||
bne 11b
|
||||
sethi %hi(0x80808080), %o4
|
||||
or %o4, %lo(0x80808080), %o3
|
||||
7: sethi %hi(0x01010101), %o4
|
||||
8: or %o4, %lo(0x01010101), %o2
|
||||
9: ld [%o0], %o5
|
||||
7: sub %o5, %o2, %o4
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %o4, %o5, %o4
|
||||
#endif
|
||||
andcc %o4, %o3, %g0
|
||||
be 9b
|
||||
add %o0, 4, %o0
|
||||
|
||||
srl %o5, 24, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
be 3f
|
||||
add %o0, -4, %o0
|
||||
srl %o5, 16, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
be 3f
|
||||
add %o0, 1, %o0
|
||||
srl %o5, 8, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
be 3f
|
||||
add %o0, 1, %o0
|
||||
andcc %o5, 0xff, %g0
|
||||
add %o0, 2, %o0
|
||||
bne,a 7b
|
||||
ld [%o0], %o5
|
||||
sub %o0, 1, %o0
|
||||
3: andcc %o1, 3, %o4
|
||||
bne 10b
|
||||
4: andcc %o0, 3, %g3
|
||||
bne 12f
|
||||
1: ld [%o1], %o5
|
||||
add %o1, 4, %o1
|
||||
sub %o5, %o2, %o4
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %o4, %o5, %o4
|
||||
#endif
|
||||
add %o0, 4, %o0
|
||||
andcc %o4, %o3, %g0
|
||||
be,a 1b
|
||||
st %o5, [%o0 - 4]
|
||||
|
||||
srl %o5, 24, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
be 1f
|
||||
srl %o5, 16, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
be 2f
|
||||
srl %o5, 8, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
be 3f
|
||||
andcc %o5, 0xff, %g0
|
||||
bne 1b
|
||||
st %o5, [%o0 - 4]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
3: srl %o5, 16, %o5
|
||||
sth %o5, [%o0 - 4]
|
||||
stb %g0, [%o0 - 2]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
2: srl %o5, 16, %o5
|
||||
sth %o5, [%o0 - 4]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
1: stb %g0, [%o0 - 4]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
|
||||
12: add %o1, 4, %o1
|
||||
sub %o5, %o2, %o4
|
||||
cmp %g3, 2
|
||||
be 2f
|
||||
cmp %g3, 3
|
||||
be 3f
|
||||
andcc %o4, %o3, %g0
|
||||
bne 5f
|
||||
srl %o5, 24, %g5
|
||||
stb %g5, [%o0]
|
||||
sub %o0, 1, %o0
|
||||
srl %o5, 8, %g5
|
||||
sth %g5, [%o0 + 2]
|
||||
1: add %o0, 4, %o0
|
||||
4: sll %o5, 24, %g6
|
||||
ld [%o1], %o5
|
||||
add %o1, 4, %o1
|
||||
srl %o5, 8, %g5
|
||||
sub %o5, %o2, %o4
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %o4, %o5, %o4
|
||||
#endif
|
||||
or %g5, %g6, %g5
|
||||
andcc %o4, %o3, %g0
|
||||
be,a 1b
|
||||
st %g5, [%o0]
|
||||
srl %o5, 24, %o4
|
||||
andcc %o4, 0xff, %g0
|
||||
be 6f
|
||||
srl %o5, 16, %o4
|
||||
andcc %o4, 0xff, %g0
|
||||
be 7f
|
||||
srl %o5, 8, %o4
|
||||
st %g5, [%o0]
|
||||
andcc %o4, 0xff, %g0
|
||||
be 0f
|
||||
andcc %o5, 0xff, %g0
|
||||
1: bne 4b
|
||||
add %o0, 4, %o0
|
||||
9: stb %g0, [%o0]
|
||||
0: retl
|
||||
mov %g2, %o0
|
||||
|
||||
6: srl %g5, 16, %g5
|
||||
sth %g5, [%o0]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
|
||||
7: srl %g5, 16, %g5
|
||||
sth %g5, [%o0]
|
||||
stb %g0, [%o0 + 2]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
|
||||
5: andcc %g5, 0xff, %g4
|
||||
be 9b
|
||||
srl %o5, 16, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
be 7f
|
||||
srl %o5, 8, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
stb %g4, [%o0]
|
||||
sth %g5, [%o0 + 1]
|
||||
sub %o0, 1, %o0
|
||||
bne 1b
|
||||
andcc %o5, 0xff, %g0
|
||||
retl
|
||||
mov %g2, %o0
|
||||
|
||||
7: stb %g4, [%o0]
|
||||
stb %g0, [%o0 + 1]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
|
||||
2: andcc %o4, %o3, %g0
|
||||
bne 5f
|
||||
srl %o5, 16, %g5
|
||||
sth %g5, [%o0]
|
||||
sub %o0, 2, %o0
|
||||
1: add %o0, 4, %o0
|
||||
4: sll %o5, 16, %g6
|
||||
ld [%o1], %o5
|
||||
add %o1, 4, %o1
|
||||
srl %o5, 16, %g5
|
||||
sub %o5, %o2, %o4
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %o4, %o5, %o4
|
||||
#endif
|
||||
or %g5, %g6, %g5
|
||||
andcc %o4, %o3, %g0
|
||||
be,a 1b
|
||||
st %g5, [%o0]
|
||||
srl %o5, 24, %o4
|
||||
andcc %o4, 0xff, %g0
|
||||
be 7f
|
||||
srl %o5, 16, %o4
|
||||
st %g5, [%o0]
|
||||
andcc %o4, 0xff, %g0
|
||||
be 0b
|
||||
srl %o5, 8, %o4
|
||||
1: andcc %o4, 0xff, %g0
|
||||
be 8f
|
||||
andcc %o5, 0xff, %g0
|
||||
bne 4b
|
||||
add %o0, 4, %o0
|
||||
sth %o5, [%o0]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
|
||||
7: srl %g5, 16, %g5
|
||||
sth %g5, [%o0]
|
||||
stb %g0, [%o0 + 2]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
|
||||
8: stb %g0, [%o0 + 4]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
|
||||
5: srl %o5, 24, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
be 9b
|
||||
srl %o5, 16, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
sth %g5, [%o0]
|
||||
sub %o0, 2, %o0
|
||||
bne 1b
|
||||
srl %o5, 8, %o4
|
||||
retl
|
||||
mov %g2, %o0
|
||||
|
||||
3: bne 5f
|
||||
srl %o5, 24, %g5
|
||||
stb %g5, [%o0]
|
||||
sub %o0, 3, %o0
|
||||
1: add %o0, 4, %o0
|
||||
4: sll %o5, 8, %g6
|
||||
ld [%o1], %o5
|
||||
add %o1, 4, %o1
|
||||
srl %o5, 24, %g5
|
||||
sub %o5, %o2, %o4
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %o4, %o5, %o4
|
||||
#endif
|
||||
or %g5, %g6, %g5
|
||||
andcc %o4, %o3, %g0
|
||||
be 1b
|
||||
st %g5, [%o0]
|
||||
srl %o5, 24, %o4
|
||||
andcc %o4, 0xff, %g0
|
||||
be 0b
|
||||
srl %o5, 16, %o4
|
||||
1: andcc %o4, 0xff, %g0
|
||||
be 8b
|
||||
srl %o5, 8, %o4
|
||||
andcc %o4, 0xff, %g0
|
||||
be 9f
|
||||
andcc %o5, 0xff, %g0
|
||||
bne 4b
|
||||
add %o0, 4, %o0
|
||||
srl %o5, 8, %o5
|
||||
sth %o5, [%o0]
|
||||
stb %g0, [%o0 + 2]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
9: srl %o5, 8, %o5
|
||||
sth %o5, [%o0 + 4]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
5: andcc %g5, 0xff, %g0
|
||||
stb %g5, [%o0]
|
||||
sub %o0, 3, %o0
|
||||
bne 1b
|
||||
srl %o5, 16, %o4
|
||||
retl
|
||||
mov %g2, %o0
|
||||
END(strcat)
|
282
sysdeps/sparc/sparc32/strchr.S
Normal file
282
sysdeps/sparc/sparc32/strchr.S
Normal file
@ -0,0 +1,282 @@
|
||||
/* strchr (str, ch) -- Return pointer to first occurrence of CH in STR.
|
||||
For SPARC v7.
|
||||
Copyright (C) 1996, 1999 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jj@ultra.linux.cz> and
|
||||
David S. Miller <davem@caip.rutgers.edu>.
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
/* Normally, this uses ((xword - 0x01010101) & 0x80808080) test
|
||||
to find out if any byte in xword could be zero. This is fast, but
|
||||
also gives false alarm for any byte in range 0x81-0xff. It does
|
||||
not matter for correctness, as if this test tells us there could
|
||||
be some zero byte, we check it byte by byte, but if bytes with
|
||||
high bits set are common in the strings, then this will give poor
|
||||
performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
|
||||
will use one tick slower, but more precise test
|
||||
((xword - 0x01010101) & (~xword) & 0x80808080),
|
||||
which does not give any false alarms (but if some bits are set,
|
||||
one cannot assume from it which bytes are zero and which are not).
|
||||
It is yet to be measured, what is the correct default for glibc
|
||||
in these days for an average user.
|
||||
*/
|
||||
|
||||
.text
|
||||
.align 4
|
||||
10: ldub [%o0], %g4
|
||||
cmp %g4, %o1
|
||||
be 1f
|
||||
add %o0, 1, %o0
|
||||
cmp %g4, 0
|
||||
be 9f
|
||||
andcc %o0, 3, %g0
|
||||
be 4f
|
||||
or %o4, %lo(0x80808080), %o3
|
||||
ldub [%o0], %g4
|
||||
cmp %g4, %o1
|
||||
be 1f
|
||||
add %o0, 1, %o0
|
||||
cmp %g4, 0
|
||||
be 9f
|
||||
andcc %o0, 3, %g0
|
||||
be 5f
|
||||
sethi %hi(0x01010101), %o5
|
||||
ldub [%o0], %g4
|
||||
cmp %g4, %o1
|
||||
be 1f
|
||||
add %o0, 1, %o0
|
||||
cmp %g4, 0
|
||||
be 9f
|
||||
or %o5, %lo(0x01010101), %o2
|
||||
b 6f
|
||||
ld [%o0], %g4
|
||||
1: retl
|
||||
sub %o0, 1, %o0
|
||||
|
||||
ENTRY(strchr)
|
||||
andcc %o1, 0xff, %o1
|
||||
be 12f
|
||||
sll %o1, 8, %o2
|
||||
andcc %o0, 3, %g0
|
||||
or %o1, %o2, %o2
|
||||
sethi %hi(0x80808080), %o4
|
||||
sll %o2, 16, %o3
|
||||
bne 10b
|
||||
or %o3, %o2, %g2
|
||||
or %o4, %lo(0x80808080), %o3
|
||||
4: sethi %hi(0x01010101), %o5
|
||||
5: or %o5, %lo(0x01010101), %o2
|
||||
7: ld [%o0], %g4
|
||||
6: xor %g4, %g2, %g5
|
||||
sub %g4, %o2, %o4
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
sub %g5, %o2, %g7
|
||||
andn %o4, %g4, %o4
|
||||
andn %g7, %g5, %g5
|
||||
#else
|
||||
sub %g5, %o2, %g5
|
||||
#endif
|
||||
or %g5, %o4, %o4
|
||||
andcc %o4, %o3, %g0
|
||||
be 7b
|
||||
add %o0, 4, %o0
|
||||
|
||||
/* Check every byte. */
|
||||
8: srl %g4, 24, %g5
|
||||
7: andcc %g5, 0xff, %g5
|
||||
be 9f
|
||||
cmp %g5, %o1
|
||||
be 4f
|
||||
srl %g4, 16, %g5
|
||||
andcc %g5, 0xff, %g5
|
||||
be 9f
|
||||
cmp %g5, %o1
|
||||
be 3f
|
||||
srl %g4, 8, %g5
|
||||
andcc %g5, 0xff, %g5
|
||||
be 9f
|
||||
cmp %g5, %o1
|
||||
be 2f
|
||||
andcc %g4, 0xff, %g5
|
||||
be 9f
|
||||
cmp %g5, %o1
|
||||
bne,a 6b
|
||||
ld [%o0], %g4
|
||||
retl
|
||||
sub %o0, 1, %o0
|
||||
2: retl
|
||||
sub %o0, 2, %o0
|
||||
3: retl
|
||||
sub %o0, 3, %o0
|
||||
4: retl
|
||||
sub %o0, 4, %o0
|
||||
9: retl
|
||||
clr %o0
|
||||
|
||||
11: ldub [%o0], %o5
|
||||
cmp %o5, 0
|
||||
be 1f
|
||||
add %o0, 1, %o0
|
||||
andcc %o0, 3, %g0
|
||||
be 4f
|
||||
or %o4, %lo(0x80808080), %o3
|
||||
ldub [%o0], %o5
|
||||
cmp %o5, 0
|
||||
be 1f
|
||||
add %o0, 1, %o0
|
||||
andcc %o0, 3, %g0
|
||||
be 5f
|
||||
sethi %hi(0x01010101), %o4
|
||||
ldub [%o0], %o5
|
||||
cmp %o5, 0
|
||||
be 1f
|
||||
add %o0, 1, %o0
|
||||
b 6f
|
||||
or %o4, %lo(0x01010101), %o2
|
||||
1: retl
|
||||
sub %o0, 1, %o0
|
||||
|
||||
12: andcc %o0, 3, %g0
|
||||
bne 11b
|
||||
sethi %hi(0x80808080), %o4
|
||||
or %o4, %lo(0x80808080), %o3
|
||||
4: sethi %hi(0x01010101), %o4
|
||||
5: or %o4, %lo(0x01010101), %o2
|
||||
6: ld [%o0], %o5
|
||||
7: sub %o5, %o2, %o4
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %o4, %o5, %o4
|
||||
#endif
|
||||
andcc %o4, %o3, %g0
|
||||
be 6b
|
||||
add %o0, 4, %o0
|
||||
|
||||
/* Check every byte. */
|
||||
srl %o5, 24, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
be 8f
|
||||
add %o0, -4, %o4
|
||||
srl %o5, 16, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
be 8f
|
||||
add %o4, 1, %o4
|
||||
srl %o5, 8, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
be 8f
|
||||
add %o4, 1, %o4
|
||||
andcc %o5, 0xff, %g0
|
||||
bne,a 7b
|
||||
ld [%o0], %o5
|
||||
add %o4, 1, %o4
|
||||
8: retl
|
||||
mov %o4, %o0
|
||||
|
||||
13: ldub [%o0], %g4
|
||||
cmp %g4, %o1
|
||||
add %o0, 1, %o0
|
||||
be,a 1f
|
||||
sub %o0, 1, %o5
|
||||
cmp %g4, 0
|
||||
be 9f
|
||||
1: andcc %o0, 3, %g0
|
||||
be 4f
|
||||
or %o4, %lo(0x80808080), %o3
|
||||
ldub [%o0], %g4
|
||||
cmp %g4, %o1
|
||||
add %o0, 1, %o0
|
||||
be,a 1f
|
||||
sub %o0, 1, %o5
|
||||
cmp %g4, 0
|
||||
be 9f
|
||||
1: andcc %o0, 3, %g0
|
||||
be 5f
|
||||
sethi %hi(0x01010101), %o4
|
||||
ldub [%o0], %g4
|
||||
cmp %g4, %o1
|
||||
add %o0, 1, %o0
|
||||
be,a 1f
|
||||
sub %o0, 1, %o5
|
||||
cmp %g4, 0
|
||||
be 9f
|
||||
1: or %o4, %lo(0x01010101), %o2
|
||||
b 7f
|
||||
ld [%o0], %g4
|
||||
END(strchr)
|
||||
|
||||
ENTRY(strrchr)
|
||||
andcc %o1, 0xff, %o1
|
||||
clr %o5
|
||||
be 12b
|
||||
sll %o1, 8, %o2
|
||||
andcc %o0, 3, %g0
|
||||
or %o1, %o2, %o2
|
||||
sethi %hi(0x80808080), %o4
|
||||
sll %o2, 16, %o3
|
||||
bne 13b
|
||||
or %o3, %o2, %g2
|
||||
or %o4, %lo(0x80808080), %o3
|
||||
4: sethi %hi(0x01010101), %o4
|
||||
5: or %o4, %lo(0x01010101), %o2
|
||||
6: ld [%o0], %g4
|
||||
7: xor %g4, %g2, %g5
|
||||
sub %g4, %o2, %o4
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
sub %g5, %o2, %g7
|
||||
andn %o4, %g4, %o4
|
||||
andn %g7, %g5, %g5
|
||||
#else
|
||||
sub %g5, %o2, %g5
|
||||
#endif
|
||||
or %g5, %o4, %o4
|
||||
andcc %o4, %o3, %g0
|
||||
be 6b
|
||||
add %o0, 4, %o0
|
||||
|
||||
/* Check every byte. */
|
||||
3: srl %g4, 24, %g5
|
||||
8: andcc %g5, 0xff, %g5
|
||||
be 9f
|
||||
cmp %g5, %o1
|
||||
be,a 1f
|
||||
sub %o0, 4, %o5
|
||||
1: srl %g4, 16, %g5
|
||||
andcc %g5, 0xff, %g5
|
||||
be 9f
|
||||
cmp %g5, %o1
|
||||
be,a 1f
|
||||
sub %o0, 3, %o5
|
||||
1: srl %g4, 8, %g5
|
||||
andcc %g5, 0xff, %g5
|
||||
be 9f
|
||||
cmp %g5, %o1
|
||||
be,a 1f
|
||||
sub %o0, 2, %o5
|
||||
1: andcc %g4, 0xff, %g5
|
||||
be 9f
|
||||
cmp %g5, %o1
|
||||
be,a 1f
|
||||
sub %o0, 1, %o5
|
||||
1: b 7b
|
||||
ld [%o0], %g4
|
||||
9: retl
|
||||
mov %o5, %o0
|
||||
END(strrchr)
|
||||
|
||||
weak_alias(strchr, index)
|
||||
weak_alias(strrchr, rindex)
|
257
sysdeps/sparc/sparc32/strcmp.S
Normal file
257
sysdeps/sparc/sparc32/strcmp.S
Normal file
@ -0,0 +1,257 @@
|
||||
/* Compare two strings for differences.
|
||||
For SPARC v7.
|
||||
Copyright (C) 1996, 97, 99 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jj@ultra.linux.cz>.
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
/* Normally, this uses ((xword - 0x01010101) & 0x80808080) test
|
||||
to find out if any byte in xword could be zero. This is fast, but
|
||||
also gives false alarm for any byte in range 0x81-0xff. It does
|
||||
not matter for correctness, as if this test tells us there could
|
||||
be some zero byte, we check it byte by byte, but if bytes with
|
||||
high bits set are common in the strings, then this will give poor
|
||||
performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
|
||||
will use one tick slower, but more precise test
|
||||
((xword - 0x01010101) & (~xword) & 0x80808080),
|
||||
which does not give any false alarms (but if some bits are set,
|
||||
one cannot assume from it which bytes are zero and which are not).
|
||||
It is yet to be measured, what is the correct default for glibc
|
||||
in these days for an average user.
|
||||
*/
|
||||
|
||||
.text
|
||||
.align 4
|
||||
10: ldub [%o0], %o4
|
||||
add %o0, 1, %o0
|
||||
ldub [%o1], %o5
|
||||
cmp %o4, 0
|
||||
add %o1, 1, %o1
|
||||
be 2f
|
||||
subcc %o4, %o5, %o4
|
||||
bne 2f
|
||||
andcc %o0, 3, %g0
|
||||
be 4f
|
||||
or %g1, %lo(0x80808080), %o3
|
||||
ldub [%o0], %o4
|
||||
add %o0, 1, %o0
|
||||
ldub [%o1], %o5
|
||||
cmp %o4, 0
|
||||
add %o1, 1, %o1
|
||||
be 2f
|
||||
subcc %o4, %o5, %o4
|
||||
bne 2f
|
||||
andcc %o0, 3, %g0
|
||||
be 5f
|
||||
sethi %hi(0x01010101), %g1
|
||||
ldub [%o0], %o4
|
||||
add %o0, 1, %o0
|
||||
ldub [%o1], %o5
|
||||
cmp %o4, 0
|
||||
add %o1, 1, %o1
|
||||
be 2f
|
||||
subcc %o4, %o5, %o4
|
||||
bne 2f
|
||||
andcc %o1, 3, %g2
|
||||
bne 12f
|
||||
or %g1, %lo(0x01010101), %o2
|
||||
b 1f
|
||||
ld [%o0], %o4
|
||||
2: retl
|
||||
mov %o4, %o0
|
||||
|
||||
ENTRY(strcmp)
|
||||
andcc %o0, 3, %g0
|
||||
bne 10b
|
||||
sethi %hi(0x80808080), %g1
|
||||
or %g1, %lo(0x80808080), %o3
|
||||
4: sethi %hi(0x01010101), %g1
|
||||
5: andcc %o1, 3, %g2
|
||||
bne 12f
|
||||
or %g1, %lo(0x01010101), %o2
|
||||
|
||||
0: ld [%o0], %o4
|
||||
1: ld [%o1], %o5
|
||||
sub %o4, %o2, %g1
|
||||
add %o0, 4, %o0
|
||||
cmp %o4, %o5
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %g1, %o4, %g1
|
||||
#endif
|
||||
bne 11f
|
||||
andcc %g1, %o3, %g0
|
||||
be 0b
|
||||
add %o1, 4, %o1
|
||||
|
||||
srl %o4, 24, %g4
|
||||
andcc %g4, 0xff, %g0
|
||||
be 2f
|
||||
srl %o4, 16, %g4
|
||||
andcc %g4, 0xff, %g0
|
||||
be 2f
|
||||
srl %o4, 8, %g4
|
||||
andcc %g4, 0xff, %g0
|
||||
be 2f
|
||||
andcc %o4, 0xff, %g0
|
||||
bne,a 1b
|
||||
ld [%o0], %o4
|
||||
2: retl
|
||||
clr %o0
|
||||
|
||||
11: srl %o4, 24, %g4
|
||||
srl %o5, 24, %g5
|
||||
andcc %g4, 0xff, %g0
|
||||
be 3f
|
||||
subcc %g4, %g5, %g4
|
||||
bne 3f
|
||||
srl %o5, 16, %g5
|
||||
srl %o4, 16, %g4
|
||||
andcc %g4, 0xff, %g0
|
||||
be 3f
|
||||
subcc %g4, %g5, %g4
|
||||
bne 3f
|
||||
srl %o5, 8, %g5
|
||||
srl %o4, 8, %g4
|
||||
andcc %g4, 0xff, %g0
|
||||
be 3f
|
||||
subcc %g4, %g5, %g4
|
||||
bne 3f
|
||||
subcc %o4, %o5, %o4
|
||||
retl
|
||||
mov %o4, %o0
|
||||
3: retl
|
||||
mov %g4, %o0
|
||||
|
||||
12: save %sp, -64, %sp
|
||||
ld [%i0], %i4
|
||||
sll %g2, 3, %g3
|
||||
andn %i1, 3, %i1
|
||||
mov 32, %l1
|
||||
ld [%i1], %l2
|
||||
mov -1, %g7
|
||||
add %i1, 4, %i1
|
||||
sub %l1, %g3, %l1
|
||||
sll %g7, %g3, %g7
|
||||
|
||||
1: sll %l2, %g3, %g5
|
||||
and %i4, %g7, %l3
|
||||
sub %i4, %i2, %g1
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %g1, %i4, %g1
|
||||
#endif
|
||||
andcc %g1, %i3, %g1
|
||||
bne 3f
|
||||
cmp %g5, %l3
|
||||
bne 2f
|
||||
add %i0, 4, %i0
|
||||
ld [%i1], %l2
|
||||
add %i1, 4, %i1
|
||||
srl %l2, %l1, %l4
|
||||
or %l4, %g5, %l4
|
||||
cmp %l4, %i4
|
||||
be,a 1b
|
||||
ld [%i0], %i4
|
||||
restore %l4, %g0, %o3
|
||||
retl
|
||||
sub %o4, %o3, %o0
|
||||
|
||||
2: sll %l2, %g3, %i2
|
||||
srl %i4, %g3, %i3
|
||||
srl %i2, %g3, %i2
|
||||
restore
|
||||
retl
|
||||
sub %o3, %o2, %o0
|
||||
|
||||
3: srl %i4, 24, %g4
|
||||
srl %g5, 24, %l6
|
||||
andcc %g4, 0xff, %g0
|
||||
be 4f
|
||||
subcc %g4, %l6, %g4
|
||||
bne 4f
|
||||
cmp %g2, 3
|
||||
be 6f
|
||||
srl %i4, 16, %g4
|
||||
srl %g5, 16, %l6
|
||||
andcc %g4, 0xff, %g0
|
||||
be 4f
|
||||
subcc %g4, %l6, %g4
|
||||
bne 4f
|
||||
cmp %g2, 2
|
||||
be 5f
|
||||
srl %i4, 8, %g4
|
||||
srl %g5, 8, %l6
|
||||
andcc %g4, 0xff, %g0
|
||||
be 4f
|
||||
subcc %g4, %l6, %g4
|
||||
bne 4f
|
||||
add %i0, 4, %i0
|
||||
ld [%i1], %l2
|
||||
add %i1, 4, %i1
|
||||
srl %l2, 24, %g5
|
||||
andcc %i4, 0xff, %g4
|
||||
be 4f
|
||||
subcc %g4, %g5, %g4
|
||||
be,a 1b
|
||||
ld [%i0], %i4
|
||||
4: jmpl %i7 + 8, %g0
|
||||
restore %g4, %g0, %o0
|
||||
|
||||
5: ld [%i1], %l2
|
||||
add %i1, 4, %i1
|
||||
add %i0, 4, %i0
|
||||
srl %l2, 24, %l6
|
||||
andcc %g4, 0xff, %g4
|
||||
be 4b
|
||||
subcc %g4, %l6, %g4
|
||||
bne 4b
|
||||
srl %l2, 16, %l6
|
||||
andcc %i4, 0xff, %g4
|
||||
and %l6, 0xff, %l6
|
||||
be 4b
|
||||
subcc %g4, %l6, %g4
|
||||
be,a 1b
|
||||
ld [%i0], %i4
|
||||
jmpl %i7 + 8, %g0
|
||||
restore %g4, %g0, %o0
|
||||
|
||||
6: ld [%i1], %l2
|
||||
add %i1, 4, %i1
|
||||
add %i0, 4, %i0
|
||||
srl %l2, 24, %l6
|
||||
andcc %g4, 0xff, %g4
|
||||
be 4b
|
||||
subcc %g4, %l6, %g4
|
||||
bne 4b
|
||||
srl %l2, 16, %l6
|
||||
srl %i4, 8, %g4
|
||||
and %l6, 0xff, %l6
|
||||
andcc %g4, 0xff, %g4
|
||||
be 4b
|
||||
subcc %g4, %l6, %g4
|
||||
bne 4b
|
||||
srl %l2, 8, %l6
|
||||
andcc %i4, 0xff, %g4
|
||||
and %l6, 0xff, %l6
|
||||
be 4b
|
||||
subcc %g4, %l6, %g4
|
||||
be,a 1b
|
||||
ld [%i0], %i4
|
||||
jmpl %i7 + 8, %g0
|
||||
restore %g4, %g0, %o0
|
||||
END(strcmp)
|
274
sysdeps/sparc/sparc32/strcpy.S
Normal file
274
sysdeps/sparc/sparc32/strcpy.S
Normal file
@ -0,0 +1,274 @@
|
||||
/* Copy SRC to DEST returning DEST.
|
||||
For SPARC v7.
|
||||
Copyright (C) 1996, 1999 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jj@ultra.linux.cz>.
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
/* Normally, this uses ((xword - 0x01010101) & 0x80808080) test
|
||||
to find out if any byte in xword could be zero. This is fast, but
|
||||
also gives false alarm for any byte in range 0x81-0xff. It does
|
||||
not matter for correctness, as if this test tells us there could
|
||||
be some zero byte, we check it byte by byte, but if bytes with
|
||||
high bits set are common in the strings, then this will give poor
|
||||
performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
|
||||
will use one tick slower, but more precise test
|
||||
((xword - 0x01010101) & (~xword) & 0x80808080),
|
||||
which does not give any false alarms (but if some bits are set,
|
||||
one cannot assume from it which bytes are zero and which are not).
|
||||
It is yet to be measured, what is the correct default for glibc
|
||||
in these days for an average user.
|
||||
*/
|
||||
|
||||
.text
|
||||
.align 4
|
||||
1: ldub [%o1], %o5
|
||||
stb %o5, [%o0]
|
||||
cmp %o5, 0
|
||||
add %o0, 1, %o0
|
||||
be 0f
|
||||
add %o1, 1, %o1
|
||||
andcc %o1, 3, %g0
|
||||
be 4f
|
||||
or %o4, %lo(0x80808080), %o3
|
||||
ldub [%o1], %o5
|
||||
stb %o5, [%o0]
|
||||
cmp %o5, 0
|
||||
add %o0, 1, %o0
|
||||
be 0f
|
||||
add %o1, 1, %o1
|
||||
andcc %o1, 3, %g0
|
||||
be 5f
|
||||
sethi %hi(0x01010101), %o4
|
||||
ldub [%o1], %o5
|
||||
stb %o5, [%o0]
|
||||
cmp %o5, 0
|
||||
add %o0, 1, %o0
|
||||
be 0f
|
||||
add %o1, 1, %o1
|
||||
b 6f
|
||||
andcc %o0, 3, %g3
|
||||
|
||||
ENTRY(strcpy)
|
||||
mov %o0, %g2
|
||||
andcc %o1, 3, %g0
|
||||
bne 1b
|
||||
sethi %hi(0x80808080), %o4
|
||||
or %o4, %lo(0x80808080), %o3
|
||||
4: sethi %hi(0x01010101), %o4
|
||||
5: andcc %o0, 3, %g3
|
||||
6: bne 10f
|
||||
or %o4, %lo(0x01010101), %o2
|
||||
1: ld [%o1], %o5
|
||||
add %o1, 4, %o1
|
||||
sub %o5, %o2, %o4
|
||||
add %o0, 4, %o0
|
||||
andcc %o4, %o3, %g0
|
||||
be,a 1b
|
||||
st %o5, [%o0 - 4]
|
||||
|
||||
srl %o5, 24, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
be 1f
|
||||
srl %o5, 16, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
be 2f
|
||||
srl %o5, 8, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
be 3f
|
||||
andcc %o5, 0xff, %g0
|
||||
bne 1b
|
||||
st %o5, [%o0 - 4]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
3: srl %o5, 16, %o5
|
||||
sth %o5, [%o0 - 4]
|
||||
stb %g0, [%o0 - 2]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
2: srl %o5, 16, %o5
|
||||
sth %o5, [%o0 - 4]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
1: stb %g0, [%o0 - 4]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
|
||||
10: ld [%o1], %o5
|
||||
add %o1, 4, %o1
|
||||
sub %o5, %o2, %o4
|
||||
cmp %g3, 2
|
||||
be 2f
|
||||
cmp %g3, 3
|
||||
be 3f
|
||||
andcc %o4, %o3, %g0
|
||||
bne 5f
|
||||
srl %o5, 24, %g5
|
||||
stb %g5, [%o0]
|
||||
sub %o0, 1, %o0
|
||||
srl %o5, 8, %g5
|
||||
sth %g5, [%o0 + 2]
|
||||
1: add %o0, 4, %o0
|
||||
4: sll %o5, 24, %g6
|
||||
ld [%o1], %o5
|
||||
add %o1, 4, %o1
|
||||
srl %o5, 8, %g5
|
||||
sub %o5, %o2, %o4
|
||||
or %g5, %g6, %g5
|
||||
andcc %o4, %o3, %g0
|
||||
be,a 1b
|
||||
st %g5, [%o0]
|
||||
srl %o5, 24, %o4
|
||||
andcc %o4, 0xff, %g0
|
||||
be 6f
|
||||
srl %o5, 16, %o4
|
||||
andcc %o4, 0xff, %g0
|
||||
be 7f
|
||||
srl %o5, 8, %o4
|
||||
st %g5, [%o0]
|
||||
andcc %o4, 0xff, %g0
|
||||
be 0f
|
||||
andcc %o5, 0xff, %g0
|
||||
1: bne 4b
|
||||
add %o0, 4, %o0
|
||||
9: stb %g0, [%o0]
|
||||
0: retl
|
||||
mov %g2, %o0
|
||||
6: srl %g5, 16, %g5
|
||||
sth %g5, [%o0]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
7: srl %g5, 16, %g5
|
||||
sth %g5, [%o0]
|
||||
stb %g0, [%o0 + 2]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
5: andcc %g5, 0xff, %g4
|
||||
be 9b
|
||||
srl %o5, 16, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
be 7f
|
||||
srl %o5, 8, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
stb %g4, [%o0]
|
||||
sth %g5, [%o0 + 1]
|
||||
sub %o0, 1, %o0
|
||||
bne 1b
|
||||
andcc %o5, 0xff, %g0
|
||||
retl
|
||||
mov %g2, %o0
|
||||
7: stb %g4, [%o0]
|
||||
stb %g0, [%o0 + 1]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
|
||||
2: andcc %o4, %o3, %g0
|
||||
bne 5f
|
||||
srl %o5, 16, %g5
|
||||
sth %g5, [%o0]
|
||||
sub %o0, 2, %o0
|
||||
1: add %o0, 4, %o0
|
||||
4: sll %o5, 16, %g6
|
||||
ld [%o1], %o5
|
||||
add %o1, 4, %o1
|
||||
srl %o5, 16, %g5
|
||||
sub %o5, %o2, %o4
|
||||
or %g5, %g6, %g5
|
||||
andcc %o4, %o3, %g0
|
||||
be,a 1b
|
||||
st %g5, [%o0]
|
||||
srl %o5, 24, %o4
|
||||
andcc %o4, 0xff, %g0
|
||||
be 7f
|
||||
srl %o5, 16, %o4
|
||||
st %g5, [%o0]
|
||||
andcc %o4, 0xff, %g0
|
||||
be 0b
|
||||
srl %o5, 8, %o4
|
||||
1: andcc %o4, 0xff, %g0
|
||||
be 8f
|
||||
andcc %o5, 0xff, %g0
|
||||
bne 4b
|
||||
add %o0, 4, %o0
|
||||
sth %o5, [%o0]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
7: srl %g5, 16, %g5
|
||||
sth %g5, [%o0]
|
||||
stb %g0, [%o0 + 2]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
8: stb %g0, [%o0 + 4]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
5: srl %o5, 24, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
be 9b
|
||||
srl %o5, 16, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
sth %g5, [%o0]
|
||||
sub %o0, 2, %o0
|
||||
bne 1b
|
||||
srl %o5, 8, %o4
|
||||
retl
|
||||
mov %g2, %o0
|
||||
|
||||
3: bne 5f
|
||||
srl %o5, 24, %g5
|
||||
stb %g5, [%o0]
|
||||
sub %o0, 3, %o0
|
||||
1: add %o0, 4, %o0
|
||||
4: sll %o5, 8, %g6
|
||||
ld [%o1], %o5
|
||||
add %o1, 4, %o1
|
||||
srl %o5, 24, %g5
|
||||
sub %o5, %o2, %o4
|
||||
or %g5, %g6, %g5
|
||||
andcc %o4, %o3, %g0
|
||||
be 1b
|
||||
st %g5, [%o0]
|
||||
srl %o5, 24, %o4
|
||||
andcc %o4, 0xff, %g0
|
||||
be 0b
|
||||
srl %o5, 16, %o4
|
||||
1: andcc %o4, 0xff, %g0
|
||||
be 8b
|
||||
srl %o5, 8, %o4
|
||||
andcc %o4, 0xff, %g0
|
||||
be 9f
|
||||
andcc %o5, 0xff, %g0
|
||||
bne 4b
|
||||
add %o0, 4, %o0
|
||||
srl %o5, 8, %o5
|
||||
sth %o5, [%o0]
|
||||
stb %g0, [%o0 + 2]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
9: srl %o5, 8, %o5
|
||||
sth %o5, [%o0 + 4]
|
||||
retl
|
||||
mov %g2, %o0
|
||||
5: andcc %g5, 0xff, %g0
|
||||
stb %g5, [%o0]
|
||||
sub %o0, 3, %o0
|
||||
bne 1b
|
||||
srl %o5, 16, %o4
|
||||
retl
|
||||
mov %g2, %o0
|
||||
END(strcpy)
|
102
sysdeps/sparc/sparc32/strlen.S
Normal file
102
sysdeps/sparc/sparc32/strlen.S
Normal file
@ -0,0 +1,102 @@
|
||||
/* Determine the length of a string.
|
||||
For SPARC v7.
|
||||
Copyright (C) 1996, 1999 Free Software Foundation, Inc.
|
||||
Contributed by Jakub Jelinek <jj@ultra.linux.cz>.
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
/* Normally, this uses ((xword - 0x01010101) & 0x80808080) test
|
||||
to find out if any byte in xword could be zero. This is fast, but
|
||||
also gives false alarm for any byte in range 0x81-0xff. It does
|
||||
not matter for correctness, as if this test tells us there could
|
||||
be some zero byte, we check it byte by byte, but if bytes with
|
||||
high bits set are common in the strings, then this will give poor
|
||||
performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
|
||||
will use one tick slower, but more precise test
|
||||
((xword - 0x01010101) & (~xword) & 0x80808080),
|
||||
which does not give any false alarms (but if some bits are set,
|
||||
one cannot assume from it which bytes are zero and which are not).
|
||||
It is yet to be measured, what is the correct default for glibc
|
||||
in these days for an average user.
|
||||
*/
|
||||
|
||||
.text
|
||||
.align 4
|
||||
10: ldub [%o0], %o5
|
||||
cmp %o5, 0
|
||||
be 1f
|
||||
add %o0, 1, %o0
|
||||
andcc %o0, 3, %g0
|
||||
be 4f
|
||||
or %o4, %lo(0x80808080), %o3
|
||||
ldub [%o0], %o5
|
||||
cmp %o5, 0
|
||||
be 2f
|
||||
add %o0, 1, %o0
|
||||
andcc %o0, 3, %g0
|
||||
be 5f
|
||||
sethi %hi(0x01010101), %o4
|
||||
ldub [%o0], %o5
|
||||
cmp %o5, 0
|
||||
be 3f
|
||||
add %o0, 1, %o0
|
||||
b 11f
|
||||
or %o4, %lo(0x01010101), %o2
|
||||
1: retl
|
||||
mov 0, %o0
|
||||
2: retl
|
||||
mov 1, %o0
|
||||
3: retl
|
||||
mov 2, %o0
|
||||
|
||||
ENTRY(strlen)
|
||||
mov %o0, %o1
|
||||
andcc %o0, 3, %g0
|
||||
bne 10b
|
||||
sethi %hi(0x80808080), %o4
|
||||
or %o4, %lo(0x80808080), %o3
|
||||
4: sethi %hi(0x01010101), %o4
|
||||
5: or %o4, %lo(0x01010101), %o2
|
||||
11: ld [%o0], %o5
|
||||
12: sub %o5, %o2, %o4
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %o4, %o5, %o4
|
||||
#endif
|
||||
andcc %o4, %o3, %g0
|
||||
be 11b
|
||||
add %o0, 4, %o0
|
||||
|
||||
srl %o5, 24, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
be 13f
|
||||
add %o0, -4, %o4
|
||||
srl %o5, 16, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
be 13f
|
||||
add %o4, 1, %o4
|
||||
srl %o5, 8, %g5
|
||||
andcc %g5, 0xff, %g0
|
||||
be 13f
|
||||
add %o4, 1, %o4
|
||||
andcc %o5, 0xff, %g0
|
||||
bne,a 12b
|
||||
ld [%o0], %o5
|
||||
add %o4, 1, %o4
|
||||
13: retl
|
||||
sub %o4, %o1, %o0
|
||||
END(strlen)
|
1
sysdeps/sparc/sparc32/strrchr.c
Normal file
1
sysdeps/sparc/sparc32/strrchr.c
Normal file
@ -0,0 +1 @@
|
||||
/* strrchr is in strchr.S */
|
1
sysdeps/sparc/sparc64/bcopy.c
Normal file
1
sysdeps/sparc/sparc64/bcopy.c
Normal file
@ -0,0 +1 @@
|
||||
/* bcopy is in memcpy.S */
|
1
sysdeps/sparc/sparc64/bzero.c
Normal file
1
sysdeps/sparc/sparc64/bzero.c
Normal file
@ -0,0 +1 @@
|
||||
/* bzero is in memset.S */
|
256
sysdeps/sparc/sparc64/memchr.S
Normal file
256
sysdeps/sparc/sparc64/memchr.S
Normal file
@ -0,0 +1,256 @@
|
||||
/* memchr (str, ch, n) -- Return pointer to first occurrence of CH in STR less
|
||||
than N.
|
||||
For SPARC v9.
|
||||
Copyright (C) 1998,1999 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz> and
|
||||
Jakub Jelinek <jj@ultra.linux.cz>.
|
||||
|
||||
This version is developed using the same algorithm as the fast C
|
||||
version which carries the following introduction:
|
||||
|
||||
Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
|
||||
with help from Dan Sahlin (dan@sics.se) and
|
||||
commentary by Jim Blandy (jimb@ai.mit.edu);
|
||||
adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu),
|
||||
and implemented by Roland McGrath (roland@ai.mit.edu).
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <asm/asi.h>
|
||||
#ifndef XCC
|
||||
#define XCC xcc
|
||||
#define USE_BPR
|
||||
#endif
|
||||
|
||||
/* Normally, this uses
|
||||
((xword - 0x0101010101010101) & 0x8080808080808080) test
|
||||
to find out if any byte in xword could be zero. This is fast, but
|
||||
also gives false alarm for any byte in range 0x81-0xff. It does
|
||||
not matter for correctness, as if this test tells us there could
|
||||
be some zero byte, we check it byte by byte, but if bytes with
|
||||
high bits set are common in the strings, then this will give poor
|
||||
performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
|
||||
will use one tick slower, but more precise test
|
||||
((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
|
||||
which does not give any false alarms (but if some bits are set,
|
||||
one cannot assume from it which bytes are zero and which are not).
|
||||
It is yet to be measured, what is the correct default for glibc
|
||||
in these days for an average user.
|
||||
*/
|
||||
|
||||
.text
|
||||
.align 32
|
||||
ENTRY(memchr)
|
||||
sll %o1, 8, %g3 /* IEU0 Group */
|
||||
#ifdef USE_BPR
|
||||
brz,pn %o2, 12f /* CTI+IEU1 */
|
||||
#else
|
||||
tst %o2 /* IEU1 */
|
||||
be,pn %XCC, 12f /* CTI */
|
||||
srl %o1, 0, %o1 /* IEU0 */
|
||||
#endif
|
||||
add %o0, %o2, %o2 /* IEU0 Group */
|
||||
sethi %hi(0x01010101), %g1 /* IEU1 */
|
||||
|
||||
or %g3, %o1, %g3 /* IEU0 Group */
|
||||
ldub [%o0], %o3 /* Load */
|
||||
sllx %g3, 16, %g5 /* IEU0 Group */
|
||||
or %g1, %lo(0x01010101), %g1 /* IEU1 */
|
||||
|
||||
sllx %g1, 32, %g2 /* IEU0 Group */
|
||||
or %g3, %g5, %g3 /* IEU1 */
|
||||
sllx %g3, 32, %g5 /* IEU0 Group */
|
||||
cmp %o3, %o1 /* IEU1 */
|
||||
|
||||
be,pn %xcc, 13f /* CTI */
|
||||
or %g1, %g2, %g1 /* IEU0 Group */
|
||||
andcc %o0, 7, %g0 /* IEU1 */
|
||||
bne,a,pn %icc, 21f /* CTI */
|
||||
|
||||
add %o0, 1, %o0 /* IEU0 Group */
|
||||
ldx [%o0], %o3 /* Load Group */
|
||||
sllx %g1, 7, %g2 /* IEU0 */
|
||||
or %g3, %g5, %g3 /* IEU1 */
|
||||
|
||||
1: add %o0, 8, %o0 /* IEU0 Group */
|
||||
xor %o3, %g3, %o4 /* IEU1 */
|
||||
/* %g1 = 0101010101010101 *
|
||||
* %g2 = 8080088080808080 *
|
||||
* %g3 = c c c c c c c c *
|
||||
* %o3 = value *
|
||||
* %o4 = value XOR c */
|
||||
2: cmp %o0, %o2 /* IEU1 Group */
|
||||
bg,pn %XCC, 11f /* CTI */
|
||||
|
||||
ldxa [%o0] ASI_PNF, %o3 /* Load */
|
||||
sub %o4, %g1, %o5 /* IEU0 Group */
|
||||
add %o0, 8, %o0 /* IEU1 */
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %o5, %o4, %o5 /* IEU0 Group */
|
||||
#endif
|
||||
andcc %o5, %g2, %g0 /* IEU1 Group */
|
||||
|
||||
be,a,pt %xcc, 2b /* CTI */
|
||||
xor %o3, %g3, %o4 /* IEU0 */
|
||||
srlx %o4, 56, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 3f /* CTI */
|
||||
srlx %o4, 48, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4f /* CTI */
|
||||
|
||||
srlx %o4, 40, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 5f /* CTI */
|
||||
srlx %o4, 32, %g5 /* IEU0 */
|
||||
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 6f /* CTI */
|
||||
srlx %o4, 24, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 7f /* CTI */
|
||||
srlx %o4, 16, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 8f /* CTI */
|
||||
|
||||
srlx %o4, 8, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 9f /* CTI */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
bne,pt %icc, 2b /* CTI */
|
||||
xor %o3, %g3, %o4 /* IEU0 */
|
||||
retl /* CTI+IEU1 Group */
|
||||
add %o0, -9, %o0 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
3: retl /* CTI+IEU1 Group */
|
||||
add %o0, -16, %o0 /* IEU0 */
|
||||
4: retl /* CTI+IEU1 Group */
|
||||
add %o0, -15, %o0 /* IEU0 */
|
||||
|
||||
5: retl /* CTI+IEU1 Group */
|
||||
add %o0, -14, %o0 /* IEU0 */
|
||||
6: retl /* CTI+IEU1 Group */
|
||||
add %o0, -13, %o0 /* IEU0 */
|
||||
|
||||
7: retl /* CTI+IEU1 Group */
|
||||
add %o0, -12, %o0 /* IEU0 */
|
||||
8: retl /* CTI+IEU1 Group */
|
||||
add %o0, -11, %o0 /* IEU0 */
|
||||
|
||||
9: retl /* CTI+IEU1 Group */
|
||||
add %o0, -10, %o0 /* IEU0 */
|
||||
11: sub %o4, %g1, %o5 /* IEU0 Group */
|
||||
sub %o0, 8, %o0 /* IEU1 */
|
||||
|
||||
andcc %o5, %g2, %g0 /* IEU1 Group */
|
||||
be,pt %xcc, 12f /* CTI */
|
||||
sub %o2, %o0, %o2 /* IEU0 */
|
||||
tst %o2 /* IEU1 Group */
|
||||
|
||||
be,pn %XCC, 12f /* CTI */
|
||||
srlx %o4, 56, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 13f /* CTI */
|
||||
|
||||
cmp %o2, 1 /* IEU0 */
|
||||
be,pn %XCC, 12f /* CTI Group */
|
||||
srlx %o4, 48, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 14f /* CTI */
|
||||
cmp %o2, 2 /* IEU1 Group */
|
||||
be,pn %XCC, 12f /* CTI */
|
||||
srlx %o4, 40, %g5 /* IEU0 */
|
||||
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 15f /* CTI */
|
||||
cmp %o2, 3 /* IEU1 Group */
|
||||
be,pn %XCC, 12f /* CTI */
|
||||
|
||||
srlx %o4, 32, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 16f /* CTI */
|
||||
cmp %o2, 4 /* IEU1 Group */
|
||||
|
||||
be,pn %XCC, 12f /* CTI */
|
||||
srlx %o4, 24, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 17f /* CTI */
|
||||
|
||||
cmp %o2, 5 /* IEU1 Group */
|
||||
be,pn %XCC, 12f /* CTI */
|
||||
srlx %o4, 16, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 18f /* CTI */
|
||||
cmp %o2, 6 /* IEU1 Group */
|
||||
be,pn %XCC, 12f /* CTI */
|
||||
srlx %o4, 8, %g5 /* IEU0 */
|
||||
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 19f /* CTI */
|
||||
nop /* IEU0 */
|
||||
12: retl /* CTI+IEU1 Group */
|
||||
|
||||
clr %o0 /* IEU0 */
|
||||
nop /* Stub */
|
||||
13: retl /* CTI+IEU1 Group */
|
||||
nop /* IEU0 */
|
||||
|
||||
14: retl /* CTI+IEU1 Group */
|
||||
add %o0, 1, %o0 /* IEU0 */
|
||||
15: retl /* CTI+IEU1 Group */
|
||||
add %o0, 2, %o0 /* IEU0 */
|
||||
|
||||
16: retl /* CTI+IEU1 Group */
|
||||
add %o0, 3, %o0 /* IEU0 */
|
||||
17: retl /* CTI+IEU1 Group */
|
||||
add %o0, 4, %o0 /* IEU0 */
|
||||
|
||||
18: retl /* CTI+IEU1 Group */
|
||||
add %o0, 5, %o0 /* IEU0 */
|
||||
19: retl /* CTI+IEU1 Group */
|
||||
add %o0, 6, %o0 /* IEU0 */
|
||||
|
||||
21: cmp %o0, %o2 /* IEU1 */
|
||||
be,pn %XCC, 12b /* CTI */
|
||||
sllx %g1, 7, %g2 /* IEU0 Group */
|
||||
ldub [%o0], %o3 /* Load */
|
||||
|
||||
or %g3, %g5, %g3 /* IEU1 */
|
||||
22: andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
be,a,pn %icc, 1b /* CTI */
|
||||
ldx [%o0], %o3 /* Load */
|
||||
|
||||
cmp %o3, %o1 /* IEU1 Group */
|
||||
be,pn %xcc, 23f /* CTI */
|
||||
add %o0, 1, %o0 /* IEU0 */
|
||||
cmp %o0, %o2 /* IEU1 Group */
|
||||
|
||||
bne,a,pt %XCC, 22b /* CTI */
|
||||
ldub [%o0], %o3 /* Load */
|
||||
retl /* CTI+IEU1 Group */
|
||||
clr %o0 /* IEU0 */
|
||||
|
||||
23: retl /* CTI+IEU1 Group */
|
||||
add %o0, -1, %o0 /* IEU0 */
|
||||
END(memchr)
|
140
sysdeps/sparc/sparc64/memcmp.S
Normal file
140
sysdeps/sparc/sparc64/memcmp.S
Normal file
@ -0,0 +1,140 @@
|
||||
/* Compare two memory blocks for differences in the first COUNT bytes.
|
||||
For SPARC v9.
|
||||
Copyright (C) 1998,1999 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz> and
|
||||
Jakub Jelinek <jj@ultra.linux.cz>.
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <asm/asi.h>
|
||||
#ifndef XCC
|
||||
#define XCC xcc
|
||||
#define USE_BPR
|
||||
#endif
|
||||
|
||||
.text
|
||||
.align 32
|
||||
ENTRY(memcmp)
|
||||
#ifdef USE_BPR
|
||||
brz,pn %o2, 3f /* CTI+IEU1 Group */
|
||||
#else
|
||||
tst %o2 /* IEU1 Group */
|
||||
be,pn %XCC, 3f /* CTI */
|
||||
#endif
|
||||
andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
bne,pn %icc, 8f /* CTI */
|
||||
1: andcc %o1, 7, %g1 /* IEU1 Group */
|
||||
|
||||
bne,pn %icc, 10f /* CTI */
|
||||
mov 64, %g3 /* IEU0 */
|
||||
ldx [%o0], %g1 /* Load Group */
|
||||
sub %o1, %o0, %o1 /* IEU0 */
|
||||
|
||||
ldx [%o0 + %o1], %g2 /* Load Group */
|
||||
add %o0, 8, %o0 /* IEU0 */
|
||||
2: mov %g1, %o3 /* IEU0 Group */
|
||||
subcc %o2, 8, %o2 /* IEU1 */
|
||||
|
||||
bl,pn %XCC, 5f /* CTI */
|
||||
ldxa [%o0] ASI_PNF, %g1 /* Load Group */
|
||||
mov %g2, %o4 /* IEU0 */
|
||||
ldxa [%o0 + %o1] ASI_PNF, %g2 /* Load Group */
|
||||
|
||||
cmp %o3, %o4 /* IEU1 */
|
||||
be,pt %xcc, 2b /* CTI */
|
||||
add %o0, 8, %o0 /* IEU0 */
|
||||
7: mov -1, %o0 /* IEU1 */
|
||||
|
||||
retl /* CTI+IEU1 Group */
|
||||
movgu %xcc, 1, %o0 /* Single Group */
|
||||
3: retl /* CTI+IEU1 Group */
|
||||
clr %o0 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
5: mov %g2, %o4 /* IEU0 */
|
||||
6: cmp %o2, -8 /* IEU1 */
|
||||
be,pn %XCC, 3b /* CTI */
|
||||
sub %g0, %o2, %o2 /* IEU0 Group */
|
||||
|
||||
sllx %o2, 3, %o2 /* IEU0 Group */
|
||||
srlx %o3, %o2, %o3 /* IEU0 Group */
|
||||
srlx %o4, %o2, %o4 /* IEU0 Group */
|
||||
clr %o0 /* IEU1 */
|
||||
|
||||
cmp %o3, %o4 /* IEU1 Group */
|
||||
movgu %xcc, 1, %o0 /* Single Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
movlu %xcc, -1, %o0 /* Single Group */
|
||||
|
||||
8: ldub [%o0], %o3 /* Load */
|
||||
add %o0, 1, %o0 /* IEU0 */
|
||||
ldub [%o1], %o4 /* Load Group */
|
||||
add %o1, 1, %o1 /* IEU0 */
|
||||
|
||||
9: cmp %o3, %o4 /* IEU1 Group */
|
||||
bne,pn %xcc, 12f /* CTI */
|
||||
subcc %o2, 1, %o2 /* IEU1 Group */
|
||||
be,pn %XCC, 3b /* CTI */
|
||||
|
||||
lduba [%o0] ASI_PNF, %o3 /* Load */
|
||||
andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 1b /* CTI */
|
||||
lduba [%o1] ASI_PNF, %o4 /* Load */
|
||||
|
||||
add %o0, 1, %o0 /* IEU0 Group */
|
||||
ba,pt %xcc, 9b /* CTI */
|
||||
add %o1, 1, %o1 /* IEU1 */
|
||||
|
||||
.align 16
|
||||
12: mov -1, %o0 /* IEU0 Group */
|
||||
cmp %o3, %o4 /* IEU1 */
|
||||
retl /* CTI+IEU1 Group */
|
||||
movgu %xcc, 1, %o0 /* Single Group */
|
||||
|
||||
.align 16
|
||||
nop /* Stub */
|
||||
10: sllx %g1, 3, %g2 /* IEU0 Group */
|
||||
sub %o1, %g1, %o1 /* IEU1 */
|
||||
sub %g3, %g2, %g3 /* IEU0 Group */
|
||||
|
||||
ldxa [%o0] ASI_PNF, %g5 /* Load */
|
||||
sub %o1, %o0, %o1 /* IEU1 */
|
||||
ldxa [%o0 + %o1] ASI_PNF, %g7 /* Load Group */
|
||||
add %o0, 8, %o0 /* IEU0 */
|
||||
|
||||
11: sllx %g7, %g2, %o4 /* IEU0 Group */
|
||||
ldxa [%o0 + %o1] ASI_PNF, %g7 /* Load */
|
||||
srlx %g7, %g3, %o5 /* IEU0 Group */
|
||||
mov %g5, %o3 /* IEU1 */
|
||||
|
||||
ldxa [%o0] ASI_PNF, %g5 /* Load */
|
||||
subcc %o2, 8, %o2 /* IEU1 Group */
|
||||
bl,pn %XCC, 6b /* CTI */
|
||||
or %o4, %o5, %o4 /* IEU0 */
|
||||
|
||||
cmp %o3, %o4 /* IEU1 Group */
|
||||
be,pt %xcc, 11b /* CTI */
|
||||
add %o0, 8, %o0 /* IEU0 */
|
||||
mov -1, %o0 /* IEU0 */
|
||||
|
||||
retl /* CTI+IEU1 Group */
|
||||
movgu %xcc, 1, %o0 /* Single Group */
|
||||
END(memcmp)
|
||||
|
||||
#undef bcmp
|
||||
weak_alias(memcmp, bcmp)
|
574
sysdeps/sparc/sparc64/memcpy.S
Normal file
574
sysdeps/sparc/sparc64/memcpy.S
Normal file
@ -0,0 +1,574 @@
|
||||
/* Copy SIZE bytes from SRC to DEST.
|
||||
For UltraSPARC.
|
||||
Copyright (C) 1996, 97, 98, 99 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by David S. Miller (davem@caip.rutgers.edu) and
|
||||
Jakub Jelinek (jj@ultra.linux.cz).
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <asm/asi.h>
|
||||
#ifndef XCC
|
||||
#define USE_BPR
|
||||
#endif
|
||||
#define FPRS_FEF 4
|
||||
|
||||
#define FREG_FROB(f1, f2, f3, f4, f5, f6, f7, f8, f9) \
|
||||
faligndata %f1, %f2, %f48; \
|
||||
faligndata %f2, %f3, %f50; \
|
||||
faligndata %f3, %f4, %f52; \
|
||||
faligndata %f4, %f5, %f54; \
|
||||
faligndata %f5, %f6, %f56; \
|
||||
faligndata %f6, %f7, %f58; \
|
||||
faligndata %f7, %f8, %f60; \
|
||||
faligndata %f8, %f9, %f62;
|
||||
|
||||
#define MAIN_LOOP_CHUNK(src, dest, fdest, fsrc, len, jmptgt) \
|
||||
ldda [%src] %asi, %fdest; \
|
||||
add %src, 0x40, %src; \
|
||||
add %dest, 0x40, %dest; \
|
||||
subcc %len, 0x40, %len; \
|
||||
be,pn %xcc, jmptgt; \
|
||||
stda %fsrc, [%dest - 0x40] %asi;
|
||||
|
||||
#define LOOP_CHUNK1(src, dest, len, branch_dest) \
|
||||
MAIN_LOOP_CHUNK(src, dest, f0, f48, len, branch_dest)
|
||||
#define LOOP_CHUNK2(src, dest, len, branch_dest) \
|
||||
MAIN_LOOP_CHUNK(src, dest, f16, f48, len, branch_dest)
|
||||
#define LOOP_CHUNK3(src, dest, len, branch_dest) \
|
||||
MAIN_LOOP_CHUNK(src, dest, f32, f48, len, branch_dest)
|
||||
|
||||
#define STORE_SYNC(dest, fsrc) \
|
||||
stda %fsrc, [%dest] %asi; \
|
||||
add %dest, 0x40, %dest;
|
||||
|
||||
#define STORE_JUMP(dest, fsrc, target) \
|
||||
stda %fsrc, [%dest] %asi; \
|
||||
add %dest, 0x40, %dest; \
|
||||
ba,pt %xcc, target;
|
||||
|
||||
#define VISLOOP_PAD nop; nop; nop; nop; \
|
||||
nop; nop; nop; nop; \
|
||||
nop; nop; nop; nop; \
|
||||
nop; nop; nop;
|
||||
|
||||
#define FINISH_VISCHUNK(dest, f0, f1, left) \
|
||||
subcc %left, 8, %left; \
|
||||
bl,pn %xcc, 205f; \
|
||||
faligndata %f0, %f1, %f48; \
|
||||
std %f48, [%dest]; \
|
||||
add %dest, 8, %dest;
|
||||
|
||||
#define UNEVEN_VISCHUNK(dest, f0, f1, left) \
|
||||
subcc %left, 8, %left; \
|
||||
bl,pn %xcc, 205f; \
|
||||
fsrc1 %f0, %f1; \
|
||||
ba,a,pt %xcc, 204f;
|
||||
|
||||
/* Macros for non-VIS memcpy code. */
|
||||
#define MOVE_BIGCHUNK(src, dst, offset, t0, t1, t2, t3) \
|
||||
ldx [%src + offset + 0x00], %t0; \
|
||||
ldx [%src + offset + 0x08], %t1; \
|
||||
ldx [%src + offset + 0x10], %t2; \
|
||||
ldx [%src + offset + 0x18], %t3; \
|
||||
stw %t0, [%dst + offset + 0x04]; \
|
||||
srlx %t0, 32, %t0; \
|
||||
stw %t0, [%dst + offset + 0x00]; \
|
||||
stw %t1, [%dst + offset + 0x0c]; \
|
||||
srlx %t1, 32, %t1; \
|
||||
stw %t1, [%dst + offset + 0x08]; \
|
||||
stw %t2, [%dst + offset + 0x14]; \
|
||||
srlx %t2, 32, %t2; \
|
||||
stw %t2, [%dst + offset + 0x10]; \
|
||||
stw %t3, [%dst + offset + 0x1c]; \
|
||||
srlx %t3, 32, %t3; \
|
||||
stw %t3, [%dst + offset + 0x18];
|
||||
|
||||
#define MOVE_BIGALIGNCHUNK(src, dst, offset, t0, t1, t2, t3) \
|
||||
ldx [%src + offset + 0x00], %t0; \
|
||||
ldx [%src + offset + 0x08], %t1; \
|
||||
ldx [%src + offset + 0x10], %t2; \
|
||||
ldx [%src + offset + 0x18], %t3; \
|
||||
stx %t0, [%dst + offset + 0x00]; \
|
||||
stx %t1, [%dst + offset + 0x08]; \
|
||||
stx %t2, [%dst + offset + 0x10]; \
|
||||
stx %t3, [%dst + offset + 0x18]; \
|
||||
ldx [%src + offset + 0x20], %t0; \
|
||||
ldx [%src + offset + 0x28], %t1; \
|
||||
ldx [%src + offset + 0x30], %t2; \
|
||||
ldx [%src + offset + 0x38], %t3; \
|
||||
stx %t0, [%dst + offset + 0x20]; \
|
||||
stx %t1, [%dst + offset + 0x28]; \
|
||||
stx %t2, [%dst + offset + 0x30]; \
|
||||
stx %t3, [%dst + offset + 0x38];
|
||||
|
||||
#define MOVE_LASTCHUNK(src, dst, offset, t0, t1, t2, t3) \
|
||||
ldx [%src - offset - 0x10], %t0; \
|
||||
ldx [%src - offset - 0x08], %t1; \
|
||||
stw %t0, [%dst - offset - 0x0c]; \
|
||||
srlx %t0, 32, %t2; \
|
||||
stw %t2, [%dst - offset - 0x10]; \
|
||||
stw %t1, [%dst - offset - 0x04]; \
|
||||
srlx %t1, 32, %t3; \
|
||||
stw %t3, [%dst - offset - 0x08];
|
||||
|
||||
#define MOVE_LASTALIGNCHUNK(src, dst, offset, t0, t1) \
|
||||
ldx [%src - offset - 0x10], %t0; \
|
||||
ldx [%src - offset - 0x08], %t1; \
|
||||
stx %t0, [%dst - offset - 0x10]; \
|
||||
stx %t1, [%dst - offset - 0x08];
|
||||
|
||||
.text
|
||||
.align 32
|
||||
|
||||
ENTRY(bcopy)
|
||||
or %o0, 0, %g3 /* IEU0 Group */
|
||||
addcc %o1, 0, %o0 /* IEU1 */
|
||||
brgez,pt %o2, 210f /* CTI */
|
||||
or %g3, 0, %o1 /* IEU0 Group */
|
||||
retl /* CTI Group brk forced*/
|
||||
clr %o0 /* IEU0 */
|
||||
END(bcopy)
|
||||
|
||||
.align 32
|
||||
200: be,pt %xcc, 201f /* CTI */
|
||||
andcc %o0, 0x38, %g5 /* IEU1 Group */
|
||||
mov 8, %g1 /* IEU0 */
|
||||
sub %g1, %g2, %g2 /* IEU0 Group */
|
||||
andcc %o0, 1, %g0 /* IEU1 */
|
||||
be,pt %icc, 2f /* CTI */
|
||||
sub %o2, %g2, %o2 /* IEU0 Group */
|
||||
1: ldub [%o1], %o5 /* Load Group */
|
||||
add %o1, 1, %o1 /* IEU0 */
|
||||
add %o0, 1, %o0 /* IEU1 */
|
||||
subcc %g2, 1, %g2 /* IEU1 Group */
|
||||
be,pn %xcc, 3f /* CTI */
|
||||
stb %o5, [%o0 - 1] /* Store */
|
||||
2: ldub [%o1], %o5 /* Load Group */
|
||||
add %o0, 2, %o0 /* IEU0 */
|
||||
ldub [%o1 + 1], %g3 /* Load Group */
|
||||
subcc %g2, 2, %g2 /* IEU1 Group */
|
||||
stb %o5, [%o0 - 2] /* Store */
|
||||
add %o1, 2, %o1 /* IEU0 */
|
||||
bne,pt %xcc, 2b /* CTI Group */
|
||||
stb %g3, [%o0 - 1] /* Store */
|
||||
3: andcc %o0, 0x38, %g5 /* IEU1 Group */
|
||||
201: be,pt %icc, 202f /* CTI */
|
||||
mov 64, %g1 /* IEU0 */
|
||||
fmovd %f0, %f2 /* FPU */
|
||||
sub %g1, %g5, %g5 /* IEU0 Group */
|
||||
alignaddr %o1, %g0, %g1 /* GRU Group */
|
||||
ldd [%g1], %f4 /* Load Group */
|
||||
sub %o2, %g5, %o2 /* IEU0 */
|
||||
1: ldd [%g1 + 0x8], %f6 /* Load Group */
|
||||
add %g1, 0x8, %g1 /* IEU0 Group */
|
||||
subcc %g5, 8, %g5 /* IEU1 */
|
||||
faligndata %f4, %f6, %f0 /* GRU Group */
|
||||
std %f0, [%o0] /* Store */
|
||||
add %o1, 8, %o1 /* IEU0 Group */
|
||||
be,pn %xcc, 202f /* CTI */
|
||||
add %o0, 8, %o0 /* IEU1 */
|
||||
ldd [%g1 + 0x8], %f4 /* Load Group */
|
||||
add %g1, 8, %g1 /* IEU0 */
|
||||
subcc %g5, 8, %g5 /* IEU1 */
|
||||
faligndata %f6, %f4, %f0 /* GRU Group */
|
||||
std %f0, [%o0] /* Store */
|
||||
add %o1, 8, %o1 /* IEU0 */
|
||||
bne,pt %xcc, 1b /* CTI Group */
|
||||
add %o0, 8, %o0 /* IEU0 */
|
||||
202: membar #LoadStore | #StoreStore | #StoreLoad /* LSU Group */
|
||||
wr %g0, ASI_BLK_P, %asi /* LSU Group */
|
||||
subcc %o2, 0x40, %g7 /* IEU1 Group */
|
||||
mov %o1, %g1 /* IEU0 */
|
||||
andncc %g7, (0x40 - 1), %g7 /* IEU1 Group */
|
||||
srl %g1, 3, %g2 /* IEU0 */
|
||||
sub %o2, %g7, %g3 /* IEU0 Group */
|
||||
andn %o1, (0x40 - 1), %o1 /* IEU1 */
|
||||
and %g2, 7, %g2 /* IEU0 Group */
|
||||
andncc %g3, 0x7, %g3 /* IEU1 */
|
||||
fmovd %f0, %f2 /* FPU */
|
||||
sub %g3, 0x10, %g3 /* IEU0 Group */
|
||||
sub %o2, %g7, %o2 /* IEU1 */
|
||||
alignaddr %g1, %g0, %g0 /* GRU Group */
|
||||
add %g1, %g7, %g1 /* IEU0 Group */
|
||||
subcc %o2, %g3, %o2 /* IEU1 */
|
||||
ldda [%o1 + 0x00] %asi, %f0 /* LSU Group */
|
||||
add %g1, %g3, %g1 /* IEU0 */
|
||||
ldda [%o1 + 0x40] %asi, %f16 /* LSU Group */
|
||||
sub %g7, 0x80, %g7 /* IEU0 */
|
||||
ldda [%o1 + 0x80] %asi, %f32 /* LSU Group */
|
||||
/* Clk1 Group 8-( */
|
||||
/* Clk2 Group 8-( */
|
||||
/* Clk3 Group 8-( */
|
||||
/* Clk4 Group 8-( */
|
||||
203: rd %pc, %g5 /* PDU Group 8-( */
|
||||
addcc %g5, %lo(300f - 203b), %g5 /* IEU1 Group */
|
||||
sll %g2, 9, %g2 /* IEU0 */
|
||||
jmpl %g5 + %g2, %g0 /* CTI Group brk forced*/
|
||||
addcc %o1, 0xc0, %o1 /* IEU1 Group */
|
||||
|
||||
.align 512 /* OK, here comes the fun part... */
|
||||
300: FREG_FROB(f0, f2, f4, f6, f8, f10,f12,f14,f16) LOOP_CHUNK1(o1, o0, g7, 301f)
|
||||
FREG_FROB(f16,f18,f20,f22,f24,f26,f28,f30,f32) LOOP_CHUNK2(o1, o0, g7, 302f)
|
||||
FREG_FROB(f32,f34,f36,f38,f40,f42,f44,f46,f0) LOOP_CHUNK3(o1, o0, g7, 303f)
|
||||
b,pt %xcc, 300b+4; faligndata %f0, %f2, %f48
|
||||
301: FREG_FROB(f16,f18,f20,f22,f24,f26,f28,f30,f32) STORE_SYNC(o0, f48) membar #Sync
|
||||
FREG_FROB(f32,f34,f36,f38,f40,f42,f44,f46,f0) STORE_JUMP(o0, f48, 400f) membar #Sync
|
||||
302: FREG_FROB(f32,f34,f36,f38,f40,f42,f44,f46,f0) STORE_SYNC(o0, f48) membar #Sync
|
||||
FREG_FROB(f0, f2, f4, f6, f8, f10,f12,f14,f16) STORE_JUMP(o0, f48, 416f) membar #Sync
|
||||
303: FREG_FROB(f0, f2, f4, f6, f8, f10,f12,f14,f16) STORE_SYNC(o0, f48) membar #Sync
|
||||
FREG_FROB(f16,f18,f20,f22,f24,f26,f28,f30,f32) STORE_JUMP(o0, f48, 432f) membar #Sync
|
||||
VISLOOP_PAD
|
||||
310: FREG_FROB(f2, f4, f6, f8, f10,f12,f14,f16,f18) LOOP_CHUNK1(o1, o0, g7, 311f)
|
||||
FREG_FROB(f18,f20,f22,f24,f26,f28,f30,f32,f34) LOOP_CHUNK2(o1, o0, g7, 312f)
|
||||
FREG_FROB(f34,f36,f38,f40,f42,f44,f46,f0, f2) LOOP_CHUNK3(o1, o0, g7, 313f)
|
||||
b,pt %xcc, 310b+4; faligndata %f2, %f4, %f48
|
||||
311: FREG_FROB(f18,f20,f22,f24,f26,f28,f30,f32,f34) STORE_SYNC(o0, f48) membar #Sync
|
||||
FREG_FROB(f34,f36,f38,f40,f42,f44,f46,f0, f2) STORE_JUMP(o0, f48, 402f) membar #Sync
|
||||
312: FREG_FROB(f34,f36,f38,f40,f42,f44,f46,f0, f2) STORE_SYNC(o0, f48) membar #Sync
|
||||
FREG_FROB(f2, f4, f6, f8, f10,f12,f14,f16,f18) STORE_JUMP(o0, f48, 418f) membar #Sync
|
||||
313: FREG_FROB(f2, f4, f6, f8, f10,f12,f14,f16,f18) STORE_SYNC(o0, f48) membar #Sync
|
||||
FREG_FROB(f18,f20,f22,f24,f26,f28,f30,f32,f34) STORE_JUMP(o0, f48, 434f) membar #Sync
|
||||
VISLOOP_PAD
|
||||
320: FREG_FROB(f4, f6, f8, f10,f12,f14,f16,f18,f20) LOOP_CHUNK1(o1, o0, g7, 321f)
|
||||
FREG_FROB(f20,f22,f24,f26,f28,f30,f32,f34,f36) LOOP_CHUNK2(o1, o0, g7, 322f)
|
||||
FREG_FROB(f36,f38,f40,f42,f44,f46,f0, f2, f4) LOOP_CHUNK3(o1, o0, g7, 323f)
|
||||
b,pt %xcc, 320b+4; faligndata %f4, %f6, %f48
|
||||
321: FREG_FROB(f20,f22,f24,f26,f28,f30,f32,f34,f36) STORE_SYNC(o0, f48) membar #Sync
|
||||
FREG_FROB(f36,f38,f40,f42,f44,f46,f0, f2, f4) STORE_JUMP(o0, f48, 404f) membar #Sync
|
||||
322: FREG_FROB(f36,f38,f40,f42,f44,f46,f0, f2, f4) STORE_SYNC(o0, f48) membar #Sync
|
||||
FREG_FROB(f4, f6, f8, f10,f12,f14,f16,f18,f20) STORE_JUMP(o0, f48, 420f) membar #Sync
|
||||
323: FREG_FROB(f4, f6, f8, f10,f12,f14,f16,f18,f20) STORE_SYNC(o0, f48) membar #Sync
|
||||
FREG_FROB(f20,f22,f24,f26,f28,f30,f32,f34,f36) STORE_JUMP(o0, f48, 436f) membar #Sync
|
||||
VISLOOP_PAD
|
||||
330: FREG_FROB(f6, f8, f10,f12,f14,f16,f18,f20,f22) LOOP_CHUNK1(o1, o0, g7, 331f)
|
||||
FREG_FROB(f22,f24,f26,f28,f30,f32,f34,f36,f38) LOOP_CHUNK2(o1, o0, g7, 332f)
|
||||
FREG_FROB(f38,f40,f42,f44,f46,f0, f2, f4, f6) LOOP_CHUNK3(o1, o0, g7, 333f)
|
||||
b,pt %xcc, 330b+4; faligndata %f6, %f8, %f48
|
||||
331: FREG_FROB(f22,f24,f26,f28,f30,f32,f34,f36,f38) STORE_SYNC(o0, f48) membar #Sync
|
||||
FREG_FROB(f38,f40,f42,f44,f46,f0, f2, f4, f6) STORE_JUMP(o0, f48, 406f) membar #Sync
|
||||
332: FREG_FROB(f38,f40,f42,f44,f46,f0, f2, f4, f6) STORE_SYNC(o0, f48) membar #Sync
|
||||
FREG_FROB(f6, f8, f10,f12,f14,f16,f18,f20,f22) STORE_JUMP(o0, f48, 422f) membar #Sync
|
||||
333: FREG_FROB(f6, f8, f10,f12,f14,f16,f18,f20,f22) STORE_SYNC(o0, f48) membar #Sync
|
||||
FREG_FROB(f22,f24,f26,f28,f30,f32,f34,f36,f38) STORE_JUMP(o0, f48, 438f) membar #Sync
|
||||
VISLOOP_PAD
|
||||
340: FREG_FROB(f8, f10,f12,f14,f16,f18,f20,f22,f24) LOOP_CHUNK1(o1, o0, g7, 341f)
|
||||
FREG_FROB(f24,f26,f28,f30,f32,f34,f36,f38,f40) LOOP_CHUNK2(o1, o0, g7, 342f)
|
||||
FREG_FROB(f40,f42,f44,f46,f0, f2, f4, f6, f8) LOOP_CHUNK3(o1, o0, g7, 343f)
|
||||
b,pt %xcc, 340b+4; faligndata %f8, %f10, %f48
|
||||
341: FREG_FROB(f24,f26,f28,f30,f32,f34,f36,f38,f40) STORE_SYNC(o0, f48) membar #Sync
|
||||
FREG_FROB(f40,f42,f44,f46,f0, f2, f4, f6, f8) STORE_JUMP(o0, f48, 408f) membar #Sync
|
||||
342: FREG_FROB(f40,f42,f44,f46,f0, f2, f4, f6, f8) STORE_SYNC(o0, f48) membar #Sync
|
||||
FREG_FROB(f8, f10,f12,f14,f16,f18,f20,f22,f24) STORE_JUMP(o0, f48, 424f) membar #Sync
|
||||
343: FREG_FROB(f8, f10,f12,f14,f16,f18,f20,f22,f24) STORE_SYNC(o0, f48) membar #Sync
|
||||
FREG_FROB(f24,f26,f28,f30,f32,f34,f36,f38,f40) STORE_JUMP(o0, f48, 440f) membar #Sync
|
||||
VISLOOP_PAD
|
||||
350: FREG_FROB(f10,f12,f14,f16,f18,f20,f22,f24,f26) LOOP_CHUNK1(o1, o0, g7, 351f)
|
||||
FREG_FROB(f26,f28,f30,f32,f34,f36,f38,f40,f42) LOOP_CHUNK2(o1, o0, g7, 352f)
|
||||
FREG_FROB(f42,f44,f46,f0, f2, f4, f6, f8, f10) LOOP_CHUNK3(o1, o0, g7, 353f)
|
||||
b,pt %xcc, 350b+4; faligndata %f10, %f12, %f48
|
||||
351: FREG_FROB(f26,f28,f30,f32,f34,f36,f38,f40,f42) STORE_SYNC(o0, f48) membar #Sync
|
||||
FREG_FROB(f42,f44,f46,f0, f2, f4, f6, f8, f10) STORE_JUMP(o0, f48, 410f) membar #Sync
|
||||
352: FREG_FROB(f42,f44,f46,f0, f2, f4, f6, f8, f10) STORE_SYNC(o0, f48) membar #Sync
|
||||
FREG_FROB(f10,f12,f14,f16,f18,f20,f22,f24,f26) STORE_JUMP(o0, f48, 426f) membar #Sync
|
||||
353: FREG_FROB(f10,f12,f14,f16,f18,f20,f22,f24,f26) STORE_SYNC(o0, f48) membar #Sync
|
||||
FREG_FROB(f26,f28,f30,f32,f34,f36,f38,f40,f42) STORE_JUMP(o0, f48, 442f) membar #Sync
|
||||
VISLOOP_PAD
|
||||
360: FREG_FROB(f12,f14,f16,f18,f20,f22,f24,f26,f28) LOOP_CHUNK1(o1, o0, g7, 361f)
|
||||
FREG_FROB(f28,f30,f32,f34,f36,f38,f40,f42,f44) LOOP_CHUNK2(o1, o0, g7, 362f)
|
||||
FREG_FROB(f44,f46,f0, f2, f4, f6, f8, f10,f12) LOOP_CHUNK3(o1, o0, g7, 363f)
|
||||
b,pt %xcc, 360b+4; faligndata %f12, %f14, %f48
|
||||
361: FREG_FROB(f28,f30,f32,f34,f36,f38,f40,f42,f44) STORE_SYNC(o0, f48) membar #Sync
|
||||
FREG_FROB(f44,f46,f0, f2, f4, f6, f8, f10,f12) STORE_JUMP(o0, f48, 412f) membar #Sync
|
||||
362: FREG_FROB(f44,f46,f0, f2, f4, f6, f8, f10,f12) STORE_SYNC(o0, f48) membar #Sync
|
||||
FREG_FROB(f12,f14,f16,f18,f20,f22,f24,f26,f28) STORE_JUMP(o0, f48, 428f) membar #Sync
|
||||
363: FREG_FROB(f12,f14,f16,f18,f20,f22,f24,f26,f28) STORE_SYNC(o0, f48) membar #Sync
|
||||
FREG_FROB(f28,f30,f32,f34,f36,f38,f40,f42,f44) STORE_JUMP(o0, f48, 444f) membar #Sync
|
||||
VISLOOP_PAD
|
||||
370: FREG_FROB(f14,f16,f18,f20,f22,f24,f26,f28,f30) LOOP_CHUNK1(o1, o0, g7, 371f)
|
||||
FREG_FROB(f30,f32,f34,f36,f38,f40,f42,f44,f46) LOOP_CHUNK2(o1, o0, g7, 372f)
|
||||
FREG_FROB(f46,f0, f2, f4, f6, f8, f10,f12,f14) LOOP_CHUNK3(o1, o0, g7, 373f)
|
||||
b,pt %xcc, 370b+4; faligndata %f14, %f16, %f48
|
||||
371: FREG_FROB(f30,f32,f34,f36,f38,f40,f42,f44,f46) STORE_SYNC(o0, f48) membar #Sync
|
||||
FREG_FROB(f46,f0, f2, f4, f6, f8, f10,f12,f14) STORE_JUMP(o0, f48, 414f) membar #Sync
|
||||
372: FREG_FROB(f46,f0, f2, f4, f6, f8, f10,f12,f14) STORE_SYNC(o0, f48) membar #Sync
|
||||
FREG_FROB(f14,f16,f18,f20,f22,f24,f26,f28,f30) STORE_JUMP(o0, f48, 430f) membar #Sync
|
||||
373: FREG_FROB(f14,f16,f18,f20,f22,f24,f26,f28,f30) STORE_SYNC(o0, f48) membar #Sync
|
||||
FREG_FROB(f30,f32,f34,f36,f38,f40,f42,f44,f46) STORE_JUMP(o0, f48, 446f) membar #Sync
|
||||
VISLOOP_PAD
|
||||
400: FINISH_VISCHUNK(o0, f0, f2, g3)
|
||||
402: FINISH_VISCHUNK(o0, f2, f4, g3)
|
||||
404: FINISH_VISCHUNK(o0, f4, f6, g3)
|
||||
406: FINISH_VISCHUNK(o0, f6, f8, g3)
|
||||
408: FINISH_VISCHUNK(o0, f8, f10, g3)
|
||||
410: FINISH_VISCHUNK(o0, f10, f12, g3)
|
||||
412: FINISH_VISCHUNK(o0, f12, f14, g3)
|
||||
414: UNEVEN_VISCHUNK(o0, f14, f0, g3)
|
||||
416: FINISH_VISCHUNK(o0, f16, f18, g3)
|
||||
418: FINISH_VISCHUNK(o0, f18, f20, g3)
|
||||
420: FINISH_VISCHUNK(o0, f20, f22, g3)
|
||||
422: FINISH_VISCHUNK(o0, f22, f24, g3)
|
||||
424: FINISH_VISCHUNK(o0, f24, f26, g3)
|
||||
426: FINISH_VISCHUNK(o0, f26, f28, g3)
|
||||
428: FINISH_VISCHUNK(o0, f28, f30, g3)
|
||||
430: UNEVEN_VISCHUNK(o0, f30, f0, g3)
|
||||
432: FINISH_VISCHUNK(o0, f32, f34, g3)
|
||||
434: FINISH_VISCHUNK(o0, f34, f36, g3)
|
||||
436: FINISH_VISCHUNK(o0, f36, f38, g3)
|
||||
438: FINISH_VISCHUNK(o0, f38, f40, g3)
|
||||
440: FINISH_VISCHUNK(o0, f40, f42, g3)
|
||||
442: FINISH_VISCHUNK(o0, f42, f44, g3)
|
||||
444: FINISH_VISCHUNK(o0, f44, f46, g3)
|
||||
446: UNEVEN_VISCHUNK(o0, f46, f0, g3)
|
||||
204: ldd [%o1], %f2 /* Load Group */
|
||||
add %o1, 8, %o1 /* IEU0 */
|
||||
subcc %g3, 8, %g3 /* IEU1 */
|
||||
faligndata %f0, %f2, %f8 /* GRU Group */
|
||||
std %f8, [%o0] /* Store */
|
||||
bl,pn %xcc, 205f /* CTI */
|
||||
add %o0, 8, %o0 /* IEU0 Group */
|
||||
ldd [%o1], %f0 /* Load Group */
|
||||
add %o1, 8, %o1 /* IEU0 */
|
||||
subcc %g3, 8, %g3 /* IEU1 */
|
||||
faligndata %f2, %f0, %f8 /* GRU Group */
|
||||
std %f8, [%o0] /* Store */
|
||||
bge,pt %xcc, 204b /* CTI */
|
||||
add %o0, 8, %o0 /* IEU0 Group */
|
||||
205: brz,pt %o2, 207f /* CTI Group */
|
||||
mov %g1, %o1 /* IEU0 */
|
||||
206: ldub [%o1], %g5 /* LOAD */
|
||||
add %o1, 1, %o1 /* IEU0 */
|
||||
add %o0, 1, %o0 /* IEU1 */
|
||||
subcc %o2, 1, %o2 /* IEU1 */
|
||||
bne,pt %xcc, 206b /* CTI */
|
||||
stb %g5, [%o0 - 1] /* Store Group */
|
||||
207: membar #StoreLoad | #StoreStore /* LSU Group */
|
||||
wr %g0, FPRS_FEF, %fprs
|
||||
retl
|
||||
mov %g4, %o0
|
||||
|
||||
208: andcc %o2, 1, %g0 /* IEU1 Group */
|
||||
be,pt %icc, 2f+4 /* CTI */
|
||||
1: ldub [%o1], %g5 /* LOAD Group */
|
||||
add %o1, 1, %o1 /* IEU0 */
|
||||
add %o0, 1, %o0 /* IEU1 */
|
||||
subcc %o2, 1, %o2 /* IEU1 Group */
|
||||
be,pn %xcc, 209f /* CTI */
|
||||
stb %g5, [%o0 - 1] /* Store */
|
||||
2: ldub [%o1], %g5 /* LOAD Group */
|
||||
add %o0, 2, %o0 /* IEU0 */
|
||||
ldub [%o1 + 1], %o5 /* LOAD Group */
|
||||
add %o1, 2, %o1 /* IEU0 */
|
||||
subcc %o2, 2, %o2 /* IEU1 Group */
|
||||
stb %g5, [%o0 - 2] /* Store */
|
||||
bne,pt %xcc, 2b /* CTI */
|
||||
stb %o5, [%o0 - 1] /* Store */
|
||||
209: retl
|
||||
mov %g4, %o0
|
||||
|
||||
ENTRY(memcpy)
|
||||
210:
|
||||
#ifndef USE_BPR
|
||||
srl %o2, 0, %o2 /* IEU1 Group */
|
||||
#endif
|
||||
brz,pn %o2, 209b /* CTI Group */
|
||||
mov %o0, %g4 /* IEU0 */
|
||||
cmp %o2, 15 /* IEU1 Group */
|
||||
bleu,pn %xcc, 208b /* CTI */
|
||||
cmp %o2, (64 * 6) /* IEU1 Group */
|
||||
bgeu,pn %xcc, 200b /* CTI */
|
||||
andcc %o0, 7, %g2 /* IEU1 Group */
|
||||
sub %o0, %o1, %g5 /* IEU0 */
|
||||
andcc %g5, 3, %o5 /* IEU1 Group */
|
||||
bne,pn %xcc, 212f /* CTI */
|
||||
andcc %o1, 3, %g0 /* IEU1 Group */
|
||||
be,a,pt %xcc, 3f /* CTI */
|
||||
andcc %o1, 4, %g0 /* IEU1 Group */
|
||||
andcc %o1, 1, %g0 /* IEU1 Group */
|
||||
be,pn %xcc, 4f /* CTI */
|
||||
andcc %o1, 2, %g0 /* IEU1 Group */
|
||||
ldub [%o1], %g2 /* Load Group */
|
||||
add %o1, 1, %o1 /* IEU0 */
|
||||
add %o0, 1, %o0 /* IEU1 */
|
||||
sub %o2, 1, %o2 /* IEU0 Group */
|
||||
bne,pn %xcc, 5f /* CTI Group */
|
||||
stb %g2, [%o0 - 1] /* Store */
|
||||
4: lduh [%o1], %g2 /* Load Group */
|
||||
add %o1, 2, %o1 /* IEU0 */
|
||||
add %o0, 2, %o0 /* IEU1 */
|
||||
sub %o2, 2, %o2 /* IEU0 */
|
||||
sth %g2, [%o0 - 2] /* Store Group + bubble */
|
||||
5: andcc %o1, 4, %g0 /* IEU1 */
|
||||
3: be,a,pn %xcc, 2f /* CTI */
|
||||
andcc %o2, -128, %g7 /* IEU1 Group */
|
||||
lduw [%o1], %g5 /* Load Group */
|
||||
add %o1, 4, %o1 /* IEU0 */
|
||||
add %o0, 4, %o0 /* IEU1 */
|
||||
sub %o2, 4, %o2 /* IEU0 Group */
|
||||
stw %g5, [%o0 - 4] /* Store */
|
||||
andcc %o2, -128, %g7 /* IEU1 Group */
|
||||
2: be,pn %xcc, 3f /* CTI */
|
||||
andcc %o0, 4, %g0 /* IEU1 Group */
|
||||
be,pn %xcc, 82f + 4 /* CTI Group */
|
||||
5: MOVE_BIGCHUNK(o1, o0, 0x00, g1, g3, g5, o5)
|
||||
MOVE_BIGCHUNK(o1, o0, 0x20, g1, g3, g5, o5)
|
||||
MOVE_BIGCHUNK(o1, o0, 0x40, g1, g3, g5, o5)
|
||||
MOVE_BIGCHUNK(o1, o0, 0x60, g1, g3, g5, o5)
|
||||
35: subcc %g7, 128, %g7 /* IEU1 Group */
|
||||
add %o1, 128, %o1 /* IEU0 */
|
||||
bne,pt %xcc, 5b /* CTI */
|
||||
add %o0, 128, %o0 /* IEU0 Group */
|
||||
3: andcc %o2, 0x70, %g7 /* IEU1 Group */
|
||||
41: be,pn %xcc, 80f /* CTI */
|
||||
andcc %o2, 8, %g0 /* IEU1 Group */
|
||||
/* Clk1 8-( */
|
||||
/* Clk2 8-( */
|
||||
/* Clk3 8-( */
|
||||
/* Clk4 8-( */
|
||||
79: rd %pc, %o5 /* PDU Group */
|
||||
sll %g7, 1, %g5 /* IEU0 Group */
|
||||
add %o1, %g7, %o1 /* IEU1 */
|
||||
sub %o5, %g5, %o5 /* IEU0 Group */
|
||||
jmpl %o5 + %lo(80f - 79b), %g0 /* CTI Group brk forced*/
|
||||
add %o0, %g7, %o0 /* IEU0 Group */
|
||||
36: MOVE_LASTCHUNK(o1, o0, 0x60, g2, g3, g5, o5)
|
||||
MOVE_LASTCHUNK(o1, o0, 0x50, g2, g3, g5, o5)
|
||||
MOVE_LASTCHUNK(o1, o0, 0x40, g2, g3, g5, o5)
|
||||
MOVE_LASTCHUNK(o1, o0, 0x30, g2, g3, g5, o5)
|
||||
MOVE_LASTCHUNK(o1, o0, 0x20, g2, g3, g5, o5)
|
||||
MOVE_LASTCHUNK(o1, o0, 0x10, g2, g3, g5, o5)
|
||||
MOVE_LASTCHUNK(o1, o0, 0x00, g2, g3, g5, o5)
|
||||
80: be,pt %xcc, 81f /* CTI */
|
||||
andcc %o2, 4, %g0 /* IEU1 */
|
||||
ldx [%o1], %g2 /* Load Group */
|
||||
add %o0, 8, %o0 /* IEU0 */
|
||||
stw %g2, [%o0 - 0x4] /* Store Group */
|
||||
add %o1, 8, %o1 /* IEU1 */
|
||||
srlx %g2, 32, %g2 /* IEU0 Group */
|
||||
stw %g2, [%o0 - 0x8] /* Store */
|
||||
81: be,pt %xcc, 1f /* CTI */
|
||||
andcc %o2, 2, %g0 /* IEU1 Group */
|
||||
lduw [%o1], %g2 /* Load Group */
|
||||
add %o1, 4, %o1 /* IEU0 */
|
||||
stw %g2, [%o0] /* Store Group */
|
||||
add %o0, 4, %o0 /* IEU0 */
|
||||
1: be,pt %xcc, 1f /* CTI */
|
||||
andcc %o2, 1, %g0 /* IEU1 Group */
|
||||
lduh [%o1], %g2 /* Load Group */
|
||||
add %o1, 2, %o1 /* IEU0 */
|
||||
sth %g2, [%o0] /* Store Group */
|
||||
add %o0, 2, %o0 /* IEU0 */
|
||||
1: be,pt %xcc, 211f /* CTI */
|
||||
nop /* IEU1 */
|
||||
ldub [%o1], %g2 /* Load Group */
|
||||
stb %g2, [%o0] /* Store Group + bubble */
|
||||
211: retl
|
||||
mov %g4, %o0
|
||||
|
||||
82: MOVE_BIGALIGNCHUNK(o1, o0, 0x00, g1, g3, g5, o5)
|
||||
MOVE_BIGALIGNCHUNK(o1, o0, 0x40, g1, g3, g5, o5)
|
||||
37: subcc %g7, 128, %g7 /* IEU1 Group */
|
||||
add %o1, 128, %o1 /* IEU0 */
|
||||
bne,pt %xcc, 82b /* CTI */
|
||||
add %o0, 128, %o0 /* IEU0 Group */
|
||||
andcc %o2, 0x70, %g7 /* IEU1 */
|
||||
be,pn %xcc, 84f /* CTI */
|
||||
andcc %o2, 8, %g0 /* IEU1 Group */
|
||||
/* Clk1 8-( */
|
||||
/* Clk2 8-( */
|
||||
/* Clk3 8-( */
|
||||
/* Clk4 8-( */
|
||||
83: rd %pc, %o5 /* PDU Group */
|
||||
add %o1, %g7, %o1 /* IEU0 Group */
|
||||
sub %o5, %g7, %o5 /* IEU1 */
|
||||
jmpl %o5 + %lo(84f - 83b), %g0 /* CTI Group brk forced*/
|
||||
add %o0, %g7, %o0 /* IEU0 Group */
|
||||
38: MOVE_LASTALIGNCHUNK(o1, o0, 0x60, g2, g3)
|
||||
MOVE_LASTALIGNCHUNK(o1, o0, 0x50, g2, g3)
|
||||
MOVE_LASTALIGNCHUNK(o1, o0, 0x40, g2, g3)
|
||||
MOVE_LASTALIGNCHUNK(o1, o0, 0x30, g2, g3)
|
||||
MOVE_LASTALIGNCHUNK(o1, o0, 0x20, g2, g3)
|
||||
MOVE_LASTALIGNCHUNK(o1, o0, 0x10, g2, g3)
|
||||
MOVE_LASTALIGNCHUNK(o1, o0, 0x00, g2, g3)
|
||||
84: be,pt %xcc, 85f /* CTI Group */
|
||||
andcc %o2, 4, %g0 /* IEU1 */
|
||||
ldx [%o1], %g2 /* Load Group */
|
||||
add %o0, 8, %o0 /* IEU0 */
|
||||
add %o1, 8, %o1 /* IEU0 Group */
|
||||
stx %g2, [%o0 - 0x8] /* Store */
|
||||
85: be,pt %xcc, 1f /* CTI */
|
||||
andcc %o2, 2, %g0 /* IEU1 Group */
|
||||
lduw [%o1], %g2 /* Load Group */
|
||||
add %o0, 4, %o0 /* IEU0 */
|
||||
add %o1, 4, %o1 /* IEU0 Group */
|
||||
stw %g2, [%o0 - 0x4] /* Store */
|
||||
1: be,pt %xcc, 1f /* CTI */
|
||||
andcc %o2, 1, %g0 /* IEU1 Group */
|
||||
lduh [%o1], %g2 /* Load Group */
|
||||
add %o0, 2, %o0 /* IEU0 */
|
||||
add %o1, 2, %o1 /* IEU0 Group */
|
||||
sth %g2, [%o0 - 0x2] /* Store */
|
||||
1: be,pt %xcc, 1f /* CTI */
|
||||
nop /* IEU0 Group */
|
||||
ldub [%o1], %g2 /* Load Group */
|
||||
stb %g2, [%o0] /* Store Group + bubble */
|
||||
1: retl
|
||||
mov %g4, %o0
|
||||
|
||||
212: brz,pt %g2, 2f /* CTI Group */
|
||||
mov 8, %g1 /* IEU0 */
|
||||
sub %g1, %g2, %g2 /* IEU0 Group */
|
||||
sub %o2, %g2, %o2 /* IEU0 Group */
|
||||
1: ldub [%o1], %g5 /* Load Group */
|
||||
add %o1, 1, %o1 /* IEU0 */
|
||||
add %o0, 1, %o0 /* IEU1 */
|
||||
subcc %g2, 1, %g2 /* IEU1 Group */
|
||||
bne,pt %xcc, 1b /* CTI */
|
||||
stb %g5, [%o0 - 1] /* Store */
|
||||
2: andn %o2, 7, %g5 /* IEU0 Group */
|
||||
and %o2, 7, %o2 /* IEU1 */
|
||||
fmovd %f0, %f2 /* FPU */
|
||||
alignaddr %o1, %g0, %g1 /* GRU Group */
|
||||
ldd [%g1], %f4 /* Load Group */
|
||||
1: ldd [%g1 + 0x8], %f6 /* Load Group */
|
||||
add %g1, 0x8, %g1 /* IEU0 Group */
|
||||
subcc %g5, 8, %g5 /* IEU1 */
|
||||
faligndata %f4, %f6, %f0 /* GRU Group */
|
||||
std %f0, [%o0] /* Store */
|
||||
add %o1, 8, %o1 /* IEU0 Group */
|
||||
be,pn %xcc, 213f /* CTI */
|
||||
add %o0, 8, %o0 /* IEU1 */
|
||||
ldd [%g1 + 0x8], %f4 /* Load Group */
|
||||
add %g1, 8, %g1 /* IEU0 */
|
||||
subcc %g5, 8, %g5 /* IEU1 */
|
||||
faligndata %f6, %f4, %f0 /* GRU Group */
|
||||
std %f0, [%o0] /* Store */
|
||||
add %o1, 8, %o1 /* IEU0 */
|
||||
bne,pn %xcc, 1b /* CTI Group */
|
||||
add %o0, 8, %o0 /* IEU0 */
|
||||
213: brz,pn %o2, 214f /* CTI Group */
|
||||
nop /* IEU0 */
|
||||
ldub [%o1], %g5 /* LOAD */
|
||||
add %o1, 1, %o1 /* IEU0 */
|
||||
add %o0, 1, %o0 /* IEU1 */
|
||||
subcc %o2, 1, %o2 /* IEU1 */
|
||||
bne,pt %xcc, 206b /* CTI */
|
||||
stb %g5, [%o0 - 1] /* Store Group */
|
||||
214: wr %g0, FPRS_FEF, %fprs
|
||||
retl
|
||||
mov %g4, %o0
|
||||
END(memcpy)
|
316
sysdeps/sparc/sparc64/memset.S
Normal file
316
sysdeps/sparc/sparc64/memset.S
Normal file
@ -0,0 +1,316 @@
|
||||
/* Set a block of memory to some byte value.
|
||||
For UltraSPARC.
|
||||
Copyright (C) 1996, 97, 98, 99 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by David S. Miller (davem@caip.rutgers.edu) and
|
||||
Jakub Jelinek (jj@ultra.linux.cz).
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <asm/asi.h>
|
||||
#ifndef XCC
|
||||
#define XCC xcc
|
||||
#define USE_BPR
|
||||
#endif
|
||||
#define FPRS_FEF 4
|
||||
|
||||
#define SET_BLOCKS(base, offset, source) \
|
||||
stx source, [base - offset - 0x18]; \
|
||||
stx source, [base - offset - 0x10]; \
|
||||
stx source, [base - offset - 0x08]; \
|
||||
stx source, [base - offset - 0x00];
|
||||
|
||||
/* Well, memset is a lot easier to get right than bcopy... */
|
||||
.text
|
||||
.align 32
|
||||
ENTRY(memset)
|
||||
#ifndef USE_BPR
|
||||
srl %o1, 0, %o1
|
||||
mov %o0, %g3
|
||||
#endif
|
||||
brz,a,pt %o1, 50f
|
||||
#ifndef USE_BPR
|
||||
srl %o2, 0, %o1
|
||||
#else
|
||||
mov %o2, %o1
|
||||
#endif
|
||||
cmp %o2, 7
|
||||
#ifndef USE_BPR
|
||||
srl %o2, 0, %o2
|
||||
#endif
|
||||
bleu,pn %XCC, 17f
|
||||
andcc %o0, 3, %g5
|
||||
be,pt %xcc, 4f
|
||||
and %o1, 0xff, %o1
|
||||
cmp %g5, 3
|
||||
be,pn %xcc, 2f
|
||||
stb %o1, [%o0 + 0x00]
|
||||
cmp %g5, 2
|
||||
be,pt %xcc, 2f
|
||||
stb %o1, [%o0 + 0x01]
|
||||
stb %o1, [%o0 + 0x02]
|
||||
2: sub %g5, 4, %g5
|
||||
sub %o0, %g5, %o0
|
||||
add %o2, %g5, %o2
|
||||
4: sllx %o1, 8, %g1
|
||||
andcc %o0, 4, %g0
|
||||
or %o1, %g1, %o1
|
||||
sllx %o1, 16, %g1
|
||||
or %o1, %g1, %o1
|
||||
be,pt %xcc, 2f
|
||||
sllx %o1, 32, %g1
|
||||
stw %o1, [%o0]
|
||||
sub %o2, 4, %o2
|
||||
add %o0, 4, %o0
|
||||
2: cmp %o2, 128
|
||||
or %o1, %g1, %o1
|
||||
blu,pn %xcc, 9f
|
||||
andcc %o0, 0x38, %g5
|
||||
be,pn %icc, 6f
|
||||
mov 64, %o5
|
||||
andcc %o0, 8, %g0
|
||||
be,pn %icc, 1f
|
||||
sub %o5, %g5, %o5
|
||||
stx %o1, [%o0]
|
||||
add %o0, 8, %o0
|
||||
1: andcc %o5, 16, %g0
|
||||
be,pn %icc, 1f
|
||||
sub %o2, %o5, %o2
|
||||
stx %o1, [%o0]
|
||||
stx %o1, [%o0 + 8]
|
||||
add %o0, 16, %o0
|
||||
1: andcc %o5, 32, %g0
|
||||
be,pn %icc, 7f
|
||||
andncc %o2, 0x3f, %o3
|
||||
stw %o1, [%o0]
|
||||
stw %o1, [%o0 + 4]
|
||||
stw %o1, [%o0 + 8]
|
||||
stw %o1, [%o0 + 12]
|
||||
stw %o1, [%o0 + 16]
|
||||
stw %o1, [%o0 + 20]
|
||||
stw %o1, [%o0 + 24]
|
||||
stw %o1, [%o0 + 28]
|
||||
add %o0, 32, %o0
|
||||
7: be,pn %xcc, 9f
|
||||
nop
|
||||
ldd [%o0 - 8], %f0
|
||||
18: wr %g0, ASI_BLK_P, %asi
|
||||
membar #StoreStore | #LoadStore
|
||||
andcc %o3, 0xc0, %g5
|
||||
and %o2, 0x3f, %o2
|
||||
fmovd %f0, %f2
|
||||
fmovd %f0, %f4
|
||||
andn %o3, 0xff, %o3
|
||||
fmovd %f0, %f6
|
||||
cmp %g5, 64
|
||||
fmovd %f0, %f8
|
||||
fmovd %f0, %f10
|
||||
fmovd %f0, %f12
|
||||
brz,pn %g5, 10f
|
||||
fmovd %f0, %f14
|
||||
be,pn %icc, 2f
|
||||
stda %f0, [%o0 + 0x00] %asi
|
||||
cmp %g5, 128
|
||||
be,pn %icc, 2f
|
||||
stda %f0, [%o0 + 0x40] %asi
|
||||
stda %f0, [%o0 + 0x80] %asi
|
||||
2: brz,pn %o3, 12f
|
||||
add %o0, %g5, %o0
|
||||
10: stda %f0, [%o0 + 0x00] %asi
|
||||
stda %f0, [%o0 + 0x40] %asi
|
||||
stda %f0, [%o0 + 0x80] %asi
|
||||
stda %f0, [%o0 + 0xc0] %asi
|
||||
11: subcc %o3, 256, %o3
|
||||
bne,pt %xcc, 10b
|
||||
add %o0, 256, %o0
|
||||
12: wr %g0, FPRS_FEF, %fprs
|
||||
membar #StoreLoad | #StoreStore
|
||||
9: andcc %o2, 0x78, %g5
|
||||
be,pn %xcc, 13f
|
||||
andcc %o2, 7, %o2
|
||||
14: rd %pc, %o4
|
||||
srl %g5, 1, %o3
|
||||
sub %o4, %o3, %o4
|
||||
jmpl %o4 + (13f - 14b), %g0
|
||||
add %o0, %g5, %o0
|
||||
12: SET_BLOCKS (%o0, 0x68, %o1)
|
||||
SET_BLOCKS (%o0, 0x48, %o1)
|
||||
SET_BLOCKS (%o0, 0x28, %o1)
|
||||
SET_BLOCKS (%o0, 0x08, %o1)
|
||||
13: be,pn %xcc, 8f
|
||||
andcc %o2, 4, %g0
|
||||
be,pn %xcc, 1f
|
||||
andcc %o2, 2, %g0
|
||||
stw %o1, [%o0]
|
||||
add %o0, 4, %o0
|
||||
1: be,pn %xcc, 1f
|
||||
andcc %o2, 1, %g0
|
||||
sth %o1, [%o0]
|
||||
add %o0, 2, %o0
|
||||
1: bne,a,pn %xcc, 8f
|
||||
stb %o1, [%o0]
|
||||
8: retl
|
||||
mov %g3, %o0
|
||||
17: brz,pn %o2, 0f
|
||||
8: add %o0, 1, %o0
|
||||
subcc %o2, 1, %o2
|
||||
bne,pt %xcc, 8b
|
||||
stb %o1, [%o0 - 1]
|
||||
0: retl
|
||||
mov %g3, %o0
|
||||
|
||||
6: stx %o1, [%o0]
|
||||
andncc %o2, 0x3f, %o3
|
||||
be,pn %xcc, 9b
|
||||
nop
|
||||
ba,pt %xcc, 18b
|
||||
ldd [%o0], %f0
|
||||
END(memset)
|
||||
|
||||
#define ZERO_BLOCKS(base, offset, source) \
|
||||
stx source, [base - offset - 0x38]; \
|
||||
stx source, [base - offset - 0x30]; \
|
||||
stx source, [base - offset - 0x28]; \
|
||||
stx source, [base - offset - 0x20]; \
|
||||
stx source, [base - offset - 0x18]; \
|
||||
stx source, [base - offset - 0x10]; \
|
||||
stx source, [base - offset - 0x08]; \
|
||||
stx source, [base - offset - 0x00];
|
||||
|
||||
.text
|
||||
.align 32
|
||||
ENTRY(__bzero)
|
||||
#ifndef USE_BPR
|
||||
srl %o1, 0, %o1
|
||||
#endif
|
||||
mov %o0, %g3
|
||||
50: cmp %o1, 7
|
||||
bleu,pn %xcc, 17f
|
||||
andcc %o0, 3, %o2
|
||||
be,a,pt %xcc, 4f
|
||||
andcc %o0, 4, %g0
|
||||
cmp %o2, 3
|
||||
be,pn %xcc, 2f
|
||||
stb %g0, [%o0 + 0x00]
|
||||
cmp %o2, 2
|
||||
be,pt %xcc, 2f
|
||||
stb %g0, [%o0 + 0x01]
|
||||
stb %g0, [%o0 + 0x02]
|
||||
2: sub %o2, 4, %o2
|
||||
sub %o0, %o2, %o0
|
||||
add %o1, %o2, %o1
|
||||
andcc %o0, 4, %g0
|
||||
4: be,pt %xcc, 2f
|
||||
cmp %o1, 128
|
||||
stw %g0, [%o0]
|
||||
sub %o1, 4, %o1
|
||||
add %o0, 4, %o0
|
||||
2: blu,pn %xcc, 9f
|
||||
andcc %o0, 0x38, %o2
|
||||
be,pn %icc, 6f
|
||||
mov 64, %o5
|
||||
andcc %o0, 8, %g0
|
||||
be,pn %icc, 1f
|
||||
sub %o5, %o2, %o5
|
||||
stx %g0, [%o0]
|
||||
add %o0, 8, %o0
|
||||
1: andcc %o5, 16, %g0
|
||||
be,pn %icc, 1f
|
||||
sub %o1, %o5, %o1
|
||||
stx %g0, [%o0]
|
||||
stx %g0, [%o0 + 8]
|
||||
add %o0, 16, %o0
|
||||
1: andcc %o5, 32, %g0
|
||||
be,pn %icc, 7f
|
||||
andncc %o1, 0x3f, %o3
|
||||
stx %g0, [%o0]
|
||||
stx %g0, [%o0 + 8]
|
||||
stx %g0, [%o0 + 16]
|
||||
stx %g0, [%o0 + 24]
|
||||
add %o0, 32, %o0
|
||||
6: andncc %o1, 0x3f, %o3
|
||||
7: be,pn %xcc, 9f
|
||||
wr %g0, ASI_BLK_P, %asi
|
||||
membar #StoreLoad | #StoreStore | #LoadStore
|
||||
fzero %f0
|
||||
andcc %o3, 0xc0, %o2
|
||||
and %o1, 0x3f, %o1
|
||||
fzero %f2
|
||||
andn %o3, 0xff, %o3
|
||||
faddd %f0, %f2, %f4
|
||||
fmuld %f0, %f2, %f6
|
||||
cmp %o2, 64
|
||||
faddd %f0, %f2, %f8
|
||||
fmuld %f0, %f2, %f10
|
||||
faddd %f0, %f2, %f12
|
||||
brz,pn %o2, 10f
|
||||
fmuld %f0, %f2, %f14
|
||||
be,pn %icc, 2f
|
||||
stda %f0, [%o0 + 0x00] %asi
|
||||
cmp %o2, 128
|
||||
be,pn %icc, 2f
|
||||
stda %f0, [%o0 + 0x40] %asi
|
||||
stda %f0, [%o0 + 0x80] %asi
|
||||
2: brz,pn %o3, 12f
|
||||
add %o0, %o2, %o0
|
||||
10: stda %f0, [%o0 + 0x00] %asi
|
||||
stda %f0, [%o0 + 0x40] %asi
|
||||
stda %f0, [%o0 + 0x80] %asi
|
||||
stda %f0, [%o0 + 0xc0] %asi
|
||||
11: subcc %o3, 256, %o3
|
||||
bne,pt %xcc, 10b
|
||||
add %o0, 256, %o0
|
||||
12: wr %g0, FPRS_FEF, %fprs
|
||||
membar #StoreLoad | #StoreStore
|
||||
9: andcc %o1, 0xf8, %o2
|
||||
be,pn %xcc, 13f
|
||||
andcc %o1, 7, %o1
|
||||
14: rd %pc, %o4
|
||||
srl %o2, 1, %o3
|
||||
sub %o4, %o3, %o4
|
||||
jmpl %o4 + (13f - 14b), %g0
|
||||
add %o0, %o2, %o0
|
||||
12: ZERO_BLOCKS (%o0, 0xc8, %g0)
|
||||
ZERO_BLOCKS (%o0, 0x88, %g0)
|
||||
ZERO_BLOCKS (%o0, 0x48, %g0)
|
||||
ZERO_BLOCKS (%o0, 0x08, %g0)
|
||||
13: be,pn %xcc, 8f
|
||||
andcc %o1, 4, %g0
|
||||
be,pn %xcc, 1f
|
||||
andcc %o1, 2, %g0
|
||||
stw %g0, [%o0]
|
||||
add %o0, 4, %o0
|
||||
1: be,pn %xcc, 1f
|
||||
andcc %o1, 1, %g0
|
||||
sth %g0, [%o0]
|
||||
add %o0, 2, %o0
|
||||
1: bne,a,pn %xcc, 8f
|
||||
stb %g0, [%o0]
|
||||
8: retl
|
||||
mov %g3, %o0
|
||||
17: be,pn %xcc, 13b
|
||||
orcc %o1, 0, %g0
|
||||
be,pn %xcc, 0f
|
||||
8: add %o0, 1, %o0
|
||||
subcc %o1, 1, %o1
|
||||
bne,pt %xcc, 8b
|
||||
stb %g0, [%o0 - 1]
|
||||
0: retl
|
||||
mov %g3, %o0
|
||||
END(__bzero)
|
||||
|
||||
weak_alias(__bzero, bzero)
|
268
sysdeps/sparc/sparc64/stpcpy.S
Normal file
268
sysdeps/sparc/sparc64/stpcpy.S
Normal file
@ -0,0 +1,268 @@
|
||||
/* Copy SRC to DEST returning the address of the terminating '\0' in DEST.
|
||||
For SPARC v9.
|
||||
Copyright (C) 1998, 1999 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz> and
|
||||
Jakub Jelinek <jj@ultra.linux.cz>.
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <asm/asi.h>
|
||||
|
||||
/* Normally, this uses
|
||||
((xword - 0x0101010101010101) & 0x8080808080808080) test
|
||||
to find out if any byte in xword could be zero. This is fast, but
|
||||
also gives false alarm for any byte in range 0x81-0xff. It does
|
||||
not matter for correctness, as if this test tells us there could
|
||||
be some zero byte, we check it byte by byte, but if bytes with
|
||||
high bits set are common in the strings, then this will give poor
|
||||
performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
|
||||
will use one tick slower, but more precise test
|
||||
((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
|
||||
which does not give any false alarms (but if some bits are set,
|
||||
one cannot assume from it which bytes are zero and which are not).
|
||||
It is yet to be measured, what is the correct default for glibc
|
||||
in these days for an average user.
|
||||
*/
|
||||
|
||||
.text
|
||||
.align 32
|
||||
ENTRY(__stpcpy)
|
||||
sethi %hi(0x01010101), %g1 /* IEU0 Group */
|
||||
or %g1, %lo(0x01010101), %g1 /* IEU0 Group */
|
||||
andcc %o0, 7, %g0 /* IEU1 */
|
||||
sllx %g1, 32, %g2 /* IEU0 Group */
|
||||
|
||||
bne,pn %icc, 12f /* CTI */
|
||||
andcc %o1, 7, %g3 /* IEU1 */
|
||||
or %g1, %g2, %g1 /* IEU0 Group */
|
||||
bne,pn %icc, 14f /* CTI */
|
||||
|
||||
sllx %g1, 7, %g2 /* IEU0 Group */
|
||||
1: ldx [%o1], %o3 /* Load */
|
||||
add %o1, 8, %o1 /* IEU1 */
|
||||
2: mov %o3, %g3 /* IEU0 Group */
|
||||
|
||||
sub %o3, %g1, %o2 /* IEU1 */
|
||||
3: ldxa [%o1] ASI_PNF, %o3 /* Load */
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %o2, %g3, %o2 /* IEU0 Group */
|
||||
#endif
|
||||
add %o0, 8, %o0 /* IEU0 Group */
|
||||
andcc %o2, %g2, %g0 /* IEU1 */
|
||||
|
||||
add %o1, 8, %o1 /* IEU0 Group */
|
||||
be,a,pt %xcc, 2b /* CTI */
|
||||
stx %g3, [%o0 - 8] /* Store */
|
||||
srlx %g3, 56, %g5 /* IEU0 Group */
|
||||
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 11f /* CTI */
|
||||
srlx %g3, 48, %g4 /* IEU0 */
|
||||
andcc %g4, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 10f /* CTI */
|
||||
srlx %g3, 40, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 9f /* CTI */
|
||||
|
||||
srlx %g3, 32, %g4 /* IEU0 */
|
||||
andcc %g4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 8f /* CTI */
|
||||
srlx %g3, 24, %g5 /* IEU0 */
|
||||
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 7f /* CTI */
|
||||
srlx %g3, 16, %g4 /* IEU0 */
|
||||
andcc %g4, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 6f /* CTI */
|
||||
srlx %g3, 8, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 5f /* CTI */
|
||||
|
||||
sub %o3, %g1, %o2 /* IEU0 */
|
||||
stx %g3, [%o0 - 8] /* Store Group */
|
||||
andcc %g3, 0xff, %g0 /* IEU1 */
|
||||
bne,pt %icc, 3b /* CTI */
|
||||
|
||||
mov %o3, %g3 /* IEU0 Group */
|
||||
4: retl /* CTI+IEU1 Group */
|
||||
sub %o0, 1, %o0 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
6: ba,pt %xcc, 23f /* CTI Group */
|
||||
sub %o0, 3, %g7 /* IEU0 */
|
||||
5: sub %o0, 2, %g7 /* IEU0 Group */
|
||||
stb %g5, [%o0 - 2] /* Store */
|
||||
|
||||
srlx %g3, 16, %g4 /* IEU0 Group */
|
||||
23: sth %g4, [%o0 - 4] /* Store */
|
||||
srlx %g3, 32, %g4 /* IEU0 Group */
|
||||
stw %g4, [%o0 - 8] /* Store */
|
||||
|
||||
retl /* CTI+IEU1 Group */
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
8: ba,pt %xcc, 24f /* CTI Group */
|
||||
sub %o0, 5, %g7 /* IEU0 */
|
||||
|
||||
7: sub %o0, 4, %g7 /* IEU0 Group */
|
||||
stb %g5, [%o0 - 4] /* Store */
|
||||
srlx %g3, 32, %g4 /* IEU0 Group */
|
||||
24: stw %g4, [%o0 - 8] /* Store */
|
||||
|
||||
retl /* CTI+IEU1 Group */
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
10: ba,pt %xcc, 25f /* CTI Group */
|
||||
sub %o0, 7, %g7 /* IEU0 */
|
||||
|
||||
9: sub %o0, 6, %g7 /* IEU0 Group */
|
||||
stb %g5, [%o0 - 6] /* Store */
|
||||
srlx %g3, 48, %g4 /* IEU0 */
|
||||
25: sth %g4, [%o0 - 8] /* Store Group */
|
||||
|
||||
retl /* CTI+IEU1 Group */
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
11: stb %g5, [%o0 - 8] /* Store Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
|
||||
sub %o0, 8, %o0 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
12: or %g1, %g2, %g1 /* IEU0 Group */
|
||||
ldub [%o1], %o3 /* Load */
|
||||
sllx %g1, 7, %g2 /* IEU0 Group */
|
||||
stb %o3, [%o0] /* Store Group */
|
||||
|
||||
13: add %o0, 1, %o0 /* IEU0 */
|
||||
add %o1, 1, %o1 /* IEU1 */
|
||||
andcc %o3, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4b /* CTI */
|
||||
|
||||
lduba [%o1] ASI_PNF, %o3 /* Load */
|
||||
andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
bne,a,pt %icc, 13b /* CTI */
|
||||
stb %o3, [%o0] /* Store */
|
||||
|
||||
andcc %o1, 7, %g3 /* IEU1 Group */
|
||||
be,a,pt %icc, 1b /* CTI */
|
||||
ldx [%o1], %o3 /* Load */
|
||||
14: orcc %g0, 64, %g4 /* IEU1 Group */
|
||||
|
||||
sllx %g3, 3, %g5 /* IEU0 */
|
||||
sub %o1, %g3, %o1 /* IEU0 Group */
|
||||
sub %g4, %g5, %g4 /* IEU1 */
|
||||
/* %g1 = 0101010101010101 *
|
||||
* %g2 = 8080808080808080 *
|
||||
* %g3 = source alignment *
|
||||
* %g5 = number of bits to shift left *
|
||||
* %g4 = number of bits to shift right */
|
||||
ldxa [%o1] ASI_PNF, %o5 /* Load Group */
|
||||
|
||||
addcc %o1, 8, %o1 /* IEU1 */
|
||||
15: sllx %o5, %g5, %o3 /* IEU0 Group */
|
||||
ldxa [%o1] ASI_PNF, %o5 /* Load */
|
||||
srlx %o5, %g4, %o4 /* IEU0 Group */
|
||||
|
||||
add %o0, 8, %o0 /* IEU1 */
|
||||
or %o3, %o4, %o3 /* IEU0 Group */
|
||||
add %o1, 8, %o1 /* IEU1 */
|
||||
sub %o3, %g1, %o4 /* IEU0 Group */
|
||||
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %o4, %o3, %o4 /* IEU0 Group */
|
||||
#endif
|
||||
andcc %o4, %g2, %g0 /* IEU1 Group */
|
||||
be,a,pt %xcc, 15b /* CTI */
|
||||
stx %o3, [%o0 - 8] /* Store */
|
||||
srlx %o3, 56, %o4 /* IEU0 Group */
|
||||
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 22f /* CTI */
|
||||
srlx %o3, 48, %o4 /* IEU0 */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 21f /* CTI */
|
||||
srlx %o3, 40, %o4 /* IEU0 */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 20f /* CTI */
|
||||
|
||||
srlx %o3, 32, %o4 /* IEU0 */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 19f /* CTI */
|
||||
srlx %o3, 24, %o4 /* IEU0 */
|
||||
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 18f /* CTI */
|
||||
srlx %o3, 16, %o4 /* IEU0 */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 17f /* CTI */
|
||||
srlx %o3, 8, %o4 /* IEU0 */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 16f /* CTI */
|
||||
|
||||
andcc %o3, 0xff, %g0 /* IEU1 Group */
|
||||
bne,pn %icc, 15b /* CTI */
|
||||
stx %o3, [%o0 - 8] /* Store */
|
||||
retl /* CTI+IEU1 Group */
|
||||
|
||||
sub %o0, 1, %o0 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
17: ba,pt %xcc, 26f /* CTI Group */
|
||||
subcc %o0, 3, %g7 /* IEU1 */
|
||||
18: ba,pt %xcc, 27f /* CTI Group */
|
||||
subcc %o0, 4, %g7 /* IEU1 */
|
||||
|
||||
19: ba,pt %xcc, 28f /* CTI Group */
|
||||
subcc %o0, 5, %g7 /* IEU1 */
|
||||
16: subcc %o0, 2, %g7 /* IEU1 Group */
|
||||
srlx %o3, 8, %o4 /* IEU0 */
|
||||
|
||||
stb %o4, [%o0 - 2] /* Store */
|
||||
26: srlx %o3, 16, %o4 /* IEU0 Group */
|
||||
stb %o4, [%o0 - 3] /* Store */
|
||||
27: srlx %o3, 24, %o4 /* IEU0 Group */
|
||||
|
||||
stb %o4, [%o0 - 4] /* Store */
|
||||
28: srlx %o3, 32, %o4 /* IEU0 Group */
|
||||
stw %o4, [%o0 - 8] /* Store */
|
||||
retl /* CTI+IEU1 Group */
|
||||
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
21: ba,pt %xcc, 29f /* CTI Group */
|
||||
subcc %o0, 7, %g7 /* IEU1 */
|
||||
22: ba,pt %xcc, 30f /* CTI Group */
|
||||
subcc %o0, 8, %g7 /* IEU1 */
|
||||
|
||||
20: subcc %o0, 6, %g7 /* IEU1 Group */
|
||||
srlx %o3, 40, %o4 /* IEU0 */
|
||||
stb %o4, [%o0 - 6] /* Store */
|
||||
29: srlx %o3, 48, %o4 /* IEU0 Group */
|
||||
|
||||
stb %o4, [%o0 - 7] /* Store */
|
||||
30: srlx %o3, 56, %o4 /* IEU0 Group */
|
||||
stb %o4, [%o0 - 8] /* Store */
|
||||
retl /* CTI+IEU1 Group */
|
||||
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
END(__stpcpy)
|
||||
|
||||
weak_alias (__stpcpy, stpcpy)
|
421
sysdeps/sparc/sparc64/stpncpy.S
Normal file
421
sysdeps/sparc/sparc64/stpncpy.S
Normal file
@ -0,0 +1,421 @@
|
||||
/* stpncpy(DST, SRC, COUNT) - Copy no more than N characters of
|
||||
SRC to DEST, returning the address of the terminating '\0' in
|
||||
DEST, if any, or else DEST + N.
|
||||
For SPARC v9.
|
||||
Copyright (C) 1998, 1999 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jj@ultra.linux.cz> and
|
||||
Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz>.
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <asm/asi.h>
|
||||
#ifndef XCC
|
||||
#define XCC xcc
|
||||
#define USE_BPR
|
||||
#endif
|
||||
|
||||
/* Normally, this uses
|
||||
((xword - 0x0101010101010101) & 0x8080808080808080) test
|
||||
to find out if any byte in xword could be zero. This is fast, but
|
||||
also gives false alarm for any byte in range 0x81-0xff. It does
|
||||
not matter for correctness, as if this test tells us there could
|
||||
be some zero byte, we check it byte by byte, but if bytes with
|
||||
high bits set are common in the strings, then this will give poor
|
||||
performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
|
||||
will use one tick slower, but more precise test
|
||||
((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
|
||||
which does not give any false alarms (but if some bits are set,
|
||||
one cannot assume from it which bytes are zero and which are not).
|
||||
It is yet to be measured, what is the correct default for glibc
|
||||
in these days for an average user.
|
||||
*/
|
||||
|
||||
.text
|
||||
.align 32
|
||||
ENTRY(__stpncpy)
|
||||
sethi %hi(0x01010101), %g1 /* IEU0 Group */
|
||||
#ifdef USE_BPR
|
||||
brz,pn %o2, 19f /* CTI+IEU1 */
|
||||
#else
|
||||
tst %o2 /* IEU1 */
|
||||
be,pn %XCC, 19f /* CTI */
|
||||
#endif
|
||||
or %g1, %lo(0x01010101), %g1 /* IEU1 */
|
||||
andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
|
||||
sllx %g1, 32, %g2 /* IEU0 */
|
||||
bne,pn %icc, 26f /* CTI */
|
||||
or %g1, %g2, %g1 /* IEU0 Group */
|
||||
andcc %o1, 7, %g3 /* IEU1 */
|
||||
|
||||
bne,pn %icc, 28f /* CTI */
|
||||
sllx %g1, 7, %g2 /* IEU0 Group */
|
||||
ldx [%o1], %o3 /* Load */
|
||||
1: add %o1, 8, %o1 /* IEU1 */
|
||||
|
||||
2: subcc %o2, 8, %o2 /* IEU1 Group */
|
||||
bl,pn %XCC, 18f /* CTI */
|
||||
sub %o3, %g1, %o4 /* IEU0 */
|
||||
add %o0, 8, %o0 /* IEU0 Group */
|
||||
|
||||
#ifdef EIGHTBIT_NOT_MORE
|
||||
andn %o4, %o3, %o4 /* IEU1 */
|
||||
#endif
|
||||
mov %o3, %g3 /* IEU1 */
|
||||
ldxa [%o1] ASI_PNF, %o3 /* Load */
|
||||
add %o1, 8, %o1 /* IEU0 Group */
|
||||
andcc %o4, %g2, %g0 /* IEU1 */
|
||||
|
||||
be,a,pt %xcc, 2b /* CTI */
|
||||
stx %g3, [%o0-8] /* Store Group */
|
||||
srlx %g3, 56, %g5 /* IEU0 Group */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 16f /* CTI */
|
||||
srlx %g3, 48, %g4 /* IEU0 */
|
||||
andcc %g4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 15f /* CTI */
|
||||
|
||||
srlx %g3, 40, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 14f /* CTI */
|
||||
srlx %g3, 32, %g4 /* IEU0 */
|
||||
|
||||
andcc %g4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 13f /* CTI */
|
||||
srlx %g3, 24, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 12f /* CTI */
|
||||
srlx %g3, 16, %g4 /* IEU0 */
|
||||
andcc %g4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 11f /* CTI */
|
||||
|
||||
srlx %g3, 8, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 10f /* CTI */
|
||||
sub %o0, 1, %g7 /* IEU0 */
|
||||
|
||||
andcc %g3, 0xff, %g0 /* IEU1 Group */
|
||||
bne,pt %icc, 2b /* CTI */
|
||||
3: stx %g3, [%o0-8] /* Store */
|
||||
andncc %o2, 31, %g3 /* IEU1 Group */
|
||||
|
||||
4: be,pn %XCC, 41f /* CTI */
|
||||
and %o2, 31, %o2 /* IEU1 Group */
|
||||
40: stx %g0, [%o0] /* Store */
|
||||
stx %g0, [%o0 + 8] /* Store Group */
|
||||
|
||||
subcc %g3, 32, %g3 /* IEU1 */
|
||||
stx %g0, [%o0 + 16] /* Store Group */
|
||||
stx %g0, [%o0 + 24] /* Store Group */
|
||||
bne,pt %XCC, 40b /* CTI */
|
||||
|
||||
add %o0, 32, %o0 /* IEU0 */
|
||||
41: subcc %o2, 8, %o2 /* IEU1 Group */
|
||||
bl,a,pn %XCC, 6f /* CTI */
|
||||
andcc %o2, 4, %g0 /* IEU1 Group */
|
||||
|
||||
5: stx %g0, [%o0] /* Store */
|
||||
subcc %o2, 8, %o2 /* IEU1 Group */
|
||||
bge,pt %XCC, 5b /* CTI */
|
||||
add %o0, 8, %o0 /* IEU0 */
|
||||
|
||||
andcc %o2, 4, %g0 /* IEU1 Group */
|
||||
6: be,a,pn %icc, 7f /* CTI */
|
||||
andcc %o2, 2, %g0 /* IEU1 Group */
|
||||
stw %g0, [%o0] /* Store */
|
||||
|
||||
add %o0, 4, %o0 /* IEU0 */
|
||||
andcc %o2, 2, %g0 /* IEU1 Group */
|
||||
7: be,a,pn %icc, 8f /* CTI */
|
||||
andcc %o2, 1, %g0 /* IEU1 Group */
|
||||
|
||||
sth %g0, [%o0] /* Store */
|
||||
add %o0, 2, %o0 /* IEU0 */
|
||||
andcc %o2, 1, %g0 /* IEU1 Group */
|
||||
8: bne,a,pn %icc, 9f /* CTI */
|
||||
|
||||
stb %g0, [%o0] /* Store */
|
||||
9: retl /* CTI+IEU1 Group */
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
10: subcc %o0, 2, %g7 /* IEU1 Group */
|
||||
|
||||
ba,pt %xcc, 3b /* CTI */
|
||||
sllx %g5, 8, %g3 /* IEU0 */
|
||||
11: subcc %o0, 3, %g7 /* IEU1 Group */
|
||||
ba,pt %xcc, 3b /* CTI */
|
||||
|
||||
sllx %g4, 16, %g3 /* IEU0 */
|
||||
12: subcc %o0, 4, %g7 /* IEU1 Group */
|
||||
ba,pt %xcc, 3b /* CTI */
|
||||
sllx %g5, 24, %g3 /* IEU0 */
|
||||
|
||||
13: subcc %o0, 5, %g7 /* IEU1 Group */
|
||||
ba,pt %xcc, 3b /* CTI */
|
||||
sllx %g4, 32, %g3 /* IEU0 */
|
||||
14: subcc %o0, 6, %g7 /* IEU1 Group */
|
||||
|
||||
ba,pt %xcc, 3b /* CTI */
|
||||
sllx %g5, 40, %g3 /* IEU0 */
|
||||
15: subcc %o0, 7, %g7 /* IEU1 Group */
|
||||
ba,pt %xcc, 3b /* CTI */
|
||||
|
||||
sllx %g4, 48, %g3 /* IEU0 */
|
||||
16: subcc %o0, 8, %g7 /* IEU1 Group */
|
||||
ba,pt %xcc, 3b /* CTI */
|
||||
clr %g3 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
17: or %o3, %o4, %o3 /* IEU0 Group */
|
||||
sub %o3, %g1, %o4 /* IEU1 */
|
||||
18: addcc %o2, 8, %o2 /* IEU1 Group */
|
||||
be,pn %XCC, 19f /* CTI */
|
||||
|
||||
andcc %o4, %g2, %g0 /* IEU1 Group */
|
||||
be,pt %xcc, 21f /* CTI */
|
||||
srlx %o3, 56, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 20f /* CTI */
|
||||
stb %g5, [%o0] /* Store */
|
||||
add %o0, 1, %o0 /* IEU0 Group */
|
||||
subcc %o2, 1, %o2 /* IEU1 */
|
||||
|
||||
be,pn %XCC, 19f /* CTI */
|
||||
srlx %o3, 48, %g5 /* IEU0 Group */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 20f /* CTI */
|
||||
|
||||
stb %g5, [%o0] /* Store */
|
||||
add %o0, 1, %o0 /* IEU0 Group */
|
||||
subcc %o2, 1, %o2 /* IEU1 */
|
||||
be,pn %XCC, 19f /* CTI */
|
||||
|
||||
srlx %o3, 40, %g5 /* IEU0 Group */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 20f /* CTI */
|
||||
stb %g5, [%o0] /* Store */
|
||||
|
||||
add %o0, 1, %o0 /* IEU0 Group */
|
||||
subcc %o2, 1, %o2 /* IEU1 */
|
||||
be,pn %XCC, 19f /* CTI */
|
||||
srlx %o3, 32, %g5 /* IEU0 Group */
|
||||
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 20f /* CTI */
|
||||
stb %g5, [%o0] /* Store */
|
||||
add %o0, 1, %o0 /* IEU0 Group */
|
||||
|
||||
subcc %o2, 1, %o2 /* IEU1 */
|
||||
be,pn %XCC, 19f /* CTI */
|
||||
srlx %o3, 24, %g5 /* IEU0 Group */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 20f /* CTI */
|
||||
stb %g5, [%o0] /* Store */
|
||||
add %o0, 1, %o0 /* IEU0 Group */
|
||||
subcc %o2, 1, %o2 /* IEU1 */
|
||||
|
||||
be,pn %XCC, 19f /* CTI */
|
||||
srlx %o3, 16, %g5 /* IEU0 Group */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 20f /* CTI */
|
||||
|
||||
stb %g5, [%o0] /* Store */
|
||||
add %o0, 1, %o0 /* IEU0 Group */
|
||||
subcc %o2, 1, %o2 /* IEU1 */
|
||||
be,pn %XCC, 19f /* CTI */
|
||||
|
||||
srlx %o3, 8, %o3 /* IEU0 Group */
|
||||
stb %o3, [%o0] /* Store */
|
||||
59: add %o0, 1, %o2 /* IEU1 */
|
||||
andcc %o3, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
retl /* CTI+IEU1 Group */
|
||||
movne %icc, %o2, %o0 /* Single Group */
|
||||
19: retl /* CTI+IEU1 Group */
|
||||
nop /* IEU0 */
|
||||
|
||||
20: mov %o0, %g7 /* IEU0 Group */
|
||||
subcc %o2, 1, %o2 /* IEU1 */
|
||||
be,pn %XCC, 51f /* CTI */
|
||||
add %o0, 1, %o0 /* IEU0 Group */
|
||||
|
||||
50: stb %g0, [%o0] /* Store Group */
|
||||
subcc %o2, 1, %o2 /* IEU1 Group */
|
||||
bne,pt %XCC, 50b /* CTI */
|
||||
add %o0, 1, %o0 /* IEU0 */
|
||||
|
||||
51: retl /* CTI+IEU1 Group */
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
21: andcc %o2, 4, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 22f /* CTI */
|
||||
srlx %o3, 32, %g5 /* IEU0 */
|
||||
stw %g5, [%o0] /* Store Group */
|
||||
|
||||
add %o0, 4, %o0 /* IEU0 */
|
||||
mov %o3, %g5 /* IEU1 */
|
||||
22: andcc %o2, 2, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 23f /* CTI */
|
||||
|
||||
srlx %g5, 16, %g4 /* IEU0 */
|
||||
sth %g4, [%o0] /* Store Group */
|
||||
add %o0, 2, %o0 /* IEU0 */
|
||||
mov %g5, %g4 /* IEU1 */
|
||||
|
||||
23: srlx %g4, 8, %g4 /* IEU0 Group */
|
||||
andcc %o2, 1, %g0 /* IEU1 */
|
||||
bne,a,pn %icc, 24f /* CTI */
|
||||
stb %g4, [%o0] /* Store Group */
|
||||
|
||||
retl /* CTI+IEU1 Group */
|
||||
nop /* IEU0 */
|
||||
24: retl /* CTI+IEU1 Group */
|
||||
add %o0, 1, %o0 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
55: sub %o0, 1, %g7 /* IEU0 Group */
|
||||
25: andcc %o0, 7, %g0 /* IEU1 */
|
||||
be,a,pn %icc, 4b /* CTI */
|
||||
andncc %o2, 31, %g3 /* IEU1 Group */
|
||||
|
||||
stb %g0, [%o0] /* Store Group */
|
||||
subcc %o2, 1, %o2 /* IEU1 */
|
||||
bne,pt %XCC, 25b /* CTI */
|
||||
add %o0, 1, %o0 /* IEU0 Group */
|
||||
|
||||
retl /* CTI+IEU1 Group */
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
26: ldub [%o1], %o3 /* Load */
|
||||
sllx %g1, 7, %g2 /* IEU0 Group */
|
||||
stb %o3, [%o0] /* Store */
|
||||
27: subcc %o2, 1, %o2 /* IEU1 */
|
||||
|
||||
be,pn %XCC, 59b /* CTI */
|
||||
add %o1, 1, %o1 /* IEU0 Group */
|
||||
add %o0, 1, %o0 /* IEU1 */
|
||||
andcc %o3, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 55b /* CTI */
|
||||
lduba [%o1] ASI_PNF, %o3 /* Load */
|
||||
andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
bne,a,pt %icc, 27b /* CTI */
|
||||
|
||||
stb %o3, [%o0] /* Store */
|
||||
andcc %o1, 7, %g3 /* IEU1 Group */
|
||||
be,a,pt %icc, 1b /* CTI */
|
||||
ldx [%o1], %o3 /* Load */
|
||||
|
||||
28: orcc %g0, 64, %g4 /* IEU1 Group */
|
||||
sllx %g3, 3, %g5 /* IEU0 */
|
||||
sub %g4, %g5, %g4 /* IEU0 Group */
|
||||
sub %o1, %g3, %o1 /* IEU1 */
|
||||
/* %g1 = 0101010101010101
|
||||
%g2 = 8080808080808080
|
||||
%g3 = source alignment
|
||||
%g5 = number of bits to shift left
|
||||
%g4 = number of bits to shift right */
|
||||
|
||||
ldxa [%o1] ASI_PNF, %o5 /* Load Group */
|
||||
addcc %o1, 8, %o1 /* IEU1 */
|
||||
29: sllx %o5, %g5, %o3 /* IEU0 Group */
|
||||
ldxa [%o1] ASI_PNF, %o5 /* Load */
|
||||
|
||||
subcc %o2, 8, %o2 /* IEU1 */
|
||||
bl,pn %XCC, 17b /* CTI */
|
||||
srlx %o5, %g4, %o4 /* IEU0 Group */
|
||||
add %o1, 8, %o1 /* IEU1 */
|
||||
|
||||
or %o3, %o4, %o3 /* IEU0 Group */
|
||||
add %o0, 8, %o0 /* IEU1 */
|
||||
sub %o3, %g1, %o4 /* IEU0 Group */
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %o4, %o3, %o4 /* IEU0 Group */
|
||||
#endif
|
||||
andcc %o4, %g2, %g0 /* IEU1 Group */
|
||||
|
||||
be,a,pt %xcc, 29b /* CTI */
|
||||
stx %o3, [%o0-8] /* Store */
|
||||
srlx %o3, 56, %o4 /* IEU0 Group */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 36f /* CTI */
|
||||
srlx %o3, 48, %g7 /* IEU0 */
|
||||
andcc %g7, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 35f /* CTI */
|
||||
|
||||
srlx %o3, 40, %o4 /* IEU0 */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 34f /* CTI */
|
||||
srlx %o3, 32, %g7 /* IEU0 */
|
||||
|
||||
andcc %g7, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 33f /* CTI */
|
||||
srlx %o3, 24, %o4 /* IEU0 */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 32f /* CTI */
|
||||
srlx %o3, 16, %g7 /* IEU0 */
|
||||
andcc %g7, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 31f /* CTI */
|
||||
|
||||
srlx %o3, 8, %o4 /* IEU0 */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 30f /* CTI */
|
||||
andcc %o3, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
bne,pn %icc, 29b /* CTI */
|
||||
stx %o3, [%o0-8] /* Store */
|
||||
sub %o0, 1, %g7 /* IEU0 Group */
|
||||
ba,pt %xcc, 4b /* CTI */
|
||||
|
||||
andncc %o2, 31, %g3 /* IEU1 */
|
||||
30: subcc %o0, 2, %g7 /* IEU0 */
|
||||
ba,pt %xcc, 3b /* CTI */
|
||||
sllx %o4, 8, %g3 /* IEU0 Group */
|
||||
|
||||
31: sllx %g7, 16, %g3 /* IEU0 Group */
|
||||
ba,pt %xcc, 3b /* CTI */
|
||||
sub %o0, 3, %g7 /* IEU1 */
|
||||
32: subcc %o0, 4, %g7 /* IEU1 Group */
|
||||
|
||||
ba,pt %xcc, 3b /* CTI */
|
||||
sllx %o4, 24, %g3 /* IEU0 */
|
||||
33: sllx %g7, 32, %g3 /* IEU0 Group */
|
||||
ba,pt %xcc, 3b /* CTI */
|
||||
|
||||
sub %o0, 5, %g7 /* IEU1 */
|
||||
34: subcc %o0, 6, %g7 /* IEU1 Group */
|
||||
ba,pt %xcc, 3b /* CTI */
|
||||
sllx %o4, 40, %g3 /* IEU0 */
|
||||
|
||||
35: sllx %g7, 48, %g3 /* IEU0 Group */
|
||||
ba,pt %xcc, 3b /* CTI */
|
||||
sub %o0, 7, %g7 /* IEU1 */
|
||||
36: subcc %o0, 8, %g7 /* IEU1 Group */
|
||||
|
||||
ba,pt %xcc, 3b /* CTI */
|
||||
sllx %o4, 56, %g3 /* IEU0 */
|
||||
END(__stpncpy)
|
||||
|
||||
weak_alias(__stpncpy, stpncpy)
|
336
sysdeps/sparc/sparc64/strcat.S
Normal file
336
sysdeps/sparc/sparc64/strcat.S
Normal file
@ -0,0 +1,336 @@
|
||||
/* strcat (dest, src) -- Append SRC on the end of DEST.
|
||||
For SPARC v9.
|
||||
Copyright (C) 1998, 1999 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jj@ultra.linux.cz> and
|
||||
Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz>.
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <asm/asi.h>
|
||||
#ifndef XCC
|
||||
#define XCC xcc
|
||||
#define USE_BPR
|
||||
#endif
|
||||
|
||||
/* Normally, this uses
|
||||
((xword - 0x0101010101010101) & 0x8080808080808080) test
|
||||
to find out if any byte in xword could be zero. This is fast, but
|
||||
also gives false alarm for any byte in range 0x81-0xff. It does
|
||||
not matter for correctness, as if this test tells us there could
|
||||
be some zero byte, we check it byte by byte, but if bytes with
|
||||
high bits set are common in the strings, then this will give poor
|
||||
performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
|
||||
will use one tick slower, but more precise test
|
||||
((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
|
||||
which does not give any false alarms (but if some bits are set,
|
||||
one cannot assume from it which bytes are zero and which are not).
|
||||
It is yet to be measured, what is the correct default for glibc
|
||||
in these days for an average user.
|
||||
*/
|
||||
|
||||
.text
|
||||
.align 32
|
||||
ENTRY(strcat)
|
||||
sethi %hi(0x01010101), %g1 /* IEU0 Group */
|
||||
ldub [%o0], %o3 /* Load */
|
||||
or %g1, %lo(0x01010101), %g1 /* IEU0 Group */
|
||||
mov %o0, %g7 /* IEU1 */
|
||||
|
||||
sllx %g1, 32, %g2 /* IEU0 Group */
|
||||
andcc %o0, 7, %g0 /* IEU1 */
|
||||
or %g1, %g2, %g1 /* IEU0 Group */
|
||||
bne,pn %icc, 32f /* CTI */
|
||||
|
||||
sllx %g1, 7, %g2 /* IEU0 Group */
|
||||
brz,pn %o3, 30f /* CTI+IEU1 */
|
||||
ldx [%o0], %o3 /* Load */
|
||||
48: add %o0, 8, %o0 /* IEU0 Group */
|
||||
|
||||
49: sub %o3, %g1, %o2 /* IEU0 Group */
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %o2, %o3, %g5 /* IEU0 Group */
|
||||
ldxa [%o0] ASI_PNF, %o3 /* Load */
|
||||
andcc %g5, %g2, %g0 /* IEU1 Group */
|
||||
#else
|
||||
ldxa [%o0] ASI_PNF, %o3 /* Load */
|
||||
andcc %o2, %g2, %g0 /* IEU1 Group */
|
||||
#endif
|
||||
be,pt %xcc, 49b /* CTI */
|
||||
|
||||
add %o0, 8, %o0 /* IEU0 */
|
||||
addcc %o2, %g1, %g3 /* IEU1 Group */
|
||||
srlx %o2, 32, %o2 /* IEU0 */
|
||||
50: andcc %o2, %g2, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %xcc, 51f /* CTI */
|
||||
srlx %g3, 56, %o2 /* IEU0 */
|
||||
andcc %o2, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 29f /* CTI */
|
||||
|
||||
srlx %g3, 48, %o2 /* IEU0 */
|
||||
andcc %o2, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 28f /* CTI */
|
||||
srlx %g3, 40, %o2 /* IEU0 */
|
||||
|
||||
andcc %o2, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 27f /* CTI */
|
||||
srlx %g3, 32, %o2 /* IEU0 */
|
||||
andcc %o2, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 26f /* CTI */
|
||||
51: srlx %g3, 24, %o2 /* IEU0 */
|
||||
andcc %o2, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 25f /* CTI */
|
||||
|
||||
srlx %g3, 16, %o2 /* IEU0 */
|
||||
andcc %o2, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 24f /* CTI */
|
||||
srlx %g3, 8, %o2 /* IEU0 */
|
||||
|
||||
andcc %o2, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 23f /* CTI */
|
||||
sub %o3, %g1, %o2 /* IEU0 */
|
||||
andcc %g3, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 52f /* CTI */
|
||||
ldxa [%o0] ASI_PNF, %o3 /* Load */
|
||||
andcc %o2, %g2, %g0 /* IEU1 Group */
|
||||
be,pt %xcc, 49b /* CTI */
|
||||
|
||||
add %o0, 8, %o0 /* IEU0 */
|
||||
addcc %o2, %g1, %g3 /* IEU1 Group */
|
||||
ba,pt %xcc, 50b /* CTI */
|
||||
srlx %o2, 32, %o2 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
52: ba,pt %xcc, 12f /* CTI Group */
|
||||
add %o0, -9, %o0 /* IEU0 */
|
||||
23: ba,pt %xcc, 12f /* CTI Group */
|
||||
add %o0, -10, %o0 /* IEU0 */
|
||||
|
||||
24: ba,pt %xcc, 12f /* CTI Group */
|
||||
add %o0, -11, %o0 /* IEU0 */
|
||||
25: ba,pt %xcc, 12f /* CTI Group */
|
||||
add %o0, -12, %o0 /* IEU0 */
|
||||
|
||||
26: ba,pt %xcc, 12f /* CTI Group */
|
||||
add %o0, -13, %o0 /* IEU0 */
|
||||
27: ba,pt %xcc, 12f /* CTI Group */
|
||||
add %o0, -14, %o0 /* IEU0 */
|
||||
|
||||
28: ba,pt %xcc, 12f /* CTI Group */
|
||||
add %o0, -15, %o0 /* IEU0 */
|
||||
29: add %o0, -16, %o0 /* IEU0 Group */
|
||||
30: andcc %o1, 7, %g3 /* IEU1 */
|
||||
|
||||
31: bne,pn %icc, 14f /* CTI */
|
||||
orcc %g0, 64, %g4 /* IEU1 Group */
|
||||
1: ldx [%o1], %o3 /* Load */
|
||||
add %o1, 8, %o1 /* IEU1 */
|
||||
|
||||
2: mov %o3, %g3 /* IEU0 Group */
|
||||
3: sub %o3, %g1, %o2 /* IEU1 */
|
||||
ldxa [%o1] ASI_PNF, %o3 /* Load */
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %o2, %g3, %o2 /* IEU0 Group */
|
||||
#endif
|
||||
add %o0, 8, %o0 /* IEU0 Group */
|
||||
|
||||
andcc %o2, %g2, %g0 /* IEU1 */
|
||||
add %o1, 8, %o1 /* IEU0 Group */
|
||||
be,a,pt %xcc, 2b /* CTI */
|
||||
stx %g3, [%o0 - 8] /* Store */
|
||||
|
||||
srlx %g3, 56, %g5 /* IEU0 Group */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 11f /* CTI */
|
||||
srlx %g3, 48, %g4 /* IEU0 */
|
||||
|
||||
andcc %g4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 10f /* CTI */
|
||||
srlx %g3, 40, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 9f /* CTI */
|
||||
srlx %g3, 32, %g4 /* IEU0 */
|
||||
andcc %g4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 8f /* CTI */
|
||||
|
||||
srlx %g3, 24, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 7f /* CTI */
|
||||
srlx %g3, 16, %g4 /* IEU0 */
|
||||
|
||||
andcc %g4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 6f /* CTI */
|
||||
srlx %g3, 8, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 5f /* CTI */
|
||||
sub %o3, %g1, %o2 /* IEU0 */
|
||||
stx %g3, [%o0 - 8] /* Store Group */
|
||||
andcc %g3, 0xff, %g0 /* IEU1 */
|
||||
|
||||
bne,pt %icc, 3b /* CTI */
|
||||
mov %o3, %g3 /* IEU0 Group */
|
||||
4: retl /* CTI+IEU1 Group */
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
5: stb %g5, [%o0 - 2] /* Store Group */
|
||||
srlx %g3, 16, %g4 /* IEU0 */
|
||||
6: sth %g4, [%o0 - 4] /* Store Group */
|
||||
srlx %g3, 32, %g4 /* IEU0 */
|
||||
|
||||
stw %g4, [%o0 - 8] /* Store Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
7: stb %g5, [%o0 - 4] /* Store Group */
|
||||
|
||||
srlx %g3, 32, %g4 /* IEU0 */
|
||||
8: stw %g4, [%o0 - 8] /* Store Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
|
||||
9: stb %g5, [%o0 - 6] /* Store Group */
|
||||
srlx %g3, 48, %g4 /* IEU0 */
|
||||
10: sth %g4, [%o0 - 8] /* Store Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
11: stb %g5, [%o0 - 8] /* Store Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
32: andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
be,a,pn %icc, 48b /* CTI */
|
||||
ldx [%o0], %o3 /* Load */
|
||||
add %o0, 1, %o0 /* IEU0 Group */
|
||||
|
||||
brnz,a,pt %o3, 32b /* CTI+IEU1 */
|
||||
lduba [%o0] ASI_PNF, %o3 /* Load */
|
||||
add %o0, -1, %o0 /* IEU0 Group */
|
||||
andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
|
||||
be,a,pn %icc, 31b /* CTI */
|
||||
andcc %o1, 7, %g3 /* IEU1 Group */
|
||||
12: ldub [%o1], %o3 /* Load */
|
||||
stb %o3, [%o0] /* Store Group */
|
||||
|
||||
13: add %o0, 1, %o0 /* IEU0 */
|
||||
add %o1, 1, %o1 /* IEU1 */
|
||||
andcc %o3, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4b /* CTI */
|
||||
|
||||
lduba [%o1] ASI_PNF, %o3 /* Load */
|
||||
andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
bne,a,pt %icc, 13b /* CTI */
|
||||
stb %o3, [%o0] /* Store */
|
||||
|
||||
andcc %o1, 7, %g3 /* IEU1 Group */
|
||||
be,a,pt %icc, 1b /* CTI */
|
||||
ldx [%o1], %o3 /* Load */
|
||||
orcc %g0, 64, %g4 /* IEU1 Group */
|
||||
|
||||
14: sllx %g3, 3, %g5 /* IEU0 */
|
||||
sub %o1, %g3, %o1 /* IEU0 Group */
|
||||
sub %g4, %g5, %g4 /* IEU1 */
|
||||
/* %g1 = 0101010101010101 *
|
||||
* %g2 = 8080808080808080 *
|
||||
* %g3 = source alignment *
|
||||
* %g5 = number of bits to shift left *
|
||||
* %g4 = number of bits to shift right */
|
||||
ldxa [%o1] ASI_PNF, %o5 /* Load Group */
|
||||
|
||||
addcc %o1, 8, %o1 /* IEU1 */
|
||||
15: sllx %o5, %g5, %o3 /* IEU0 Group */
|
||||
ldxa [%o1] ASI_PNF, %o5 /* Load */
|
||||
srlx %o5, %g4, %o4 /* IEU0 Group */
|
||||
|
||||
add %o0, 8, %o0 /* IEU1 */
|
||||
or %o3, %o4, %o3 /* IEU0 Group */
|
||||
add %o1, 8, %o1 /* IEU1 */
|
||||
sub %o3, %g1, %o4 /* IEU0 Group */
|
||||
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %o4, %o3, %o4 /* IEU0 Group */
|
||||
#endif
|
||||
andcc %o4, %g2, %g0 /* IEU1 Group */
|
||||
be,a,pt %xcc, 15b /* CTI */
|
||||
stx %o3, [%o0 - 8] /* Store */
|
||||
srlx %o3, 56, %o4 /* IEU0 Group */
|
||||
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 22f /* CTI */
|
||||
srlx %o3, 48, %o4 /* IEU0 */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 21f /* CTI */
|
||||
srlx %o3, 40, %o4 /* IEU0 */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 20f /* CTI */
|
||||
|
||||
srlx %o3, 32, %o4 /* IEU0 */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 19f /* CTI */
|
||||
srlx %o3, 24, %o4 /* IEU0 */
|
||||
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 18f /* CTI */
|
||||
srlx %o3, 16, %o4 /* IEU0 */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 17f /* CTI */
|
||||
srlx %o3, 8, %o4 /* IEU0 */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 16f /* CTI */
|
||||
|
||||
andcc %o3, 0xff, %g0 /* IEU1 Group */
|
||||
bne,pn %icc, 15b /* CTI */
|
||||
stx %o3, [%o0 - 8] /* Store */
|
||||
retl /* CTI+IEU1 Group */
|
||||
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
16: srlx %o3, 8, %o4 /* IEU0 Group */
|
||||
stb %o4, [%o0 - 2] /* Store */
|
||||
17: srlx %o3, 16, %o4 /* IEU0 Group */
|
||||
stb %o4, [%o0 - 3] /* Store */
|
||||
|
||||
18: srlx %o3, 24, %o4 /* IEU0 Group */
|
||||
stb %o4, [%o0 - 4] /* Store */
|
||||
19: srlx %o3, 32, %o4 /* IEU0 Group */
|
||||
stw %o4, [%o0 - 8] /* Store */
|
||||
|
||||
retl /* CTI+IEU1 Group */
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
nop
|
||||
nop
|
||||
|
||||
20: srlx %o3, 40, %o4 /* IEU0 Group */
|
||||
stb %o4, [%o0 - 6] /* Store */
|
||||
21: srlx %o3, 48, %o4 /* IEU0 Group */
|
||||
stb %o4, [%o0 - 7] /* Store */
|
||||
|
||||
22: srlx %o3, 56, %o4 /* IEU0 Group */
|
||||
stb %o4, [%o0 - 8] /* Store */
|
||||
retl /* CTI+IEU1 Group */
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
END(strcat)
|
479
sysdeps/sparc/sparc64/strchr.S
Normal file
479
sysdeps/sparc/sparc64/strchr.S
Normal file
@ -0,0 +1,479 @@
|
||||
/* strchr (str, ch) -- Return pointer to first occurrence of CH in STR.
|
||||
For SPARC v9.
|
||||
Copyright (C) 1998, 1999 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz> and
|
||||
Jakub Jelinek <jj@ultra.linux.cz>.
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <asm/asi.h>
|
||||
#ifndef XCC
|
||||
#define XCC xcc
|
||||
#define USE_BPR
|
||||
#endif
|
||||
|
||||
/* Normally, this uses
|
||||
((xword - 0x0101010101010101) & 0x8080808080808080) test
|
||||
to find out if any byte in xword could be zero. This is fast, but
|
||||
also gives false alarm for any byte in range 0x81-0xff. It does
|
||||
not matter for correctness, as if this test tells us there could
|
||||
be some zero byte, we check it byte by byte, but if bytes with
|
||||
high bits set are common in the strings, then this will give poor
|
||||
performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
|
||||
will use one tick slower, but more precise test
|
||||
((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
|
||||
which does not give any false alarms (but if some bits are set,
|
||||
one cannot assume from it which bytes are zero and which are not).
|
||||
It is yet to be measured, what is the correct default for glibc
|
||||
in these days for an average user.
|
||||
*/
|
||||
|
||||
.text
|
||||
.align 32
|
||||
ENTRY(strchr)
|
||||
#ifndef USE_BPR
|
||||
srl %o1, 0, %o1 /* IEU0 Group */
|
||||
#endif
|
||||
brz,pn %o1, 17f /* CTI+IEU1 Group */
|
||||
sllx %o1, 8, %g3 /* IEU0 */
|
||||
sethi %hi(0x01010101), %g1 /* IEU0 Group */
|
||||
or %g3, %o1, %g3 /* IEU1 */
|
||||
|
||||
ldub [%o0], %o3 /* Load */
|
||||
sllx %g3, 16, %g5 /* IEU0 Group */
|
||||
or %g1, %lo(0x01010101), %g1 /* IEU1 */
|
||||
sllx %g1, 32, %g2 /* IEU0 Group */
|
||||
|
||||
brz,pn %o3, 5f /* CTI+IEU1 */
|
||||
orcc %g3, %g5, %g3 /* IEU1 Group */
|
||||
sllx %g3, 32, %g5 /* IEU0 */
|
||||
cmp %o3, %o1 /* IEU1 Group */
|
||||
|
||||
be,pn %xcc, 14f /* CTI */
|
||||
or %g1, %g2, %g1 /* IEU0 */
|
||||
andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
bne,a,pn %icc, 15f /* CTI */
|
||||
|
||||
add %o0, 1, %o0 /* IEU0 */
|
||||
ldx [%o0], %o3 /* Load Group */
|
||||
1: sllx %g1, 7, %g2 /* IEU0 */
|
||||
or %g3, %g5, %g3 /* IEU1 */
|
||||
|
||||
add %o0, 8, %o0 /* IEU0 Group */
|
||||
xor %o3, %g3, %o4 /* IEU1 */
|
||||
/* %g1 = 0101010101010101 *
|
||||
* %g2 = 8080088080808080 *
|
||||
* %g3 = c c c c c c c c *
|
||||
* %o3 = value *
|
||||
* %o4 = value XOR c */
|
||||
2: sub %o3, %g1, %o2 /* IEU0 Group */
|
||||
sub %o4, %g1, %o5 /* IEU1 */
|
||||
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %o2, %o3, %g7 /* IEU0 Group */
|
||||
andn %o5, %o4, %o5 /* IEU1 */
|
||||
ldxa [%o0] ASI_PNF, %o3 /* Load */
|
||||
or %o5, %g7, %o5 /* IEU0 Group */
|
||||
#else
|
||||
ldxa [%o0] ASI_PNF, %o3 /* Load */
|
||||
or %o5, %o2, %o5 /* IEU0 Group */
|
||||
#endif
|
||||
add %o0, 8, %o0 /* IEU1 */
|
||||
andcc %o5, %g2, %g0 /* IEU1 Group */
|
||||
|
||||
be,a,pt %xcc, 2b /* CTI */
|
||||
xor %o3, %g3, %o4 /* IEU0 */
|
||||
srlx %o5, 32, %g5 /* IEU0 Group */
|
||||
add %o2, %g1, %o2 /* IEU1 */
|
||||
|
||||
3: andcc %g5, %g2, %g0 /* IEU1 Group */
|
||||
be,pn %xcc, 4f /* CTI */
|
||||
srlx %o2, 56, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 5f /* CTI */
|
||||
srlx %o4, 56, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 6f /* CTI */
|
||||
|
||||
srlx %o2, 48, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 5f /* CTI */
|
||||
srlx %o4, 48, %g5 /* IEU0 */
|
||||
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 7f /* CTI */
|
||||
srlx %o2, 40, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 5f /* CTI */
|
||||
srlx %o4, 40, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 8f /* CTI */
|
||||
|
||||
srlx %o2, 32, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 5f /* CTI */
|
||||
srlx %o4, 32, %g5 /* IEU0 */
|
||||
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 9f /* CTI */
|
||||
4: srlx %o2, 24, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 5f /* CTI */
|
||||
srlx %o4, 24, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 10f /* CTI */
|
||||
|
||||
srlx %o2, 16, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 5f /* CTI */
|
||||
srlx %o4, 16, %g5 /* IEU0 */
|
||||
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 11f /* CTI */
|
||||
srlx %o2, 8, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 5f /* CTI */
|
||||
srlx %o4, 8, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 12f /* CTI */
|
||||
|
||||
andcc %o2, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 5f /* CTI */
|
||||
sub %o3, %g1, %o2 /* IEU0 */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 13f /* CTI */
|
||||
xor %o3, %g3, %o4 /* IEU0 */
|
||||
ldxa [%o0] ASI_PNF, %o3 /* Load Group */
|
||||
sub %o4, %g1, %o5 /* IEU0 */
|
||||
|
||||
or %o5, %o2, %o5 /* IEU1 */
|
||||
add %o0, 8, %o0 /* IEU0 Group */
|
||||
andcc %o5, %g2, %g0 /* IEU1 */
|
||||
be,a,pt %xcc, 2b /* CTI */
|
||||
|
||||
xor %o3, %g3, %o4 /* IEU0 Group */
|
||||
srlx %o5, 32, %g5 /* IEU0 Group */
|
||||
ba,pt %xcc, 3b /* CTI */
|
||||
add %o2, %g1, %o2 /* IEU1 */
|
||||
|
||||
.align 16
|
||||
5: retl /* CTI+IEU1 Group */
|
||||
clr %o0 /* IEU0 */
|
||||
6: retl /* CTI+IEU1 Group */
|
||||
add %o0, -16, %o0 /* IEU0 */
|
||||
|
||||
7: retl /* CTI+IEU1 Group */
|
||||
add %o0, -15, %o0 /* IEU0 */
|
||||
8: retl /* CTI+IEU1 Group */
|
||||
add %o0, -14, %o0 /* IEU0 */
|
||||
|
||||
9: retl /* CTI+IEU1 Group */
|
||||
add %o0, -13, %o0 /* IEU0 */
|
||||
10: retl /* CTI+IEU1 Group */
|
||||
add %o0, -12, %o0 /* IEU0 */
|
||||
|
||||
11: retl /* CTI+IEU1 Group */
|
||||
add %o0, -11, %o0 /* IEU0 */
|
||||
12: retl /* CTI+IEU1 Group */
|
||||
add %o0, -10, %o0 /* IEU0 */
|
||||
|
||||
13: retl /* CTI+IEU1 Group */
|
||||
add %o0, -9, %o0 /* IEU0 */
|
||||
14: retl /* CTI+IEU1 Group */
|
||||
nop /* IEU0 */
|
||||
|
||||
.align 16
|
||||
15: ldub [%o0], %o3 /* Load Group */
|
||||
16: andcc %o0, 7, %g0 /* IEU1 */
|
||||
be,a,pn %icc, 1b /* CTI */
|
||||
ldx [%o0], %o3 /* Load Group */
|
||||
|
||||
andcc %o3, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 5b /* CTI */
|
||||
add %o0, 1, %o0 /* IEU0 */
|
||||
cmp %o3, %o1 /* IEU1 Group */
|
||||
|
||||
bne,a,pn %icc, 16b /* CTI */
|
||||
ldub [%o0], %o3 /* Load */
|
||||
retl /* CTI+IEU1 Group */
|
||||
add %o0, -1, %o0 /* IEU0 */
|
||||
|
||||
/* strchr (str, 0) */
|
||||
.align 32
|
||||
nop
|
||||
.align 16
|
||||
17: sethi %hi(0x01010101), %g1 /* IEU0 Group */
|
||||
ldub [%o0], %o3 /* Load */
|
||||
or %g1, %lo(0x01010101), %g1 /* IEU0 Group */
|
||||
sllx %g1, 32, %g2 /* IEU0 Group */
|
||||
|
||||
andcc %o0, 7, %g0 /* IEU1 */
|
||||
or %g1, %g2, %g1 /* IEU0 Group */
|
||||
bne,pn %icc, 32f /* CTI */
|
||||
sllx %g1, 7, %g2 /* IEU0 Group */
|
||||
|
||||
brz,pn %o3, 30f /* CTI+IEU1 */
|
||||
ldx [%o0], %o3 /* Load */
|
||||
18: add %o0, 8, %o0 /* IEU0 Group */
|
||||
19: sub %o3, %g1, %o2 /* IEU0 Group */
|
||||
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %o2, %o3, %g7 /* IEU0 Group */
|
||||
ldxa [%o0] ASI_PNF, %o3 /* Load */
|
||||
andcc %g7, %g2, %g0 /* IEU1 Group */
|
||||
#else
|
||||
ldxa [%o0] ASI_PNF, %o3 /* Load */
|
||||
andcc %o2, %g2, %g0 /* IEU1 Group */
|
||||
#endif
|
||||
be,pt %xcc, 19b /* CTI */
|
||||
add %o0, 8, %o0 /* IEU0 */
|
||||
|
||||
addcc %o2, %g1, %g3 /* IEU1 Group */
|
||||
srlx %o2, 32, %o2 /* IEU0 */
|
||||
20: andcc %o2, %g2, %g0 /* IEU1 Group */
|
||||
be,pn %xcc, 21f /* CTI */
|
||||
|
||||
srlx %g3, 56, %o2 /* IEU0 */
|
||||
andcc %o2, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 29f /* CTI */
|
||||
srlx %g3, 48, %o2 /* IEU0 */
|
||||
|
||||
andcc %o2, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 28f /* CTI */
|
||||
srlx %g3, 40, %o2 /* IEU0 */
|
||||
andcc %o2, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 27f /* CTI */
|
||||
srlx %g3, 32, %o2 /* IEU0 */
|
||||
andcc %o2, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 26f /* CTI */
|
||||
|
||||
21: srlx %g3, 24, %o2 /* IEU0 */
|
||||
andcc %o2, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 25f /* CTI */
|
||||
srlx %g3, 16, %o2 /* IEU0 */
|
||||
|
||||
andcc %o2, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 24f /* CTI */
|
||||
srlx %g3, 8, %o2 /* IEU0 */
|
||||
andcc %o2, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 23f /* CTI */
|
||||
sub %o3, %g1, %o2 /* IEU0 */
|
||||
andcc %g3, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 22f /* CTI */
|
||||
|
||||
ldxa [%o0] ASI_PNF, %o3 /* Load */
|
||||
andcc %o2, %g2, %g0 /* IEU1 Group */
|
||||
be,pt %xcc, 19b /* CTI */
|
||||
add %o0, 8, %o0 /* IEU0 */
|
||||
|
||||
addcc %o2, %g1, %g3 /* IEU1 Group */
|
||||
ba,pt %xcc, 20b /* CTI */
|
||||
srlx %o2, 32, %o2 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
22: retl /* CTI+IEU1 Group */
|
||||
add %o0, -9, %o0 /* IEU0 */
|
||||
23: retl /* CTI+IEU1 Group */
|
||||
add %o0, -10, %o0 /* IEU0 */
|
||||
|
||||
24: retl /* CTI+IEU1 Group */
|
||||
add %o0, -11, %o0 /* IEU0 */
|
||||
25: retl /* CTI+IEU1 Group */
|
||||
add %o0, -12, %o0 /* IEU0 */
|
||||
|
||||
26: retl /* CTI+IEU1 Group */
|
||||
add %o0, -13, %o0 /* IEU0 */
|
||||
27: retl /* CTI+IEU1 Group */
|
||||
add %o0, -14, %o0 /* IEU0 */
|
||||
|
||||
28: retl /* CTI+IEU1 Group */
|
||||
add %o0, -15, %o0 /* IEU0 */
|
||||
29: retl /* CTI+IEU1 Group */
|
||||
add %o0, -16, %o0 /* IEU0 */
|
||||
|
||||
30: retl /* CTI+IEU1 Group */
|
||||
nop /* IEU0 */
|
||||
|
||||
.align 16
|
||||
32: andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
be,a,pn %icc, 18b /* CTI */
|
||||
ldx [%o0], %o3 /* Load */
|
||||
add %o0, 1, %o0 /* IEU0 Group */
|
||||
|
||||
brnz,a,pt %o3, 32b /* CTI+IEU1 */
|
||||
lduba [%o0] ASI_PNF, %o3 /* Load */
|
||||
retl /* CTI+IEU1 Group */
|
||||
add %o0, -1, %o0 /* IEU0 */
|
||||
END(strchr)
|
||||
|
||||
.align 32
|
||||
ENTRY(strrchr)
|
||||
#ifndef USE_BPR
|
||||
srl %o1, 0, %o1 /* IEU0 Group */
|
||||
#endif
|
||||
brz,pn %o1, 17b /* CTI+IEU1 Group */
|
||||
clr %g4 /* IEU0 */
|
||||
andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
bne,pn %icc, 13f /* CTI */
|
||||
|
||||
sllx %o1, 8, %g3 /* IEU0 */
|
||||
ldx [%o0], %o3 /* Load Group */
|
||||
1: sethi %hi(0x01010101), %g1 /* IEU0 */
|
||||
or %g3, %o1, %g3 /* IEU1 */
|
||||
|
||||
sllx %g3, 16, %g5 /* IEU0 Group */
|
||||
or %g1, %lo(0x01010101), %g1 /* IEU1 */
|
||||
sllx %g1, 32, %g2 /* IEU0 Group */
|
||||
or %g3, %g5, %g3 /* IEU1 */
|
||||
|
||||
sllx %g3, 32, %g5 /* IEU0 Group */
|
||||
or %g1, %g2, %g1 /* IEU1 */
|
||||
sllx %g1, 7, %g2 /* IEU0 Group */
|
||||
or %g3, %g5, %g3 /* IEU1 */
|
||||
|
||||
add %o0, 8, %o0 /* IEU0 Group */
|
||||
xor %o3, %g3, %o4 /* IEU1 */
|
||||
/* %g1 = 0101010101010101 *
|
||||
* %g2 = 8080088080808080 *
|
||||
* %g3 = c c c c c c c c *
|
||||
* %o3 = value *
|
||||
* %o4 = value XOR c */
|
||||
2: sub %o3, %g1, %o2 /* IEU0 Group */
|
||||
3: sub %o4, %g1, %o5 /* IEU1 */
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %o2, %o3, %g7 /* IEU0 Group */
|
||||
andn %o5, %o4, %o5 /* IEU1 */
|
||||
ldxa [%o0] ASI_PNF, %o3 /* Load */
|
||||
or %o5, %g7, %o5 /* IEU0 Group */
|
||||
#else
|
||||
ldxa [%o0] ASI_PNF, %o3 /* Load */
|
||||
or %o5, %o2, %o5 /* IEU0 Group */
|
||||
#endif
|
||||
|
||||
add %o0, 8, %o0 /* IEU1 */
|
||||
andcc %o5, %g2, %g0 /* IEU1 Group */
|
||||
be,a,pt %xcc, 2b /* CTI */
|
||||
xor %o3, %g3, %o4 /* IEU0 */
|
||||
|
||||
srlx %o5, 32, %g5 /* IEU0 Group */
|
||||
add %o2, %g1, %o2 /* IEU1 */
|
||||
andcc %g5, %g2, %g0 /* IEU1 Group */
|
||||
be,pn %xcc, 7f /* CTI */
|
||||
|
||||
srlx %o2, 56, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 12f /* CTI */
|
||||
srlx %o4, 56, %g5 /* IEU0 */
|
||||
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
srlx %o2, 48, %g5 /* IEU0 */
|
||||
be,a,pn %icc, 4f /* CTI */
|
||||
add %o0, -16, %g4 /* IEU0 Group */
|
||||
|
||||
4: andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 12f /* CTI */
|
||||
srlx %o4, 48, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
srlx %o2, 40, %g5 /* IEU0 */
|
||||
be,a,pn %icc, 5f /* CTI */
|
||||
add %o0, -15, %g4 /* IEU0 Group */
|
||||
5: andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 12f /* CTI */
|
||||
srlx %o4, 40, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
srlx %o2, 32, %g5 /* IEU0 */
|
||||
|
||||
be,a,pn %icc, 6f /* CTI */
|
||||
add %o0, -14, %g4 /* IEU0 Group */
|
||||
6: andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 12f /* CTI */
|
||||
|
||||
srlx %o4, 32, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,a,pn %icc, 7f /* CTI */
|
||||
add %o0, -13, %g4 /* IEU0 */
|
||||
|
||||
7: srlx %o2, 24, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 12f /* CTI */
|
||||
srlx %o4, 24, %g5 /* IEU0 */
|
||||
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
srlx %o2, 16, %g5 /* IEU0 */
|
||||
be,a,pn %icc, 8f /* CTI */
|
||||
add %o0, -12, %g4 /* IEU0 Group */
|
||||
|
||||
8: andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 12f /* CTI */
|
||||
srlx %o4, 16, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
srlx %o2, 8, %g5 /* IEU0 */
|
||||
be,a,pn %icc, 9f /* CTI */
|
||||
add %o0, -11, %g4 /* IEU0 Group */
|
||||
9: andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 12f /* CTI */
|
||||
srlx %o4, 8, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,a,pn %icc, 10f /* CTI */
|
||||
|
||||
add %o0, -10, %g4 /* IEU0 */
|
||||
10: andcc %o2, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 12f /* CTI */
|
||||
sub %o3, %g1, %o2 /* IEU0 */
|
||||
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,a,pn %icc, 11f /* CTI */
|
||||
add %o0, -9, %g4 /* IEU0 */
|
||||
11: ba,pt %xcc, 3b /* CTI Group */
|
||||
|
||||
xor %o3, %g3, %o4 /* IEU0 Group */
|
||||
12: retl /* CTI+IEU1 Group */
|
||||
mov %g4, %o0 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
13: ldub [%o0], %o3 /* Load Group */
|
||||
add %o0, 1, %o0 /* IEU0 */
|
||||
14: andcc %o3, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 12b /* CTI */
|
||||
|
||||
cmp %o3, %o1 /* IEU1 Group */
|
||||
ldub [%o0], %o3 /* Load */
|
||||
be,a,pn %icc, 15f /* CTI */
|
||||
add %o0, -1, %g4 /* IEU0 Group */
|
||||
|
||||
15: andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
bne,a,pt %icc, 14b /* CTI */
|
||||
add %o0, 1, %o0 /* IEU0 */
|
||||
ba,pt %xcc, 1b /* CTI Group */
|
||||
|
||||
ldx [%o0], %o3 /* Load */
|
||||
END(strrchr)
|
||||
|
||||
weak_alias (strchr, index)
|
||||
weak_alias (strrchr, rindex)
|
274
sysdeps/sparc/sparc64/strcmp.S
Normal file
274
sysdeps/sparc/sparc64/strcmp.S
Normal file
@ -0,0 +1,274 @@
|
||||
/* Compare two strings for differences.
|
||||
For SPARC v9.
|
||||
Copyright (C) 1997, 1999 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz> and
|
||||
Jakub Jelinek <jj@ultra.linux.cz>.
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <asm/asi.h>
|
||||
|
||||
/* Normally, this uses
|
||||
((xword - 0x0101010101010101) & 0x8080808080808080) test
|
||||
to find out if any byte in xword could be zero. This is fast, but
|
||||
also gives false alarm for any byte in range 0x81-0xff. It does
|
||||
not matter for correctness, as if this test tells us there could
|
||||
be some zero byte, we check it byte by byte, but if bytes with
|
||||
high bits set are common in the strings, then this will give poor
|
||||
performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
|
||||
will use one tick slower, but more precise test
|
||||
((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
|
||||
which does not give any false alarms (but if some bits are set,
|
||||
one cannot assume from it which bytes are zero and which are not).
|
||||
It is yet to be measured, what is the correct default for glibc
|
||||
in these days for an average user.
|
||||
*/
|
||||
|
||||
.text
|
||||
.align 32
|
||||
ENTRY(strcmp)
|
||||
sethi %hi(0x01010101), %g1 /* IEU0 Group */
|
||||
andcc %o0, 7, %g0 /* IEU1 */
|
||||
bne,pn %icc, 7f /* CTI */
|
||||
or %g1, %lo(0x01010101), %g1 /* IEU0 Group */
|
||||
|
||||
andcc %o1, 7, %g3 /* IEU1 */
|
||||
bne,pn %icc, 9f /* CTI */
|
||||
sllx %g1, 32, %g2 /* IEU0 Group */
|
||||
ldx [%o0], %o2 /* Load */
|
||||
|
||||
or %g1, %g2, %g1 /* IEU0 Group */
|
||||
1: ldx [%o1], %o3 /* Load */
|
||||
sub %o1, %o0, %o1 /* IEU1 */
|
||||
sllx %g1, 7, %g2 /* IEU0 Group */
|
||||
|
||||
2: add %o0, 8, %o0 /* IEU1 */
|
||||
sub %o2, %g1, %g3 /* IEU0 Group */
|
||||
subcc %o2, %o3, %g0 /* IEU1 */
|
||||
bne,pn %xcc, 13f /* CTI */
|
||||
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %g3, %o2, %g4 /* IEU0 Group */
|
||||
ldxa [%o0] ASI_PNF, %o2 /* Load */
|
||||
andcc %g4, %g2, %g0 /* IEU1 Group */
|
||||
#else
|
||||
ldxa [%o0] ASI_PNF, %o2 /* Load Group */
|
||||
andcc %g3, %g2, %g0 /* IEU1 */
|
||||
#endif
|
||||
be,a,pt %xcc, 2b /* CTI */
|
||||
ldxa [%o1 + %o0] ASI_PNF, %o3 /* Load Group */
|
||||
|
||||
addcc %g3, %g1, %o4 /* IEU1 */
|
||||
srlx %g3, 32, %g3 /* IEU0 */
|
||||
andcc %g3, %g2, %g0 /* IEU1 Group */
|
||||
be,pt %xcc, 3f /* CTI */
|
||||
|
||||
srlx %o4, 56, %o5 /* IEU0 */
|
||||
andcc %o5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4f /* CTI */
|
||||
srlx %o4, 48, %o5 /* IEU0 */
|
||||
|
||||
andcc %o5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4f /* CTI */
|
||||
srlx %o4, 40, %o5 /* IEU0 */
|
||||
andcc %o5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 4f /* CTI */
|
||||
srlx %o4, 32, %o5 /* IEU0 */
|
||||
andcc %o5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4f /* CTI */
|
||||
|
||||
3: srlx %o4, 24, %o5 /* IEU0 */
|
||||
andcc %o5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4f /* CTI */
|
||||
srlx %o4, 16, %o5 /* IEU0 */
|
||||
|
||||
andcc %o5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4f /* CTI */
|
||||
srlx %o4, 8, %o5 /* IEU0 */
|
||||
andcc %o5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 4f /* CTI */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
bne,a,pn %icc, 2b /* CTI */
|
||||
ldxa [%o1 + %o0] ASI_PNF, %o3 /* Load */
|
||||
|
||||
4: retl /* CTI+IEU1 Group */
|
||||
clr %o0 /* IEU0 */
|
||||
|
||||
.align 32
|
||||
13: mov 0xff, %g7 /* IEU0 Group */
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andcc %g4, %g2, %g0 /* IEU1 */
|
||||
#else
|
||||
andcc %g3, %g2, %g0 /* IEU1 */
|
||||
#endif
|
||||
be,pt %xcc, 25f /* CTI */
|
||||
addcc %g3, %g1, %o4 /* IEU1 Group */
|
||||
|
||||
srlx %g3, 32, %g3 /* IEU0 */
|
||||
andcc %g3, %g2, %g0 /* IEU1 Group */
|
||||
be,pt %xcc, 23f /* CTI */
|
||||
sllx %g7, 56, %o5 /* IEU0 */
|
||||
|
||||
andcc %o4, %o5, %g0 /* IEU1 Group */
|
||||
be,pn %xcc, 24f /* CTI */
|
||||
sllx %g7, 48, %o5 /* IEU0 */
|
||||
andcc %o4, %o5, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %xcc, 24f /* CTI */
|
||||
sllx %g7, 40, %o5 /* IEU0 */
|
||||
andcc %o4, %o5, %g0 /* IEU1 Group */
|
||||
be,pn %xcc, 24f /* CTI */
|
||||
|
||||
sllx %g7, 32, %o5 /* IEU0 */
|
||||
andcc %o4, %o5, %g0 /* IEU1 Group */
|
||||
be,pn %xcc, 24f /* CTI */
|
||||
23: sllx %g7, 24, %o5 /* IEU0 */
|
||||
|
||||
andcc %o4, %o5, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 24f /* CTI */
|
||||
sllx %g7, 16, %o5 /* IEU0 */
|
||||
andcc %o4, %o5, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 24f /* CTI */
|
||||
sllx %g7, 8, %o5 /* IEU0 */
|
||||
andcc %o4, %o5, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 24f /* CTI */
|
||||
|
||||
mov %g7, %o5 /* IEU0 */
|
||||
25: cmp %o4, %o3 /* IEU1 Group */
|
||||
5: mov -1, %o0 /* IEU0 */
|
||||
retl /* CTI+IEU1 Group */
|
||||
|
||||
movgu %xcc, 1, %o0 /* Single Group */
|
||||
|
||||
.align 16
|
||||
24: sub %o5, 1, %g7 /* IEU0 Group */
|
||||
clr %o0 /* IEU1 */
|
||||
or %o5, %g7, %o5 /* IEU0 Group */
|
||||
andn %o4, %o5, %o4 /* IEU0 Group */
|
||||
|
||||
andn %o3, %o5, %o3 /* IEU1 */
|
||||
cmp %o4, %o3 /* IEU1 Group */
|
||||
movgu %xcc, 1, %o0 /* Single Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
|
||||
movlu %xcc, -1, %o0 /* Single Group */
|
||||
6: retl /* CTI+IEU1 Group */
|
||||
mov %o4, %o0 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
7: ldub [%o0], %o2 /* Load */
|
||||
add %o0, 1, %o0 /* IEU1 */
|
||||
ldub [%o1], %o3 /* Load Group */
|
||||
sllx %g1, 32, %g2 /* IEU0 */
|
||||
|
||||
8: add %o1, 1, %o1 /* IEU1 */
|
||||
subcc %o2, %o3, %o4 /* IEU1 Group */
|
||||
bne,pn %xcc, 6b /* CTI */
|
||||
lduba [%o0] ASI_PNF, %o2 /* Load */
|
||||
|
||||
brz,pn %o3, 4b /* CTI+IEU1 Group */
|
||||
lduba [%o1] ASI_PNF, %o3 /* Load */
|
||||
andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
bne,a,pn %icc, 8b /* CTI */
|
||||
|
||||
add %o0, 1, %o0 /* IEU0 */
|
||||
or %g1, %g2, %g1 /* IEU0 Group */
|
||||
andcc %o1, 7, %g3 /* IEU1 */
|
||||
be,a,pn %icc, 1b /* CTI */
|
||||
|
||||
ldxa [%o0] ASI_PNF, %o2 /* Load Group */
|
||||
9: sllx %g3, 3, %g5 /* IEU0 */
|
||||
mov 64, %o5 /* IEU1 */
|
||||
sub %o1, %g3, %o1 /* IEU0 Group */
|
||||
|
||||
sub %o5, %g5, %o5 /* IEU1 */
|
||||
ldxa [%o1] ASI_PNF, %g7 /* Load Group */
|
||||
or %g1, %g2, %g1 /* IEU0 */
|
||||
sub %o1, %o0, %o1 /* IEU1 */
|
||||
|
||||
sllx %g1, 7, %g2 /* IEU0 Group */
|
||||
add %o1, 8, %o1 /* IEU1 */
|
||||
/* %g1 = 0101010101010101
|
||||
* %g2 = 8080808080800880
|
||||
* %g5 = number of bits to shift left
|
||||
* %o5 = number of bits to shift right */
|
||||
10: sllx %g7, %g5, %o3 /* IEU0 Group */
|
||||
ldxa [%o1 + %o0] ASI_PNF, %g7 /* Load */
|
||||
|
||||
11: srlx %g7, %o5, %o4 /* IEU0 Group */
|
||||
ldxa [%o0] ASI_PNF, %o2 /* Load */
|
||||
or %o3, %o4, %o3 /* IEU1 */
|
||||
add %o0, 8, %o0 /* IEU0 Group */
|
||||
|
||||
subcc %o2, %o3, %g0 /* IEU1 */
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
sub %o2, %g1, %g3 /* IEU0 Group */
|
||||
bne,pn %xcc, 13b /* CTI */
|
||||
andn %g3, %o2, %g4 /* IEU0 Group */
|
||||
|
||||
andcc %g4, %g2, %g0 /* IEU1 Group */
|
||||
be,pt %xcc, 10b /* CTI */
|
||||
srlx %g4, 32, %g4 /* IEU0 */
|
||||
andcc %g4, %g2, %g0 /* IEU1 Group */
|
||||
#else
|
||||
bne,pn %xcc, 13b /* CTI */
|
||||
sub %o2, %g1, %g3 /* IEU0 Group */
|
||||
andcc %g3, %g2, %g0 /* IEU1 Group */
|
||||
|
||||
be,pt %xcc, 10b /* CTI */
|
||||
srlx %g3, 32, %g3 /* IEU0 */
|
||||
andcc %g3, %g2, %g0 /* IEU1 Group */
|
||||
#endif
|
||||
be,pt %xcc, 12f /* CTI */
|
||||
|
||||
srlx %o2, 56, %g3 /* IEU0 */
|
||||
andcc %g3, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4b /* CTI */
|
||||
srlx %o2, 48, %g3 /* IEU0 */
|
||||
|
||||
andcc %g3, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4b /* CTI */
|
||||
srlx %o2, 40, %g3 /* IEU0 */
|
||||
andcc %g3, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 4b /* CTI */
|
||||
srlx %o2, 32, %g3 /* IEU0 */
|
||||
andcc %g3, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4b /* CTI */
|
||||
|
||||
12: srlx %o2, 24, %g3 /* IEU0 */
|
||||
andcc %g3, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4b /* CTI */
|
||||
srlx %o2, 16, %g3 /* IEU0 */
|
||||
|
||||
andcc %g3, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4b /* CTI */
|
||||
srlx %o2, 8, %g3 /* IEU0 */
|
||||
andcc %g3, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 4b /* CTI */
|
||||
andcc %o2, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4b /* CTI */
|
||||
sllx %g7, %g5, %o3 /* IEU0 */
|
||||
|
||||
ba,pt %xcc, 11b /* CTI Group */
|
||||
ldxa [%o1 + %o0] ASI_PNF, %g7 /* Load */
|
||||
END(strcmp)
|
239
sysdeps/sparc/sparc64/strcpy.S
Normal file
239
sysdeps/sparc/sparc64/strcpy.S
Normal file
@ -0,0 +1,239 @@
|
||||
/* Copy SRC to DEST returning DEST.
|
||||
For SPARC v9.
|
||||
Copyright (C) 1998, 1999 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz> and
|
||||
Jakub Jelinek <jj@ultra.linux.cz>.
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <asm/asi.h>
|
||||
|
||||
/* Normally, this uses
|
||||
((xword - 0x0101010101010101) & 0x8080808080808080) test
|
||||
to find out if any byte in xword could be zero. This is fast, but
|
||||
also gives false alarm for any byte in range 0x81-0xff. It does
|
||||
not matter for correctness, as if this test tells us there could
|
||||
be some zero byte, we check it byte by byte, but if bytes with
|
||||
high bits set are common in the strings, then this will give poor
|
||||
performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
|
||||
will use one tick slower, but more precise test
|
||||
((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
|
||||
which does not give any false alarms (but if some bits are set,
|
||||
one cannot assume from it which bytes are zero and which are not).
|
||||
It is yet to be measured, what is the correct default for glibc
|
||||
in these days for an average user.
|
||||
*/
|
||||
|
||||
.text
|
||||
.align 32
|
||||
ENTRY(strcpy)
|
||||
sethi %hi(0x01010101), %g1 /* IEU0 Group */
|
||||
mov %o0, %g7 /* IEU1 */
|
||||
or %g1, %lo(0x01010101), %g1 /* IEU0 Group */
|
||||
andcc %o0, 7, %g0 /* IEU1 */
|
||||
|
||||
sllx %g1, 32, %g2 /* IEU0 Group */
|
||||
bne,pn %icc, 12f /* CTI */
|
||||
andcc %o1, 7, %g3 /* IEU1 */
|
||||
or %g1, %g2, %g1 /* IEU0 Group */
|
||||
|
||||
bne,pn %icc, 14f /* CTI */
|
||||
sllx %g1, 7, %g2 /* IEU0 Group */
|
||||
1: ldx [%o1], %o3 /* Load */
|
||||
add %o1, 8, %o1 /* IEU1 */
|
||||
|
||||
2: mov %o3, %g3 /* IEU0 Group */
|
||||
3: sub %o3, %g1, %o2 /* IEU1 */
|
||||
ldxa [%o1] ASI_PNF, %o3 /* Load */
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %o2, %g3, %o2 /* IEU0 Group */
|
||||
#endif
|
||||
add %o0, 8, %o0 /* IEU0 Group */
|
||||
|
||||
andcc %o2, %g2, %g0 /* IEU1 */
|
||||
add %o1, 8, %o1 /* IEU0 Group */
|
||||
be,a,pt %xcc, 2b /* CTI */
|
||||
stx %g3, [%o0 - 8] /* Store */
|
||||
|
||||
srlx %g3, 56, %g5 /* IEU0 Group */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 11f /* CTI */
|
||||
srlx %g3, 48, %g4 /* IEU0 */
|
||||
|
||||
andcc %g4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 10f /* CTI */
|
||||
srlx %g3, 40, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 9f /* CTI */
|
||||
srlx %g3, 32, %g4 /* IEU0 */
|
||||
andcc %g4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 8f /* CTI */
|
||||
|
||||
srlx %g3, 24, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 7f /* CTI */
|
||||
srlx %g3, 16, %g4 /* IEU0 */
|
||||
|
||||
andcc %g4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 6f /* CTI */
|
||||
srlx %g3, 8, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 5f /* CTI */
|
||||
sub %o3, %g1, %o2 /* IEU0 */
|
||||
stx %g3, [%o0 - 8] /* Store Group */
|
||||
andcc %g3, 0xff, %g0 /* IEU1 */
|
||||
|
||||
bne,pt %icc, 3b /* CTI */
|
||||
mov %o3, %g3 /* IEU0 Group */
|
||||
4: retl /* CTI+IEU1 Group */
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
5: stb %g5, [%o0 - 2] /* Store Group */
|
||||
srlx %g3, 16, %g4 /* IEU0 */
|
||||
6: sth %g4, [%o0 - 4] /* Store Group */
|
||||
srlx %g3, 32, %g4 /* IEU0 */
|
||||
|
||||
stw %g4, [%o0 - 8] /* Store Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
7: stb %g5, [%o0 - 4] /* Store Group */
|
||||
|
||||
srlx %g3, 32, %g4 /* IEU0 */
|
||||
8: stw %g4, [%o0 - 8] /* Store Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
|
||||
9: stb %g5, [%o0 - 6] /* Store Group */
|
||||
srlx %g3, 48, %g4 /* IEU0 */
|
||||
10: sth %g4, [%o0 - 8] /* Store Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
11: stb %g5, [%o0 - 8] /* Store Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
|
||||
12: or %g1, %g2, %g1 /* IEU0 Group */
|
||||
ldub [%o1], %o3 /* Load */
|
||||
sllx %g1, 7, %g2 /* IEU0 Group */
|
||||
stb %o3, [%o0] /* Store Group */
|
||||
|
||||
13: add %o0, 1, %o0 /* IEU0 */
|
||||
add %o1, 1, %o1 /* IEU1 */
|
||||
andcc %o3, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4b /* CTI */
|
||||
|
||||
lduba [%o1] ASI_PNF, %o3 /* Load */
|
||||
andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
bne,a,pt %icc, 13b /* CTI */
|
||||
stb %o3, [%o0] /* Store */
|
||||
|
||||
andcc %o1, 7, %g3 /* IEU1 Group */
|
||||
be,a,pt %icc, 1b /* CTI */
|
||||
ldx [%o1], %o3 /* Load */
|
||||
14: orcc %g0, 64, %g4 /* IEU1 Group */
|
||||
|
||||
sllx %g3, 3, %g5 /* IEU0 */
|
||||
sub %o1, %g3, %o1 /* IEU0 Group */
|
||||
sub %g4, %g5, %g4 /* IEU1 */
|
||||
/* %g1 = 0101010101010101 *
|
||||
* %g2 = 8080808080808080 *
|
||||
* %g3 = source alignment *
|
||||
* %g5 = number of bits to shift left *
|
||||
* %g4 = number of bits to shift right */
|
||||
ldxa [%o1] ASI_PNF, %o5 /* Load Group */
|
||||
|
||||
addcc %o1, 8, %o1 /* IEU1 */
|
||||
15: sllx %o5, %g5, %o3 /* IEU0 Group */
|
||||
ldxa [%o1] ASI_PNF, %o5 /* Load */
|
||||
srlx %o5, %g4, %o4 /* IEU0 Group */
|
||||
|
||||
add %o0, 8, %o0 /* IEU1 */
|
||||
or %o3, %o4, %o3 /* IEU0 Group */
|
||||
add %o1, 8, %o1 /* IEU1 */
|
||||
sub %o3, %g1, %o4 /* IEU0 Group */
|
||||
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %o4, %o3, %o4 /* IEU0 Group */
|
||||
#endif
|
||||
andcc %o4, %g2, %g0 /* IEU1 Group */
|
||||
be,a,pt %xcc, 15b /* CTI */
|
||||
stx %o3, [%o0 - 8] /* Store */
|
||||
srlx %o3, 56, %o4 /* IEU0 Group */
|
||||
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 22f /* CTI */
|
||||
srlx %o3, 48, %o4 /* IEU0 */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 21f /* CTI */
|
||||
srlx %o3, 40, %o4 /* IEU0 */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 20f /* CTI */
|
||||
|
||||
srlx %o3, 32, %o4 /* IEU0 */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 19f /* CTI */
|
||||
srlx %o3, 24, %o4 /* IEU0 */
|
||||
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 18f /* CTI */
|
||||
srlx %o3, 16, %o4 /* IEU0 */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 17f /* CTI */
|
||||
srlx %o3, 8, %o4 /* IEU0 */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 16f /* CTI */
|
||||
|
||||
andcc %o3, 0xff, %g0 /* IEU1 Group */
|
||||
bne,pn %icc, 15b /* CTI */
|
||||
stx %o3, [%o0 - 8] /* Store */
|
||||
retl /* CTI+IEU1 Group */
|
||||
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
16: srlx %o3, 8, %o4 /* IEU0 Group */
|
||||
stb %o4, [%o0 - 2] /* Store */
|
||||
17: srlx %o3, 16, %o4 /* IEU0 Group */
|
||||
stb %o4, [%o0 - 3] /* Store */
|
||||
|
||||
18: srlx %o3, 24, %o4 /* IEU0 Group */
|
||||
stb %o4, [%o0 - 4] /* Store */
|
||||
19: srlx %o3, 32, %o4 /* IEU0 Group */
|
||||
stw %o4, [%o0 - 8] /* Store */
|
||||
|
||||
retl /* CTI+IEU1 Group */
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
nop
|
||||
nop
|
||||
|
||||
20: srlx %o3, 40, %o4 /* IEU0 Group */
|
||||
stb %o4, [%o0 - 6] /* Store */
|
||||
21: srlx %o3, 48, %o4 /* IEU0 Group */
|
||||
stb %o4, [%o0 - 7] /* Store */
|
||||
|
||||
22: srlx %o3, 56, %o4 /* IEU0 Group */
|
||||
stb %o4, [%o0 - 8] /* Store */
|
||||
retl /* CTI+IEU1 Group */
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
END(strcpy)
|
211
sysdeps/sparc/sparc64/strcspn.S
Normal file
211
sysdeps/sparc/sparc64/strcspn.S
Normal file
@ -0,0 +1,211 @@
|
||||
/* strcspn (str, ss) -- Return the length of the initial segment of STR
|
||||
which contains no characters from SS.
|
||||
For SPARC v9.
|
||||
Copyright (C) 1999 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jj@ultra.linux.cz>
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <asm/asi.h>
|
||||
#ifndef XCC
|
||||
#define XCC xcc
|
||||
#define STACK_SIZE 128
|
||||
#define STACK_OFFSET 128+0x7ff
|
||||
#else
|
||||
#define STACK_SIZE 64
|
||||
#define STACK_OFFSET 64
|
||||
#endif
|
||||
|
||||
.text
|
||||
.align 32
|
||||
ENTRY(strcspn)
|
||||
sub %sp, STACK_SIZE+32, %sp /* IEU0 Group */
|
||||
mov 1, %o4 /* IEU1 */
|
||||
stx %o4, [%sp + STACK_OFFSET] /* Store Group */
|
||||
mov %o0, %g7 /* IEU0 */
|
||||
|
||||
stx %g0, [%sp + STACK_OFFSET + 8] /* Store Group */
|
||||
add %sp, STACK_OFFSET, %o5 /* IEU0 */
|
||||
stx %g0, [%sp + STACK_OFFSET + 16] /* Store Group */
|
||||
stx %g0, [%sp + STACK_OFFSET + 24] /* Store Group */
|
||||
|
||||
1: ldub [%o1], %o2 /* Load Group */
|
||||
brz,pn %o2, 2f /* CTI+IEU1 Group */
|
||||
srl %o2, 3, %o3 /* IEU0 */
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
|
||||
and %o2, 0x3f, %o2 /* IEU1 */
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
sllx %o4, %o2, %g1 /* IEU0 */
|
||||
add %o1, 1, %o1 /* IEU1 */
|
||||
|
||||
or %g2, %g1, %g2 /* IEU0 Group */
|
||||
ba,pt %xcc, 1b /* CTI */
|
||||
stx %g2, [%o5 + %o3] /* Store */
|
||||
2: andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
|
||||
be,a,pt %xcc, 4f /* CTI */
|
||||
ldx [%o0], %o2 /* Load */
|
||||
ldub [%o0], %o2 /* Load Group */
|
||||
3: srl %o2, 3, %o3 /* IEU0 Group */
|
||||
|
||||
and %o2, 0x3f, %o2 /* IEU1 */
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
sllx %o4, %o2, %g1 /* IEU0 */
|
||||
|
||||
add %o0, 1, %o0 /* IEU1 */
|
||||
andcc %g2, %g1, %g0 /* IEU1 Group */
|
||||
bne,pn %xcc, 12f /* CTI */
|
||||
andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
|
||||
bne,a,pt %icc, 3b /* CTI */
|
||||
ldub [%o0], %o2 /* Load */
|
||||
ldx [%o0], %o2 /* Load Group */
|
||||
4: srlx %o2, 59, %o3 /* IEU0 Group */
|
||||
|
||||
srlx %o2, 56, %g3 /* IEU0 Group */
|
||||
5: and %o3, 0x18, %o3 /* IEU1 */
|
||||
andcc %g3, 0x3f, %g3 /* IEU1 Group */
|
||||
ldx [%o5 + %o3], %g2 /* Load */
|
||||
|
||||
srlx %o2, 51, %o3 /* IEU0 */
|
||||
sllx %o4, %g3, %g1 /* IEU0 Group */
|
||||
srlx %o2, 48, %g3 /* IEU0 Group */
|
||||
andcc %g2, %g1, %g2 /* IEU1 */
|
||||
|
||||
bne,pn %xcc, 13f /* CTI */
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
and %g3, 0x3f, %g3 /* IEU1 */
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
|
||||
srlx %o2, 43, %o3 /* IEU0 */
|
||||
sllx %o4, %g3, %g1 /* IEU0 Group */
|
||||
srlx %o2, 40, %g3 /* IEU0 Group */
|
||||
andcc %g2, %g1, %g2 /* IEU1 */
|
||||
|
||||
bne,pn %xcc, 14f /* CTI */
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
and %g3, 0x3f, %g3 /* IEU1 */
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
|
||||
srlx %o2, 35, %o3 /* IEU0 */
|
||||
sllx %o4, %g3, %g1 /* IEU0 Group */
|
||||
srlx %o2, 32, %g3 /* IEU0 Group */
|
||||
andcc %g2, %g1, %g2 /* IEU1 */
|
||||
|
||||
bne,pn %xcc, 15f /* CTI */
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
and %g3, 0x3f, %g3 /* IEU1 */
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
|
||||
srlx %o2, 27, %o3 /* IEU0 */
|
||||
sllx %o4, %g3, %g1 /* IEU0 Group */
|
||||
srlx %o2, 24, %g3 /* IEU0 Group */
|
||||
andcc %g2, %g1, %g2 /* IEU1 */
|
||||
|
||||
bne,pn %xcc, 16f /* CTI */
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
and %g3, 0x3f, %g3 /* IEU1 */
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
|
||||
srlx %o2, 19, %o3 /* IEU0 */
|
||||
sllx %o4, %g3, %g1 /* IEU0 Group */
|
||||
srlx %o2, 16, %g3 /* IEU0 Group */
|
||||
andcc %g2, %g1, %g2 /* IEU1 */
|
||||
|
||||
bne,pn %xcc, 17f /* CTI */
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
and %g3, 0x3f, %g3 /* IEU1 */
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
|
||||
srlx %o2, 11, %o3 /* IEU0 */
|
||||
sllx %o4, %g3, %g1 /* IEU0 Group */
|
||||
add %o0, 8, %o0 /* IEU1 */
|
||||
srlx %o2, 8, %g3 /* IEU0 Group */
|
||||
|
||||
andcc %g2, %g1, %g2 /* IEU1 */
|
||||
bne,pn %xcc, 18f /* CTI */
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
and %g3, 0x3f, %g3 /* IEU1 */
|
||||
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
sllx %o4, %g3, %g1 /* IEU0 */
|
||||
mov %o2, %g3 /* IEU1 */
|
||||
srlx %o2, 3, %o3 /* IEU0 Group */
|
||||
|
||||
ldxa [%o0] ASI_PNF, %o2 /* Load */
|
||||
andcc %g2, %g1, %g2 /* IEU1 Group */
|
||||
bne,pn %xcc, 19f /* CTI */
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
|
||||
and %g3, 0x3f, %g3 /* IEU1 */
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
sllx %o4, %g3, %g1 /* IEU0 */
|
||||
srlx %o2, 59, %o3 /* IEU0 Group */
|
||||
|
||||
andcc %g2, %g1, %g2 /* IEU1 Group */
|
||||
be,pt %xcc, 5b /* CTI */
|
||||
srlx %o2, 56, %g3 /* IEU0 Group */
|
||||
sub %o0, 1, %o0 /* IEU1 */
|
||||
|
||||
add %sp, STACK_SIZE+32, %sp /* IEU0 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %g7, %o0 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
19: sub %o0, 2, %o0 /* IEU1 */
|
||||
add %sp, STACK_SIZE+32, %sp /* IEU0 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %g7, %o0 /* IEU0 */
|
||||
|
||||
18: sub %o0, 3, %o0 /* IEU1 */
|
||||
add %sp, STACK_SIZE+32, %sp /* IEU0 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %g7, %o0 /* IEU0 */
|
||||
|
||||
17: add %o0, 4, %o0 /* IEU1 */
|
||||
add %sp, STACK_SIZE+32, %sp /* IEU0 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %g7, %o0 /* IEU0 */
|
||||
|
||||
16: add %o0, 3, %o0 /* IEU1 */
|
||||
add %sp, STACK_SIZE+32, %sp /* IEU0 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %g7, %o0 /* IEU0 */
|
||||
|
||||
15: add %o0, 2, %o0 /* IEU1 */
|
||||
add %sp, STACK_SIZE+32, %sp /* IEU0 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %g7, %o0 /* IEU0 */
|
||||
|
||||
14: add %o0, 1, %o0 /* IEU1 */
|
||||
add %sp, STACK_SIZE+32, %sp /* IEU0 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %g7, %o0 /* IEU0 */
|
||||
|
||||
13: add %sp, STACK_SIZE+32, %sp /* IEU1 */
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %g7, %o0 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
12: sub %o0, 1, %o0 /* IEU0 Group */
|
||||
add %sp, STACK_SIZE+32, %sp /* IEU1 */
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %g7, %o0 /* IEU0 */
|
||||
END(strcspn)
|
172
sysdeps/sparc/sparc64/strlen.S
Normal file
172
sysdeps/sparc/sparc64/strlen.S
Normal file
@ -0,0 +1,172 @@
|
||||
/* Determine the length of a string. For SPARC v9.
|
||||
Copyright (C) 1998, 1999 Free Software Foundation, Inc.
|
||||
Contributed by Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz> and
|
||||
Jakub Jelinek <jj@ultra.linux.cz>.
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <asm/asi.h>
|
||||
|
||||
/* Normally, this uses
|
||||
((xword - 0x0101010101010101) & 0x8080808080808080) test
|
||||
to find out if any byte in xword could be zero. This is fast, but
|
||||
also gives false alarm for any byte in range 0x81-0xff. It does
|
||||
not matter for correctness, as if this test tells us there could
|
||||
be some zero byte, we check it byte by byte, but if bytes with
|
||||
high bits set are common in the strings, then this will give poor
|
||||
performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
|
||||
will use one tick slower, but more precise test
|
||||
((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
|
||||
which does not give any false alarms (but if some bits are set,
|
||||
one cannot assume from it which bytes are zero and which are not).
|
||||
It is yet to be measured, what is the correct default for glibc
|
||||
in these days for an average user.
|
||||
*/
|
||||
|
||||
.text
|
||||
.align 32
|
||||
ENTRY(strlen)
|
||||
sethi %hi(0x01010101), %g1 /* IEU0 Group */
|
||||
ldub [%o0], %o3 /* Load */
|
||||
or %g1, %lo(0x01010101), %g1 /* IEU0 Group */
|
||||
mov %o0, %o1 /* IEU1 */
|
||||
|
||||
sllx %g1, 32, %g2 /* IEU0 Group */
|
||||
andcc %o0, 7, %g0 /* IEU1 */
|
||||
or %g1, %g2, %g1 /* IEU0 Group */
|
||||
brz,pn %o3, 13f /* CTI+IEU1 */
|
||||
|
||||
sllx %g1, 7, %g2 /* IEU0 Group */
|
||||
bne,a,pn %icc, 15f /* CTI */
|
||||
add %o0, 1, %o0 /* IEU1 */
|
||||
/* %g1 = 0x0101010101010101 *
|
||||
* %g2 = 0x8080808080808080 *
|
||||
* %o0 = string pointer *
|
||||
* %o1 = start of string */
|
||||
1: ldx [%o0], %o3 /* Load Group */
|
||||
|
||||
add %o0, 8, %o0 /* IEU1 */
|
||||
2: sub %o3, %g1, %o2 /* IEU0 Group */
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %o2, %o3, %g7 /* IEU0 Group */
|
||||
ldxa [%o0] ASI_PNF, %o3 /* Load */
|
||||
andcc %g7, %g2, %g0 /* IEU1 Group */
|
||||
#else
|
||||
ldxa [%o0] ASI_PNF, %o3 /* Load */
|
||||
andcc %o2, %g2, %g0 /* IEU1 Group */
|
||||
#endif
|
||||
|
||||
be,pt %xcc, 2b /* CTI */
|
||||
add %o0, 8, %o0 /* IEU0 */
|
||||
addcc %o2, %g1, %g3 /* IEU1 Group */
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
srlx %g7, 32, %g7 /* IEU0 */
|
||||
|
||||
3: andcc %g7, %g2, %g0 /* IEU1 Group */
|
||||
#else
|
||||
srlx %o2, 32, %o2 /* IEU0 */
|
||||
|
||||
3: andcc %o2, %g2, %g0 /* IEU1 Group */
|
||||
#endif
|
||||
be,pn %xcc, 4f /* CTI */
|
||||
srlx %g3, 56, %o2 /* IEU0 */
|
||||
andcc %o2, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 12f /* CTI */
|
||||
srlx %g3, 48, %o2 /* IEU0 */
|
||||
andcc %o2, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 11f /* CTI */
|
||||
|
||||
srlx %g3, 40, %o2 /* IEU0 */
|
||||
andcc %o2, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 10f /* CTI */
|
||||
srlx %g3, 32, %o2 /* IEU0 */
|
||||
|
||||
andcc %o2, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 9f /* CTI */
|
||||
4: srlx %g3, 24, %o2 /* IEU0 */
|
||||
andcc %o2, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 8f /* CTI */
|
||||
srlx %g3, 16, %o2 /* IEU0 */
|
||||
andcc %o2, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 7f /* CTI */
|
||||
|
||||
srlx %g3, 8, %o2 /* IEU0 */
|
||||
andcc %o2, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 6f /* CTI */
|
||||
sub %o3, %g1, %o2 /* IEU0 */
|
||||
|
||||
andcc %g3, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 5f /* CTI */
|
||||
ldxa [%o0] ASI_PNF, %o3 /* Load */
|
||||
andcc %o2, %g2, %g0 /* IEU1 Group */
|
||||
|
||||
be,pt %xcc, 2b /* CTI */
|
||||
add %o0, 8, %o0 /* IEU0 */
|
||||
addcc %o2, %g1, %g3 /* IEU1 Group */
|
||||
ba,pt %xcc, 3b /* CTI */
|
||||
|
||||
srlx %o2, 32, %o2 /* IEU0 */
|
||||
5: add %o0, -9, %o0 /* IEU0 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %o1, %o0 /* IEU0 */
|
||||
|
||||
6: add %o0, -10, %o0 /* IEU0 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %o1, %o0 /* IEU0 */
|
||||
7: add %o0, -11, %o0 /* IEU0 Group */
|
||||
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %o1, %o0 /* IEU0 */
|
||||
8: add %o0, -12, %o0 /* IEU0 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
|
||||
sub %o0, %o1, %o0 /* IEU0 */
|
||||
9: add %o0, -13, %o0 /* IEU0 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %o1, %o0 /* IEU0 */
|
||||
|
||||
10: add %o0, -14, %o0 /* IEU0 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %o1, %o0 /* IEU0 */
|
||||
11: add %o0, -15, %o0 /* IEU0 Group */
|
||||
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %o1, %o0 /* IEU0 */
|
||||
12: add %o0, -16, %o0 /* IEU0 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
|
||||
sub %o0, %o1, %o0 /* IEU0 */
|
||||
13: retl /* CTI+IEU1 Group */
|
||||
mov 0, %o0 /* IEU0 */
|
||||
nop
|
||||
|
||||
15: ldub [%o0], %o3 /* Load Group */
|
||||
16: andcc %o0, 7, %g0 /* IEU1 */
|
||||
be,pn %icc, 1b /* CTI */
|
||||
nop /* IEU0 Group */
|
||||
|
||||
add %o0, 1, %o0 /* IEU1 */
|
||||
andcc %o3, 0xff, %g0 /* IEU1 Group */
|
||||
bne,a,pt %icc, 16b /* CTI */
|
||||
lduba [%o0] ASI_PNF, %o3 /* Load */
|
||||
|
||||
add %o0, -1, %o0 /* IEU0 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %o1, %o0 /* IEU0 */
|
||||
END(strlen)
|
359
sysdeps/sparc/sparc64/strncmp.S
Normal file
359
sysdeps/sparc/sparc64/strncmp.S
Normal file
@ -0,0 +1,359 @@
|
||||
/* Compare no more than N characters of S1 and S2, returning less than,
|
||||
equal to or greater than zero if S1 is lexicographically less than,
|
||||
equal to or greater than S2.
|
||||
For SPARC v9.
|
||||
Copyright (C) 1997, 1999 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz> and
|
||||
Jakub Jelinek <jj@ultra.linux.cz>.
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <asm/asi.h>
|
||||
#ifndef XCC
|
||||
#define XCC xcc
|
||||
#define USE_BPR
|
||||
#endif
|
||||
|
||||
/* Normally, this uses
|
||||
((xword - 0x0101010101010101) & 0x8080808080808080) test
|
||||
to find out if any byte in xword could be zero. This is fast, but
|
||||
also gives false alarm for any byte in range 0x81-0xff. It does
|
||||
not matter for correctness, as if this test tells us there could
|
||||
be some zero byte, we check it byte by byte, but if bytes with
|
||||
high bits set are common in the strings, then this will give poor
|
||||
performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
|
||||
will use one tick slower, but more precise test
|
||||
((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
|
||||
which does not give any false alarms (but if some bits are set,
|
||||
one cannot assume from it which bytes are zero and which are not).
|
||||
It is yet to be measured, what is the correct default for glibc
|
||||
in these days for an average user.
|
||||
*/
|
||||
|
||||
.text
|
||||
.align 32
|
||||
ENTRY(strncmp)
|
||||
#ifdef USE_BPR
|
||||
brz,pn %o2, 4f /* CTI+IEU1 Group */
|
||||
#else
|
||||
tst %o2 /* IEU1 Group */
|
||||
be,pn %XCC, 4f /* CTI */
|
||||
#endif
|
||||
sethi %hi(0x1010101), %g1 /* IEU0 */
|
||||
andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
bne,pn %icc, 9f /* CTI */
|
||||
|
||||
or %g1, %lo(0x1010101), %g1 /* IEU0 */
|
||||
andcc %o1, 7, %g3 /* IEU1 Group */
|
||||
bne,pn %icc, 11f /* CTI */
|
||||
sllx %g1, 32, %g2 /* IEU0 */
|
||||
|
||||
ldx [%o0], %g4 /* Load Group */
|
||||
or %g1, %g2, %g1 /* IEU0 */
|
||||
1: ldx [%o1], %o3 /* Load Group */
|
||||
sllx %g1, 7, %g2 /* IEU0 */
|
||||
|
||||
add %o0, 8, %o0 /* IEU1 */
|
||||
2: subcc %o2, 8, %o2 /* IEU1 Group */
|
||||
bl,pn %XCC, 5f /* CTI */
|
||||
add %o1, 8, %o1 /* IEU0 */
|
||||
|
||||
sub %g4, %g1, %g3 /* IEU0 Group */
|
||||
subcc %g4, %o3, %o4 /* IEU1 */
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %g3, %g4, %g7 /* IEU0 Group */
|
||||
#endif
|
||||
bne,pn %xcc, 6f /* CTI */
|
||||
ldxa [%o0] ASI_PNF, %g4 /* Load Group */
|
||||
|
||||
add %o0, 8, %o0 /* IEU0 */
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andcc %g7, %g2, %g0 /* IEU1 */
|
||||
#else
|
||||
andcc %g3, %g2, %g0 /* IEU1 */
|
||||
#endif
|
||||
be,a,pt %xcc, 2b /* CTI */
|
||||
ldxa [%o1] ASI_PNF, %o3 /* Load Group */
|
||||
|
||||
addcc %g3, %g1, %o4 /* IEU1 */
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
srlx %g7, 32, %g7 /* IEU0 */
|
||||
andcc %g7, %g2, %g0 /* IEU1 Group */
|
||||
#else
|
||||
srlx %g3, 32, %g3 /* IEU0 */
|
||||
andcc %g3, %g2, %g0 /* IEU1 Group */
|
||||
#endif
|
||||
be,pt %xcc, 3f /* CTI */
|
||||
|
||||
srlx %o4, 56, %o5 /* IEU0 */
|
||||
andcc %o5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4f /* CTI */
|
||||
srlx %o4, 48, %o5 /* IEU0 */
|
||||
|
||||
andcc %o5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4f /* CTI */
|
||||
srlx %o4, 40, %o5 /* IEU0 */
|
||||
andcc %o5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 4f /* CTI */
|
||||
srlx %o4, 32, %o5 /* IEU0 */
|
||||
andcc %o5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4f /* CTI */
|
||||
|
||||
3: srlx %o4, 24, %o5 /* IEU0 */
|
||||
andcc %o5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4f /* CTI */
|
||||
srlx %o4, 16, %o5 /* IEU0 */
|
||||
|
||||
andcc %o5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4f /* CTI */
|
||||
srlx %o4, 8, %o5 /* IEU0 */
|
||||
andcc %o5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 4f /* CTI */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
bne,a,pn %icc, 2b /* CTI */
|
||||
ldxa [%o1] ASI_PNF, %o3 /* Load */
|
||||
|
||||
4: retl /* CTI+IEU1 Group */
|
||||
clr %o0 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
5: srlx %g4, 56, %o4 /* IEU0 Group */
|
||||
cmp %o2, -8 /* IEU1 */
|
||||
be,pn %XCC, 4b /* CTI */
|
||||
srlx %o3, 56, %o5 /* IEU0 Group */
|
||||
|
||||
andcc %o4, 0xff, %g0 /* IEU1 */
|
||||
be,pn %xcc, 8f /* CTI */
|
||||
subcc %o4, %o5, %o4 /* IEU1 Group */
|
||||
bne,pn %xcc, 8f /* CTI */
|
||||
|
||||
srlx %o3, 48, %o5 /* IEU0 */
|
||||
cmp %o2, -7 /* IEU1 Group */
|
||||
be,pn %XCC, 4b /* CTI */
|
||||
srlx %g4, 48, %o4 /* IEU0 */
|
||||
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %xcc, 8f /* CTI */
|
||||
subcc %o4, %o5, %o4 /* IEU1 Group */
|
||||
bne,pn %xcc, 8f /* CTI */
|
||||
|
||||
srlx %o3, 40, %o5 /* IEU0 */
|
||||
cmp %o2, -6 /* IEU1 Group */
|
||||
be,pn %XCC, 4b /* CTI */
|
||||
srlx %g4, 40, %o4 /* IEU0 */
|
||||
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %xcc, 8f /* CTI */
|
||||
subcc %o4, %o5, %o4 /* IEU1 Group */
|
||||
bne,pn %xcc, 8f /* CTI */
|
||||
|
||||
srlx %o3, 32, %o5 /* IEU0 */
|
||||
cmp %o2, -5 /* IEU1 Group */
|
||||
be,pn %XCC, 4b /* CTI */
|
||||
srlx %g4, 32, %o4 /* IEU0 */
|
||||
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %xcc, 8f /* CTI */
|
||||
subcc %o4, %o5, %o4 /* IEU1 Group */
|
||||
bne,pn %xcc, 8f /* CTI */
|
||||
|
||||
srlx %o3, 24, %o5 /* IEU0 */
|
||||
cmp %o2, -4 /* IEU1 Group */
|
||||
be,pn %XCC, 4b /* CTI */
|
||||
srlx %g4, 24, %o4 /* IEU0 */
|
||||
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %xcc, 8f /* CTI */
|
||||
subcc %o4, %o5, %o4 /* IEU1 Group */
|
||||
bne,pn %xcc, 8f /* CTI */
|
||||
|
||||
srlx %o3, 16, %o5 /* IEU0 */
|
||||
cmp %o2, -3 /* IEU1 Group */
|
||||
be,pn %XCC, 4b /* CTI */
|
||||
srlx %g4, 16, %o4 /* IEU0 */
|
||||
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %xcc, 8f /* CTI */
|
||||
subcc %o4, %o5, %o4 /* IEU1 Group */
|
||||
bne,pn %xcc, 8f /* CTI */
|
||||
|
||||
srlx %o3, 8, %o5 /* IEU0 */
|
||||
cmp %o2, -2 /* IEU1 Group */
|
||||
be,pn %XCC, 4b /* CTI */
|
||||
srlx %g4, 8, %o4 /* IEU0 */
|
||||
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o4, %o5, %o0 /* IEU0 */
|
||||
6: addcc %o3, %o4, %g4 /* IEU1 */
|
||||
7: srlx %o3, 56, %o5 /* IEU0 */
|
||||
|
||||
srlx %g4, 56, %o4 /* IEU0 Group */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %xcc, 8f /* CTI */
|
||||
subcc %o4, %o5, %o4 /* IEU1 Group */
|
||||
|
||||
bne,pn %xcc, 8f /* CTI */
|
||||
srlx %o3, 48, %o5 /* IEU0 */
|
||||
srlx %g4, 48, %o4 /* IEU0 Group */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %xcc, 8f /* CTI */
|
||||
subcc %o4, %o5, %o4 /* IEU1 Group */
|
||||
bne,pn %xcc, 8f /* CTI */
|
||||
srlx %o3, 40, %o5 /* IEU0 */
|
||||
|
||||
srlx %g4, 40, %o4 /* IEU0 Group */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %xcc, 8f /* CTI */
|
||||
subcc %o4, %o5, %o4 /* IEU1 Group */
|
||||
|
||||
bne,pn %xcc, 8f /* CTI */
|
||||
srlx %o3, 32, %o5 /* IEU0 */
|
||||
srlx %g4, 32, %o4 /* IEU0 Group */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %xcc, 8f /* CTI */
|
||||
subcc %o4, %o5, %o4 /* IEU1 Group */
|
||||
bne,pn %xcc, 8f /* CTI */
|
||||
srlx %o3, 24, %o5 /* IEU0 */
|
||||
|
||||
srlx %g4, 24, %o4 /* IEU0 Group */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %xcc, 8f /* CTI */
|
||||
subcc %o4, %o5, %o4 /* IEU1 Group */
|
||||
|
||||
bne,pn %xcc, 8f /* CTI */
|
||||
srlx %o3, 16, %o5 /* IEU0 */
|
||||
srlx %g4, 16, %o4 /* IEU0 Group */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %xcc, 8f /* CTI */
|
||||
subcc %o4, %o5, %o4 /* IEU1 Group */
|
||||
bne,pn %xcc, 8f /* CTI */
|
||||
srlx %o3, 8, %o5 /* IEU0 */
|
||||
|
||||
srlx %g4, 8, %o4 /* IEU0 Group */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %xcc, 8f /* CTI */
|
||||
subcc %o4, %o5, %o4 /* IEU1 Group */
|
||||
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %g4, %o3, %o0 /* IEU0 */
|
||||
8: retl /* CTI+IEU1 Group */
|
||||
mov %o4, %o0 /* IEU0 */
|
||||
|
||||
9: ldub [%o0], %g4 /* Load Group */
|
||||
add %o0, 1, %o0 /* IEU0 */
|
||||
ldub [%o1], %o3 /* Load Group */
|
||||
sllx %g1, 32, %g2 /* IEU0 */
|
||||
|
||||
10: subcc %o2, 1, %o2 /* IEU1 Group */
|
||||
be,pn %XCC, 8b /* CTI */
|
||||
sub %g4, %o3, %o4 /* IEU0 */
|
||||
add %o1, 1, %o1 /* IEU0 Group */
|
||||
|
||||
cmp %g4, %o3 /* IEU1 */
|
||||
bne,pn %xcc, 8b /* CTI */
|
||||
lduba [%o0] ASI_PNF, %g4 /* Load Group */
|
||||
andcc %o3, 0xff, %g0 /* IEU1 */
|
||||
|
||||
be,pn %icc, 4b /* CTI */
|
||||
lduba [%o1] ASI_PNF, %o3 /* Load Group */
|
||||
andcc %o0, 7, %g0 /* IEU1 */
|
||||
bne,a,pn %icc, 10b /* CTI */
|
||||
|
||||
add %o0, 1, %o0 /* IEU0 Group */
|
||||
or %g1, %g2, %g1 /* IEU1 */
|
||||
andcc %o1, 7, %g3 /* IEU1 Group */
|
||||
be,pn %icc, 1b /* CTI */
|
||||
|
||||
ldxa [%o0] ASI_PNF, %g4 /* Load */
|
||||
11: sllx %g3, 3, %g5 /* IEU0 Group */
|
||||
mov 64, %g7 /* IEU1 */
|
||||
sub %o1, %g3, %o1 /* IEU0 Group */
|
||||
|
||||
sub %g7, %g5, %g7 /* IEU1 */
|
||||
ldxa [%o1] ASI_PNF, %o4 /* Load */
|
||||
sllx %g1, 7, %g2 /* IEU0 Group */
|
||||
add %o1, 8, %o1 /* IEU1 */
|
||||
/* %g1 = 0101010101010101
|
||||
%g2 = 8080808080800880
|
||||
%g3 = %o1 alignment
|
||||
%g5 = number of bits to shift left
|
||||
%g7 = number of bits to shift right */
|
||||
|
||||
12: sllx %o4, %g5, %o3 /* IEU0 Group */
|
||||
ldxa [%o1] ASI_PNF, %o4 /* Load */
|
||||
add %o1, 8, %o1 /* IEU1 */
|
||||
13: ldxa [%o0] ASI_PNF, %g4 /* Load Group */
|
||||
|
||||
addcc %o0, 8, %o0 /* IEU1 */
|
||||
srlx %o4, %g7, %o5 /* IEU0 */
|
||||
subcc %o2, 8, %o2 /* IEU1 Group */
|
||||
bl,pn %XCC, 5b /* CTI */
|
||||
|
||||
or %o3, %o5, %o3 /* IEU0 */
|
||||
cmp %g4, %o3 /* IEU1 Group */
|
||||
bne,pn %xcc, 7b /* CTI */
|
||||
sub %g4, %g1, %o5 /* IEU0 */
|
||||
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %o5, %g4, %o5 /* IEU0 Group */
|
||||
#endif
|
||||
andcc %o5, %g2, %g0 /* IEU1 Group */
|
||||
be,pt %xcc, 12b /* CTI */
|
||||
srlx %o5, 32, %o5 /* IEU0 */
|
||||
andcc %o5, %g2, %g0 /* IEU1 Group */
|
||||
|
||||
be,pt %xcc, 14f /* CTI */
|
||||
srlx %g4, 56, %o5 /* IEU0 */
|
||||
andcc %o5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4b /* CTI */
|
||||
|
||||
srlx %g4, 48, %o5 /* IEU0 */
|
||||
andcc %o5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4b /* CTI */
|
||||
srlx %g4, 40, %o5 /* IEU0 */
|
||||
|
||||
andcc %o5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4b /* CTI */
|
||||
srlx %g4, 32, %o5 /* IEU0 */
|
||||
andcc %o5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 4b /* CTI */
|
||||
14: srlx %g4, 24, %o5 /* IEU0 */
|
||||
andcc %o5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4b /* CTI */
|
||||
|
||||
srlx %g4, 16, %o5 /* IEU0 */
|
||||
andcc %o5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4b /* CTI */
|
||||
srlx %g4, 8, %o5 /* IEU0 */
|
||||
|
||||
andcc %o5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4b /* CTI */
|
||||
andcc %g4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 4b /* CTI */
|
||||
|
||||
sllx %o4, %g5, %o3 /* IEU0 */
|
||||
ldxa [%o1] ASI_PNF, %o4 /* Load Group */
|
||||
ba,pt %xcc, 13b /* CTI */
|
||||
add %o1, 8, %o1 /* IEU0 */
|
||||
END(strncmp)
|
393
sysdeps/sparc/sparc64/strncpy.S
Normal file
393
sysdeps/sparc/sparc64/strncpy.S
Normal file
@ -0,0 +1,393 @@
|
||||
/* strncpy(DST, SRC, COUNT) - Copy no more than COUNT bytes of the
|
||||
null-terminated string from SRC to DST. If SRC does not cover all of
|
||||
COUNT, the balance is zeroed.
|
||||
For SPARC v9.
|
||||
Copyright (C) 1998, 1999 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz> and
|
||||
Jakub Jelinek <jj@ultra.linux.cz>.
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <asm/asi.h>
|
||||
#ifndef XCC
|
||||
#define XCC xcc
|
||||
#define USE_BPR
|
||||
#endif
|
||||
|
||||
/* Normally, this uses
|
||||
((xword - 0x0101010101010101) & 0x8080808080808080) test
|
||||
to find out if any byte in xword could be zero. This is fast, but
|
||||
also gives false alarm for any byte in range 0x81-0xff. It does
|
||||
not matter for correctness, as if this test tells us there could
|
||||
be some zero byte, we check it byte by byte, but if bytes with
|
||||
high bits set are common in the strings, then this will give poor
|
||||
performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
|
||||
will use one tick slower, but more precise test
|
||||
((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
|
||||
which does not give any false alarms (but if some bits are set,
|
||||
one cannot assume from it which bytes are zero and which are not).
|
||||
It is yet to be measured, what is the correct default for glibc
|
||||
in these days for an average user.
|
||||
*/
|
||||
|
||||
.text
|
||||
.align 32
|
||||
ENTRY(strncpy)
|
||||
sethi %hi(0x01010101), %g1 /* IEU0 Group */
|
||||
#ifdef USE_BPR
|
||||
brz,pn %o2, 19f /* CTI+IEU1 */
|
||||
#else
|
||||
tst %o2 /* IEU1 */
|
||||
be,pn %XCC, 19f /* CTI */
|
||||
#endif
|
||||
mov %o0, %g7 /* IEU0 Group */
|
||||
or %g1, %lo(0x01010101), %g1 /* IEU1 */
|
||||
|
||||
andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
sllx %g1, 32, %g2 /* IEU0 */
|
||||
bne,pn %icc, 26f /* CTI */
|
||||
or %g1, %g2, %g1 /* IEU0 Group */
|
||||
|
||||
andcc %o1, 7, %g3 /* IEU1 */
|
||||
bne,pn %icc, 28f /* CTI */
|
||||
sllx %g1, 7, %g2 /* IEU0 Group */
|
||||
ldx [%o1], %o3 /* Load */
|
||||
|
||||
1: add %o1, 8, %o1 /* IEU1 */
|
||||
2: subcc %o2, 8, %o2 /* IEU1 Group */
|
||||
bl,pn %XCC, 18f /* CTI */
|
||||
sub %o3, %g1, %o4 /* IEU0 */
|
||||
|
||||
add %o0, 8, %o0 /* IEU0 Group */
|
||||
#ifdef EIGHTBIT_NOT_MORE
|
||||
andn %o4, %o3, %o4 /* IEU1 */
|
||||
#endif
|
||||
mov %o3, %g3 /* IEU1 */
|
||||
ldxa [%o1] ASI_PNF, %o3 /* Load */
|
||||
add %o1, 8, %o1 /* IEU0 Group */
|
||||
|
||||
andcc %o4, %g2, %g0 /* IEU1 */
|
||||
be,a,pt %xcc, 2b /* CTI */
|
||||
stx %g3, [%o0-8] /* Store Group */
|
||||
srlx %g3, 56, %g5 /* IEU0 Group */
|
||||
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 16f /* CTI */
|
||||
srlx %g3, 48, %g4 /* IEU0 */
|
||||
andcc %g4, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 15f /* CTI */
|
||||
srlx %g3, 40, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 14f /* CTI */
|
||||
|
||||
srlx %g3, 32, %g4 /* IEU0 */
|
||||
andcc %g4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 13f /* CTI */
|
||||
srlx %g3, 24, %g5 /* IEU0 */
|
||||
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 12f /* CTI */
|
||||
srlx %g3, 16, %g4 /* IEU0 */
|
||||
andcc %g4, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 11f /* CTI */
|
||||
srlx %g3, 8, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 10f /* CTI */
|
||||
|
||||
andcc %g3, 0xff, %g0 /* IEU1 Group */
|
||||
bne,pt %icc, 2b /* CTI */
|
||||
3: stx %g3, [%o0-8] /* Store */
|
||||
andncc %o2, 31, %g3 /* IEU1 Group */
|
||||
|
||||
4: be,pn %XCC, 41f /* CTI */
|
||||
and %o2, 31, %o2 /* IEU1 Group */
|
||||
40: stx %g0, [%o0] /* Store */
|
||||
stx %g0, [%o0 + 8] /* Store Group */
|
||||
|
||||
subcc %g3, 32, %g3 /* IEU1 */
|
||||
stx %g0, [%o0 + 16] /* Store Group */
|
||||
stx %g0, [%o0 + 24] /* Store Group */
|
||||
bne,pt %XCC, 40b /* CTI */
|
||||
|
||||
add %o0, 32, %o0 /* IEU0 */
|
||||
41: subcc %o2, 8, %o2 /* IEU1 Group */
|
||||
bl,a,pn %XCC, 6f /* CTI */
|
||||
andcc %o2, 4, %g0 /* IEU1 Group */
|
||||
|
||||
5: stx %g0, [%o0] /* Store */
|
||||
subcc %o2, 8, %o2 /* IEU1 Group */
|
||||
bge,pt %XCC, 5b /* CTI */
|
||||
add %o0, 8, %o0 /* IEU0 */
|
||||
|
||||
andcc %o2, 4, %g0 /* IEU1 Group */
|
||||
6: be,a,pn %icc, 7f /* CTI */
|
||||
andcc %o2, 2, %g0 /* IEU1 Group */
|
||||
stw %g0, [%o0] /* Store */
|
||||
|
||||
add %o0, 4, %o0 /* IEU0 */
|
||||
andcc %o2, 2, %g0 /* IEU1 Group */
|
||||
7: be,a,pn %icc, 8f /* CTI */
|
||||
andcc %o2, 1, %g0 /* IEU1 Group */
|
||||
|
||||
sth %g0, [%o0] /* Store */
|
||||
add %o0, 2, %o0 /* IEU0 */
|
||||
andcc %o2, 1, %g0 /* IEU1 Group */
|
||||
8: bne,a,pn %icc, 9f /* CTI */
|
||||
|
||||
stb %g0, [%o0] /* Store */
|
||||
9: retl /* CTI+IEU1 Group */
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
10: ba,pt %xcc, 3b /* CTI */
|
||||
sllx %g5, 8, %g3 /* IEU0 */
|
||||
11: ba,pt %xcc, 3b /* CTI Group */
|
||||
sllx %g4, 16, %g3 /* IEU0 */
|
||||
|
||||
12: ba,pt %xcc, 3b /* CTI Group */
|
||||
sllx %g5, 24, %g3 /* IEU0 */
|
||||
13: ba,pt %xcc, 3b /* CTI Group */
|
||||
sllx %g4, 32, %g3 /* IEU0 */
|
||||
|
||||
14: ba,pt %xcc, 3b /* CTI Group */
|
||||
sllx %g5, 40, %g3 /* IEU0 */
|
||||
15: ba,pt %xcc, 3b /* CTI Group */
|
||||
sllx %g4, 48, %g3 /* IEU0 */
|
||||
|
||||
16: ba,pt %xcc, 3b /* CTI */
|
||||
sllx %g5, 56, %g3 /* IEU0 */
|
||||
17: or %o3, %o4, %o3 /* IEU0 Group */
|
||||
sub %o3, %g1, %o4 /* IEU1 */
|
||||
|
||||
18: addcc %o2, 8, %o2 /* IEU1 Group */
|
||||
be,pn %XCC, 19f /* CTI */
|
||||
andcc %o4, %g2, %g0 /* IEU1 Group */
|
||||
be,pt %xcc, 21f /* CTI */
|
||||
|
||||
srlx %o3, 56, %g5 /* IEU0 */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 20f /* CTI */
|
||||
stb %g5, [%o0] /* Store */
|
||||
|
||||
add %o0, 1, %o0 /* IEU0 Group */
|
||||
subcc %o2, 1, %o2 /* IEU1 */
|
||||
be,pn %XCC, 19f /* CTI */
|
||||
srlx %o3, 48, %g5 /* IEU0 Group */
|
||||
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 20f /* CTI */
|
||||
stb %g5, [%o0] /* Store */
|
||||
add %o0, 1, %o0 /* IEU0 Group */
|
||||
|
||||
subcc %o2, 1, %o2 /* IEU1 */
|
||||
be,pn %XCC, 19f /* CTI */
|
||||
srlx %o3, 40, %g5 /* IEU0 Group */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 20f /* CTI */
|
||||
stb %g5, [%o0] /* Store */
|
||||
add %o0, 1, %o0 /* IEU0 Group */
|
||||
subcc %o2, 1, %o2 /* IEU1 */
|
||||
|
||||
be,pn %XCC, 19f /* CTI */
|
||||
srlx %o3, 32, %g5 /* IEU0 Group */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 20f /* CTI */
|
||||
|
||||
stb %g5, [%o0] /* Store */
|
||||
add %o0, 1, %o0 /* IEU0 Group */
|
||||
subcc %o2, 1, %o2 /* IEU1 */
|
||||
be,pn %XCC, 19f /* CTI */
|
||||
|
||||
srlx %o3, 24, %g5 /* IEU0 Group */
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 20f /* CTI */
|
||||
stb %g5, [%o0] /* Store */
|
||||
|
||||
add %o0, 1, %o0 /* IEU0 Group */
|
||||
subcc %o2, 1, %o2 /* IEU1 */
|
||||
be,pn %XCC, 19f /* CTI */
|
||||
srlx %o3, 16, %g5 /* IEU0 Group */
|
||||
|
||||
andcc %g5, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 20f /* CTI */
|
||||
stb %g5, [%o0] /* Store */
|
||||
add %o0, 1, %o0 /* IEU0 Group */
|
||||
|
||||
subcc %o2, 1, %o2 /* IEU1 */
|
||||
be,pn %XCC, 19f /* CTI */
|
||||
srlx %o3, 8, %g5 /* IEU0 Group */
|
||||
stb %g5, [%o0] /* Store */
|
||||
|
||||
19: retl /* CTI+IEU1 Group */
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
50: stb %g0, [%o0] /* Store Group */
|
||||
20: subcc %o2, 1, %o2 /* IEU1 Group */
|
||||
|
||||
bne,pt %XCC, 50b /* CTI */
|
||||
add %o0, 1, %o0 /* IEU0 */
|
||||
retl /* CTI+IEU1 Group */
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
|
||||
21: andcc %o2, 4, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 22f /* CTI */
|
||||
srlx %o3, 32, %g5 /* IEU0 */
|
||||
stw %g5, [%o0] /* Store Group */
|
||||
|
||||
add %o0, 4, %o0 /* IEU0 */
|
||||
mov %o3, %g5 /* IEU1 */
|
||||
22: andcc %o2, 2, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 23f /* CTI */
|
||||
|
||||
srlx %g5, 16, %g4 /* IEU0 */
|
||||
sth %g4, [%o0] /* Store Group */
|
||||
add %o0, 2, %o0 /* IEU0 */
|
||||
mov %g5, %g4 /* IEU1 */
|
||||
|
||||
23: srlx %g4, 8, %g4 /* IEU0 Group */
|
||||
andcc %o2, 1, %g0 /* IEU1 */
|
||||
bne,a,pn %icc, 24f /* CTI */
|
||||
stb %g4, [%o0] /* Store Group */
|
||||
|
||||
24: retl /* CTI+IEU1 Group */
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
25: andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
be,a,pn %icc, 4b /* CTI */
|
||||
|
||||
andncc %o2, 31, %g3 /* IEU1 Group */
|
||||
stb %g0, [%o0] /* Store Group */
|
||||
subcc %o2, 1, %o2 /* IEU1 */
|
||||
bne,pt %XCC, 25b /* CTI */
|
||||
|
||||
add %o0, 1, %o0 /* IEU0 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
mov %g7, %o0 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
26: ldub [%o1], %o3 /* Load */
|
||||
sllx %g1, 7, %g2 /* IEU0 Group */
|
||||
stb %o3, [%o0] /* Store */
|
||||
27: subcc %o2, 1, %o2 /* IEU1 */
|
||||
|
||||
be,pn %XCC, 9b /* CTI */
|
||||
add %o1, 1, %o1 /* IEU0 Group */
|
||||
add %o0, 1, %o0 /* IEU1 */
|
||||
andcc %o3, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 25b /* CTI */
|
||||
lduba [%o1] ASI_PNF, %o3 /* Load */
|
||||
andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
bne,a,pt %icc, 27b /* CTI */
|
||||
|
||||
stb %o3, [%o0] /* Store */
|
||||
andcc %o1, 7, %g3 /* IEU1 Group */
|
||||
be,a,pt %icc, 1b /* CTI */
|
||||
ldx [%o1], %o3 /* Load */
|
||||
|
||||
28: orcc %g0, 64, %g4 /* IEU1 Group */
|
||||
sllx %g3, 3, %g5 /* IEU0 */
|
||||
sub %g4, %g5, %g4 /* IEU0 Group */
|
||||
sub %o1, %g3, %o1 /* IEU1 */
|
||||
/* %g1 = 0101010101010101
|
||||
%g2 = 8080808080808080
|
||||
%g3 = source alignment
|
||||
%g5 = number of bits to shift left
|
||||
%g4 = number of bits to shift right */
|
||||
|
||||
ldxa [%o1] ASI_PNF, %o5 /* Load Group */
|
||||
addcc %o1, 8, %o1 /* IEU1 */
|
||||
|
||||
29: sllx %o5, %g5, %o3 /* IEU0 Group */
|
||||
ldxa [%o1] ASI_PNF, %o5 /* Load */
|
||||
subcc %o2, 8, %o2 /* IEU1 */
|
||||
bl,pn %XCC, 17b /* CTI */
|
||||
|
||||
srlx %o5, %g4, %o4 /* IEU0 Group */
|
||||
add %o1, 8, %o1 /* IEU1 */
|
||||
or %o3, %o4, %o3 /* IEU0 Group */
|
||||
add %o0, 8, %o0 /* IEU1 */
|
||||
|
||||
sub %o3, %g1, %o4 /* IEU0 Group */
|
||||
#ifdef EIGHTBIT_NOT_RARE
|
||||
andn %o4, %o3, %o4 /* IEU0 Group */
|
||||
#endif
|
||||
andcc %o4, %g2, %g0 /* IEU1 Group */
|
||||
be,a,pt %xcc, 29b /* CTI */
|
||||
stx %o3, [%o0-8] /* Store */
|
||||
|
||||
srlx %o3, 56, %o4 /* IEU0 Group */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 36f /* CTI */
|
||||
srlx %o3, 48, %o4 /* IEU0 */
|
||||
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 35f /* CTI */
|
||||
srlx %o3, 40, %o4 /* IEU0 */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 34f /* CTI */
|
||||
srlx %o3, 32, %o4 /* IEU0 */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 33f /* CTI */
|
||||
|
||||
srlx %o3, 24, %o4 /* IEU0 */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 32f /* CTI */
|
||||
srlx %o3, 16, %o4 /* IEU0 */
|
||||
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
be,pn %icc, 31f /* CTI */
|
||||
srlx %o3, 8, %o4 /* IEU0 */
|
||||
andcc %o4, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
be,pn %icc, 30f /* CTI */
|
||||
andcc %o3, 0xff, %g0 /* IEU1 Group */
|
||||
bne,pn %icc, 29b /* CTI */
|
||||
stx %o3, [%o0-8] /* Store */
|
||||
|
||||
ba,pt %xcc, 4b /* CTI Group */
|
||||
andncc %o2, 31, %g3 /* IEU1 */
|
||||
30: srlx %o3, 8, %o4 /* IEU0 */
|
||||
ba,pt %xcc, 3b /* CTI */
|
||||
|
||||
sllx %o4, 8, %g3 /* IEU0 Group */
|
||||
31: srlx %o3, 16, %o4 /* IEU0 Group */
|
||||
ba,pt %xcc, 3b /* CTI */
|
||||
sllx %o4, 16, %g3 /* IEU0 Group */
|
||||
|
||||
32: srlx %o3, 24, %o4 /* IEU0 Group */
|
||||
ba,pt %xcc, 3b /* CTI */
|
||||
sllx %o4, 24, %g3 /* IEU0 Group */
|
||||
33: srlx %o3, 32, %o4 /* IEU0 Group */
|
||||
|
||||
ba,pt %xcc, 3b /* CTI */
|
||||
sllx %o4, 32, %g3 /* IEU0 Group */
|
||||
34: srlx %o3, 40, %o4 /* IEU0 Group */
|
||||
ba,pt %xcc, 3b /* CTI */
|
||||
|
||||
sllx %o4, 40, %g3 /* IEU0 Group */
|
||||
35: srlx %o3, 48, %o4 /* IEU0 Group */
|
||||
ba,pt %xcc, 3b /* CTI */
|
||||
sllx %o4, 48, %g3 /* IEU0 Group */
|
||||
|
||||
36: srlx %o3, 56, %o4 /* IEU0 Group */
|
||||
ba,pt %xcc, 3b /* CTI */
|
||||
sllx %o4, 56, %g3 /* IEU0 Group */
|
||||
END(strncpy)
|
229
sysdeps/sparc/sparc64/strpbrk.S
Normal file
229
sysdeps/sparc/sparc64/strpbrk.S
Normal file
@ -0,0 +1,229 @@
|
||||
/* strpbrk (s, accept) -- Find the first occurrence in S of any character in
|
||||
ACCEPT.
|
||||
For SPARC v9.
|
||||
Copyright (C) 1999 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jj@ultra.linux.cz>
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <asm/asi.h>
|
||||
#ifndef XCC
|
||||
#define XCC xcc
|
||||
#define STACK_SIZE 128
|
||||
#define STACK_OFFSET 128+0x7ff
|
||||
#else
|
||||
#define STACK_SIZE 64
|
||||
#define STACK_OFFSET 64
|
||||
#endif
|
||||
|
||||
.text
|
||||
.align 32
|
||||
ENTRY(strpbrk)
|
||||
sub %sp, STACK_SIZE+32, %sp /* IEU0 Group */
|
||||
mov 1, %o4 /* IEU1 */
|
||||
stx %o4, [%sp + STACK_OFFSET] /* Store Group */
|
||||
stx %g0, [%sp + STACK_OFFSET + 8] /* Store Group */
|
||||
|
||||
add %sp, STACK_OFFSET, %o5 /* IEU0 */
|
||||
stx %g0, [%sp + STACK_OFFSET + 16] /* Store Group */
|
||||
stx %g0, [%sp + STACK_OFFSET + 24] /* Store Group */
|
||||
1: ldub [%o1], %o2 /* Load Group */
|
||||
|
||||
brz,pn %o2, 2f /* CTI+IEU1 Group */
|
||||
srl %o2, 3, %o3 /* IEU0 */
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
and %o2, 0x3f, %o2 /* IEU1 */
|
||||
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
sllx %o4, %o2, %g1 /* IEU0 */
|
||||
add %o1, 1, %o1 /* IEU1 */
|
||||
or %g2, %g1, %g2 /* IEU0 Group */
|
||||
|
||||
ba,pt %xcc, 1b /* CTI */
|
||||
stx %g2, [%o5 + %o3] /* Store */
|
||||
2: andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
be,a,pt %xcc, 4f /* CTI */
|
||||
|
||||
ldx [%o0], %o2 /* Load */
|
||||
ldub [%o0], %o2 /* Load Group */
|
||||
3: srl %o2, 3, %o3 /* IEU0 Group */
|
||||
and %o2, 0x3f, %o2 /* IEU1 */
|
||||
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
sllx %o4, %o2, %g1 /* IEU0 */
|
||||
add %o0, 1, %o0 /* IEU1 */
|
||||
|
||||
andcc %g2, %g1, %g0 /* IEU1 Group */
|
||||
bne,pn %xcc, 12f /* CTI */
|
||||
andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
bne,a,pt %icc, 3b /* CTI */
|
||||
|
||||
ldub [%o0], %o2 /* Load */
|
||||
ldx [%o0], %o2 /* Load Group */
|
||||
4: srlx %o2, 59, %o3 /* IEU0 Group */
|
||||
srlx %o2, 56, %g3 /* IEU0 Group */
|
||||
|
||||
5: and %o3, 0x18, %o3 /* IEU1 */
|
||||
andcc %g3, 0x3f, %g3 /* IEU1 Group */
|
||||
ldx [%o5 + %o3], %g2 /* Load */
|
||||
srlx %o2, 51, %o3 /* IEU0 */
|
||||
|
||||
sllx %o4, %g3, %g1 /* IEU0 Group */
|
||||
srlx %o2, 48, %g3 /* IEU0 Group */
|
||||
andcc %g2, %g1, %g2 /* IEU1 */
|
||||
bne,pn %xcc, 13f /* CTI */
|
||||
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
and %g3, 0x3f, %g3 /* IEU1 */
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
srlx %o2, 43, %o3 /* IEU0 */
|
||||
|
||||
sllx %o4, %g3, %g1 /* IEU0 Group */
|
||||
srlx %o2, 40, %g3 /* IEU0 Group */
|
||||
andcc %g2, %g1, %g2 /* IEU1 */
|
||||
bne,pn %xcc, 14f /* CTI */
|
||||
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
and %g3, 0x3f, %g3 /* IEU1 */
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
srlx %o2, 35, %o3 /* IEU0 */
|
||||
|
||||
sllx %o4, %g3, %g1 /* IEU0 Group */
|
||||
srlx %o2, 32, %g3 /* IEU0 Group */
|
||||
andcc %g2, %g1, %g2 /* IEU1 */
|
||||
bne,pn %xcc, 15f /* CTI */
|
||||
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
and %g3, 0x3f, %g3 /* IEU1 */
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
srlx %o2, 27, %o3 /* IEU0 */
|
||||
|
||||
sllx %o4, %g3, %g1 /* IEU0 Group */
|
||||
srlx %o2, 24, %g3 /* IEU0 Group */
|
||||
andcc %g2, %g1, %g2 /* IEU1 */
|
||||
bne,pn %xcc, 16f /* CTI */
|
||||
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
and %g3, 0x3f, %g3 /* IEU1 */
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
srlx %o2, 19, %o3 /* IEU0 */
|
||||
|
||||
sllx %o4, %g3, %g1 /* IEU0 Group */
|
||||
srlx %o2, 16, %g3 /* IEU0 Group */
|
||||
andcc %g2, %g1, %g2 /* IEU1 */
|
||||
bne,pn %xcc, 17f /* CTI */
|
||||
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
and %g3, 0x3f, %g3 /* IEU1 */
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
srlx %o2, 11, %o3 /* IEU0 */
|
||||
|
||||
sllx %o4, %g3, %g1 /* IEU0 Group */
|
||||
add %o0, 8, %o0 /* IEU1 */
|
||||
srlx %o2, 8, %g3 /* IEU0 Group */
|
||||
andcc %g2, %g1, %g2 /* IEU1 */
|
||||
|
||||
bne,pn %xcc, 18f /* CTI */
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
and %g3, 0x3f, %g3 /* IEU1 */
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
|
||||
sllx %o4, %g3, %g1 /* IEU0 */
|
||||
mov %o2, %g5 /* IEU1 */
|
||||
srlx %o2, 3, %o3 /* IEU0 Group */
|
||||
ldxa [%o0] ASI_PNF, %o2 /* Load */
|
||||
|
||||
andcc %g2, %g1, %g2 /* IEU1 Group */
|
||||
bne,pn %xcc, 19f /* CTI */
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
and %g5, 0x3f, %g3 /* IEU1 */
|
||||
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
sllx %o4, %g3, %g1 /* IEU0 */
|
||||
srlx %o2, 59, %o3 /* IEU0 Group */
|
||||
andcc %g2, %g1, %g2 /* IEU1 Group */
|
||||
|
||||
be,pt %xcc, 5b /* CTI */
|
||||
srlx %o2, 56, %g3 /* IEU0 Group */
|
||||
sub %o0, 1, %o0 /* IEU1 */
|
||||
add %sp, STACK_SIZE+32, %sp /* IEU0 Group */
|
||||
|
||||
andcc %g5, 0xff, %g0 /* IEU1 */
|
||||
retl /* CTI+IEU1 Group */
|
||||
move %icc, 0, %o0 /* Single Group */
|
||||
|
||||
.align 16
|
||||
19: sub %o0, 2, %o0 /* IEU1 */
|
||||
srl %g5, 8, %g1 /* IEU0 Group */
|
||||
add %sp, STACK_SIZE+32, %sp /* IEU1 */
|
||||
andcc %g1, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
retl /* CTI+IEU1 Group */
|
||||
move %icc, 0, %o0 /* Single Group */
|
||||
18: sub %o0, 3, %o0 /* IEU1 */
|
||||
srl %o2, 16, %g1 /* IEU0 Group */
|
||||
|
||||
add %sp, STACK_SIZE+32, %sp /* IEU1 */
|
||||
andcc %g1, 0xff, %g0 /* IEU1 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
move %icc, 0, %o0 /* Single Group */
|
||||
|
||||
17: add %o0, 4, %o0 /* IEU1 */
|
||||
srl %o2, 24, %g1 /* IEU0 Group */
|
||||
add %sp, STACK_SIZE+32, %sp /* IEU1 */
|
||||
retl /* CTI+IEU1 Group */
|
||||
|
||||
movrz %g1, 0, %o0 /* Single Group */
|
||||
16: add %o0, 3, %o0 /* IEU1 */
|
||||
srlx %o2, 32, %g1 /* IEU0 Group */
|
||||
add %sp, STACK_SIZE+32, %sp /* IEU1 */
|
||||
|
||||
andcc %g1, 0xff, %g0 /* IEU1 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
move %icc, 0, %o0 /* Single Group */
|
||||
|
||||
.align 16
|
||||
15: add %o0, 2, %o0 /* IEU1 */
|
||||
srlx %o2, 40, %g1 /* IEU0 Group */
|
||||
add %sp, STACK_SIZE+32, %sp /* IEU1 */
|
||||
andcc %g1, 0xff, %g0 /* IEU1 Group */
|
||||
|
||||
retl /* CTI+IEU1 Group */
|
||||
move %icc, 0, %o0 /* Single Group */
|
||||
14: add %o0, 1, %o0 /* IEU1 */
|
||||
srlx %o2, 48, %g1 /* IEU0 Group */
|
||||
|
||||
add %sp, STACK_SIZE+32, %sp /* IEU1 */
|
||||
andcc %g1, 0xff, %g0 /* IEU1 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
move %icc, 0, %o0 /* Single Group */
|
||||
|
||||
13: add %sp, STACK_SIZE+32, %sp /* IEU1 */
|
||||
srlx %o2, 56, %g1 /* IEU0 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
movrz %g1, 0, %o0 /* Single Group */
|
||||
|
||||
.align 16
|
||||
12: sub %o0, 1, %o0 /* IEU0 Group */
|
||||
or %o3, %o2, %g1 /* IEU1 */
|
||||
add %sp, STACK_SIZE+32, %sp /* IEU0 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
|
||||
movrz %g1, 0, %o0 /* Single Group */
|
||||
END(strpbrk)
|
1
sysdeps/sparc/sparc64/strrchr.c
Normal file
1
sysdeps/sparc/sparc64/strrchr.c
Normal file
@ -0,0 +1 @@
|
||||
/* strrchr is in strchr.S */
|
211
sysdeps/sparc/sparc64/strspn.S
Normal file
211
sysdeps/sparc/sparc64/strspn.S
Normal file
@ -0,0 +1,211 @@
|
||||
/* strspn (str, ss) -- Return the length of the maximum initial segment
|
||||
of S which contains only characters in ACCEPT.
|
||||
For SPARC v9.
|
||||
Copyright (C) 1999 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Jakub Jelinek <jj@ultra.linux.cz>
|
||||
|
||||
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., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <asm/asi.h>
|
||||
#ifndef XCC
|
||||
#define XCC xcc
|
||||
#define STACK_SIZE 128
|
||||
#define STACK_OFFSET 128+0x7ff
|
||||
#else
|
||||
#define STACK_SIZE 64
|
||||
#define STACK_OFFSET 64
|
||||
#endif
|
||||
|
||||
.text
|
||||
.align 32
|
||||
ENTRY(strspn)
|
||||
sub %sp, STACK_SIZE+32, %sp /* IEU0 Group */
|
||||
mov 1, %o4 /* IEU1 */
|
||||
stx %g0, [%sp + STACK_OFFSET] /* Store Group */
|
||||
mov %o0, %g7 /* IEU0 */
|
||||
|
||||
stx %g0, [%sp + STACK_OFFSET + 8] /* Store Group */
|
||||
add %sp, STACK_OFFSET, %o5 /* IEU0 */
|
||||
stx %g0, [%sp + STACK_OFFSET + 16] /* Store Group */
|
||||
stx %g0, [%sp + STACK_OFFSET + 24] /* Store Group */
|
||||
|
||||
1: ldub [%o1], %o2 /* Load Group */
|
||||
brz,pn %o2, 2f /* CTI+IEU1 Group */
|
||||
srl %o2, 3, %o3 /* IEU0 */
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
|
||||
and %o2, 0x3f, %o2 /* IEU1 */
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
sllx %o4, %o2, %g1 /* IEU0 */
|
||||
add %o1, 1, %o1 /* IEU1 */
|
||||
|
||||
or %g2, %g1, %g2 /* IEU0 Group */
|
||||
ba,pt %xcc, 1b /* CTI */
|
||||
stx %g2, [%o5 + %o3] /* Store */
|
||||
2: andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
|
||||
be,a,pt %xcc, 4f /* CTI */
|
||||
ldx [%o0], %o2 /* Load */
|
||||
ldub [%o0], %o2 /* Load Group */
|
||||
3: srl %o2, 3, %o3 /* IEU0 Group */
|
||||
|
||||
and %o2, 0x3f, %o2 /* IEU1 */
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
sllx %o4, %o2, %g1 /* IEU0 */
|
||||
|
||||
add %o0, 1, %o0 /* IEU1 */
|
||||
andcc %g2, %g1, %g0 /* IEU1 Group */
|
||||
be,pn %xcc, 12f /* CTI */
|
||||
andcc %o0, 7, %g0 /* IEU1 Group */
|
||||
|
||||
bne,a,pt %icc, 3b /* CTI */
|
||||
ldub [%o0], %o2 /* Load */
|
||||
ldx [%o0], %o2 /* Load Group */
|
||||
4: srlx %o2, 59, %o3 /* IEU0 Group */
|
||||
|
||||
srlx %o2, 56, %g3 /* IEU0 Group */
|
||||
5: and %o3, 0x18, %o3 /* IEU1 */
|
||||
andcc %g3, 0x3f, %g3 /* IEU1 Group */
|
||||
ldx [%o5 + %o3], %g2 /* Load */
|
||||
|
||||
srlx %o2, 51, %o3 /* IEU0 */
|
||||
sllx %o4, %g3, %g1 /* IEU0 Group */
|
||||
srlx %o2, 48, %g3 /* IEU0 Group */
|
||||
andcc %g2, %g1, %g2 /* IEU1 */
|
||||
|
||||
be,pn %xcc, 13f /* CTI */
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
and %g3, 0x3f, %g3 /* IEU1 */
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
|
||||
srlx %o2, 43, %o3 /* IEU0 */
|
||||
sllx %o4, %g3, %g1 /* IEU0 Group */
|
||||
srlx %o2, 40, %g3 /* IEU0 Group */
|
||||
andcc %g2, %g1, %g2 /* IEU1 */
|
||||
|
||||
be,pn %xcc, 14f /* CTI */
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
and %g3, 0x3f, %g3 /* IEU1 */
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
|
||||
srlx %o2, 35, %o3 /* IEU0 */
|
||||
sllx %o4, %g3, %g1 /* IEU0 Group */
|
||||
srlx %o2, 32, %g3 /* IEU0 Group */
|
||||
andcc %g2, %g1, %g2 /* IEU1 */
|
||||
|
||||
be,pn %xcc, 15f /* CTI */
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
and %g3, 0x3f, %g3 /* IEU1 */
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
|
||||
srlx %o2, 27, %o3 /* IEU0 */
|
||||
sllx %o4, %g3, %g1 /* IEU0 Group */
|
||||
srlx %o2, 24, %g3 /* IEU0 Group */
|
||||
andcc %g2, %g1, %g2 /* IEU1 */
|
||||
|
||||
be,pn %xcc, 16f /* CTI */
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
and %g3, 0x3f, %g3 /* IEU1 */
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
|
||||
srlx %o2, 19, %o3 /* IEU0 */
|
||||
sllx %o4, %g3, %g1 /* IEU0 Group */
|
||||
srlx %o2, 16, %g3 /* IEU0 Group */
|
||||
andcc %g2, %g1, %g2 /* IEU1 */
|
||||
|
||||
be,pn %xcc, 17f /* CTI */
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
and %g3, 0x3f, %g3 /* IEU1 */
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
|
||||
srlx %o2, 11, %o3 /* IEU0 */
|
||||
sllx %o4, %g3, %g1 /* IEU0 Group */
|
||||
add %o0, 8, %o0 /* IEU1 */
|
||||
srlx %o2, 8, %g3 /* IEU0 Group */
|
||||
|
||||
andcc %g2, %g1, %g2 /* IEU1 */
|
||||
be,pn %xcc, 18f /* CTI */
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
and %g3, 0x3f, %g3 /* IEU1 */
|
||||
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
sllx %o4, %g3, %g1 /* IEU0 */
|
||||
mov %o2, %g3 /* IEU1 */
|
||||
srlx %o2, 3, %o3 /* IEU0 Group */
|
||||
|
||||
ldxa [%o0] ASI_PNF, %o2 /* Load */
|
||||
andcc %g2, %g1, %g2 /* IEU1 Group */
|
||||
be,pn %xcc, 19f /* CTI */
|
||||
and %o3, 0x18, %o3 /* IEU0 Group */
|
||||
|
||||
and %g3, 0x3f, %g3 /* IEU1 */
|
||||
ldx [%o5 + %o3], %g2 /* Load Group */
|
||||
sllx %o4, %g3, %g1 /* IEU0 */
|
||||
srlx %o2, 59, %o3 /* IEU0 Group */
|
||||
|
||||
andcc %g2, %g1, %g2 /* IEU1 Group */
|
||||
bne,pt %xcc, 5b /* CTI */
|
||||
srlx %o2, 56, %g3 /* IEU0 Group */
|
||||
sub %o0, 1, %o0 /* IEU1 */
|
||||
|
||||
add %sp, STACK_SIZE+32, %sp /* IEU0 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %g7, %o0 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
19: sub %o0, 2, %o0 /* IEU1 */
|
||||
add %sp, STACK_SIZE+32, %sp /* IEU0 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %g7, %o0 /* IEU0 */
|
||||
|
||||
18: sub %o0, 3, %o0 /* IEU1 */
|
||||
add %sp, STACK_SIZE+32, %sp /* IEU0 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %g7, %o0 /* IEU0 */
|
||||
|
||||
17: add %o0, 4, %o0 /* IEU1 */
|
||||
add %sp, STACK_SIZE+32, %sp /* IEU0 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %g7, %o0 /* IEU0 */
|
||||
|
||||
16: add %o0, 3, %o0 /* IEU1 */
|
||||
add %sp, STACK_SIZE+32, %sp /* IEU0 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %g7, %o0 /* IEU0 */
|
||||
|
||||
15: add %o0, 2, %o0 /* IEU1 */
|
||||
add %sp, STACK_SIZE+32, %sp /* IEU0 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %g7, %o0 /* IEU0 */
|
||||
|
||||
14: add %o0, 1, %o0 /* IEU1 */
|
||||
add %sp, STACK_SIZE+32, %sp /* IEU0 Group */
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %g7, %o0 /* IEU0 */
|
||||
|
||||
13: add %sp, STACK_SIZE+32, %sp /* IEU1 */
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %g7, %o0 /* IEU0 */
|
||||
|
||||
.align 16
|
||||
12: sub %o0, 1, %o0 /* IEU0 Group */
|
||||
add %sp, STACK_SIZE+32, %sp /* IEU1 */
|
||||
retl /* CTI+IEU1 Group */
|
||||
sub %o0, %g7, %o0 /* IEU0 */
|
||||
END(strspn)
|
@ -1,5 +1,5 @@
|
||||
asm-CPPFLAGS=-D__ASSEMBLY__
|
||||
ASFLAGS-.os=-fPIC
|
||||
asm-CPPFLAGS = -D__ASSEMBLY__
|
||||
ASFLAGS-.os += -fPIC
|
||||
|
||||
ifeq ($(subdir),misc)
|
||||
sysdep_routines += setfsgid setfsuid setresgid setresuid
|
||||
|
Loading…
x
Reference in New Issue
Block a user