Blame sysdeps/sparc/sparc32/strcat.S

Packit 6c4009
/* strcat (dest, src) -- Append SRC on the end of DEST.
Packit 6c4009
   For SPARC v7.
Packit 6c4009
   Copyright (C) 1996-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
   Contributed by Jakub Jelinek <jj@ultra.linux.cz>.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library; if not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#include <sysdep.h>
Packit 6c4009
Packit 6c4009
	/* Normally, this uses ((xword - 0x01010101) & 0x80808080) test
Packit 6c4009
	   to find out if any byte in xword could be zero. This is fast, but
Packit 6c4009
	   also gives false alarm for any byte in range 0x81-0xff. It does
Packit 6c4009
	   not matter for correctness, as if this test tells us there could
Packit 6c4009
	   be some zero byte, we check it byte by byte, but if bytes with
Packit 6c4009
	   high bits set are common in the strings, then this will give poor
Packit 6c4009
	   performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
Packit 6c4009
	   will use one tick slower, but more precise test
Packit 6c4009
	   ((xword - 0x01010101) & (~xword) & 0x80808080),
Packit 6c4009
	   which does not give any false alarms (but if some bits are set,
Packit 6c4009
	   one cannot assume from it which bytes are zero and which are not).
Packit 6c4009
	   It is yet to be measured, what is the correct default for glibc
Packit 6c4009
	   in these days for an average user.
Packit 6c4009
	 */
Packit 6c4009
Packit 6c4009
	.text
Packit 6c4009
	.align		4
Packit 6c4009
Packit 6c4009
ENTRY(strcat)
Packit 6c4009
	mov		%o0, %g2
Packit 6c4009
	andcc		%o0, 3, %g0
Packit 6c4009
	be		30f
Packit 6c4009
	 sethi		%hi(0x80808080), %o4
Packit 6c4009
Packit 6c4009
	ldub		[%o0], %o5
Packit 6c4009
	cmp		%o5, 0
Packit 6c4009
	be		1f
Packit 6c4009
	 add		%o0, 1, %o0
Packit 6c4009
	andcc		%o0, 3, %g0
Packit 6c4009
	be		7f
Packit 6c4009
	 or		%o4, %lo(0x80808080), %o3
Packit 6c4009
	ldub		[%o0], %o5
Packit 6c4009
	cmp		%o5, 0
Packit 6c4009
	be		2f
Packit 6c4009
	 add		%o0, 1, %o0
Packit 6c4009
	andcc		%o0, 3, %g0
Packit 6c4009
	be		8f
Packit 6c4009
	 sethi		%hi(0x01010101), %o4
Packit 6c4009
	ldub		[%o0], %o5
Packit 6c4009
	cmp		%o5, 0
Packit 6c4009
	be		3f
Packit 6c4009
	 add		%o0, 1, %o0
Packit 6c4009
	b		9f
Packit 6c4009
	 or		%o4, %lo(0x01010101), %o2
Packit 6c4009
1:	or		%o4, %lo(0x80808080), %o3
Packit 6c4009
2:	sethi		%hi(0x01010101), %o4
Packit 6c4009
3:	or		%o4, %lo(0x01010101), %o2
Packit 6c4009
	b		3f
Packit 6c4009
	 sub		%o0, 1, %o0
Packit 6c4009
Packit 6c4009
30:	or		%o4, %lo(0x80808080), %o3
Packit 6c4009
7:	sethi		%hi(0x01010101), %o4
Packit 6c4009
8:	or		%o4, %lo(0x01010101), %o2
Packit 6c4009
9:	ld		[%o0], %o5
Packit 6c4009
7:	sub		%o5, %o2, %o4
Packit 6c4009
#ifdef EIGHTBIT_NOT_RARE
Packit 6c4009
	andn		%o4, %o5, %o4
Packit 6c4009
#endif
Packit 6c4009
	andcc		%o4, %o3, %g0
Packit 6c4009
	be		9b
Packit 6c4009
	 add		%o0, 4, %o0
Packit 6c4009
Packit 6c4009
	srl		%o5, 24, %g5
Packit 6c4009
	andcc		%g5, 0xff, %g0
Packit 6c4009
	be		3f
Packit 6c4009
	 add		%o0, -4, %o0
Packit 6c4009
	srl		%o5, 16, %g5
Packit 6c4009
	andcc		%g5, 0xff, %g0
Packit 6c4009
	be		3f
Packit 6c4009
	 add		%o0, 1, %o0
Packit 6c4009
	srl		%o5, 8, %g5
Packit 6c4009
	andcc		%g5, 0xff, %g0
Packit 6c4009
	be		3f
Packit 6c4009
	 add		%o0, 1, %o0
Packit 6c4009
	andcc		%o5, 0xff, %g0
Packit 6c4009
	add		%o0, 2, %o0
Packit 6c4009
	bne,a		7b
Packit 6c4009
	 ld		[%o0], %o5
Packit 6c4009
	sub		%o0, 1, %o0
Packit 6c4009
3:	andcc		%o1, 3, %o4
Packit 6c4009
	be		4f
Packit 6c4009
	 nop
Packit 6c4009
Packit 6c4009
	cmp		%o4, 2
Packit 6c4009
	be		11f
Packit 6c4009
	 cmp		%o4, 3
Packit 6c4009
	ldub		[%o1], %o5
Packit 6c4009
	add		%o1, 1, %o1
Packit 6c4009
	stb		%o5, [%o0]
Packit 6c4009
	be		13f
Packit 6c4009
	 cmp		%o5, 0
Packit 6c4009
	be		0f
Packit 6c4009
	 add		%o0, 1, %o0
Packit 6c4009
11:	lduh		[%o1], %o5
Packit 6c4009
	add		%o1, 2, %o1
Packit 6c4009
	srl		%o5, 8, %o4
Packit 6c4009
	cmp		%o4, 0
Packit 6c4009
	stb		%o4, [%o0]
Packit 6c4009
	bne,a		12f
Packit 6c4009
	 stb		%o5, [%o0 + 1]
Packit 6c4009
	retl
Packit 6c4009
	 mov		%g2, %o0
Packit 6c4009
12:	andcc		%o5, 0xff, %o5
Packit 6c4009
	bne		4f
Packit 6c4009
	 add		%o0, 2, %o0
Packit 6c4009
	retl
Packit 6c4009
	 mov 		%g2, %o0
Packit 6c4009
13:	bne		4f
Packit 6c4009
	 add		%o0, 1, %o0
Packit 6c4009
	retl
Packit 6c4009
	 mov		%g2, %o0
Packit 6c4009
Packit 6c4009
4:	andcc		%o0, 3, %g3
Packit 6c4009
	bne		12f
Packit 6c4009
1:	ld		[%o1], %o5
Packit 6c4009
	add		%o1, 4, %o1
Packit 6c4009
	sub		%o5, %o2, %o4
Packit 6c4009
#ifdef EIGHTBIT_NOT_RARE
Packit 6c4009
	andn		%o4, %o5, %o4
Packit 6c4009
#endif
Packit 6c4009
	add		%o0, 4, %o0
Packit 6c4009
	andcc		%o4, %o3, %g0
Packit 6c4009
	be,a		1b
Packit 6c4009
	 st		%o5, [%o0 - 4]
Packit 6c4009
Packit 6c4009
	srl		%o5, 24, %g5
Packit 6c4009
	andcc		%g5, 0xff, %g0
Packit 6c4009
	be		1f
Packit 6c4009
	 srl		%o5, 16, %g5
Packit 6c4009
	andcc		%g5, 0xff, %g0
Packit 6c4009
	be		2f
Packit 6c4009
	 srl		%o5, 8, %g5
Packit 6c4009
	andcc		%g5, 0xff, %g0
Packit 6c4009
	be		3f
Packit 6c4009
	 andcc		%o5, 0xff, %g0
Packit 6c4009
	bne		1b
Packit 6c4009
	 st		%o5, [%o0 - 4]
Packit 6c4009
	retl
Packit 6c4009
	 mov		%g2, %o0
Packit 6c4009
3:	srl		%o5, 16, %o5
Packit 6c4009
	sth		%o5, [%o0 - 4]
Packit 6c4009
	stb		%g0, [%o0 - 2]
Packit 6c4009
	retl
Packit 6c4009
	 mov		%g2, %o0
Packit 6c4009
2:	srl		%o5, 16, %o5
Packit 6c4009
	sth		%o5, [%o0 - 4]
Packit 6c4009
	retl
Packit 6c4009
	 mov		%g2, %o0
Packit 6c4009
1:	stb		%g0, [%o0 - 4]
Packit 6c4009
	retl
Packit 6c4009
	 mov		%g2, %o0
Packit 6c4009
Packit 6c4009
12:	add		%o1, 4, %o1
Packit 6c4009
	sub		%o5, %o2, %o4
Packit 6c4009
	cmp		%g3, 2
Packit 6c4009
	be		2f
Packit 6c4009
	 cmp		%g3, 3
Packit 6c4009
	be		3f
Packit 6c4009
	 andcc		%o4, %o3, %g0
Packit 6c4009
	bne		5f
Packit 6c4009
	 srl		%o5, 24, %g5
Packit 6c4009
	stb		%g5, [%o0]
Packit 6c4009
	sub		%o0, 1, %o0
Packit 6c4009
	srl		%o5, 8, %g5
Packit 6c4009
	sth		%g5, [%o0 + 2]
Packit 6c4009
1:	add		%o0, 4, %o0
Packit 6c4009
4:	sll		%o5, 24, %g6
Packit 6c4009
	ld		[%o1], %o5
Packit 6c4009
	add		%o1, 4, %o1
Packit 6c4009
	srl		%o5, 8, %g5
Packit 6c4009
	sub		%o5, %o2, %o4
Packit 6c4009
#ifdef EIGHTBIT_NOT_RARE
Packit 6c4009
	andn		%o4, %o5, %o4
Packit 6c4009
#endif
Packit 6c4009
	or		%g5, %g6, %g5
Packit 6c4009
	andcc		%o4, %o3, %g0
Packit 6c4009
	be,a		1b
Packit 6c4009
	 st		%g5, [%o0]
Packit 6c4009
	srl		%o5, 24, %o4
Packit 6c4009
	andcc		%o4, 0xff, %g0
Packit 6c4009
	be		6f
Packit 6c4009
	 srl		%o5, 16, %o4
Packit 6c4009
	andcc		%o4, 0xff, %g0
Packit 6c4009
	be		7f
Packit 6c4009
	 srl		%o5, 8, %o4
Packit 6c4009
	st		%g5, [%o0]
Packit 6c4009
	andcc		%o4, 0xff, %g0
Packit 6c4009
	be		0f
Packit 6c4009
	 andcc		%o5, 0xff, %g0
Packit 6c4009
1:	bne		4b
Packit 6c4009
	 add		%o0, 4, %o0
Packit 6c4009
9:	stb		%g0, [%o0]
Packit 6c4009
0:	retl
Packit 6c4009
	 mov		%g2, %o0
Packit 6c4009
Packit 6c4009
6:	srl		%g5, 16, %g5
Packit 6c4009
	sth		%g5, [%o0]
Packit 6c4009
	retl
Packit 6c4009
	 mov		%g2, %o0
Packit 6c4009
Packit 6c4009
7:	srl		%g5, 16, %g5
Packit 6c4009
	sth		%g5, [%o0]
Packit 6c4009
	stb		%g0, [%o0 + 2]
Packit 6c4009
	retl
Packit 6c4009
	 mov		%g2, %o0
Packit 6c4009
Packit 6c4009
5:	andcc		%g5, 0xff, %g4
Packit 6c4009
	be		9b
Packit 6c4009
	 srl		%o5, 16, %g5
Packit 6c4009
	andcc		%g5, 0xff, %g0
Packit 6c4009
	be		7f
Packit 6c4009
	 srl		%o5, 8, %g5
Packit 6c4009
	andcc		%g5, 0xff, %g0
Packit 6c4009
	stb		%g4, [%o0]
Packit 6c4009
	sth		%g5, [%o0 + 1]
Packit 6c4009
	sub		%o0, 1, %o0
Packit 6c4009
	bne		1b
Packit 6c4009
	 andcc		%o5, 0xff, %g0
Packit 6c4009
	retl
Packit 6c4009
	 mov		%g2, %o0
Packit 6c4009
Packit 6c4009
7:	stb		%g4, [%o0]
Packit 6c4009
	stb		%g0, [%o0 + 1]
Packit 6c4009
	retl
Packit 6c4009
	 mov		%g2, %o0
Packit 6c4009
Packit 6c4009
2:	andcc		%o4, %o3, %g0
Packit 6c4009
	bne		5f
Packit 6c4009
	 srl		%o5, 16, %g5
Packit 6c4009
	sth		%g5, [%o0]
Packit 6c4009
	sub		%o0, 2, %o0
Packit 6c4009
1:	add		%o0, 4, %o0
Packit 6c4009
4:	sll		%o5, 16, %g6
Packit 6c4009
	ld		[%o1], %o5
Packit 6c4009
	add		%o1, 4, %o1
Packit 6c4009
	srl		%o5, 16, %g5
Packit 6c4009
	sub		%o5, %o2, %o4
Packit 6c4009
#ifdef EIGHTBIT_NOT_RARE
Packit 6c4009
	andn		%o4, %o5, %o4
Packit 6c4009
#endif
Packit 6c4009
	or		%g5, %g6, %g5
Packit 6c4009
	andcc		%o4, %o3, %g0
Packit 6c4009
	be,a		1b
Packit 6c4009
	 st		%g5, [%o0]
Packit 6c4009
	srl		%o5, 24, %o4
Packit 6c4009
	andcc		%o4, 0xff, %g0
Packit 6c4009
	be		7f
Packit 6c4009
	 srl		%o5, 16, %o4
Packit 6c4009
	st		%g5, [%o0]
Packit 6c4009
	andcc		%o4, 0xff, %g0
Packit 6c4009
	be		0b
Packit 6c4009
	 srl		%o5, 8, %o4
Packit 6c4009
1:	andcc		%o4, 0xff, %g0
Packit 6c4009
	be		8f
Packit 6c4009
	 andcc		%o5, 0xff, %g0
Packit 6c4009
	bne		4b
Packit 6c4009
	 add		%o0, 4, %o0
Packit 6c4009
	sth		%o5, [%o0]
Packit 6c4009
	retl
Packit 6c4009
	 mov		%g2, %o0
Packit 6c4009
Packit 6c4009
7:	srl		%g5, 16, %g5
Packit 6c4009
	sth		%g5, [%o0]
Packit 6c4009
	stb		%g0, [%o0 + 2]
Packit 6c4009
	retl
Packit 6c4009
	 mov		%g2, %o0
Packit 6c4009
Packit 6c4009
8:	stb		%g0, [%o0 + 4]
Packit 6c4009
	retl
Packit 6c4009
	 mov		%g2, %o0
Packit 6c4009
Packit 6c4009
5:	srl		%o5, 24, %g5
Packit 6c4009
	andcc		%g5, 0xff, %g0
Packit 6c4009
	be		9b
Packit 6c4009
	 srl		%o5, 16, %g5
Packit 6c4009
	andcc		%g5, 0xff, %g0
Packit 6c4009
	sth		%g5, [%o0]
Packit 6c4009
	sub		%o0, 2, %o0
Packit 6c4009
	bne		1b
Packit 6c4009
	 srl		%o5, 8, %o4
Packit 6c4009
	retl
Packit 6c4009
	 mov		%g2, %o0
Packit 6c4009
Packit 6c4009
3:	bne		5f
Packit 6c4009
	 srl		%o5, 24, %g5
Packit 6c4009
	stb		%g5, [%o0]
Packit 6c4009
	sub		%o0, 3, %o0
Packit 6c4009
1:	add		%o0, 4, %o0
Packit 6c4009
4:	sll		%o5, 8, %g6
Packit 6c4009
	ld		[%o1], %o5
Packit 6c4009
	add		%o1, 4, %o1
Packit 6c4009
	srl		%o5, 24, %g5
Packit 6c4009
	sub		%o5, %o2, %o4
Packit 6c4009
#ifdef EIGHTBIT_NOT_RARE
Packit 6c4009
	andn		%o4, %o5, %o4
Packit 6c4009
#endif
Packit 6c4009
	or		%g5, %g6, %g5
Packit 6c4009
	andcc		%o4, %o3, %g0
Packit 6c4009
	be		1b
Packit 6c4009
	 st		%g5, [%o0]
Packit 6c4009
	srl		%o5, 24, %o4
Packit 6c4009
	andcc		%o4, 0xff, %g0
Packit 6c4009
	be		0b
Packit 6c4009
	 srl		%o5, 16, %o4
Packit 6c4009
1:	andcc		%o4, 0xff, %g0
Packit 6c4009
	be		8b
Packit 6c4009
	 srl		%o5, 8, %o4
Packit 6c4009
	andcc		%o4, 0xff, %g0
Packit 6c4009
	be		9f
Packit 6c4009
	 andcc		%o5, 0xff, %g0
Packit 6c4009
	bne		4b
Packit 6c4009
	 add		%o0, 4, %o0
Packit 6c4009
	srl		%o5, 8, %o5
Packit 6c4009
	sth		%o5, [%o0]
Packit 6c4009
	stb		%g0, [%o0 + 2]
Packit 6c4009
	retl
Packit 6c4009
	 mov		%g2, %o0
Packit 6c4009
9:	srl		%o5, 8, %o5
Packit 6c4009
	sth		%o5, [%o0 + 4]
Packit 6c4009
	retl
Packit 6c4009
	 mov		%g2, %o0
Packit 6c4009
5:	andcc		%g5, 0xff, %g0
Packit 6c4009
	stb		%g5, [%o0]
Packit 6c4009
	sub		%o0, 3, %o0
Packit 6c4009
	bne		1b
Packit 6c4009
	 srl		%o5, 16, %o4
Packit 6c4009
	retl
Packit 6c4009
	 mov		%g2, %o0
Packit 6c4009
END(strcat)
Packit 6c4009
libc_hidden_builtin_def (strcat)