]> git.ipfire.org Git - people/ms/u-boot.git/blob - arch/arc/lib/strcpy-700.S
arc: add library functions
[people/ms/u-boot.git] / arch / arc / lib / strcpy-700.S
1 /*
2 * Copyright (C) 2004, 2007-2010, 2011-2014 Synopsys, Inc. All rights reserved.
3 *
4 * SPDX-License-Identifier: GPL-2.0+
5 */
6
7 /*
8 * If dst and src are 4 byte aligned, copy 8 bytes at a time.
9 * If the src is 4, but not 8 byte aligned, we first read 4 bytes to get
10 * it 8 byte aligned. Thus, we can do a little read-ahead, without
11 * dereferencing a cache line that we should not touch.
12 * Note that short and long instructions have been scheduled to avoid
13 * branch stalls.
14 * The beq_s to r3z could be made unaligned & long to avoid a stall
15 * there, but it is not likely to be taken often, and it would also be likely
16 * to cost an unaligned mispredict at the next call.
17 */
18
19 .global strcpy
20 .align 4
21 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
36 loop:
37 ld.a %r3, [%r1, 4]
38 st.ab %r4, [%r10, 4]
39 loop_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__
52 r3z: bmsk.f %r1, %r3, 7
53 lsr_s %r3, %r3, 8
54 #else /* __BIG_ENDIAN__ */
55 r3z: lsr.f %r1, %r3, 24
56 asl_s %r3, %r3, 8
57 #endif /* _ENDIAN__ */
58 bne.d r3z
59 stb.ab %r1, [%r10, 1]
60 j_s [%blink]
61
62 .balign 4
63 charloop:
64 ldb.ab %r3, [%r1, 1]
65 brne.d %r3, 0, charloop
66 stb.ab %r3, [%r10, 1]
67 j [%blink]