1/* 2 * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License version 2 as 6 * published by the Free Software Foundation. 7 */ 8 9/* If dst and src are 4 byte aligned, copy 8 bytes at a time. 10 If the src is 4, but not 8 byte aligned, we first read 4 bytes to get 11 it 8 byte aligned. Thus, we can do a little read-ahead, without 12 dereferencing a cache line that we should not touch. 13 Note that short and long instructions have been scheduled to avoid 14 branch stalls. 15 The beq_s to r3z could be made unaligned & long to avoid a stall 16 there, but the it is not likely to be taken often, and it 17 would also be likey to cost an unaligned mispredict at the next call. */ 18 19#include <linux/linkage.h> 20 21ENTRY(strcpy) 22 or r2,r0,r1 23 bmsk_s r2,r2,1 24 brne.d r2,0,charloop 25 mov_s r10,r0 26 ld_s r3,[r1,0] 27 mov r8,0x01010101 28 bbit0.d r1,2,loop_start 29 ror r12,r8 30 sub r2,r3,r8 31 bic_s r2,r2,r3 32 tst_s r2,r12 33 bne r3z 34 mov_s r4,r3 35 .balign 4 36loop: 37 ld.a r3,[r1,4] 38 st.ab r4,[r10,4] 39loop_start: 40 ld.a r4,[r1,4] 41 sub r2,r3,r8 42 bic_s r2,r2,r3 43 tst_s r2,r12 44 bne_s r3z 45 st.ab r3,[r10,4] 46 sub r2,r4,r8 47 bic r2,r2,r4 48 tst r2,r12 49 beq loop 50 mov_s r3,r4 51#ifdef __LITTLE_ENDIAN__ 52r3z: bmsk.f r1,r3,7 53 lsr_s r3,r3,8 54#else 55r3z: lsr.f r1,r3,24 56 asl_s r3,r3,8 57#endif 58 bne.d r3z 59 stb.ab r1,[r10,1] 60 j_s [blink] 61 62 .balign 4 63charloop: 64 ldb.ab r3,[r1,1] 65 66 67 brne.d r3,0,charloop 68 stb.ab r3,[r10,1] 69 j [blink] 70END(strcpy) 71