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