Linux-libre 5.4.48-gnu
[librecmc/linux-libre.git] / arch / arc / lib / memcpy-700.S
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
4  */
5
6 #include <linux/linkage.h>
7
8 ENTRY_CFI(memcpy)
9         or      r3,r0,r1
10         asl_s   r3,r3,30
11         mov_s   r5,r0
12         brls.d  r2,r3,.Lcopy_bytewise
13         sub.f   r3,r2,1
14         ld_s    r12,[r1,0]
15         asr.f   lp_count,r3,3
16         bbit0.d r3,2,.Lnox4
17         bmsk_s  r2,r2,1
18         st.ab   r12,[r5,4]
19         ld.a    r12,[r1,4]
20 .Lnox4:
21         lppnz   .Lendloop
22         ld_s    r3,[r1,4]
23         st.ab   r12,[r5,4]
24         ld.a    r12,[r1,8]
25         st.ab   r3,[r5,4]
26 .Lendloop:
27         breq    r2,0,.Last_store
28         ld      r3,[r5,0]
29 #ifdef __LITTLE_ENDIAN__
30         add3    r2,-1,r2
31         ; uses long immediate
32         xor_s   r12,r12,r3
33         bmsk    r12,r12,r2
34     xor_s       r12,r12,r3
35 #else /* BIG ENDIAN */
36         sub3    r2,31,r2
37         ; uses long immediate
38         xor_s   r3,r3,r12
39         bmsk    r3,r3,r2
40         xor_s   r12,r12,r3
41 #endif /* ENDIAN */
42 .Last_store:
43         j_s.d   [blink]
44         st      r12,[r5,0]
45
46         .balign 4
47 .Lcopy_bytewise:
48         jcs     [blink]
49         ldb_s   r12,[r1,0]
50         lsr.f   lp_count,r3
51         bhs_s   .Lnox1
52         stb.ab  r12,[r5,1]
53         ldb.a   r12,[r1,1]
54 .Lnox1:
55         lppnz   .Lendbloop
56         ldb_s   r3,[r1,1]
57         stb.ab  r12,[r5,1]
58         ldb.a   r12,[r1,2]
59         stb.ab  r3,[r5,1]
60 .Lendbloop:
61         j_s.d   [blink]
62         stb     r12,[r5,0]
63 END_CFI(memcpy)