strlen.S 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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 strlen
  7. .align 4
  8. strlen:
  9. or %r3, %r0, 7
  10. ld %r2, [%r3, -7]
  11. ld.a %r6, [%r3, -3]
  12. mov %r4, 0x01010101
  13. /* uses long immediate */
  14. #ifdef __LITTLE_ENDIAN__
  15. asl_s %r1, %r0, 3
  16. btst_s %r0, 2
  17. asl %r7, %r4, %r1
  18. ror %r5, %r4
  19. sub %r1, %r2, %r7
  20. bic_s %r1, %r1, %r2
  21. mov.eq %r7, %r4
  22. sub %r12, %r6, %r7
  23. bic %r12, %r12, %r6
  24. or.eq %r12, %r12, %r1
  25. and %r12, %r12, %r5
  26. brne %r12, 0, .Learly_end
  27. #else /* __BIG_ENDIAN__ */
  28. ror %r5, %r4
  29. btst_s %r0, 2
  30. mov_s %r1, 31
  31. sub3 %r7, %r1, %r0
  32. sub %r1, %r2, %r4
  33. bic_s %r1, %r1, %r2
  34. bmsk %r1, %r1, %r7
  35. sub %r12, %r6, %r4
  36. bic %r12, %r12, %r6
  37. bmsk.ne %r12, %r12, %r7
  38. or.eq %r12, %r12, %r1
  39. and %r12, %r12, %r5
  40. brne %r12, 0, .Learly_end
  41. #endif /* _ENDIAN__ */
  42. .Loop:
  43. ld_s %r2, [%r3, 4]
  44. ld.a %r6, [%r3, 8]
  45. /* stall for load result */
  46. sub %r1, %r2, %r4
  47. bic_s %r1, %r1, %r2
  48. sub %r12, %r6, %r4
  49. bic %r12, %r12, %r6
  50. or %r12, %r12, %r1
  51. and %r12, %r12, %r5
  52. breq %r12, 0, .Loop
  53. .Lend:
  54. and.f %r1, %r1, %r5
  55. sub.ne %r3, %r3, 4
  56. mov.eq %r1, %r12
  57. #ifdef __LITTLE_ENDIAN__
  58. sub_s %r2, %r1, 1
  59. bic_s %r2, %r2, %r1
  60. norm %r1, %r2
  61. sub_s %r0, %r0, 3
  62. lsr_s %r1, %r1, 3
  63. sub %r0, %r3, %r0
  64. j_s.d [%blink]
  65. sub %r0, %r0, %r1
  66. #else /* __BIG_ENDIAN__ */
  67. lsr_s %r1, %r1, 7
  68. mov.eq %r2, %r6
  69. bic_s %r1, %r1, %r2
  70. norm %r1, %r1
  71. sub %r0, %r3, %r0
  72. lsr_s %r1, %r1, 3
  73. j_s.d [%blink]
  74. add %r0, %r0, %r1
  75. #endif /* _ENDIAN */
  76. .Learly_end:
  77. b.d .Lend
  78. sub_s.ne %r1, %r1, %r1