xref: /linux/arch/arc/lib/memcpy-700.S (revision 9e56ff53b4115875667760445b028357848b4748)
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
8ENTRY_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]
63END_CFI(memcpy)
64