| /* Copyright (C) 1998 Free Software Foundation, Inc. | 
 |    This file is part of the GNU C Library. | 
 |    Contributed by Philip Blundell <philb@gnu.org> | 
 |  | 
 |    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, write to the Free | 
 |    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | 
 |    02111-1307 USA.  */ | 
 |  | 
 | #include <features.h> | 
 | #include <sys/syscall.h> | 
 | #include <bits/arm_asm.h> | 
 |  | 
 | .text | 
 | .global memset | 
 | .type memset,%function | 
 | .align 4 | 
 |  | 
 | #if defined(THUMB1_ONLY) | 
 | .thumb_func | 
 | memset: | 
 | 	mov	ip, r0 | 
 | 	cmp	r2, #8		@ at least 8 bytes to do? | 
 | 	bcc	2f | 
 |  | 
 | 	lsl	r3, r1, #8 | 
 | 	orr	r1, r3 | 
 | 	lsl	r3, r1, #16 | 
 | 	orr	r1, r3 | 
 |  | 
 | 	mov	r3, #3 | 
 | 1:	@ Fill up to the first word boundary | 
 | 	tst	r0, r3 | 
 | 	beq	1f | 
 | 	strb	r1, [r0] | 
 | 	add	r0, r0, #1 | 
 | 	sub	r2, r2, #1 | 
 | 	b	1b | 
 | 1:	@ Fill aligned words | 
 | 	str	r1, [r0] | 
 | 	add	r0, r0, #4 | 
 | 	sub	r2, r2, #4 | 
 | 	cmp	r2, #4 | 
 | 	bcs	1b | 
 |  | 
 | 2:	@ Fill the remaining bytes | 
 | 	cmp	r2, #0 | 
 | 	beq	2f | 
 | 1: | 
 | 	strb	r1, [r0] | 
 | 	add	r0, r0, #1 | 
 | 	sub	r2, r2, #1 | 
 | 	bne	1b | 
 | 2: | 
 | 	mov	r0, ip | 
 | 	bx lr | 
 | #else | 
 | memset: | 
 | 	mov	a4, a1 | 
 | 	cmp	a3, $8		@ at least 8 bytes to do? | 
 | 	blt	2f | 
 | 	orr	a2, a2, a2, lsl $8 | 
 | 	orr	a2, a2, a2, lsl $16 | 
 | 1: | 
 | 	tst	a4, $3		@ aligned yet? | 
 | #if defined(__thumb2__) | 
 | 	itt	ne | 
 | 	strbne	a2, [a4], $1 | 
 | 	subne	a3, a3, $1 | 
 | #else | 
 | 	strneb	a2, [a4], $1 | 
 | 	subne	a3, a3, $1 | 
 | #endif | 
 | 	bne	1b | 
 | 	mov	ip, a2 | 
 | 1: | 
 | 	cmp	a3, $8		@ 8 bytes still to do? | 
 | 	blt	2f | 
 | 	stmia	a4!, {a2, ip} | 
 | 	sub	a3, a3, $8 | 
 | 	cmp	a3, $8		@ 8 bytes still to do? | 
 | 	blt	2f | 
 | 	stmia	a4!, {a2, ip} | 
 | 	sub	a3, a3, $8 | 
 | 	cmp	a3, $8		@ 8 bytes still to do? | 
 | 	blt	2f | 
 | 	stmia	a4!, {a2, ip} | 
 | 	sub	a3, a3, $8 | 
 | 	cmp	a3, $8		@ 8 bytes still to do? | 
 | #if defined(__thumb2__) | 
 | 	itt	ge | 
 | 	stmiage	a4!, {a2, ip} | 
 | 	subge	a3, a3, $8 | 
 | #else | 
 | 	stmgeia	a4!, {a2, ip} | 
 | 	subge	a3, a3, $8 | 
 | #endif | 
 | 	bge	1b | 
 | 2: | 
 | 	movs	a3, a3		@ anything left? | 
 | 	IT(t, eq) | 
 | #if defined(__USE_BX__) | 
 |         bxeq    lr | 
 | #else | 
 |         moveq	pc, lr		@ nope | 
 | #endif | 
 | #if defined (__thumb2__) | 
 | 1: | 
 | 	strb	a2, [a4], #1 | 
 | 	subs	a3, a3, #1 | 
 | 	bne	1b | 
 | 	bx	lr | 
 | #else | 
 | 	rsb	a3, a3, $7 | 
 | 	add	pc, pc, a3, lsl $2 | 
 | 	mov	r0, r0 | 
 | 	strb	a2, [a4], $1 | 
 | 	strb	a2, [a4], $1 | 
 | 	strb	a2, [a4], $1 | 
 | 	strb	a2, [a4], $1 | 
 | 	strb	a2, [a4], $1 | 
 | 	strb	a2, [a4], $1 | 
 | 	strb	a2, [a4], $1 | 
 | #if defined(__USE_BX__) | 
 |         bx      lr | 
 | #else | 
 |  	mov	pc, lr | 
 | #endif | 
 | #endif | 
 | #endif | 
 |  | 
 | .size memset,.-memset | 
 |  | 
 | libc_hidden_def(memset) |