Merge branch 'vmwgfx-fixes-5.1' of git://people.freedesktop.org/~thomash/linux into...
[sfrench/cifs-2.6.git] / arch / arc / lib / memcpy-archs-unaligned.S
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)