Path: blob/master/arch/arc/lib/memcpy-archs-unaligned.S
26424 views
/* SPDX-License-Identifier: GPL-2.0+ */1/*2* ARCv2 memcpy implementation optimized for unaligned memory access using.3*4* Copyright (C) 2019 Synopsys5* Author: Eugeniy Paltsev <[email protected]>6*/78#include <linux/linkage.h>910#ifdef CONFIG_ARC_HAS_LL6411# define LOADX(DST,RX) ldd.ab DST, [RX, 8]12# define STOREX(SRC,RX) std.ab SRC, [RX, 8]13# define ZOLSHFT 514# define ZOLAND 0x1F15#else16# define LOADX(DST,RX) ld.ab DST, [RX, 4]17# define STOREX(SRC,RX) st.ab SRC, [RX, 4]18# define ZOLSHFT 419# define ZOLAND 0xF20#endif2122ENTRY_CFI(memcpy)23mov r3, r0 ; don;t clobber ret val2425lsr.f lp_count, r2, ZOLSHFT26lpnz @.Lcopy32_64bytes27;; LOOP START28LOADX (r6, r1)29LOADX (r8, r1)30LOADX (r10, r1)31LOADX (r4, r1)32STOREX (r6, r3)33STOREX (r8, r3)34STOREX (r10, r3)35STOREX (r4, r3)36.Lcopy32_64bytes:3738and.f lp_count, r2, ZOLAND ;Last remaining 31 bytes39lpnz @.Lcopyremainingbytes40;; LOOP START41ldb.ab r5, [r1, 1]42stb.ab r5, [r3, 1]43.Lcopyremainingbytes:4445j [blink]46END_CFI(memcpy)474849