strlen.S 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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(strlen)
  6. /* Check if the start addr is aligned. */
  7. mov r3, r0
  8. andi r1, r0, 3
  9. movi r2, 4
  10. movi r0, 0
  11. bnez r1, .L_start_not_aligned
  12. LABLE_ALIGN
  13. .L_start_addr_aligned:
  14. /* Check if all the bytes in the word are not zero. */
  15. ldw r1, (r3)
  16. tstnbz r1
  17. bf .L_string_tail
  18. ldw r1, (r3, 4)
  19. addi r0, 4
  20. tstnbz r1
  21. bf .L_string_tail
  22. ldw r1, (r3, 8)
  23. addi r0, 4
  24. tstnbz r1
  25. bf .L_string_tail
  26. ldw r1, (r3, 12)
  27. addi r0, 4
  28. tstnbz r1
  29. bf .L_string_tail
  30. ldw r1, (r3, 16)
  31. addi r0, 4
  32. tstnbz r1
  33. bf .L_string_tail
  34. ldw r1, (r3, 20)
  35. addi r0, 4
  36. tstnbz r1
  37. bf .L_string_tail
  38. ldw r1, (r3, 24)
  39. addi r0, 4
  40. tstnbz r1
  41. bf .L_string_tail
  42. ldw r1, (r3, 28)
  43. addi r0, 4
  44. tstnbz r1
  45. bf .L_string_tail
  46. addi r0, 4
  47. addi r3, 32
  48. br .L_start_addr_aligned
  49. .L_string_tail:
  50. # ifdef __CSKYBE__
  51. xtrb0 r3, r1
  52. bez r3, .L_return
  53. addi r0, 1
  54. xtrb1 r3, r1
  55. bez r3, .L_return
  56. addi r0, 1
  57. xtrb2 r3, r1
  58. bez r3, .L_return
  59. addi r0, 1
  60. # else
  61. xtrb3 r3, r1
  62. bez r3, .L_return
  63. addi r0, 1
  64. xtrb2 r3, r1
  65. bez r3, .L_return
  66. addi r0, 1
  67. xtrb1 r3, r1
  68. bez r3, .L_return
  69. addi r0, 1
  70. # endif /* !__CSKYBE__ */
  71. .L_return:
  72. rts
  73. .L_start_not_aligned:
  74. sub r2, r2, r1
  75. .L_start_not_aligned_loop:
  76. ldb r1, (r3)
  77. PRE_BNEZAD (r2)
  78. addi r3, 1
  79. bez r1, .L_return
  80. addi r0, 1
  81. BNEZAD (r2, .L_start_not_aligned_loop)
  82. br .L_start_addr_aligned
  83. ENDPROC(strlen)