1
2
3
4
5
6
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)