root/arch/arc/lib/memcpy-archs-unaligned.S

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

/* [<][>][^][v][top][bottom][index][help] */