2
0

memcpy.S 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. .section ".text.hot.memcpy","ax"
  2. .balign 4
  3. .globl memcpy
  4. memcpy:
  5. #if 0
  6. j __memcpy_bytewise
  7. #else
  8. or a5, a0, a1
  9. or a5, a5, a2
  10. andi a5, a5, 3
  11. .option norvc
  12. bnez a5, __memcpy_bytewise
  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 // a0 is also return value
  22. andi a2, a2, 7*4
  23. .option norelax
  24. sub a5, zero, a2
  25. jr a5, %lo(.L_case0)
  26. .option relax
  27. .balign 4
  28. .L_aligned_loop:
  29. .option norvc
  30. li a2, 32
  31. .option rvc
  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 a1, a1, a2
  57. add a3, a3, a2
  58. bltu a3, a4, .L_aligned_loop
  59. .L_empty:
  60. ret
  61. .type __memcpy_aligned, @function
  62. .size __memcpy_aligned, . - __memcpy_aligned
  63. // This can be used by I/O devices that need bytewise accesses
  64. .balign 4
  65. __memcpy_bytewise:
  66. .option norvc
  67. add a4, a0, a2
  68. mv a3, a0
  69. .option rvc
  70. .balign 4
  71. .L_bytewise_loop:
  72. lbu a5, 0(a1)
  73. sb a5, 0(a3)
  74. addi a1, a1, 1
  75. addi a3, a3, 1
  76. bltu a3, a4, .L_bytewise_loop
  77. ret
  78. .type __memcpy_bytewise, @function
  79. .size __memcpy_bytewise, . - __memcpy_bytewise