memcpy-archs-unaligned.S 1009 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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. #include <linux/linkage.h>
  9. #ifdef CONFIG_ARC_HAS_LL64
  10. # define LOADX(DST,RX) ldd.ab DST, [RX, 8]
  11. # define STOREX(SRC,RX) std.ab SRC, [RX, 8]
  12. # define ZOLSHFT 5
  13. # define ZOLAND 0x1F
  14. #else
  15. # define LOADX(DST,RX) ld.ab DST, [RX, 4]
  16. # define STOREX(SRC,RX) st.ab SRC, [RX, 4]
  17. # define ZOLSHFT 4
  18. # define ZOLAND 0xF
  19. #endif
  20. ENTRY_CFI(memcpy)
  21. mov r3, r0 ; don;t clobber ret val
  22. lsr.f lp_count, r2, ZOLSHFT
  23. lpnz @.Lcopy32_64bytes
  24. ;; LOOP START
  25. LOADX (r6, r1)
  26. LOADX (r8, r1)
  27. LOADX (r10, r1)
  28. LOADX (r4, r1)
  29. STOREX (r6, r3)
  30. STOREX (r8, r3)
  31. STOREX (r10, r3)
  32. STOREX (r4, r3)
  33. .Lcopy32_64bytes:
  34. and.f lp_count, r2, ZOLAND ;Last remaining 31 bytes
  35. lpnz @.Lcopyremainingbytes
  36. ;; LOOP START
  37. ldb.ab r5, [r1, 1]
  38. stb.ab r5, [r3, 1]
  39. .Lcopyremainingbytes:
  40. j [blink]
  41. END_CFI(memcpy)