162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * ARCv2 memcpy implementation optimized for unaligned memory access using.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2019 Synopsys
662306a36Sopenharmony_ci * Author: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/linkage.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#ifdef CONFIG_ARC_HAS_LL64
1262306a36Sopenharmony_ci# define LOADX(DST,RX)		ldd.ab	DST, [RX, 8]
1362306a36Sopenharmony_ci# define STOREX(SRC,RX)		std.ab	SRC, [RX, 8]
1462306a36Sopenharmony_ci# define ZOLSHFT		5
1562306a36Sopenharmony_ci# define ZOLAND			0x1F
1662306a36Sopenharmony_ci#else
1762306a36Sopenharmony_ci# define LOADX(DST,RX)		ld.ab	DST, [RX, 4]
1862306a36Sopenharmony_ci# define STOREX(SRC,RX)		st.ab	SRC, [RX, 4]
1962306a36Sopenharmony_ci# define ZOLSHFT		4
2062306a36Sopenharmony_ci# define ZOLAND			0xF
2162306a36Sopenharmony_ci#endif
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ciENTRY_CFI(memcpy)
2462306a36Sopenharmony_ci	mov	r3, r0		; don;t clobber ret val
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	lsr.f	lp_count, r2, ZOLSHFT
2762306a36Sopenharmony_ci	lpnz	@.Lcopy32_64bytes
2862306a36Sopenharmony_ci	;; LOOP START
2962306a36Sopenharmony_ci	LOADX	(r6, r1)
3062306a36Sopenharmony_ci	LOADX	(r8, r1)
3162306a36Sopenharmony_ci	LOADX	(r10, r1)
3262306a36Sopenharmony_ci	LOADX	(r4, r1)
3362306a36Sopenharmony_ci	STOREX	(r6, r3)
3462306a36Sopenharmony_ci	STOREX	(r8, r3)
3562306a36Sopenharmony_ci	STOREX	(r10, r3)
3662306a36Sopenharmony_ci	STOREX	(r4, r3)
3762306a36Sopenharmony_ci.Lcopy32_64bytes:
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	and.f	lp_count, r2, ZOLAND ;Last remaining 31 bytes
4062306a36Sopenharmony_ci	lpnz	@.Lcopyremainingbytes
4162306a36Sopenharmony_ci	;; LOOP START
4262306a36Sopenharmony_ci	ldb.ab	r5, [r1, 1]
4362306a36Sopenharmony_ci	stb.ab	r5, [r3, 1]
4462306a36Sopenharmony_ci.Lcopyremainingbytes:
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	j	[blink]
4762306a36Sopenharmony_ciEND_CFI(memcpy)
48