]> git.ipfire.org Git - people/ms/u-boot.git/blob - arch/arc/lib/memcpy-700.S
Merge branch 'master' of git://git.denx.de/u-boot
[people/ms/u-boot.git] / arch / arc / lib / memcpy-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 .global memcpy
8 .align 4
9 memcpy:
10 or %r3, %r0, %r1
11 asl_s %r3, %r3, 30
12 mov_s %r5, %r0
13 brls.d %r2, %r3, .Lcopy_bytewise
14 sub.f %r3, %r2, 1
15 ld_s %r12, [%r1, 0]
16 asr.f %lp_count, %r3, 3
17 bbit0.d %r3, 2, .Lnox4
18 bmsk_s %r2, %r2, 1
19 st.ab %r12, [%r5, 4]
20 ld.a %r12, [%r1, 4]
21 .Lnox4:
22 lppnz .Lendloop
23 ld_s %r3, [%r1, 4]
24 st.ab %r12, [%r5, 4]
25 ld.a %r12, [%r1, 8]
26 st.ab %r3, [%r5, 4]
27 .Lendloop:
28 breq %r2, 0, .Last_store
29 ld %r3, [%r5, 0]
30 #ifdef __LITTLE_ENDIAN__
31 add3 %r2, -1, %r2
32 /* uses long immediate */
33 xor_s %r12, %r12, %r3
34 bmsk %r12, %r12, %r2
35 xor_s %r12, %r12, %r3
36 #else /* __BIG_ENDIAN__ */
37 sub3 %r2, 31, %r2
38 /* uses long immediate */
39 xor_s %r3, %r3, %r12
40 bmsk %r3, %r3, %r2
41 xor_s %r12, %r12, %r3
42 #endif /* _ENDIAN__ */
43 .Last_store:
44 j_s.d [%blink]
45 st %r12, [%r5, 0]
46
47 .balign 4
48 .Lcopy_bytewise:
49 jcs [%blink]
50 ldb_s %r12, [%r1, 0]
51 lsr.f %lp_count, %r3
52 bhs_s .Lnox1
53 stb.ab %r12, [%r5, 1]
54 ldb.a %r12, [%r1, 1]
55 .Lnox1:
56 lppnz .Lendbloop
57 ldb_s %r3, [%r1, 1]
58 stb.ab %r12, [%r5, 1]
59 ldb.a %r12, [%r1, 2]
60 stb.ab %r3, [%r5, 1]
61 .Lendbloop:
62 j_s.d [%blink]
63 stb %r12, [%r5, 0]