xref: /OK3568_Linux_fs/kernel/arch/arc/lib/memcpy-archs-unaligned.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0+ */
2*4882a593Smuzhiyun/*
3*4882a593Smuzhiyun * ARCv2 memcpy implementation optimized for unaligned memory access using.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2019 Synopsys
6*4882a593Smuzhiyun * Author: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun#include <linux/linkage.h>
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun#ifdef CONFIG_ARC_HAS_LL64
12*4882a593Smuzhiyun# define LOADX(DST,RX)		ldd.ab	DST, [RX, 8]
13*4882a593Smuzhiyun# define STOREX(SRC,RX)		std.ab	SRC, [RX, 8]
14*4882a593Smuzhiyun# define ZOLSHFT		5
15*4882a593Smuzhiyun# define ZOLAND			0x1F
16*4882a593Smuzhiyun#else
17*4882a593Smuzhiyun# define LOADX(DST,RX)		ld.ab	DST, [RX, 4]
18*4882a593Smuzhiyun# define STOREX(SRC,RX)		st.ab	SRC, [RX, 4]
19*4882a593Smuzhiyun# define ZOLSHFT		4
20*4882a593Smuzhiyun# define ZOLAND			0xF
21*4882a593Smuzhiyun#endif
22*4882a593Smuzhiyun
23*4882a593SmuzhiyunENTRY_CFI(memcpy)
24*4882a593Smuzhiyun	mov	r3, r0		; don;t clobber ret val
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun	lsr.f	lp_count, r2, ZOLSHFT
27*4882a593Smuzhiyun	lpnz	@.Lcopy32_64bytes
28*4882a593Smuzhiyun	;; LOOP START
29*4882a593Smuzhiyun	LOADX	(r6, r1)
30*4882a593Smuzhiyun	LOADX	(r8, r1)
31*4882a593Smuzhiyun	LOADX	(r10, r1)
32*4882a593Smuzhiyun	LOADX	(r4, r1)
33*4882a593Smuzhiyun	STOREX	(r6, r3)
34*4882a593Smuzhiyun	STOREX	(r8, r3)
35*4882a593Smuzhiyun	STOREX	(r10, r3)
36*4882a593Smuzhiyun	STOREX	(r4, r3)
37*4882a593Smuzhiyun.Lcopy32_64bytes:
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun	and.f	lp_count, r2, ZOLAND ;Last remaining 31 bytes
40*4882a593Smuzhiyun	lpnz	@.Lcopyremainingbytes
41*4882a593Smuzhiyun	;; LOOP START
42*4882a593Smuzhiyun	ldb.ab	r5, [r1, 1]
43*4882a593Smuzhiyun	stb.ab	r5, [r3, 1]
44*4882a593Smuzhiyun.Lcopyremainingbytes:
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun	j	[blink]
47*4882a593SmuzhiyunEND_CFI(memcpy)
48