0001
0002
0003
0004
0005
0006
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)