Blame sysdeps/sparc/sparc64/stpncpy.S

Packit 6c4009
/* stpncpy(DST, SRC, COUNT) - Copy no more than N characters of
Packit 6c4009
   SRC to DEST, returning the address of the terminating '\0' in
Packit 6c4009
   DEST, if any, or else DEST + N.
Packit 6c4009
   For SPARC v9.
Packit 6c4009
   Copyright (C) 1998-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> and
Packit 6c4009
		  Jan Vondrak <jvon4518@ss1000.ms.mff.cuni.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
#include <asm/asi.h>
Packit 6c4009
#ifndef XCC
Packit 6c4009
#define XCC xcc
Packit 6c4009
#define USE_BPR
Packit 6c4009
	.register	%g2, #scratch
Packit 6c4009
	.register	%g3, #scratch
Packit 6c4009
	.register	%g6, #scratch
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
	/* Normally, this uses
Packit 6c4009
	   ((xword - 0x0101010101010101) & 0x8080808080808080) 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 - 0x0101010101010101) & (~xword) & 0x8080808080808080),
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		32
Packit 6c4009
ENTRY(__stpncpy)
Packit 6c4009
	sethi		%hi(0x01010101), %g1		/* IEU0		Group		*/
Packit 6c4009
#ifdef USE_BPR
Packit 6c4009
	brz,pn		%o2, 19f			/* CTI+IEU1			*/
Packit 6c4009
#else
Packit 6c4009
	tst		%o2				/* IEU1				*/
Packit 6c4009
	be,pn		%XCC, 19f			/* CTI				*/
Packit 6c4009
#endif
Packit 6c4009
	 or		%g1, %lo(0x01010101), %g1	/* IEU1				*/
Packit 6c4009
	andcc		%o0, 7, %g0			/* IEU1		Group		*/
Packit 6c4009
Packit 6c4009
	sllx		%g1, 32, %g2			/* IEU0				*/
Packit 6c4009
	bne,pn		%icc, 26f			/* CTI				*/
Packit 6c4009
	 or		%g1, %g2, %g1			/* IEU0		Group		*/
Packit 6c4009
	andcc		%o1, 7, %g3			/* IEU1				*/
Packit 6c4009
Packit 6c4009
	bne,pn		%icc, 28f			/* CTI				*/
Packit 6c4009
	 sllx		%g1, 7, %g2			/* IEU0		Group		*/
Packit 6c4009
	ldx		[%o1], %o3			/* Load				*/
Packit 6c4009
1:	add		%o1, 8, %o1			/* IEU1				*/
Packit 6c4009
Packit 6c4009
2:	subcc		%o2, 8, %o2			/* IEU1		Group		*/
Packit 6c4009
	bl,pn		%XCC, 18f			/* CTI				*/
Packit 6c4009
	 sub		%o3, %g1, %o4			/* IEU0				*/
Packit 6c4009
	add		%o0, 8, %o0			/* IEU0		Group		*/
Packit 6c4009
Packit 6c4009
#ifdef EIGHTBIT_NOT_MORE
Packit 6c4009
	andn		%o4, %o3, %o4			/* IEU1				*/
Packit 6c4009
#endif
Packit 6c4009
	mov		%o3, %g3			/* IEU1				*/
Packit 6c4009
	ldxa		[%o1] ASI_PNF, %o3		/* Load				*/
Packit 6c4009
	add		%o1, 8, %o1			/* IEU0		Group		*/
Packit 6c4009
	andcc		%o4, %g2, %g0			/* IEU1				*/
Packit 6c4009
Packit 6c4009
	be,a,pt		%xcc, 2b			/* CTI				*/
Packit 6c4009
	 stx		%g3, [%o0-8]			/* Store	Group		*/
Packit 6c4009
	srlx		%g3, 56, %g5			/* IEU0		Group		*/
Packit 6c4009
	andcc		%g5, 0xff, %g0			/* IEU1		Group		*/
Packit 6c4009
Packit 6c4009
	be,pn		%icc, 16f			/* CTI				*/
Packit 6c4009
	 srlx		%g3, 48, %g4			/* IEU0				*/
Packit 6c4009
	andcc		%g4, 0xff, %g0			/* IEU1		Group		*/
Packit 6c4009
	be,pn		%icc, 15f			/* CTI				*/
Packit 6c4009
Packit 6c4009
	 srlx		%g3, 40, %g5			/* IEU0				*/
Packit 6c4009
	andcc		%g5, 0xff, %g0			/* IEU1		Group		*/
Packit 6c4009
	be,pn		%icc, 14f			/* CTI				*/
Packit 6c4009
	 srlx		%g3, 32, %g4			/* IEU0				*/
Packit 6c4009
Packit 6c4009
	andcc		%g4, 0xff, %g0			/* IEU1		Group		*/
Packit 6c4009
	be,pn		%icc, 13f			/* CTI				*/
Packit 6c4009
	 srlx		%g3, 24, %g5			/* IEU0				*/
Packit 6c4009
	andcc		%g5, 0xff, %g0			/* IEU1		Group		*/
Packit 6c4009
Packit 6c4009
	be,pn		%icc, 12f			/* CTI				*/
Packit 6c4009
	 srlx		%g3, 16, %g4			/* IEU0				*/
Packit 6c4009
	andcc		%g4, 0xff, %g0			/* IEU1		Group		*/
Packit 6c4009
	be,pn		%icc, 11f			/* CTI				*/
Packit 6c4009
Packit 6c4009
	 srlx		%g3, 8, %g5			/* IEU0				*/
Packit 6c4009
	andcc		%g5, 0xff, %g0			/* IEU1		Group		*/
Packit 6c4009
	be,pn		%icc, 10f			/* CTI				*/
Packit 6c4009
	 sub		%o0, 1, %g6			/* IEU0				*/
Packit 6c4009
Packit 6c4009
	andcc		%g3, 0xff, %g0			/* IEU1		Group		*/
Packit 6c4009
	bne,pt		%icc, 2b			/* CTI				*/
Packit 6c4009
3:	 stx		%g3, [%o0-8]			/* Store			*/
Packit 6c4009
	andncc		%o2, 31, %g3			/* IEU1		Group		*/
Packit 6c4009
Packit 6c4009
4:	be,pn		%XCC, 41f			/* CTI				*/
Packit 6c4009
	 and		%o2, 31, %o2			/* IEU1		Group		*/
Packit 6c4009
40:	stx		%g0, [%o0]			/* Store			*/
Packit 6c4009
	stx		%g0, [%o0 + 8]			/* Store	Group		*/
Packit 6c4009
Packit 6c4009
	subcc		%g3, 32, %g3			/* IEU1				*/
Packit 6c4009
	stx		%g0, [%o0 + 16]			/* Store	Group		*/
Packit 6c4009
	stx		%g0, [%o0 + 24]			/* Store	Group		*/
Packit 6c4009
	bne,pt		%XCC, 40b			/* CTI				*/
Packit 6c4009
Packit 6c4009
	 add		%o0, 32, %o0			/* IEU0				*/
Packit 6c4009
41:	subcc		%o2, 8, %o2			/* IEU1		Group		*/
Packit 6c4009
	bl,a,pn		%XCC, 6f			/* CTI				*/
Packit 6c4009
	 andcc		%o2, 4, %g0			/* IEU1		Group		*/
Packit 6c4009
Packit 6c4009
5:	stx		%g0, [%o0]			/* Store			*/
Packit 6c4009
	subcc		%o2, 8, %o2			/* IEU1		Group		*/
Packit 6c4009
	bge,pt		%XCC, 5b			/* CTI				*/
Packit 6c4009
	 add		%o0, 8, %o0			/* IEU0				*/
Packit 6c4009
Packit 6c4009
	andcc		%o2, 4, %g0			/* IEU1		Group		*/
Packit 6c4009
6:	be,a,pn		%icc, 7f			/* CTI				*/
Packit 6c4009
	 andcc		%o2, 2, %g0			/* IEU1		Group		*/
Packit 6c4009
	stw		%g0, [%o0]			/* Store			*/
Packit 6c4009
Packit 6c4009
	add		%o0, 4, %o0			/* IEU0				*/
Packit 6c4009
	andcc		%o2, 2, %g0			/* IEU1		Group		*/
Packit 6c4009
7:	be,a,pn		%icc, 8f			/* CTI				*/
Packit 6c4009
	 andcc		%o2, 1, %g0			/* IEU1		Group		*/
Packit 6c4009
Packit 6c4009
	sth		%g0, [%o0]			/* Store			*/
Packit 6c4009
	add		%o0, 2, %o0			/* IEU0				*/
Packit 6c4009
	andcc		%o2, 1, %g0			/* IEU1		Group		*/
Packit 6c4009
8:	bne,a,pn	%icc, 9f			/* CTI				*/
Packit 6c4009
Packit 6c4009
	 stb		%g0, [%o0]			/* Store			*/
Packit 6c4009
9:	retl						/* CTI+IEU1	Group		*/
Packit 6c4009
	 mov		%g6, %o0			/* IEU0				*/
Packit 6c4009
10:	subcc		%o0, 2, %g6			/* IEU1		Group		*/
Packit 6c4009
Packit 6c4009
	ba,pt		%xcc, 3b			/* CTI				*/
Packit 6c4009
	 sllx		%g5, 8, %g3			/* IEU0				*/
Packit 6c4009
11:	subcc		%o0, 3, %g6			/* IEU1		Group		*/
Packit 6c4009
	ba,pt		%xcc, 3b			/* CTI				*/
Packit 6c4009
Packit 6c4009
	 sllx		%g4, 16, %g3			/* IEU0				*/
Packit 6c4009
12:	subcc		%o0, 4, %g6			/* IEU1		Group		*/
Packit 6c4009
	ba,pt		%xcc, 3b			/* CTI				*/
Packit 6c4009
	 sllx		%g5, 24, %g3			/* IEU0				*/
Packit 6c4009
Packit 6c4009
13:	subcc		%o0, 5, %g6			/* IEU1		Group		*/
Packit 6c4009
	ba,pt		%xcc, 3b			/* CTI				*/
Packit 6c4009
	 sllx		%g4, 32, %g3			/* IEU0				*/
Packit 6c4009
14:	subcc		%o0, 6, %g6			/* IEU1		Group		*/
Packit 6c4009
Packit 6c4009
	ba,pt		%xcc, 3b			/* CTI				*/
Packit 6c4009
	 sllx		%g5, 40, %g3			/* IEU0				*/
Packit 6c4009
15:	subcc		%o0, 7, %g6			/* IEU1		Group		*/
Packit 6c4009
	ba,pt		%xcc, 3b			/* CTI				*/
Packit 6c4009
Packit 6c4009
	 sllx		%g4, 48, %g3			/* IEU0				*/
Packit 6c4009
16:	subcc		%o0, 8, %g6			/* IEU1		Group		*/
Packit 6c4009
	ba,pt		%xcc, 3b			/* CTI				*/
Packit 6c4009
	 clr		%g3				/* IEU0				*/
Packit 6c4009
Packit 6c4009
	.align		16
Packit 6c4009
17:	or		%o3, %o4, %o3			/* IEU0		Group		*/
Packit 6c4009
	sub		%o3, %g1, %o4			/* IEU1				*/
Packit 6c4009
18:	addcc		%o2, 8, %o2			/* IEU1		Group		*/
Packit 6c4009
	be,pn		%XCC, 19f			/* CTI				*/
Packit 6c4009
Packit 6c4009
	 andcc		%o4, %g2, %g0			/* IEU1		Group		*/
Packit 6c4009
	be,pt		%xcc, 21f			/* CTI				*/
Packit 6c4009
	 srlx		%o3, 56, %g5			/* IEU0				*/
Packit 6c4009
	andcc		%g5, 0xff, %g0			/* IEU1		Group		*/
Packit 6c4009
Packit 6c4009
	be,pn		%icc, 20f			/* CTI				*/
Packit 6c4009
	 stb		%g5, [%o0]			/* Store			*/
Packit 6c4009
	add		%o0, 1, %o0			/* IEU0		Group		*/
Packit 6c4009
	subcc		%o2, 1, %o2			/* IEU1				*/
Packit 6c4009
Packit 6c4009
	be,pn		%XCC, 19f			/* CTI				*/
Packit 6c4009
	 srlx		%o3, 48, %g5			/* IEU0		Group		*/
Packit 6c4009
	andcc		%g5, 0xff, %g0			/* IEU1		Group		*/
Packit 6c4009
	be,pn		%icc, 20f			/* CTI				*/
Packit 6c4009
Packit 6c4009
	 stb		%g5, [%o0]			/* Store			*/
Packit 6c4009
	add		%o0, 1, %o0			/* IEU0		Group		*/
Packit 6c4009
	subcc		%o2, 1, %o2			/* IEU1				*/
Packit 6c4009
	be,pn		%XCC, 19f			/* CTI				*/
Packit 6c4009
Packit 6c4009
	 srlx		%o3, 40, %g5			/* IEU0		Group		*/
Packit 6c4009
	andcc		%g5, 0xff, %g0			/* IEU1		Group		*/
Packit 6c4009
	be,pn		%icc, 20f			/* CTI				*/
Packit 6c4009
	 stb		%g5, [%o0]			/* Store			*/
Packit 6c4009
Packit 6c4009
	add		%o0, 1, %o0			/* IEU0		Group		*/
Packit 6c4009
	subcc		%o2, 1, %o2			/* IEU1				*/
Packit 6c4009
	be,pn		%XCC, 19f			/* CTI				*/
Packit 6c4009
	 srlx		%o3, 32, %g5			/* IEU0		Group		*/
Packit 6c4009
Packit 6c4009
	andcc		%g5, 0xff, %g0			/* IEU1		Group		*/
Packit 6c4009
	be,pn		%icc, 20f			/* CTI				*/
Packit 6c4009
	 stb		%g5, [%o0]			/* Store			*/
Packit 6c4009
	add		%o0, 1, %o0			/* IEU0		Group		*/
Packit 6c4009
Packit 6c4009
	subcc		%o2, 1, %o2			/* IEU1				*/
Packit 6c4009
	be,pn		%XCC, 19f			/* CTI				*/
Packit 6c4009
	 srlx		%o3, 24, %g5			/* IEU0		Group		*/
Packit 6c4009
	andcc		%g5, 0xff, %g0			/* IEU1		Group		*/
Packit 6c4009
Packit 6c4009
	be,pn		%icc, 20f			/* CTI				*/
Packit 6c4009
	 stb		%g5, [%o0]			/* Store			*/
Packit 6c4009
	add		%o0, 1, %o0			/* IEU0		Group		*/
Packit 6c4009
	subcc		%o2, 1, %o2			/* IEU1				*/
Packit 6c4009
Packit 6c4009
	be,pn		%XCC, 19f			/* CTI				*/
Packit 6c4009
	 srlx		%o3, 16, %g5			/* IEU0		Group		*/
Packit 6c4009
	andcc		%g5, 0xff, %g0			/* IEU1		Group		*/
Packit 6c4009
	be,pn		%icc, 20f			/* CTI				*/
Packit 6c4009
Packit 6c4009
	 stb		%g5, [%o0]			/* Store			*/
Packit 6c4009
	add		%o0, 1, %o0			/* IEU0		Group		*/
Packit 6c4009
	subcc		%o2, 1, %o2			/* IEU1				*/
Packit 6c4009
	be,pn		%XCC, 19f			/* CTI				*/
Packit 6c4009
Packit 6c4009
	 srlx		%o3, 8, %o3			/* IEU0		Group		*/
Packit 6c4009
	stb		%o3, [%o0]			/* Store			*/
Packit 6c4009
59:	add		%o0, 1, %o2			/* IEU1				*/
Packit 6c4009
	andcc		%o3, 0xff, %g0			/* IEU1		Group		*/
Packit 6c4009
Packit 6c4009
	retl						/* CTI+IEU1	Group		*/
Packit 6c4009
	 movne		%icc, %o2, %o0			/* Single	Group		*/
Packit 6c4009
19:	retl						/* CTI+IEU1	Group		*/
Packit 6c4009
	 nop						/* IEU0				*/
Packit 6c4009
Packit 6c4009
20:	mov		%o0, %g6			/* IEU0		Group		*/
Packit 6c4009
	subcc		%o2, 1, %o2			/* IEU1				*/
Packit 6c4009
	be,pn		%XCC, 51f			/* CTI				*/
Packit 6c4009
	 add		%o0, 1, %o0			/* IEU0		Group		*/
Packit 6c4009
Packit 6c4009
50:	stb		%g0, [%o0]			/* Store	Group		*/
Packit 6c4009
	subcc		%o2, 1, %o2			/* IEU1		Group		*/
Packit 6c4009
	bne,pt		%XCC, 50b			/* CTI				*/
Packit 6c4009
	 add		%o0, 1, %o0			/* IEU0				*/
Packit 6c4009
Packit 6c4009
51:	retl						/* CTI+IEU1	Group		*/
Packit 6c4009
	 mov		%g6, %o0			/* IEU0				*/
Packit 6c4009
Packit 6c4009
	.align		16
Packit 6c4009
21:	andcc		%o2, 4, %g0			/* IEU1		Group		*/
Packit 6c4009
	be,pn		%icc, 22f			/* CTI				*/
Packit 6c4009
	 srlx		%o3, 32, %g5			/* IEU0				*/
Packit 6c4009
	stw		%g5, [%o0]			/* Store	Group		*/
Packit 6c4009
Packit 6c4009
	add		%o0, 4, %o0			/* IEU0				*/
Packit 6c4009
	mov		%o3, %g5			/* IEU1				*/
Packit 6c4009
22:	andcc		%o2, 2, %g0			/* IEU1		Group		*/
Packit 6c4009
	be,pn		%icc, 23f			/* CTI				*/
Packit 6c4009
Packit 6c4009
	 srlx		%g5, 16, %g4			/* IEU0				*/
Packit 6c4009
	sth		%g4, [%o0]			/* Store	Group		*/
Packit 6c4009
	add		%o0, 2, %o0			/* IEU0				*/
Packit 6c4009
	mov		%g5, %g4			/* IEU1				*/
Packit 6c4009
Packit 6c4009
23:	srlx		%g4, 8, %g4			/* IEU0		Group		*/
Packit 6c4009
	andcc		%o2, 1, %g0			/* IEU1				*/
Packit 6c4009
	bne,a,pn	%icc, 24f			/* CTI				*/
Packit 6c4009
	 stb		%g4, [%o0]			/* Store	Group		*/
Packit 6c4009
Packit 6c4009
	retl						/* CTI+IEU1	Group		*/
Packit 6c4009
	 nop						/* IEU0				*/
Packit 6c4009
24:	retl						/* CTI+IEU1	Group		*/
Packit 6c4009
	 add		%o0, 1, %o0			/* IEU0				*/
Packit 6c4009
Packit 6c4009
	.align		16
Packit 6c4009
55:	sub		%o0, 1, %g6			/* IEU0		Group		*/
Packit 6c4009
25:	andcc		%o0, 7, %g0			/* IEU1				*/
Packit 6c4009
	be,a,pn		%icc, 4b			/* CTI				*/
Packit 6c4009
	 andncc		%o2, 31, %g3			/* IEU1		Group		*/
Packit 6c4009
Packit 6c4009
	stb		%g0, [%o0]			/* Store	Group		*/
Packit 6c4009
	subcc		%o2, 1, %o2			/* IEU1				*/
Packit 6c4009
	bne,pt		%XCC, 25b			/* CTI				*/
Packit 6c4009
	 add		%o0, 1, %o0			/* IEU0		Group		*/
Packit 6c4009
Packit 6c4009
	retl						/* CTI+IEU1	Group		*/
Packit 6c4009
	 mov		%g6, %o0			/* IEU0				*/
Packit 6c4009
Packit 6c4009
	.align		16
Packit 6c4009
26:	ldub		[%o1], %o3			/* Load				*/
Packit 6c4009
	sllx		%g1, 7, %g2			/* IEU0		Group		*/
Packit 6c4009
	stb		%o3, [%o0]			/* Store			*/
Packit 6c4009
27:	subcc		%o2, 1, %o2			/* IEU1				*/
Packit 6c4009
Packit 6c4009
	be,pn		%XCC, 59b			/* CTI				*/
Packit 6c4009
	 add		%o1, 1, %o1			/* IEU0		Group		*/
Packit 6c4009
	add		%o0, 1, %o0			/* IEU1				*/
Packit 6c4009
	andcc		%o3, 0xff, %g0			/* IEU1		Group		*/
Packit 6c4009
Packit 6c4009
	be,pn		%icc, 55b			/* CTI				*/
Packit 6c4009
	 lduba		[%o1] ASI_PNF, %o3		/* Load				*/
Packit 6c4009
	andcc		%o0, 7, %g0			/* IEU1		Group		*/
Packit 6c4009
	bne,a,pt	%icc, 27b			/* CTI				*/
Packit 6c4009
Packit 6c4009
	 stb		%o3, [%o0]			/* Store			*/
Packit 6c4009
	andcc		%o1, 7, %g3			/* IEU1		Group		*/
Packit 6c4009
	be,a,pt		%icc, 1b			/* CTI				*/
Packit 6c4009
	 ldx		[%o1], %o3			/* Load				*/
Packit 6c4009
Packit 6c4009
28:	orcc		%g0, 64, %g4			/* IEU1		Group		*/
Packit 6c4009
	sllx		%g3, 3, %g5			/* IEU0				*/
Packit 6c4009
	sub		%g4, %g5, %g4			/* IEU0		Group		*/
Packit 6c4009
	sub		%o1, %g3, %o1			/* IEU1				*/
Packit 6c4009
							/* %g1 = 0101010101010101
Packit 6c4009
							   %g2 = 8080808080808080
Packit 6c4009
							   %g3 = source alignment
Packit 6c4009
							   %g5 = number of bits to shift left
Packit 6c4009
							   %g4 = number of bits to shift right */
Packit 6c4009
Packit 6c4009
	ldxa		[%o1] ASI_PNF, %o5		/* Load		Group		*/
Packit 6c4009
	addcc		%o1, 8, %o1			/* IEU1				*/
Packit 6c4009
29:	sllx		%o5, %g5, %o3			/* IEU0		Group		*/
Packit 6c4009
	ldxa		[%o1] ASI_PNF, %o5		/* Load				*/
Packit 6c4009
Packit 6c4009
	subcc		%o2, 8, %o2			/* IEU1				*/
Packit 6c4009
	bl,pn		%XCC, 17b			/* CTI				*/
Packit 6c4009
	 srlx		%o5, %g4, %o4			/* IEU0		Group		*/
Packit 6c4009
	add		%o1, 8, %o1			/* IEU1				*/
Packit 6c4009
Packit 6c4009
	or		%o3, %o4, %o3			/* IEU0		Group		*/
Packit 6c4009
	add		%o0, 8, %o0			/* IEU1				*/
Packit 6c4009
	sub		%o3, %g1, %o4			/* IEU0		Group		*/
Packit 6c4009
#ifdef EIGHTBIT_NOT_RARE
Packit 6c4009
	andn		%o4, %o3, %o4			/* IEU0		Group		*/
Packit 6c4009
#endif
Packit 6c4009
	andcc		%o4, %g2, %g0			/* IEU1		Group		*/
Packit 6c4009
Packit 6c4009
	be,a,pt		%xcc, 29b			/* CTI				*/
Packit 6c4009
	 stx		%o3, [%o0-8]			/* Store			*/
Packit 6c4009
	srlx		%o3, 56, %o4			/* IEU0		Group		*/
Packit 6c4009
	andcc		%o4, 0xff, %g0			/* IEU1		Group		*/
Packit 6c4009
Packit 6c4009
	be,pn		%icc, 36f			/* CTI				*/
Packit 6c4009
	 srlx		%o3, 48, %g6			/* IEU0				*/
Packit 6c4009
	andcc		%g6, 0xff, %g0			/* IEU1		Group		*/
Packit 6c4009
	be,pn		%icc, 35f			/* CTI				*/
Packit 6c4009
Packit 6c4009
	 srlx		%o3, 40, %o4			/* IEU0				*/
Packit 6c4009
	andcc		%o4, 0xff, %g0			/* IEU1		Group		*/
Packit 6c4009
	be,pn		%icc, 34f			/* CTI				*/
Packit 6c4009
	 srlx		%o3, 32, %g6			/* IEU0				*/
Packit 6c4009
Packit 6c4009
	andcc		%g6, 0xff, %g0			/* IEU1		Group		*/
Packit 6c4009
	be,pn		%icc, 33f			/* CTI				*/
Packit 6c4009
	 srlx		%o3, 24, %o4			/* IEU0				*/
Packit 6c4009
	andcc		%o4, 0xff, %g0			/* IEU1		Group		*/
Packit 6c4009
Packit 6c4009
	be,pn		%icc, 32f			/* CTI				*/
Packit 6c4009
	 srlx		%o3, 16, %g6			/* IEU0				*/
Packit 6c4009
	andcc		%g6, 0xff, %g0			/* IEU1		Group		*/
Packit 6c4009
	be,pn		%icc, 31f			/* CTI				*/
Packit 6c4009
Packit 6c4009
	 srlx		%o3, 8, %o4			/* IEU0				*/
Packit 6c4009
	andcc		%o4, 0xff, %g0			/* IEU1		Group		*/
Packit 6c4009
	be,pn		%icc, 30f			/* CTI				*/
Packit 6c4009
	 andcc		%o3, 0xff, %g0			/* IEU1		Group		*/
Packit 6c4009
Packit 6c4009
	bne,pn		%icc, 29b			/* CTI				*/
Packit 6c4009
	 stx		%o3, [%o0-8]			/* Store			*/
Packit 6c4009
	sub		%o0, 1, %g6			/* IEU0		Group		*/
Packit 6c4009
	ba,pt		%xcc, 4b			/* CTI				*/
Packit 6c4009
Packit 6c4009
	 andncc		%o2, 31, %g3			/* IEU1				*/
Packit 6c4009
30:	subcc		%o0, 2, %g6			/* IEU0				*/
Packit 6c4009
	ba,pt		%xcc, 3b			/* CTI				*/
Packit 6c4009
	 sllx		%o4, 8, %g3			/* IEU0		Group		*/
Packit 6c4009
Packit 6c4009
31:	sllx		%g6, 16, %g3			/* IEU0		Group		*/
Packit 6c4009
	ba,pt		%xcc, 3b			/* CTI				*/
Packit 6c4009
	 sub		%o0, 3, %g6			/* IEU1				*/
Packit 6c4009
32:	subcc		%o0, 4, %g6			/* IEU1		Group		*/
Packit 6c4009
Packit 6c4009
	ba,pt		%xcc, 3b			/* CTI				*/
Packit 6c4009
	 sllx		%o4, 24, %g3			/* IEU0				*/
Packit 6c4009
33:	sllx		%g6, 32, %g3			/* IEU0		Group		*/
Packit 6c4009
	ba,pt		%xcc, 3b			/* CTI				*/
Packit 6c4009
Packit 6c4009
	 sub		%o0, 5, %g6			/* IEU1				*/
Packit 6c4009
34:	subcc		%o0, 6, %g6			/* IEU1		Group		*/
Packit 6c4009
	ba,pt		%xcc, 3b			/* CTI				*/
Packit 6c4009
	 sllx		%o4, 40, %g3			/* IEU0				*/
Packit 6c4009
Packit 6c4009
35:	sllx		%g6, 48, %g3			/* IEU0		Group		*/
Packit 6c4009
	ba,pt		%xcc, 3b			/* CTI				*/
Packit 6c4009
	 sub		%o0, 7, %g6			/* IEU1				*/
Packit 6c4009
36:	subcc		%o0, 8, %g6			/* IEU1		Group		*/
Packit 6c4009
Packit 6c4009
	ba,pt		%xcc, 3b			/* CTI				*/
Packit 6c4009
	 sllx		%o4, 56, %g3			/* IEU0				*/
Packit 6c4009
END(__stpncpy)
Packit 6c4009
Packit 6c4009
libc_hidden_def (__stpncpy)
Packit 6c4009
weak_alias (__stpncpy, stpncpy)