memcpy.S 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. .section ".text.memcpy","ax"
  2. .balign 4
  3. .globl memcpy
  4. memcpy:
  5. #if 0
  6. j __memcpy_misaligned
  7. #else
  8. or a5, a0, a1
  9. or a5, a5, a2
  10. andi a5, a5, 3
  11. .option norvc
  12. bnez a5, __memcpy_misaligned
  13. .option rvc
  14. #endif
  15. .type memcpy, @function
  16. .size memcpy, . - memcpy
  17. .balign 4
  18. .globl __memcpy_aligned
  19. __memcpy_aligned:
  20. add a4, a0, a2
  21. mv a3, a0
  22. andi a2, a2, 7*4
  23. .option norelax
  24. lui a5, %hi(.L_case0)
  25. sub a5, a5, a2
  26. jr a5, %lo(.L_case0)
  27. .option relax
  28. .balign 4
  29. .L_aligned_loop:
  30. add a1, a1, a2
  31. li a2, 32
  32. c.lw a5, 28(a1)
  33. c.sw a5, 28(a3)
  34. .L_case7:
  35. c.lw a5, 24(a1)
  36. c.sw a5, 24(a3)
  37. .L_case6:
  38. c.lw a5, 20(a1)
  39. c.sw a5, 20(a3)
  40. .L_case5:
  41. c.lw a5, 16(a1)
  42. c.sw a5, 16(a3)
  43. .L_case4:
  44. c.lw a5, 12(a1)
  45. c.sw a5, 12(a3)
  46. .L_case3:
  47. c.lw a5, 8(a1)
  48. c.sw a5, 8(a3)
  49. .L_case2:
  50. c.lw a5, 4(a1)
  51. c.sw a5, 4(a3)
  52. .L_case1:
  53. c.lw a5, 0(a1)
  54. c.sw a5, 0(a3)
  55. .L_case0:
  56. add a3, a3, a2
  57. bltu a3, a4, .L_aligned_loop
  58. .L_empty:
  59. ret
  60. .type __memcpy_aligned, @function
  61. .size __memcpy_aligned, . - __memcpy_aligned
  62. .balign 4
  63. __memcpy_misaligned:
  64. .option norvc
  65. add a4, a0, a2
  66. mv a3, a0
  67. .option rvc
  68. // This could be optimized if it ever matters...
  69. .balign 4
  70. .L_misaligned_loop:
  71. lbu a5, 0(a1)
  72. sb a5, 0(a3)
  73. addi a1, a1, 1
  74. addi a3, a3, 1
  75. bltu a3, a4, .L_misaligned_loop
  76. ret
  77. .type __memcpy_misaligned, @function
  78. .size __memcpy_misaligned, . - __memcpy_misaligned