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)
64