Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0+ */
0002 /*
0003  * ARCv2 memcpy implementation optimized for unaligned memory access using.
0004  *
0005  * Copyright (C) 2019 Synopsys
0006  * Author: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
0007  */
0008 
0009 #include <linux/linkage.h>
0010 
0011 #ifdef CONFIG_ARC_HAS_LL64
0012 # define LOADX(DST,RX)      ldd.ab  DST, [RX, 8]
0013 # define STOREX(SRC,RX)     std.ab  SRC, [RX, 8]
0014 # define ZOLSHFT        5
0015 # define ZOLAND         0x1F
0016 #else
0017 # define LOADX(DST,RX)      ld.ab   DST, [RX, 4]
0018 # define STOREX(SRC,RX)     st.ab   SRC, [RX, 4]
0019 # define ZOLSHFT        4
0020 # define ZOLAND         0xF
0021 #endif
0022 
0023 ENTRY_CFI(memcpy)
0024     mov r3, r0      ; don;t clobber ret val
0025 
0026     lsr.f   lp_count, r2, ZOLSHFT
0027     lpnz    @.Lcopy32_64bytes
0028     ;; LOOP START
0029     LOADX   (r6, r1)
0030     LOADX   (r8, r1)
0031     LOADX   (r10, r1)
0032     LOADX   (r4, r1)
0033     STOREX  (r6, r3)
0034     STOREX  (r8, r3)
0035     STOREX  (r10, r3)
0036     STOREX  (r4, r3)
0037 .Lcopy32_64bytes:
0038 
0039     and.f   lp_count, r2, ZOLAND ;Last remaining 31 bytes
0040     lpnz    @.Lcopyremainingbytes
0041     ;; LOOP START
0042     ldb.ab  r5, [r1, 1]
0043     stb.ab  r5, [r3, 1]
0044 .Lcopyremainingbytes:
0045 
0046     j   [blink]
0047 END_CFI(memcpy)