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 26memset: 27 mov r9, r12 28 mov r8, r12 29 or r11, r11, r11 << 8 30 andl r9, 3, COH 31 brne 1f 32 332: or r11, r11, r11 << 16 34 sub r10, 4 35 brlt 5f 36 37 /* Let's do some real work */ 384: 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 */ 465: 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 586: st.b r8++, r11 59 retal r12 60 61 /* Handle unaligned pointer */ 621: 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