| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 | /* Set a block of memory to some byte value.   For SPARC v7.   Copyright (C) 1996, 1999, 2003 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 Lesser General Public   License as published by the Free Software Foundation; either   version 2.1 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   Lesser General Public License for more details.   You should have received a copy of the GNU Lesser General Public   License along with the GNU C Library; if not, see   <http://www.gnu.org/licenses/>.  */#include <features.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#ifdef __UCLIBC_SUSV3_LEGACY__ENTRY(bzero)	b		1f	 mov		%g0, %g3#endif3:	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#ifdef __UCLIBC_SUSV3_LEGACY__END(bzero)#endifENTRY(memset)	and		%o1, 0xff, %g3	sll		%g3, 8, %g2	or		%g3, %g2, %g3	sll		%g3, 16, %g2	or		%g3, %g2, %g3	orcc		%o2, %g0, %o11:	cmp		%o1, 7	bleu		7f	 mov		%o0, %g1	andcc		%o0, 3, %o2	bne		3b4:	 andcc		%o0, 4, %g0	be		2f	 mov		%g3, %g2	st		%g3, [%o0]	sub		%o1, 4, %o1	add		%o0, 4, %o02:	andcc		%o1, 0xffffff80, %o3	be		9f	 andcc		%o1, 0x78, %o24:	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, %g09:	be		6f	 andcc		%o1, 7, %o1	mov		%o7, %g4101:	call		100f	 srl		%o2, 1, %o3	mov		%g4, %o7	jmpl		%o4 + (20f + 64 - 101b), %g0	 add		%o0, %o2, %o0100:	retl	 sub		%o7, %o3, %o420:	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, %o01:	be		1f	 andcc		%o1, 1, %g0	sth		%g3, [%o0]	add		%o0, 2, %o01:	bne,a		8f	 stb		%g3, [%o0]8:	retl	 mov		%g1, %o07:	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	 nopEND(memset)libc_hidden_def(memset)
 |