Blame sysdeps/sparc/sparc64/strcpy.S

Packit Service 82fcde
/* Copy SRC to DEST returning DEST.
Packit Service 82fcde
   For SPARC v9.
Packit Service 82fcde
   Copyright (C) 1998-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
   Contributed by Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.cz> and
Packit Service 82fcde
                  Jakub Jelinek <jj@ultra.linux.cz>.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#include <sysdep.h>
Packit Service 82fcde
#include <asm/asi.h>
Packit Service 82fcde
#ifndef XCC
Packit Service 82fcde
	.register	%g2, #scratch
Packit Service 82fcde
	.register	%g3, #scratch
Packit Service 82fcde
	.register	%g6, #scratch
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
	/* Normally, this uses
Packit Service 82fcde
	   ((xword - 0x0101010101010101) & 0x8080808080808080) test
Packit Service 82fcde
	   to find out if any byte in xword could be zero. This is fast, but
Packit Service 82fcde
	   also gives false alarm for any byte in range 0x81-0xff. It does
Packit Service 82fcde
	   not matter for correctness, as if this test tells us there could
Packit Service 82fcde
	   be some zero byte, we check it byte by byte, but if bytes with
Packit Service 82fcde
	   high bits set are common in the strings, then this will give poor
Packit Service 82fcde
	   performance. You can #define EIGHTBIT_NOT_RARE and the algorithm
Packit Service 82fcde
	   will use one tick slower, but more precise test
Packit Service 82fcde
	   ((xword - 0x0101010101010101) & (~xword) & 0x8080808080808080),
Packit Service 82fcde
	   which does not give any false alarms (but if some bits are set,
Packit Service 82fcde
	   one cannot assume from it which bytes are zero and which are not).
Packit Service 82fcde
	   It is yet to be measured, what is the correct default for glibc
Packit Service 82fcde
	   in these days for an average user.
Packit Service 82fcde
	 */
Packit Service 82fcde
Packit Service 82fcde
	.text
Packit Service 82fcde
	.align		32
Packit Service 82fcde
ENTRY(strcpy)
Packit Service 82fcde
	sethi		%hi(0x01010101), %g1		/* IEU0		Group		*/
Packit Service 82fcde
	mov		%o0, %g6			/* IEU1				*/
Packit Service 82fcde
	or		%g1, %lo(0x01010101), %g1	/* IEU0		Group		*/
Packit Service 82fcde
	andcc		%o0, 7, %g0			/* IEU1				*/
Packit Service 82fcde
Packit Service 82fcde
	sllx		%g1, 32, %g2			/* IEU0		Group		*/
Packit Service 82fcde
	bne,pn		%icc, 12f			/* CTI				*/
Packit Service 82fcde
	 andcc		%o1, 7, %g3			/* IEU1				*/
Packit Service 82fcde
	or		%g1, %g2, %g1			/* IEU0		Group		*/
Packit Service 82fcde
Packit Service 82fcde
	bne,pn		%icc, 14f			/* CTI				*/
Packit Service 82fcde
	 sllx		%g1, 7, %g2			/* IEU0		Group		*/
Packit Service 82fcde
1:	ldx		[%o1], %o3			/* Load				*/
Packit Service 82fcde
	add		%o1, 8, %o1			/* IEU1				*/
Packit Service 82fcde
Packit Service 82fcde
2:	mov		%o3, %g3			/* IEU0		Group		*/
Packit Service 82fcde
3:	sub		%o3, %g1, %o2			/* IEU1				*/
Packit Service 82fcde
	ldxa		[%o1] ASI_PNF, %o3		/* Load				*/
Packit Service 82fcde
#ifdef EIGHTBIT_NOT_RARE
Packit Service 82fcde
	andn		%o2, %g3, %o2			/* IEU0		Group		*/
Packit Service 82fcde
#endif
Packit Service 82fcde
	add		%o0, 8, %o0			/* IEU0		Group		*/
Packit Service 82fcde
Packit Service 82fcde
	andcc		%o2, %g2, %g0			/* IEU1				*/
Packit Service 82fcde
	add		%o1, 8, %o1			/* IEU0		Group		*/
Packit Service 82fcde
	be,a,pt		%xcc, 2b			/* CTI				*/
Packit Service 82fcde
	 stx		%g3, [%o0 - 8]			/* Store			*/
Packit Service 82fcde
Packit Service 82fcde
	srlx		%g3, 56, %g5			/* IEU0		Group		*/
Packit Service 82fcde
	andcc		%g5, 0xff, %g0			/* IEU1		Group		*/
Packit Service 82fcde
	be,pn		%icc, 11f			/* CTI				*/
Packit Service 82fcde
	 srlx		%g3, 48, %g4			/* IEU0				*/
Packit Service 82fcde
Packit Service 82fcde
	andcc		%g4, 0xff, %g0			/* IEU1		Group		*/
Packit Service 82fcde
	be,pn		%icc, 10f			/* CTI				*/
Packit Service 82fcde
	 srlx		%g3, 40, %g5			/* IEU0				*/
Packit Service 82fcde
	andcc		%g5, 0xff, %g0			/* IEU1		Group		*/
Packit Service 82fcde
Packit Service 82fcde
	be,pn		%icc, 9f			/* CTI				*/
Packit Service 82fcde
	 srlx		%g3, 32, %g4			/* IEU0				*/
Packit Service 82fcde
	andcc		%g4, 0xff, %g0			/* IEU1		Group		*/
Packit Service 82fcde
	be,pn		%icc, 8f			/* CTI				*/
Packit Service 82fcde
Packit Service 82fcde
	 srlx		%g3, 24, %g5			/* IEU0				*/
Packit Service 82fcde
	andcc		%g5, 0xff, %g0			/* IEU1		Group		*/
Packit Service 82fcde
	be,pn		%icc, 7f			/* CTI				*/
Packit Service 82fcde
	 srlx		%g3, 16, %g4			/* IEU0				*/
Packit Service 82fcde
Packit Service 82fcde
	andcc		%g4, 0xff, %g0			/* IEU1		Group		*/
Packit Service 82fcde
	be,pn		%icc, 6f			/* CTI				*/
Packit Service 82fcde
	 srlx		%g3, 8, %g5			/* IEU0				*/
Packit Service 82fcde
	andcc		%g5, 0xff, %g0			/* IEU1		Group		*/
Packit Service 82fcde
Packit Service 82fcde
	be,pn		%icc, 5f			/* CTI				*/
Packit Service 82fcde
	 sub		%o3, %g1, %o2			/* IEU0				*/
Packit Service 82fcde
	stx		%g3, [%o0 - 8]			/* Store	Group		*/
Packit Service 82fcde
	andcc		%g3, 0xff, %g0			/* IEU1				*/
Packit Service 82fcde
Packit Service 82fcde
	bne,pt		%icc, 3b			/* CTI				*/
Packit Service 82fcde
	 mov		%o3, %g3			/* IEU0		Group		*/
Packit Service 82fcde
4:	retl						/* CTI+IEU1	Group		*/
Packit Service 82fcde
	 mov		%g6, %o0			/* IEU0				*/
Packit Service 82fcde
Packit Service 82fcde
	.align		16
Packit Service 82fcde
5:	stb		%g5, [%o0 - 2]			/* Store	Group		*/
Packit Service 82fcde
	srlx		%g3, 16, %g4			/* IEU0				*/
Packit Service 82fcde
6:	sth		%g4, [%o0 - 4]			/* Store	Group		*/
Packit Service 82fcde
	srlx		%g3, 32, %g4			/* IEU0				*/
Packit Service 82fcde
Packit Service 82fcde
	stw		%g4, [%o0 - 8]			/* Store	Group		*/
Packit Service 82fcde
	retl						/* CTI+IEU1	Group		*/
Packit Service 82fcde
	 mov		%g6, %o0			/* IEU0				*/
Packit Service 82fcde
7:	stb		%g5, [%o0 - 4]			/* Store	Group		*/
Packit Service 82fcde
Packit Service 82fcde
	srlx		%g3, 32, %g4			/* IEU0				*/
Packit Service 82fcde
8:	stw		%g4, [%o0 - 8]			/* Store	Group		*/
Packit Service 82fcde
	retl						/* CTI+IEU1	Group		*/
Packit Service 82fcde
	 mov		%g6, %o0 			/* IEU0				*/
Packit Service 82fcde
Packit Service 82fcde
9:	stb		%g5, [%o0 - 6]			/* Store	Group		*/
Packit Service 82fcde
	srlx		%g3, 48, %g4			/* IEU0				*/
Packit Service 82fcde
10:	sth		%g4, [%o0 - 8]			/* Store	Group		*/
Packit Service 82fcde
	retl						/* CTI+IEU1	Group		*/
Packit Service 82fcde
Packit Service 82fcde
	 mov		%g6, %o0			/* IEU0				*/
Packit Service 82fcde
11:	stb		%g5, [%o0 - 8]			/* Store	Group		*/
Packit Service 82fcde
	retl						/* CTI+IEU1	Group		*/
Packit Service 82fcde
	 mov		%g6, %o0			/* IEU0				*/
Packit Service 82fcde
Packit Service 82fcde
12:	or		%g1, %g2, %g1			/* IEU0		Group		*/
Packit Service 82fcde
	ldub		[%o1], %o3			/* Load				*/
Packit Service 82fcde
	sllx		%g1, 7, %g2			/* IEU0		Group		*/
Packit Service 82fcde
	stb		%o3, [%o0]			/* Store	Group		*/
Packit Service 82fcde
Packit Service 82fcde
13:	add		%o0, 1, %o0			/* IEU0				*/
Packit Service 82fcde
	add		%o1, 1, %o1			/* IEU1				*/
Packit Service 82fcde
	andcc		%o3, 0xff, %g0			/* IEU1		Group		*/
Packit Service 82fcde
	be,pn		%icc, 4b			/* CTI				*/
Packit Service 82fcde
Packit Service 82fcde
	 lduba		[%o1] ASI_PNF, %o3		/* Load				*/
Packit Service 82fcde
	andcc		%o0, 7, %g0			/* IEU1		Group		*/
Packit Service 82fcde
	bne,a,pt	%icc, 13b			/* CTI				*/
Packit Service 82fcde
	 stb		%o3, [%o0]			/* Store			*/
Packit Service 82fcde
Packit Service 82fcde
	andcc		%o1, 7, %g3			/* IEU1		Group		*/
Packit Service 82fcde
	be,a,pt		%icc, 1b			/* CTI				*/
Packit Service 82fcde
	 ldx		[%o1], %o3			/* Load				*/
Packit Service 82fcde
14:	orcc		%g0, 64, %g4			/* IEU1		Group		*/
Packit Service 82fcde
Packit Service 82fcde
	sllx		%g3, 3, %g5			/* IEU0				*/
Packit Service 82fcde
	sub		%o1, %g3, %o1			/* IEU0		Group		*/
Packit Service 82fcde
	sub		%g4, %g5, %g4			/* IEU1				*/
Packit Service 82fcde
							/* %g1 = 0101010101010101	*
Packit Service 82fcde
							 * %g2 = 8080808080808080	*
Packit Service 82fcde
							 * %g3 = source alignment	*
Packit Service 82fcde
							 * %g5 = number of bits to shift left  *
Packit Service 82fcde
							 * %g4 = number of bits to shift right */
Packit Service 82fcde
	ldxa		[%o1] ASI_PNF, %o5		/* Load		Group		*/
Packit Service 82fcde
Packit Service 82fcde
	addcc		%o1, 8, %o1			/* IEU1				*/
Packit Service 82fcde
15:	sllx		%o5, %g5, %o3			/* IEU0		Group		*/
Packit Service 82fcde
	ldxa		[%o1] ASI_PNF, %o5		/* Load				*/
Packit Service 82fcde
	srlx		%o5, %g4, %o4			/* IEU0		Group		*/
Packit Service 82fcde
Packit Service 82fcde
	add		%o0, 8, %o0			/* IEU1				*/
Packit Service 82fcde
	or		%o3, %o4, %o3			/* IEU0		Group		*/
Packit Service 82fcde
	add		%o1, 8, %o1			/* IEU1				*/
Packit Service 82fcde
	sub		%o3, %g1, %o4			/* IEU0		Group		*/
Packit Service 82fcde
Packit Service 82fcde
#ifdef EIGHTBIT_NOT_RARE
Packit Service 82fcde
	andn		%o4, %o3, %o4			/* IEU0		Group		*/
Packit Service 82fcde
#endif
Packit Service 82fcde
	andcc		%o4, %g2, %g0			/* IEU1		Group		*/
Packit Service 82fcde
	be,a,pt		%xcc, 15b			/* CTI				*/
Packit Service 82fcde
	 stx		%o3, [%o0 - 8]			/* Store			*/
Packit Service 82fcde
	srlx		%o3, 56, %o4			/* IEU0		Group		*/
Packit Service 82fcde
Packit Service 82fcde
	andcc		%o4, 0xff, %g0			/* IEU1		Group		*/
Packit Service 82fcde
	be,pn		%icc, 22f			/* CTI				*/
Packit Service 82fcde
	 srlx		%o3, 48, %o4			/* IEU0				*/
Packit Service 82fcde
	andcc		%o4, 0xff, %g0			/* IEU1		Group		*/
Packit Service 82fcde
Packit Service 82fcde
	be,pn		%icc, 21f			/* CTI				*/
Packit Service 82fcde
	 srlx		%o3, 40, %o4			/* IEU0				*/
Packit Service 82fcde
	andcc		%o4, 0xff, %g0			/* IEU1		Group		*/
Packit Service 82fcde
	be,pn		%icc, 20f			/* CTI				*/
Packit Service 82fcde
Packit Service 82fcde
	 srlx		%o3, 32, %o4			/* IEU0				*/
Packit Service 82fcde
	andcc		%o4, 0xff, %g0			/* IEU1		Group		*/
Packit Service 82fcde
	be,pn		%icc, 19f			/* CTI				*/
Packit Service 82fcde
	 srlx		%o3, 24, %o4			/* IEU0				*/
Packit Service 82fcde
Packit Service 82fcde
	andcc		%o4, 0xff, %g0			/* IEU1		Group		*/
Packit Service 82fcde
	be,pn		%icc, 18f			/* CTI				*/
Packit Service 82fcde
	 srlx		%o3, 16, %o4			/* IEU0				*/
Packit Service 82fcde
	andcc		%o4, 0xff, %g0			/* IEU1		Group		*/
Packit Service 82fcde
Packit Service 82fcde
	be,pn		%icc, 17f			/* CTI				*/
Packit Service 82fcde
	 srlx		%o3, 8, %o4			/* IEU0				*/
Packit Service 82fcde
	andcc		%o4, 0xff, %g0			/* IEU1		Group		*/
Packit Service 82fcde
	be,pn		%icc, 16f			/* CTI				*/
Packit Service 82fcde
Packit Service 82fcde
	 andcc		%o3, 0xff, %g0			/* IEU1		Group		*/
Packit Service 82fcde
	bne,pn		%icc, 15b			/* CTI				*/
Packit Service 82fcde
	 stx		%o3, [%o0 - 8]			/* Store			*/
Packit Service 82fcde
	retl						/* CTI+IEU1	Group		*/
Packit Service 82fcde
Packit Service 82fcde
	 mov		%g6, %o0			/* IEU0				*/
Packit Service 82fcde
Packit Service 82fcde
	.align		16
Packit Service 82fcde
16:	srlx		%o3, 8, %o4			/* IEU0		Group		*/
Packit Service 82fcde
	stb		%o4, [%o0 - 2]			/* Store			*/
Packit Service 82fcde
17:	srlx		%o3, 16, %o4			/* IEU0		Group		*/
Packit Service 82fcde
	stb		%o4, [%o0 - 3]			/* Store			*/
Packit Service 82fcde
Packit Service 82fcde
18:	srlx		%o3, 24, %o4			/* IEU0		Group		*/
Packit Service 82fcde
	stb		%o4, [%o0 - 4]			/* Store			*/
Packit Service 82fcde
19:	srlx		%o3, 32, %o4			/* IEU0		Group		*/
Packit Service 82fcde
	stw		%o4, [%o0 - 8]			/* Store			*/
Packit Service 82fcde
Packit Service 82fcde
	retl						/* CTI+IEU1	Group		*/
Packit Service 82fcde
	 mov		%g6, %o0 			/* IEU0				*/
Packit Service 82fcde
	nop
Packit Service 82fcde
	nop
Packit Service 82fcde
Packit Service 82fcde
20:	srlx		%o3, 40, %o4			/* IEU0		Group		*/
Packit Service 82fcde
	stb		%o4, [%o0 - 6]			/* Store			*/
Packit Service 82fcde
21:	srlx		%o3, 48, %o4			/* IEU0		Group		*/
Packit Service 82fcde
	stb		%o4, [%o0 - 7]			/* Store			*/
Packit Service 82fcde
Packit Service 82fcde
22:	srlx		%o3, 56, %o4			/* IEU0		Group		*/
Packit Service 82fcde
	stb		%o4, [%o0 - 8]			/* Store			*/
Packit Service 82fcde
	retl						/* CTI+IEU1	Group		*/
Packit Service 82fcde
	 mov		%g6, %o0			/* IEU0				*/
Packit Service 82fcde
END(strcpy)
Packit Service 82fcde
libc_hidden_builtin_def (strcpy)