Home | History | Annotate | Download | only in lib
      1 /*
      2  * Copyright (C) 2004-2006 Atmel Corporation
      3  *
      4  * Based on linux/arch/arm/lib/memset.S
      5  *   Copyright (C) 1995-2000 Russell King
      6  *
      7  * This program is free software; you can redistribute it and/or modify
      8  * it under the terms of the GNU General Public License version 2 as
      9  * published by the Free Software Foundation.
     10  *
     11  * ASM optimised string functions
     12  */
     13 #include <asm/asm.h>
     14 
     15 	/*
     16 	 * r12:	void *b
     17 	 * r11:	int c
     18 	 * r10:	size_t len
     19 	 *
     20 	 * Returns b in r12
     21 	 */
     22 	.text
     23 	.global	memset
     24 	.type	memset, @function
     25 	.align	5
     26 memset:
     27 	mov	r9, r12
     28 	mov	r8, r12
     29 	or	r11, r11, r11 << 8
     30 	andl	r9, 3, COH
     31 	brne	1f
     32 
     33 2:	or	r11, r11, r11 << 16
     34 	sub	r10, 4
     35 	brlt	5f
     36 
     37 	/* Let's do some real work */
     38 4:	st.w	r8++, r11
     39 	sub	r10, 4
     40 	brge	4b
     41 
     42 	/*
     43 	 * When we get here, we've got less than 4 bytes to set. r10
     44 	 * might be negative.
     45 	 */
     46 5:	sub	r10, -4
     47 	reteq	r12
     48 
     49 	/* Fastpath ends here, exactly 32 bytes from memset */
     50 
     51 	/* Handle unaligned count or pointer */
     52 	bld	r10, 1
     53 	brcc	6f
     54 	st.b	r8++, r11
     55 	st.b	r8++, r11
     56 	bld	r10, 0
     57 	retcc	r12
     58 6:	st.b	r8++, r11
     59 	retal	r12
     60 
     61 	/* Handle unaligned pointer */
     62 1:	sub	r10, 4
     63 	brlt	5b
     64 	add	r10, r9
     65 	lsl	r9, 1
     66 	add	pc, r9
     67 	st.b	r8++, r11
     68 	st.b	r8++, r11
     69 	st.b	r8++, r11
     70 	rjmp	2b
     71 
     72 	.size	memset, . - memset
     73