strcpy.S 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
  3. #include <linux/linkage.h>
  4. #include "sysdep.h"
  5. ENTRY(strcpy)
  6. mov a3, a0
  7. /* Check if the src addr is aligned. */
  8. andi t0, a1, 3
  9. bnez t0, 11f
  10. 1:
  11. /* Check if all the bytes in the word are not zero. */
  12. ldw a2, (a1)
  13. tstnbz a2
  14. bf 9f
  15. stw a2, (a3)
  16. ldw a2, (a1, 4)
  17. tstnbz a2
  18. bf 2f
  19. stw a2, (a3, 4)
  20. ldw a2, (a1, 8)
  21. tstnbz a2
  22. bf 3f
  23. stw a2, (a3, 8)
  24. ldw a2, (a1, 12)
  25. tstnbz a2
  26. bf 4f
  27. stw a2, (a3, 12)
  28. ldw a2, (a1, 16)
  29. tstnbz a2
  30. bf 5f
  31. stw a2, (a3, 16)
  32. ldw a2, (a1, 20)
  33. tstnbz a2
  34. bf 6f
  35. stw a2, (a3, 20)
  36. ldw a2, (a1, 24)
  37. tstnbz a2
  38. bf 7f
  39. stw a2, (a3, 24)
  40. ldw a2, (a1, 28)
  41. tstnbz a2
  42. bf 8f
  43. stw a2, (a3, 28)
  44. addi a3, 32
  45. addi a1, 32
  46. br 1b
  47. 2:
  48. addi a3, 4
  49. br 9f
  50. 3:
  51. addi a3, 8
  52. br 9f
  53. 4:
  54. addi a3, 12
  55. br 9f
  56. 5:
  57. addi a3, 16
  58. br 9f
  59. 6:
  60. addi a3, 20
  61. br 9f
  62. 7:
  63. addi a3, 24
  64. br 9f
  65. 8:
  66. addi a3, 28
  67. 9:
  68. # ifdef __CSKYBE__
  69. xtrb0 t0, a2
  70. st.b t0, (a3)
  71. bez t0, 10f
  72. xtrb1 t0, a2
  73. st.b t0, (a3, 1)
  74. bez t0, 10f
  75. xtrb2 t0, a2
  76. st.b t0, (a3, 2)
  77. bez t0, 10f
  78. stw a2, (a3)
  79. # else
  80. xtrb3 t0, a2
  81. st.b t0, (a3)
  82. bez t0, 10f
  83. xtrb2 t0, a2
  84. st.b t0, (a3, 1)
  85. bez t0, 10f
  86. xtrb1 t0, a2
  87. st.b t0, (a3, 2)
  88. bez t0, 10f
  89. stw a2, (a3)
  90. # endif /* !__CSKYBE__ */
  91. 10:
  92. jmp lr
  93. 11:
  94. subi t0, 4
  95. 12:
  96. ld.b a2, (a1)
  97. st.b a2, (a3)
  98. bez a2, 10b
  99. addi t0, 1
  100. addi a1, a1, 1
  101. addi a3, a3, 1
  102. bnez t0, 12b
  103. jbr 1b
  104. ENDPROC(strcpy)