14d1e7918SEugeniy Paltsev/* SPDX-License-Identifier: GPL-2.0+ */
24d1e7918SEugeniy Paltsev/*
34d1e7918SEugeniy Paltsev * ARCv2 memcpy implementation optimized for unaligned memory access using.
44d1e7918SEugeniy Paltsev *
54d1e7918SEugeniy Paltsev * Copyright (C) 2019 Synopsys
64d1e7918SEugeniy Paltsev * Author: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
74d1e7918SEugeniy Paltsev */
84d1e7918SEugeniy Paltsev
94d1e7918SEugeniy Paltsev#include <linux/linkage.h>
104d1e7918SEugeniy Paltsev
114d1e7918SEugeniy Paltsev#ifdef CONFIG_ARC_HAS_LL64
124d1e7918SEugeniy Paltsev# define LOADX(DST,RX)		ldd.ab	DST, [RX, 8]
134d1e7918SEugeniy Paltsev# define STOREX(SRC,RX)		std.ab	SRC, [RX, 8]
144d1e7918SEugeniy Paltsev# define ZOLSHFT		5
154d1e7918SEugeniy Paltsev# define ZOLAND			0x1F
164d1e7918SEugeniy Paltsev#else
174d1e7918SEugeniy Paltsev# define LOADX(DST,RX)		ld.ab	DST, [RX, 4]
184d1e7918SEugeniy Paltsev# define STOREX(SRC,RX)		st.ab	SRC, [RX, 4]
194d1e7918SEugeniy Paltsev# define ZOLSHFT		4
204d1e7918SEugeniy Paltsev# define ZOLAND			0xF
214d1e7918SEugeniy Paltsev#endif
224d1e7918SEugeniy Paltsev
234d1e7918SEugeniy PaltsevENTRY_CFI(memcpy)
244d1e7918SEugeniy Paltsev	mov	r3, r0		; don;t clobber ret val
254d1e7918SEugeniy Paltsev
264d1e7918SEugeniy Paltsev	lsr.f	lp_count, r2, ZOLSHFT
274d1e7918SEugeniy Paltsev	lpnz	@.Lcopy32_64bytes
284d1e7918SEugeniy Paltsev	;; LOOP START
294d1e7918SEugeniy Paltsev	LOADX	(r6, r1)
304d1e7918SEugeniy Paltsev	LOADX	(r8, r1)
314d1e7918SEugeniy Paltsev	LOADX	(r10, r1)
324d1e7918SEugeniy Paltsev	LOADX	(r4, r1)
334d1e7918SEugeniy Paltsev	STOREX	(r6, r3)
344d1e7918SEugeniy Paltsev	STOREX	(r8, r3)
354d1e7918SEugeniy Paltsev	STOREX	(r10, r3)
364d1e7918SEugeniy Paltsev	STOREX	(r4, r3)
374d1e7918SEugeniy Paltsev.Lcopy32_64bytes:
384d1e7918SEugeniy Paltsev
394d1e7918SEugeniy Paltsev	and.f	lp_count, r2, ZOLAND ;Last remaining 31 bytes
404d1e7918SEugeniy Paltsev	lpnz	@.Lcopyremainingbytes
414d1e7918SEugeniy Paltsev	;; LOOP START
424d1e7918SEugeniy Paltsev	ldb.ab	r5, [r1, 1]
434d1e7918SEugeniy Paltsev	stb.ab	r5, [r3, 1]
444d1e7918SEugeniy Paltsev.Lcopyremainingbytes:
454d1e7918SEugeniy Paltsev
464d1e7918SEugeniy Paltsev	j	[blink]
474d1e7918SEugeniy PaltsevEND_CFI(memcpy)
48