/* SPDX-License-Identifier: GPL-2.0+ */ /* * ARCv2 memcpy implementation optimized for unaligned memory access using. * * Copyright (C) 2019 Synopsys * Author: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com> */ #include <linux/linkage.h> #ifdef CONFIG_ARC_HAS_LL64 # define LOADX(DST,RX) ldd.ab DST, [RX, 8] # define STOREX(SRC,RX) std.ab SRC, [RX, 8] # define ZOLSHFT 5 # define ZOLAND 0x1F #else # define LOADX(DST,RX) ld.ab DST, [RX, 4] # define STOREX(SRC,RX) st.ab SRC, [RX, 4] # define ZOLSHFT 4 # define ZOLAND 0xF #endif ENTRY_CFI(memcpy) mov r3, r0 ; don;t clobber ret val lsr.f lp_count, r2, ZOLSHFT lpnz @.Lcopy32_64bytes ;; LOOP START LOADX (r6, r1) LOADX (r8, r1) LOADX (r10, r1) LOADX (r4, r1) STOREX (r6, r3) STOREX (r8, r3) STOREX (r10, r3) STOREX (r4, r3) .Lcopy32_64bytes: and.f lp_count, r2, ZOLAND ;Last remaining 31 bytes lpnz @.Lcopyremainingbytes ;; LOOP START ldb.ab r5, [r1, 1] stb.ab r5, [r3, 1] .Lcopyremainingbytes: j [blink] END_CFI(memcpy)