^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0+ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * ARCv2 memcpy implementation optimized for unaligned memory access using.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2019 Synopsys
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Author: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/linkage.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #ifdef CONFIG_ARC_HAS_LL64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) # define LOADX(DST,RX) ldd.ab DST, [RX, 8]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) # define STOREX(SRC,RX) std.ab SRC, [RX, 8]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) # define ZOLSHFT 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) # define ZOLAND 0x1F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) # define LOADX(DST,RX) ld.ab DST, [RX, 4]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) # define STOREX(SRC,RX) st.ab SRC, [RX, 4]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) # define ZOLSHFT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) # define ZOLAND 0xF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) ENTRY_CFI(memcpy)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) mov r3, r0 ; don;t clobber ret val
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) lsr.f lp_count, r2, ZOLSHFT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) lpnz @.Lcopy32_64bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) ;; LOOP START
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) LOADX (r6, r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) LOADX (r8, r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) LOADX (r10, r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) LOADX (r4, r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) STOREX (r6, r3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) STOREX (r8, r3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) STOREX (r10, r3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) STOREX (r4, r3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) .Lcopy32_64bytes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) and.f lp_count, r2, ZOLAND ;Last remaining 31 bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) lpnz @.Lcopyremainingbytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) ;; LOOP START
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) ldb.ab r5, [r1, 1]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) stb.ab r5, [r3, 1]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) .Lcopyremainingbytes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) j [blink]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) END_CFI(memcpy)