Blame sysdeps/sparc/sparc32/memcpy.S

Packit 6c4009
/* Copy SIZE bytes from SRC to 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 David S. Miller <davem@caip.rutgers.edu>,
Packit 6c4009
		  Eddie C. Dost <ecd@skynet.be> and
Packit 6c4009
                  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
/* Both these macros have to start with exactly the same insn */
Packit 6c4009
#define MOVE_BIGCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) 				\
Packit 6c4009
	ldd	[%src + offset + 0x00], %t0; 								\
Packit 6c4009
	ldd	[%src + offset + 0x08], %t2; 								\
Packit 6c4009
	ldd	[%src + offset + 0x10], %t4; 								\
Packit 6c4009
	ldd	[%src + offset + 0x18], %t6; 								\
Packit 6c4009
	st	%t0, [%dst + offset + 0x00]; 								\
Packit 6c4009
	st	%t1, [%dst + offset + 0x04]; 								\
Packit 6c4009
	st	%t2, [%dst + offset + 0x08]; 								\
Packit 6c4009
	st	%t3, [%dst + offset + 0x0c]; 								\
Packit 6c4009
	st	%t4, [%dst + offset + 0x10]; 								\
Packit 6c4009
	st	%t5, [%dst + offset + 0x14]; 								\
Packit 6c4009
	st	%t6, [%dst + offset + 0x18]; 								\
Packit 6c4009
	st	%t7, [%dst + offset + 0x1c];
Packit 6c4009
Packit 6c4009
#define MOVE_BIGALIGNCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) 				\
Packit 6c4009
	ldd	[%src + offset + 0x00], %t0; 								\
Packit 6c4009
	ldd	[%src + offset + 0x08], %t2; 								\
Packit 6c4009
	ldd	[%src + offset + 0x10], %t4; 								\
Packit 6c4009
	ldd	[%src + offset + 0x18], %t6; 								\
Packit 6c4009
	std	%t0, [%dst + offset + 0x00]; 								\
Packit 6c4009
	std	%t2, [%dst + offset + 0x08]; 								\
Packit 6c4009
	std	%t4, [%dst + offset + 0x10]; 								\
Packit 6c4009
	std	%t6, [%dst + offset + 0x18];
Packit 6c4009
Packit 6c4009
#define MOVE_LASTCHUNK(src, dst, offset, t0, t1, t2, t3) 						\
Packit 6c4009
	ldd	[%src - offset - 0x10], %t0; 								\
Packit 6c4009
	ldd	[%src - offset - 0x08], %t2; 								\
Packit 6c4009
	st	%t0, [%dst - offset - 0x10]; 								\
Packit 6c4009
	st	%t1, [%dst - offset - 0x0c]; 								\
Packit 6c4009
	st	%t2, [%dst - offset - 0x08]; 								\
Packit 6c4009
	st	%t3, [%dst - offset - 0x04];
Packit 6c4009
Packit 6c4009
#define MOVE_LASTALIGNCHUNK(src, dst, offset, t0, t1, t2, t3) 						\
Packit 6c4009
	ldd	[%src - offset - 0x10], %t0; 								\
Packit 6c4009
	ldd	[%src - offset - 0x08], %t2; 								\
Packit 6c4009
	std	%t0, [%dst - offset - 0x10]; 								\
Packit 6c4009
	std	%t2, [%dst - offset - 0x08];
Packit 6c4009
Packit 6c4009
#define MOVE_SHORTCHUNK(src, dst, offset, t0, t1) 							\
Packit 6c4009
	ldub	[%src - offset - 0x02], %t0; 								\
Packit 6c4009
	ldub	[%src - offset - 0x01], %t1; 								\
Packit 6c4009
	stb	%t0, [%dst - offset - 0x02]; 								\
Packit 6c4009
	stb	%t1, [%dst - offset - 0x01];
Packit 6c4009
Packit 6c4009
#define SMOVE_CHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, prev, shil, shir, offset2) 		\
Packit 6c4009
	ldd	[%src + offset + 0x00], %t0; 								\
Packit 6c4009
	ldd	[%src + offset + 0x08], %t2; 								\
Packit 6c4009
	srl	%t0, shir, %t5; 									\
Packit 6c4009
	srl	%t1, shir, %t6; 									\
Packit 6c4009
	sll	%t0, shil, %t0; 									\
Packit 6c4009
	or	%t5, %prev, %t5; 									\
Packit 6c4009
	sll	%t1, shil, %prev; 									\
Packit 6c4009
	or	%t6, %t0, %t0; 										\
Packit 6c4009
	srl	%t2, shir, %t1; 									\
Packit 6c4009
	srl	%t3, shir, %t6; 									\
Packit 6c4009
	sll	%t2, shil, %t2; 									\
Packit 6c4009
	or	%t1, %prev, %t1; 									\
Packit 6c4009
	std	%t4, [%dst + offset + offset2 - 0x04]; 							\
Packit 6c4009
	std	%t0, [%dst + offset + offset2 + 0x04];							\
Packit 6c4009
	sll	%t3, shil, %prev; 									\
Packit 6c4009
	or	%t6, %t2, %t4;
Packit 6c4009
Packit 6c4009
#define SMOVE_ALIGNCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, prev, shil, shir, offset2) 	\
Packit 6c4009
	ldd	[%src + offset + 0x00], %t0; 								\
Packit 6c4009
	ldd	[%src + offset + 0x08], %t2; 								\
Packit 6c4009
	srl	%t0, shir, %t4; 									\
Packit 6c4009
	srl	%t1, shir, %t5; 									\
Packit 6c4009
	sll	%t0, shil, %t6; 									\
Packit 6c4009
	or	%t4, %prev, %t0; 									\
Packit 6c4009
	sll	%t1, shil, %prev; 									\
Packit 6c4009
	or	%t5, %t6, %t1; 										\
Packit 6c4009
	srl	%t2, shir, %t4; 									\
Packit 6c4009
	srl	%t3, shir, %t5; 									\
Packit 6c4009
	sll	%t2, shil, %t6; 									\
Packit 6c4009
	or	%t4, %prev, %t2; 									\
Packit 6c4009
	sll	%t3, shil, %prev; 									\
Packit 6c4009
	or	%t5, %t6, %t3;										\
Packit 6c4009
	std	%t0, [%dst + offset + offset2 + 0x00]; 							\
Packit 6c4009
	std	%t2, [%dst + offset + offset2 + 0x08];
Packit 6c4009
Packit 6c4009
	.text
Packit 6c4009
ENTRY(__mempcpy)
Packit 6c4009
	add		%o0, %o2, %g1
Packit 6c4009
	ba		101f
Packit 6c4009
	 st		%g1, [%sp + 64]
Packit 6c4009
END(__mempcpy)
Packit 6c4009
Packit 6c4009
	.align	4
Packit 6c4009
ENTRY(memcpy)		/* %o0=dst %o1=src %o2=len */
Packit 6c4009
	st		%o0, [%sp + 64]
Packit 6c4009
101:
Packit 6c4009
	sub		%o0, %o1, %o4
Packit 6c4009
9:	andcc		%o4, 3, %o5
Packit 6c4009
0:	bne		86f
Packit 6c4009
	 cmp		%o2, 15
Packit 6c4009
Packit 6c4009
	bleu		90f
Packit 6c4009
	 andcc		%o1, 3, %g0
Packit 6c4009
Packit 6c4009
	be		78f
Packit 6c4009
	 andcc		%o1, 4, %g0
Packit 6c4009
Packit 6c4009
	andcc		%o1, 1, %g0
Packit 6c4009
	be		4f
Packit 6c4009
	 andcc		%o1, 2, %g0
Packit 6c4009
Packit 6c4009
	ldub		[%o1], %g2
Packit 6c4009
	add		%o1, 1, %o1
Packit 6c4009
	stb		%g2, [%o0]
Packit 6c4009
	sub		%o2, 1, %o2
Packit 6c4009
	bne		77f
Packit 6c4009
	 add		%o0, 1, %o0
Packit 6c4009
4:	lduh		[%o1], %g2
Packit 6c4009
	add		%o1, 2, %o1
Packit 6c4009
	sth		%g2, [%o0]
Packit 6c4009
	sub		%o2, 2, %o2
Packit 6c4009
	add		%o0, 2, %o0
Packit 6c4009
Packit 6c4009
77:	andcc		%o1, 4, %g0
Packit 6c4009
78:	be		2f
Packit 6c4009
	 mov		%o2, %g1
Packit 6c4009
Packit 6c4009
	ld		[%o1], %o4
Packit 6c4009
	sub		%g1, 4, %g1
Packit 6c4009
	st		%o4, [%o0]
Packit 6c4009
	add		%o1, 4, %o1
Packit 6c4009
	add		%o0, 4, %o0
Packit 6c4009
2:	andcc		%g1, 0xffffff80, %g6
Packit 6c4009
	be		3f
Packit 6c4009
	 andcc		%o0, 4, %g0
Packit 6c4009
Packit 6c4009
	be		82f + 4
Packit 6c4009
5:	MOVE_BIGCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5)
Packit 6c4009
	MOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
Packit 6c4009
	MOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
Packit 6c4009
	MOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
Packit 6c4009
	subcc		%g6, 128, %g6
Packit 6c4009
	add		%o1, 128, %o1
Packit 6c4009
	bne		5b
Packit 6c4009
	 add		%o0, 128, %o0
Packit 6c4009
3:	andcc		%g1, 0x70, %g6
Packit 6c4009
	be		80f
Packit 6c4009
	 andcc		%g1, 8, %g0
Packit 6c4009
Packit 6c4009
	srl		%g6, 1, %o4
Packit 6c4009
	mov		%o7, %g2
Packit 6c4009
	add		%g6, %o4, %o4
Packit 6c4009
	add		%o1, %g6, %o1
Packit 6c4009
104:	call		100f
Packit 6c4009
	 add		%o0, %g6, %o0
Packit 6c4009
	jmpl		%o5 + (80f - 104b), %g0
Packit 6c4009
	 mov		%g2, %o7
Packit 6c4009
Packit 6c4009
79:	MOVE_LASTCHUNK(o1, o0, 0x60, g2, g3, g4, g5)
Packit 6c4009
	MOVE_LASTCHUNK(o1, o0, 0x50, g2, g3, g4, g5)
Packit 6c4009
	MOVE_LASTCHUNK(o1, o0, 0x40, g2, g3, g4, g5)
Packit 6c4009
	MOVE_LASTCHUNK(o1, o0, 0x30, g2, g3, g4, g5)
Packit 6c4009
	MOVE_LASTCHUNK(o1, o0, 0x20, g2, g3, g4, g5)
Packit 6c4009
	MOVE_LASTCHUNK(o1, o0, 0x10, g2, g3, g4, g5)
Packit 6c4009
	MOVE_LASTCHUNK(o1, o0, 0x00, g2, g3, g4, g5)
Packit 6c4009
Packit 6c4009
80:	be		81f
Packit 6c4009
	 andcc		%g1, 4, %g0
Packit 6c4009
Packit 6c4009
	ldd		[%o1], %g2
Packit 6c4009
	add		%o0, 8, %o0
Packit 6c4009
	st		%g2, [%o0 - 0x08]
Packit 6c4009
	add		%o1, 8, %o1
Packit 6c4009
	st		%g3, [%o0 - 0x04]
Packit 6c4009
Packit 6c4009
81:	be		1f
Packit 6c4009
	 andcc		%g1, 2, %g0
Packit 6c4009
Packit 6c4009
	ld		[%o1], %g2
Packit 6c4009
	add		%o1, 4, %o1
Packit 6c4009
	st		%g2, [%o0]
Packit 6c4009
	add		%o0, 4, %o0
Packit 6c4009
1:	be		1f
Packit 6c4009
	 andcc		%g1, 1, %g0
Packit 6c4009
Packit 6c4009
	lduh		[%o1], %g2
Packit 6c4009
	add		%o1, 2, %o1
Packit 6c4009
	sth		%g2, [%o0]
Packit 6c4009
	add		%o0, 2, %o0
Packit 6c4009
1:	be		1f
Packit 6c4009
	 nop
Packit 6c4009
Packit 6c4009
	ldub		[%o1], %g2
Packit 6c4009
	stb		%g2, [%o0]
Packit 6c4009
1:	retl
Packit 6c4009
	 ld		[%sp + 64], %o0
Packit 6c4009
Packit 6c4009
82:	/* ldd_std */
Packit 6c4009
	MOVE_BIGALIGNCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5)
Packit 6c4009
	MOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
Packit 6c4009
	MOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
Packit 6c4009
	MOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
Packit 6c4009
	subcc		%g6, 128, %g6
Packit 6c4009
	add		%o1, 128, %o1
Packit 6c4009
	bne		82b
Packit 6c4009
	 add		%o0, 128, %o0
Packit 6c4009
Packit 6c4009
	andcc		%g1, 0x70, %g6
Packit 6c4009
	be		84f
Packit 6c4009
	 andcc		%g1, 8, %g0
Packit 6c4009
Packit 6c4009
	mov		%o7, %g2
Packit 6c4009
111:	call		110f
Packit 6c4009
	 add		%o1, %g6, %o1
Packit 6c4009
	mov		%g2, %o7
Packit 6c4009
	jmpl		%o5 + (84f - 111b), %g0
Packit 6c4009
	 add		%o0, %g6, %o0
Packit 6c4009
Packit 6c4009
83:	MOVE_LASTALIGNCHUNK(o1, o0, 0x60, g2, g3, g4, g5)
Packit 6c4009
	MOVE_LASTALIGNCHUNK(o1, o0, 0x50, g2, g3, g4, g5)
Packit 6c4009
	MOVE_LASTALIGNCHUNK(o1, o0, 0x40, g2, g3, g4, g5)
Packit 6c4009
	MOVE_LASTALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5)
Packit 6c4009
	MOVE_LASTALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5)
Packit 6c4009
	MOVE_LASTALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5)
Packit 6c4009
	MOVE_LASTALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5)
Packit 6c4009
Packit 6c4009
84:	be		85f
Packit 6c4009
	 andcc		%g1, 4, %g0
Packit 6c4009
Packit 6c4009
	ldd		[%o1], %g2
Packit 6c4009
	add		%o0, 8, %o0
Packit 6c4009
	std		%g2, [%o0 - 0x08]
Packit 6c4009
	add		%o1, 8, %o1
Packit 6c4009
85:	be		1f
Packit 6c4009
	 andcc		%g1, 2, %g0
Packit 6c4009
Packit 6c4009
	ld		[%o1], %g2
Packit 6c4009
	add		%o1, 4, %o1
Packit 6c4009
	st		%g2, [%o0]
Packit 6c4009
	add		%o0, 4, %o0
Packit 6c4009
1:	be		1f
Packit 6c4009
	 andcc		%g1, 1, %g0
Packit 6c4009
Packit 6c4009
	lduh		[%o1], %g2
Packit 6c4009
	add		%o1, 2, %o1
Packit 6c4009
	sth		%g2, [%o0]
Packit 6c4009
	add		%o0, 2, %o0
Packit 6c4009
1:	be		1f
Packit 6c4009
	 nop
Packit 6c4009
Packit 6c4009
	ldub		[%o1], %g2
Packit 6c4009
	stb		%g2, [%o0]
Packit 6c4009
1:	retl
Packit 6c4009
	 ld		[%sp + 64], %o0
Packit 6c4009
Packit 6c4009
86:	cmp		%o2, 6
Packit 6c4009
	bleu		88f
Packit 6c4009
Packit 6c4009
	 cmp		%o2, 256
Packit 6c4009
	bcc		87f
Packit 6c4009
Packit 6c4009
	 andcc		%o0, 3, %g0
Packit 6c4009
	be		61f
Packit 6c4009
	 andcc		%o0, 1, %g0
Packit 6c4009
	be		60f
Packit 6c4009
	 andcc		%o0, 2, %g0
Packit 6c4009
Packit 6c4009
	ldub		[%o1], %g5
Packit 6c4009
	add		%o1, 1, %o1
Packit 6c4009
	stb		%g5, [%o0]
Packit 6c4009
	sub		%o2, 1, %o2
Packit 6c4009
	bne		61f
Packit 6c4009
	 add		%o0, 1, %o0
Packit 6c4009
60:	ldub		[%o1], %g3
Packit 6c4009
	add		%o1, 2, %o1
Packit 6c4009
	stb		%g3, [%o0]
Packit 6c4009
	sub		%o2, 2, %o2
Packit 6c4009
	ldub		[%o1 - 1], %g3
Packit 6c4009
	add		%o0, 2, %o0
Packit 6c4009
	stb		%g3, [%o0 - 1]
Packit 6c4009
61:	and		%o1, 3, %g2
Packit 6c4009
	and		%o2, 0xc, %g3
Packit 6c4009
	and		%o1, -4, %o1
Packit 6c4009
	cmp		%g3, 4
Packit 6c4009
	sll		%g2, 3, %g4
Packit 6c4009
	mov		32, %g2
Packit 6c4009
	be		4f
Packit 6c4009
	 sub		%g2, %g4, %g6
Packit 6c4009
Packit 6c4009
	blu		3f
Packit 6c4009
	 cmp		%g3, 0x8
Packit 6c4009
Packit 6c4009
	be		2f
Packit 6c4009
	 srl		%o2, 2, %g3
Packit 6c4009
Packit 6c4009
	ld		[%o1], %o3
Packit 6c4009
	add		%o0, -8, %o0
Packit 6c4009
	ld		[%o1 + 4], %o4
Packit 6c4009
	b		8f
Packit 6c4009
	 add		%g3, 1, %g3
Packit 6c4009
2:	ld		[%o1], %o4
Packit 6c4009
	add		%o0, -12, %o0
Packit 6c4009
	ld		[%o1 + 4], %o5
Packit 6c4009
	add		%g3, 2, %g3
Packit 6c4009
	b		9f
Packit 6c4009
	 add		%o1, -4, %o1
Packit 6c4009
3:	ld		[%o1], %g1
Packit 6c4009
	add		%o0, -4, %o0
Packit 6c4009
	ld		[%o1 + 4], %o3
Packit 6c4009
	srl		%o2, 2, %g3
Packit 6c4009
	b		7f
Packit 6c4009
	 add		%o1, 4, %o1
Packit 6c4009
4:	ld		[%o1], %o5
Packit 6c4009
	cmp		%o2, 7
Packit 6c4009
	ld		[%o1 + 4], %g1
Packit 6c4009
	srl		%o2, 2, %g3
Packit 6c4009
	bleu		10f
Packit 6c4009
	 add		%o1, 8, %o1
Packit 6c4009
Packit 6c4009
	ld		[%o1], %o3
Packit 6c4009
	add		%g3, -1, %g3
Packit 6c4009
5:	sll		%o5, %g4, %g2
Packit 6c4009
	srl		%g1, %g6, %g5
Packit 6c4009
	or		%g2, %g5, %g2
Packit 6c4009
	st		%g2, [%o0]
Packit 6c4009
7:	ld		[%o1 + 4], %o4
Packit 6c4009
	sll		%g1, %g4, %g2
Packit 6c4009
	srl		%o3, %g6, %g5
Packit 6c4009
	or		%g2, %g5, %g2
Packit 6c4009
	st		%g2, [%o0 + 4]
Packit 6c4009
8:	ld		[%o1 + 8], %o5
Packit 6c4009
	sll		%o3, %g4, %g2
Packit 6c4009
	srl		%o4, %g6, %g5
Packit 6c4009
	or		%g2, %g5, %g2
Packit 6c4009
	st		%g2, [%o0 + 8]
Packit 6c4009
9:	ld		[%o1 + 12], %g1
Packit 6c4009
	sll		%o4, %g4, %g2
Packit 6c4009
	srl		%o5, %g6, %g5
Packit 6c4009
	addcc		%g3, -4, %g3
Packit 6c4009
	or		%g2, %g5, %g2
Packit 6c4009
	add		%o1, 16, %o1
Packit 6c4009
	st		%g2, [%o0 + 12]
Packit 6c4009
	add		%o0, 16, %o0
Packit 6c4009
	bne,a		5b
Packit 6c4009
	 ld		[%o1], %o3
Packit 6c4009
10:	sll		%o5, %g4, %g2
Packit 6c4009
	srl		%g1, %g6, %g5
Packit 6c4009
	srl		%g6, 3, %g3
Packit 6c4009
	or		%g2, %g5, %g2
Packit 6c4009
	sub		%o1, %g3, %o1
Packit 6c4009
	andcc		%o2, 2, %g0
Packit 6c4009
	st		%g2, [%o0]
Packit 6c4009
	be		1f
Packit 6c4009
	 andcc		%o2, 1, %g0
Packit 6c4009
Packit 6c4009
	ldub		[%o1], %g2
Packit 6c4009
	add		%o1, 2, %o1
Packit 6c4009
	stb		%g2, [%o0 + 4]
Packit 6c4009
	add		%o0, 2, %o0
Packit 6c4009
	ldub		[%o1 - 1], %g2
Packit 6c4009
	stb		%g2, [%o0 + 3]
Packit 6c4009
1:	be		1f
Packit 6c4009
	 nop
Packit 6c4009
	ldub		[%o1], %g2
Packit 6c4009
	stb		%g2, [%o0 + 4]
Packit 6c4009
1:	retl
Packit 6c4009
	 ld		[%sp + 64], %o0
Packit 6c4009
Packit 6c4009
87:	andcc		%o1, 3, %g0
Packit 6c4009
	be		3f
Packit 6c4009
	 andcc		%o1, 1, %g0
Packit 6c4009
Packit 6c4009
	be		4f
Packit 6c4009
	 andcc		%o1, 2, %g0
Packit 6c4009
Packit 6c4009
	ldub		[%o1], %g2
Packit 6c4009
	add		%o1, 1, %o1
Packit 6c4009
	stb		%g2, [%o0]
Packit 6c4009
	sub		%o2, 1, %o2
Packit 6c4009
	bne		3f
Packit 6c4009
	 add		%o0, 1, %o0
Packit 6c4009
4:	lduh		[%o1], %g2
Packit 6c4009
	add		%o1, 2, %o1
Packit 6c4009
	srl		%g2, 8, %g3
Packit 6c4009
	sub		%o2, 2, %o2
Packit 6c4009
	stb		%g3, [%o0]
Packit 6c4009
	add		%o0, 2, %o0
Packit 6c4009
	stb		%g2, [%o0 - 1]
Packit 6c4009
3:	 andcc		%o1, 4, %g0
Packit 6c4009
Packit 6c4009
	bne		2f
Packit 6c4009
	 cmp		%o5, 1
Packit 6c4009
Packit 6c4009
	ld		[%o1], %o4
Packit 6c4009
	srl		%o4, 24, %g2
Packit 6c4009
	stb		%g2, [%o0]
Packit 6c4009
	srl		%o4, 16, %g3
Packit 6c4009
	stb		%g3, [%o0 + 1]
Packit 6c4009
	srl		%o4, 8, %g2
Packit 6c4009
	stb		%g2, [%o0 + 2]
Packit 6c4009
	sub		%o2, 4, %o2
Packit 6c4009
	stb		%o4, [%o0 + 3]
Packit 6c4009
	add		%o1, 4, %o1
Packit 6c4009
	add		%o0, 4, %o0
Packit 6c4009
2:	be		33f
Packit 6c4009
	 cmp		%o5, 2
Packit 6c4009
	be		32f
Packit 6c4009
	 sub		%o2, 4, %o2
Packit 6c4009
31:	ld		[%o1], %g2
Packit 6c4009
	add		%o1, 4, %o1
Packit 6c4009
	srl		%g2, 24, %g3
Packit 6c4009
	and		%o0, 7, %g5
Packit 6c4009
	stb		%g3, [%o0]
Packit 6c4009
	cmp		%g5, 7
Packit 6c4009
	sll		%g2, 8, %g1
Packit 6c4009
	add		%o0, 4, %o0
Packit 6c4009
	be		41f
Packit 6c4009
	 and		%o2, 0xffffffc0, %o3
Packit 6c4009
	ld		[%o0 - 7], %o4
Packit 6c4009
4:	SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
Packit 6c4009
	SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
Packit 6c4009
	SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
Packit 6c4009
	SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
Packit 6c4009
	subcc		%o3, 64, %o3
Packit 6c4009
	add		%o1, 64, %o1
Packit 6c4009
	bne		4b
Packit 6c4009
	 add		%o0, 64, %o0
Packit 6c4009
Packit 6c4009
	andcc		%o2, 0x30, %o3
Packit 6c4009
	be,a		1f
Packit 6c4009
	 srl		%g1, 16, %g2
Packit 6c4009
4:	SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
Packit 6c4009
	subcc		%o3, 16, %o3
Packit 6c4009
	add		%o1, 16, %o1
Packit 6c4009
	bne		4b
Packit 6c4009
	 add		%o0, 16, %o0
Packit 6c4009
Packit 6c4009
	srl		%g1, 16, %g2
Packit 6c4009
1:	st		%o4, [%o0 - 7]
Packit 6c4009
	sth		%g2, [%o0 - 3]
Packit 6c4009
	srl		%g1, 8, %g4
Packit 6c4009
	b		88f
Packit 6c4009
	 stb		%g4, [%o0 - 1]
Packit 6c4009
32:	ld		[%o1], %g2
Packit 6c4009
	add		%o1, 4, %o1
Packit 6c4009
	srl		%g2, 16, %g3
Packit 6c4009
	and		%o0, 7, %g5
Packit 6c4009
	sth		%g3, [%o0]
Packit 6c4009
	cmp		%g5, 6
Packit 6c4009
	sll		%g2, 16, %g1
Packit 6c4009
	add		%o0, 4, %o0
Packit 6c4009
	be		42f
Packit 6c4009
	 and		%o2, 0xffffffc0, %o3
Packit 6c4009
	ld		[%o0 - 6], %o4
Packit 6c4009
4:	SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
Packit 6c4009
	SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
Packit 6c4009
	SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
Packit 6c4009
	SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
Packit 6c4009
	subcc		%o3, 64, %o3
Packit 6c4009
	add		%o1, 64, %o1
Packit 6c4009
	bne		4b
Packit 6c4009
	 add		%o0, 64, %o0
Packit 6c4009
Packit 6c4009
	andcc		%o2, 0x30, %o3
Packit 6c4009
	be,a		1f
Packit 6c4009
	 srl		%g1, 16, %g2
Packit 6c4009
4:	SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
Packit 6c4009
	subcc		%o3, 16, %o3
Packit 6c4009
	add		%o1, 16, %o1
Packit 6c4009
	bne		4b
Packit 6c4009
	 add		%o0, 16, %o0
Packit 6c4009
Packit 6c4009
	srl		%g1, 16, %g2
Packit 6c4009
1:	st		%o4, [%o0 - 6]
Packit 6c4009
	b		88f
Packit 6c4009
	 sth		%g2, [%o0 - 2]
Packit 6c4009
33:	ld		[%o1], %g2
Packit 6c4009
	sub		%o2, 4, %o2
Packit 6c4009
	srl		%g2, 24, %g3
Packit 6c4009
	and		%o0, 7, %g5
Packit 6c4009
	stb		%g3, [%o0]
Packit 6c4009
	cmp		%g5, 5
Packit 6c4009
	srl		%g2, 8, %g4
Packit 6c4009
	sll		%g2, 24, %g1
Packit 6c4009
	sth		%g4, [%o0 + 1]
Packit 6c4009
	add		%o1, 4, %o1
Packit 6c4009
	be		43f
Packit 6c4009
	 and		%o2, 0xffffffc0, %o3
Packit 6c4009
Packit 6c4009
	ld		[%o0 - 1], %o4
Packit 6c4009
	add		%o0, 4, %o0
Packit 6c4009
4:	SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1)
Packit 6c4009
	SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1)
Packit 6c4009
	SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1)
Packit 6c4009
	SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1)
Packit 6c4009
	subcc		%o3, 64, %o3
Packit 6c4009
	add		%o1, 64, %o1
Packit 6c4009
	bne		4b
Packit 6c4009
	 add		%o0, 64, %o0
Packit 6c4009
Packit 6c4009
	andcc		%o2, 0x30, %o3
Packit 6c4009
	be,a		1f
Packit 6c4009
	 srl		%g1, 24, %g2
Packit 6c4009
4:	SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1)
Packit 6c4009
	subcc		%o3, 16, %o3
Packit 6c4009
	add		%o1, 16, %o1
Packit 6c4009
	bne		4b
Packit 6c4009
	 add		%o0, 16, %o0
Packit 6c4009
Packit 6c4009
	srl		%g1, 24, %g2
Packit 6c4009
1:	st		%o4, [%o0 - 5]
Packit 6c4009
	b		88f
Packit 6c4009
	 stb		%g2, [%o0 - 1]
Packit 6c4009
41:	SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
Packit 6c4009
	SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
Packit 6c4009
	SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
Packit 6c4009
	SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
Packit 6c4009
	subcc		%o3, 64, %o3
Packit 6c4009
	add		%o1, 64, %o1
Packit 6c4009
	bne		41b
Packit 6c4009
	 add		%o0, 64, %o0
Packit 6c4009
Packit 6c4009
	andcc		%o2, 0x30, %o3
Packit 6c4009
	be,a		1f
Packit 6c4009
	 srl		%g1, 16, %g2
Packit 6c4009
4:	SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3)
Packit 6c4009
	subcc		%o3, 16, %o3
Packit 6c4009
	add		%o1, 16, %o1
Packit 6c4009
	bne		4b
Packit 6c4009
	 add		%o0, 16, %o0
Packit 6c4009
Packit 6c4009
	srl		%g1, 16, %g2
Packit 6c4009
1:	sth		%g2, [%o0 - 3]
Packit 6c4009
	srl		%g1, 8, %g4
Packit 6c4009
	b		88f
Packit 6c4009
	 stb		%g4, [%o0 - 1]
Packit 6c4009
43:	SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3)
Packit 6c4009
	SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3)
Packit 6c4009
	SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3)
Packit 6c4009
	SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3)
Packit 6c4009
	subcc		%o3, 64, %o3
Packit 6c4009
	add		%o1, 64, %o1
Packit 6c4009
	bne		43b
Packit 6c4009
	 add		%o0, 64, %o0
Packit 6c4009
Packit 6c4009
	andcc		%o2, 0x30, %o3
Packit 6c4009
	be,a		1f
Packit 6c4009
	 srl		%g1, 24, %g2
Packit 6c4009
4:	SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3)
Packit 6c4009
	subcc		%o3, 16, %o3
Packit 6c4009
	add		%o1, 16, %o1
Packit 6c4009
	bne		4b
Packit 6c4009
	 add		%o0, 16, %o0
Packit 6c4009
Packit 6c4009
	srl		%g1, 24, %g2
Packit 6c4009
1:	stb		%g2, [%o0 + 3]
Packit 6c4009
	b		88f
Packit 6c4009
	 add		%o0, 4, %o0
Packit 6c4009
42:	SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
Packit 6c4009
	SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
Packit 6c4009
	SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
Packit 6c4009
	SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
Packit 6c4009
	subcc		%o3, 64, %o3
Packit 6c4009
	add		%o1, 64, %o1
Packit 6c4009
	bne		42b
Packit 6c4009
	 add		%o0, 64, %o0
Packit 6c4009
Packit 6c4009
	andcc		%o2, 0x30, %o3
Packit 6c4009
	be,a		1f
Packit 6c4009
	 srl		%g1, 16, %g2
Packit 6c4009
4:	SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2)
Packit 6c4009
	subcc		%o3, 16, %o3
Packit 6c4009
	add		%o1, 16, %o1
Packit 6c4009
	bne		4b
Packit 6c4009
	 add		%o0, 16, %o0
Packit 6c4009
Packit 6c4009
	srl		%g1, 16, %g2
Packit 6c4009
1:	sth		%g2, [%o0 - 2]
Packit 6c4009
Packit 6c4009
	/* Fall through */
Packit 6c4009
Packit 6c4009
88:	and		%o2, 0xe, %o3
Packit 6c4009
	mov		%o7, %g2
Packit 6c4009
	sll		%o3, 3, %o4
Packit 6c4009
	add		%o0, %o3, %o0
Packit 6c4009
106:	call		100f
Packit 6c4009
	 add		%o1, %o3, %o1
Packit 6c4009
	mov		%g2, %o7
Packit 6c4009
	jmpl		%o5 + (89f - 106b), %g0
Packit 6c4009
	 andcc		%o2, 1, %g0
Packit 6c4009
Packit 6c4009
	MOVE_SHORTCHUNK(o1, o0, 0x0c, g2, g3)
Packit 6c4009
	MOVE_SHORTCHUNK(o1, o0, 0x0a, g2, g3)
Packit 6c4009
	MOVE_SHORTCHUNK(o1, o0, 0x08, g2, g3)
Packit 6c4009
	MOVE_SHORTCHUNK(o1, o0, 0x06, g2, g3)
Packit 6c4009
	MOVE_SHORTCHUNK(o1, o0, 0x04, g2, g3)
Packit 6c4009
	MOVE_SHORTCHUNK(o1, o0, 0x02, g2, g3)
Packit 6c4009
	MOVE_SHORTCHUNK(o1, o0, 0x00, g2, g3)
Packit 6c4009
Packit 6c4009
89:	be		1f
Packit 6c4009
	 nop
Packit 6c4009
Packit 6c4009
	ldub		[%o1], %g2
Packit 6c4009
	stb		%g2, [%o0]
Packit 6c4009
1:	retl
Packit 6c4009
	 ld		[%sp + 64], %o0
Packit 6c4009
Packit 6c4009
90:	bne		88b
Packit 6c4009
	 andcc		%o2, 8, %g0
Packit 6c4009
Packit 6c4009
	be		1f
Packit 6c4009
	 andcc		%o2, 4, %g0
Packit 6c4009
Packit 6c4009
	ld		[%o1 + 0x00], %g2
Packit 6c4009
	ld		[%o1 + 0x04], %g3
Packit 6c4009
	add		%o1, 8, %o1
Packit 6c4009
	st		%g2, [%o0 + 0x00]
Packit 6c4009
	st		%g3, [%o0 + 0x04]
Packit 6c4009
	add		%o0, 8, %o0
Packit 6c4009
1:	b		81b
Packit 6c4009
	 mov		%o2, %g1
Packit 6c4009
Packit 6c4009
100:	retl
Packit 6c4009
	 sub		%o7, %o4, %o5
Packit 6c4009
110:	retl
Packit 6c4009
	 sub		%o7, %g6, %o5
Packit 6c4009
END(memcpy)
Packit 6c4009
Packit 6c4009
libc_hidden_builtin_def (memcpy)
Packit 6c4009
Packit 6c4009
libc_hidden_def (__mempcpy)
Packit 6c4009
weak_alias (__mempcpy, mempcpy)
Packit 6c4009
libc_hidden_builtin_def (mempcpy)