73 lines
		
	
	
	
		
			1.2 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
		
		
			
		
	
	
			73 lines
		
	
	
	
		
			1.2 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
|   | /* | ||
|  |  * Copyright (C) 2004-2006 Atmel Corporation | ||
|  |  * | ||
|  |  * Based on linux/arch/arm/lib/memset.S | ||
|  |  *   Copyright (C) 1995-2000 Russell King | ||
|  |  * | ||
|  |  * This program is free software; you can redistribute it and/or modify
 | ||
|  |  * it under the terms of the GNU General Public License version 2 as | ||
|  |  * published by the Free Software Foundation. | ||
|  |  * | ||
|  |  * ASM optimised string functions | ||
|  |  */ | ||
|  | #include <asm/asm.h> | ||
|  | 
 | ||
|  | 	/* | ||
|  | 	 * r12:	void *b | ||
|  | 	 * r11:	int c | ||
|  | 	 * r10:	size_t len | ||
|  | 	 * | ||
|  | 	 * Returns b in r12 | ||
|  | 	 */ | ||
|  | 	.text | ||
|  | 	.global	memset
 | ||
|  | 	.type	memset, @function
 | ||
|  | 	.align	5
 | ||
|  | memset: | ||
|  | 	mov	r9, r12 | ||
|  | 	mov	r8, r12 | ||
|  | 	or	r11, r11, r11 << 8 | ||
|  | 	andl	r9, 3, COH | ||
|  | 	brne	1f | ||
|  | 
 | ||
|  | 2:	or	r11, r11, r11 << 16 | ||
|  | 	sub	r10, 4 | ||
|  | 	brlt	5f | ||
|  | 
 | ||
|  | 	/* Let's do some real work */ | ||
|  | 4:	st.w	r8++, r11 | ||
|  | 	sub	r10, 4 | ||
|  | 	brge	4b | ||
|  | 
 | ||
|  | 	/* | ||
|  | 	 * When we get here, we've got less than 4 bytes to set. r10 | ||
|  | 	 * might be negative. | ||
|  | 	 */ | ||
|  | 5:	sub	r10, -4 | ||
|  | 	reteq	r12 | ||
|  | 
 | ||
|  | 	/* Fastpath ends here, exactly 32 bytes from memset */ | ||
|  | 
 | ||
|  | 	/* Handle unaligned count or pointer */ | ||
|  | 	bld	r10, 1 | ||
|  | 	brcc	6f | ||
|  | 	st.b	r8++, r11 | ||
|  | 	st.b	r8++, r11 | ||
|  | 	bld	r10, 0 | ||
|  | 	retcc	r12 | ||
|  | 6:	st.b	r8++, r11 | ||
|  | 	retal	r12 | ||
|  | 
 | ||
|  | 	/* Handle unaligned pointer */ | ||
|  | 1:	sub	r10, 4 | ||
|  | 	brlt	5b | ||
|  | 	add	r10, r9 | ||
|  | 	lsl	r9, 1 | ||
|  | 	add	pc, r9 | ||
|  | 	st.b	r8++, r11 | ||
|  | 	st.b	r8++, r11 | ||
|  | 	st.b	r8++, r11 | ||
|  | 	rjmp	2b | ||
|  | 
 | ||
|  | 	.size	memset, . - memset |