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