memcpy-700.S 1.2 KB

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