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