memcpy-700.S 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
  4. */
  5. #include <linux/linkage.h>
  6. ENTRY_CFI(memcpy)
  7. or r3,r0,r1
  8. asl_s r3,r3,30
  9. mov_s r5,r0
  10. brls.d r2,r3,.Lcopy_bytewise
  11. sub.f r3,r2,1
  12. ld_s r12,[r1,0]
  13. asr.f lp_count,r3,3
  14. bbit0.d r3,2,.Lnox4
  15. bmsk_s r2,r2,1
  16. st.ab r12,[r5,4]
  17. ld.a r12,[r1,4]
  18. .Lnox4:
  19. lppnz .Lendloop
  20. ld_s r3,[r1,4]
  21. st.ab r12,[r5,4]
  22. ld.a r12,[r1,8]
  23. st.ab r3,[r5,4]
  24. .Lendloop:
  25. breq r2,0,.Last_store
  26. ld r3,[r5,0]
  27. #ifdef __LITTLE_ENDIAN__
  28. add3 r2,-1,r2
  29. ; uses long immediate
  30. xor_s r12,r12,r3
  31. bmsk r12,r12,r2
  32. xor_s r12,r12,r3
  33. #else /* BIG ENDIAN */
  34. sub3 r2,31,r2
  35. ; uses long immediate
  36. xor_s r3,r3,r12
  37. bmsk r3,r3,r2
  38. xor_s r12,r12,r3
  39. #endif /* ENDIAN */
  40. .Last_store:
  41. j_s.d [blink]
  42. st r12,[r5,0]
  43. .balign 4
  44. .Lcopy_bytewise:
  45. jcs [blink]
  46. ldb_s r12,[r1,0]
  47. lsr.f lp_count,r3
  48. bhs_s .Lnox1
  49. stb.ab r12,[r5,1]
  50. ldb.a r12,[r1,1]
  51. .Lnox1:
  52. lppnz .Lendbloop
  53. ldb_s r3,[r1,1]
  54. stb.ab r12,[r5,1]
  55. ldb.a r12,[r1,2]
  56. stb.ab r3,[r5,1]
  57. .Lendbloop:
  58. j_s.d [blink]
  59. stb r12,[r5,0]
  60. END_CFI(memcpy)