about summary refs log tree commit diff
path: root/sysdeps/sparc/sparc32
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/sparc/sparc32')
-rw-r--r--sysdeps/sparc/sparc32/bcopy.c1
-rw-r--r--sysdeps/sparc/sparc32/bzero.c1
-rw-r--r--sysdeps/sparc/sparc32/memchr.S143
-rw-r--r--sysdeps/sparc/sparc32/memcpy.S974
-rw-r--r--sysdeps/sparc/sparc32/memmove.c1
-rw-r--r--sysdeps/sparc/sparc32/memset.S154
-rw-r--r--sysdeps/sparc/sparc32/sparcv8/Makefile1
-rw-r--r--sysdeps/sparc/sparc32/sparcv8/rem.S3
-rw-r--r--sysdeps/sparc/sparc32/sparcv8/sdiv.S10
-rw-r--r--sysdeps/sparc/sparc32/sparcv8/udiv.S2
-rw-r--r--sysdeps/sparc/sparc32/sparcv8/urem.S3
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/Makefile1
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/bcopy.c1
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/bzero.c1
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/dotmul.S17
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/memchr.S4
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/memcmp.S4
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/memcpy.S4
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/memset.S4
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/rem.S22
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/sdiv.S20
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/stpcpy.S4
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/stpncpy.S4
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/strcat.S4
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/strchr.S4
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/strcmp.S4
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/strcpy.S4
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/strcspn.S4
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/strlen.S4
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/strncmp.S4
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/strncpy.S4
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/strpbrk.S4
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/strrchr.c1
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/strspn.S4
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/udiv.S17
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/umul.S17
-rw-r--r--sysdeps/sparc/sparc32/sparcv9/urem.S19
-rw-r--r--sysdeps/sparc/sparc32/stpcpy.S163
-rw-r--r--sysdeps/sparc/sparc32/strcat.S348
-rw-r--r--sysdeps/sparc/sparc32/strchr.S282
-rw-r--r--sysdeps/sparc/sparc32/strcmp.S257
-rw-r--r--sysdeps/sparc/sparc32/strcpy.S274
-rw-r--r--sysdeps/sparc/sparc32/strlen.S102
-rw-r--r--sysdeps/sparc/sparc32/strrchr.c1
44 files changed, 2898 insertions, 2 deletions
diff --git a/sysdeps/sparc/sparc32/bcopy.c b/sysdeps/sparc/sparc32/bcopy.c
new file mode 100644
index 0000000000..9a455f33c4
--- /dev/null
+++ b/sysdeps/sparc/sparc32/bcopy.c
@@ -0,0 +1 @@
+/* bcopy is in memcpy.S */
diff --git a/sysdeps/sparc/sparc32/bzero.c b/sysdeps/sparc/sparc32/bzero.c
new file mode 100644
index 0000000000..37f0f6f993
--- /dev/null
+++ b/sysdeps/sparc/sparc32/bzero.c
@@ -0,0 +1 @@
+/* bzero is in memset.S */
diff --git a/sysdeps/sparc/sparc32/memchr.S b/sysdeps/sparc/sparc32/memchr.S
new file mode 100644
index 0000000000..270216e6d8
--- /dev/null
+++ b/sysdeps/sparc/sparc32/memchr.S
@@ -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)
diff --git a/sysdeps/sparc/sparc32/memcpy.S b/sysdeps/sparc/sparc32/memcpy.S
new file mode 100644
index 0000000000..24d9e04346
--- /dev/null
+++ b/sysdeps/sparc/sparc32/memcpy.S
@@ -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)
diff --git a/sysdeps/sparc/sparc32/memmove.c b/sysdeps/sparc/sparc32/memmove.c
new file mode 100644
index 0000000000..a8d2d49948
--- /dev/null
+++ b/sysdeps/sparc/sparc32/memmove.c
@@ -0,0 +1 @@
+/* memmove is in memcpy.S */
diff --git a/sysdeps/sparc/sparc32/memset.S b/sysdeps/sparc/sparc32/memset.S
new file mode 100644
index 0000000000..65e3243b3a
--- /dev/null
+++ b/sysdeps/sparc/sparc32/memset.S
@@ -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)
diff --git a/sysdeps/sparc/sparc32/sparcv8/Makefile b/sysdeps/sparc/sparc32/sparcv8/Makefile
new file mode 100644
index 0000000000..02139eceb0
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv8/Makefile
@@ -0,0 +1 @@
+CFLAGS += -mv8
diff --git a/sysdeps/sparc/sparc32/sparcv8/rem.S b/sysdeps/sparc/sparc32/sparcv8/rem.S
index 061e80093c..a2694e699e 100644
--- a/sysdeps/sparc/sparc32/sparcv8/rem.S
+++ b/sysdeps/sparc/sparc32/sparcv8/rem.S
@@ -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
diff --git a/sysdeps/sparc/sparc32/sparcv8/sdiv.S b/sysdeps/sparc/sparc32/sparcv8/sdiv.S
index 81c3ac1c97..bfc4acf2fa 100644
--- a/sysdeps/sparc/sparc32/sparcv8/sdiv.S
+++ b/sysdeps/sparc/sparc32/sparcv8/sdiv.S
@@ -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)
diff --git a/sysdeps/sparc/sparc32/sparcv8/udiv.S b/sysdeps/sparc/sparc32/sparcv8/udiv.S
index 4e3cddc63f..d71954351e 100644
--- a/sysdeps/sparc/sparc32/sparcv8/udiv.S
+++ b/sysdeps/sparc/sparc32/sparcv8/udiv.S
@@ -7,6 +7,8 @@
 ENTRY(.udiv)
 
 	wr	%g0, 0, %y
+	nop
+	nop
 	retl
 	 udiv	%o0, %o1, %o0
 
diff --git a/sysdeps/sparc/sparc32/sparcv8/urem.S b/sysdeps/sparc/sparc32/sparcv8/urem.S
index 81e123f3da..cc2689d514 100644
--- a/sysdeps/sparc/sparc32/sparcv8/urem.S
+++ b/sysdeps/sparc/sparc32/sparcv8/urem.S
@@ -7,6 +7,9 @@
 ENTRY(.urem)
 
 	wr	%g0, 0, %y
+	nop
+	nop
+	nop
 	udiv	%o0, %o1, %o2
 	umul	%o2, %o1, %o2
 	retl
diff --git a/sysdeps/sparc/sparc32/sparcv9/Makefile b/sysdeps/sparc/sparc32/sparcv9/Makefile
new file mode 100644
index 0000000000..00675fd671
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/Makefile
@@ -0,0 +1 @@
+CFLAGS += -mv8 -mtune=ultrasparc
diff --git a/sysdeps/sparc/sparc32/sparcv9/bcopy.c b/sysdeps/sparc/sparc32/sparcv9/bcopy.c
new file mode 100644
index 0000000000..9a455f33c4
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/bcopy.c
@@ -0,0 +1 @@
+/* bcopy is in memcpy.S */
diff --git a/sysdeps/sparc/sparc32/sparcv9/bzero.c b/sysdeps/sparc/sparc32/sparcv9/bzero.c
new file mode 100644
index 0000000000..37f0f6f993
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/bzero.c
@@ -0,0 +1 @@
+/* bzero is in memset.S */
diff --git a/sysdeps/sparc/sparc32/sparcv9/dotmul.S b/sysdeps/sparc/sparc32/sparcv9/dotmul.S
new file mode 100644
index 0000000000..811cf1e89e
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/dotmul.S
@@ -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)
diff --git a/sysdeps/sparc/sparc32/sparcv9/memchr.S b/sysdeps/sparc/sparc32/sparcv9/memchr.S
new file mode 100644
index 0000000000..c5dfbef184
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/memchr.S
@@ -0,0 +1,4 @@
+#define ASI_PNF     0x82
+#define ASI_BLK_P   0xf0
+#define XCC icc
+#include <sparc64/memchr.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/memcmp.S b/sysdeps/sparc/sparc32/sparcv9/memcmp.S
new file mode 100644
index 0000000000..44878f4486
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/memcmp.S
@@ -0,0 +1,4 @@
+#define ASI_PNF     0x82
+#define ASI_BLK_P   0xf0
+#define XCC icc
+#include <sparc64/memcmp.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/memcpy.S b/sysdeps/sparc/sparc32/sparcv9/memcpy.S
new file mode 100644
index 0000000000..675ec496b9
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/memcpy.S
@@ -0,0 +1,4 @@
+#define ASI_PNF     0x82
+#define ASI_BLK_P   0xf0
+#define XCC icc
+#include <sparc64/memcpy.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/memset.S b/sysdeps/sparc/sparc32/sparcv9/memset.S
new file mode 100644
index 0000000000..ac67b7ab7c
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/memset.S
@@ -0,0 +1,4 @@
+#define ASI_PNF     0x82
+#define ASI_BLK_P   0xf0
+#define XCC icc
+#include <sparc64/memset.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/rem.S b/sysdeps/sparc/sparc32/sparcv9/rem.S
new file mode 100644
index 0000000000..5385bd8305
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/rem.S
@@ -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)
diff --git a/sysdeps/sparc/sparc32/sparcv9/sdiv.S b/sysdeps/sparc/sparc32/sparcv9/sdiv.S
new file mode 100644
index 0000000000..d765514cea
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/sdiv.S
@@ -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)
diff --git a/sysdeps/sparc/sparc32/sparcv9/stpcpy.S b/sysdeps/sparc/sparc32/sparcv9/stpcpy.S
new file mode 100644
index 0000000000..440ad7e215
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/stpcpy.S
@@ -0,0 +1,4 @@
+#define ASI_PNF     0x82
+#define ASI_BLK_P   0xf0
+#define XCC icc
+#include <sparc64/stpcpy.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/stpncpy.S b/sysdeps/sparc/sparc32/sparcv9/stpncpy.S
new file mode 100644
index 0000000000..124136a0b2
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/stpncpy.S
@@ -0,0 +1,4 @@
+#define ASI_PNF     0x82
+#define ASI_BLK_P   0xf0
+#define XCC icc
+#include <sparc64/stpncpy.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/strcat.S b/sysdeps/sparc/sparc32/sparcv9/strcat.S
new file mode 100644
index 0000000000..7a22235703
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/strcat.S
@@ -0,0 +1,4 @@
+#define ASI_PNF     0x82
+#define ASI_BLK_P   0xf0
+#define XCC icc
+#include <sparc64/strcat.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/strchr.S b/sysdeps/sparc/sparc32/sparcv9/strchr.S
new file mode 100644
index 0000000000..ddd32120d4
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/strchr.S
@@ -0,0 +1,4 @@
+#define ASI_PNF     0x82
+#define ASI_BLK_P   0xf0
+#define XCC icc
+#include <sparc64/strchr.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/strcmp.S b/sysdeps/sparc/sparc32/sparcv9/strcmp.S
new file mode 100644
index 0000000000..5330f4359b
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/strcmp.S
@@ -0,0 +1,4 @@
+#define ASI_PNF     0x82
+#define ASI_BLK_P   0xf0
+#define XCC icc
+#include <sparc64/strcmp.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/strcpy.S b/sysdeps/sparc/sparc32/sparcv9/strcpy.S
new file mode 100644
index 0000000000..0b35c9be08
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/strcpy.S
@@ -0,0 +1,4 @@
+#define ASI_PNF     0x82
+#define ASI_BLK_P   0xf0
+#define XCC icc
+#include <sparc64/strcpy.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/strcspn.S b/sysdeps/sparc/sparc32/sparcv9/strcspn.S
new file mode 100644
index 0000000000..f9d6beabe4
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/strcspn.S
@@ -0,0 +1,4 @@
+#define ASI_PNF     0x82
+#define ASI_BLK_P   0xf0
+#define XCC icc
+#include <sparc64/strcspn.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/strlen.S b/sysdeps/sparc/sparc32/sparcv9/strlen.S
new file mode 100644
index 0000000000..b8f4dba4f4
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/strlen.S
@@ -0,0 +1,4 @@
+#define ASI_PNF     0x82
+#define ASI_BLK_P   0xf0
+#define XCC icc
+#include <sparc64/strlen.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/strncmp.S b/sysdeps/sparc/sparc32/sparcv9/strncmp.S
new file mode 100644
index 0000000000..addd89e05b
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/strncmp.S
@@ -0,0 +1,4 @@
+#define ASI_PNF     0x82
+#define ASI_BLK_P   0xf0
+#define XCC icc
+#include <sparc64/strncmp.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/strncpy.S b/sysdeps/sparc/sparc32/sparcv9/strncpy.S
new file mode 100644
index 0000000000..688f9dfd65
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/strncpy.S
@@ -0,0 +1,4 @@
+#define ASI_PNF     0x82
+#define ASI_BLK_P   0xf0
+#define XCC icc
+#include <sparc64/strncpy.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/strpbrk.S b/sysdeps/sparc/sparc32/sparcv9/strpbrk.S
new file mode 100644
index 0000000000..62294c0af4
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/strpbrk.S
@@ -0,0 +1,4 @@
+#define ASI_PNF     0x82
+#define ASI_BLK_P   0xf0
+#define XCC icc
+#include <sparc64/strpbrk.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/strrchr.c b/sysdeps/sparc/sparc32/sparcv9/strrchr.c
new file mode 100644
index 0000000000..ec608d6ab3
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/strrchr.c
@@ -0,0 +1 @@
+/* strrchr is in strchr.S */
diff --git a/sysdeps/sparc/sparc32/sparcv9/strspn.S b/sysdeps/sparc/sparc32/sparcv9/strspn.S
new file mode 100644
index 0000000000..291e798085
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/strspn.S
@@ -0,0 +1,4 @@
+#define ASI_PNF     0x82
+#define ASI_BLK_P   0xf0
+#define XCC icc
+#include <sparc64/strspn.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/udiv.S b/sysdeps/sparc/sparc32/sparcv9/udiv.S
new file mode 100644
index 0000000000..de79899756
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/udiv.S
@@ -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)
diff --git a/sysdeps/sparc/sparc32/sparcv9/umul.S b/sysdeps/sparc/sparc32/sparcv9/umul.S
new file mode 100644
index 0000000000..608b72aca1
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/umul.S
@@ -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)
diff --git a/sysdeps/sparc/sparc32/sparcv9/urem.S b/sysdeps/sparc/sparc32/sparcv9/urem.S
new file mode 100644
index 0000000000..cab16c9193
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/urem.S
@@ -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)
diff --git a/sysdeps/sparc/sparc32/stpcpy.S b/sysdeps/sparc/sparc32/stpcpy.S
new file mode 100644
index 0000000000..9d496dd8a9
--- /dev/null
+++ b/sysdeps/sparc/sparc32/stpcpy.S
@@ -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)
diff --git a/sysdeps/sparc/sparc32/strcat.S b/sysdeps/sparc/sparc32/strcat.S
new file mode 100644
index 0000000000..d901087672
--- /dev/null
+++ b/sysdeps/sparc/sparc32/strcat.S
@@ -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)
diff --git a/sysdeps/sparc/sparc32/strchr.S b/sysdeps/sparc/sparc32/strchr.S
new file mode 100644
index 0000000000..d1a70ad7ff
--- /dev/null
+++ b/sysdeps/sparc/sparc32/strchr.S
@@ -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)
diff --git a/sysdeps/sparc/sparc32/strcmp.S b/sysdeps/sparc/sparc32/strcmp.S
new file mode 100644
index 0000000000..99c6e6f399
--- /dev/null
+++ b/sysdeps/sparc/sparc32/strcmp.S
@@ -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)
diff --git a/sysdeps/sparc/sparc32/strcpy.S b/sysdeps/sparc/sparc32/strcpy.S
new file mode 100644
index 0000000000..e376bb41b8
--- /dev/null
+++ b/sysdeps/sparc/sparc32/strcpy.S
@@ -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)
diff --git a/sysdeps/sparc/sparc32/strlen.S b/sysdeps/sparc/sparc32/strlen.S
new file mode 100644
index 0000000000..2dc9a9d33c
--- /dev/null
+++ b/sysdeps/sparc/sparc32/strlen.S
@@ -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)
diff --git a/sysdeps/sparc/sparc32/strrchr.c b/sysdeps/sparc/sparc32/strrchr.c
new file mode 100644
index 0000000000..ec608d6ab3
--- /dev/null
+++ b/sysdeps/sparc/sparc32/strrchr.c
@@ -0,0 +1 @@
+/* strrchr is in strchr.S */