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