strlen.S 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /*
  2. * Copyright (C) 2013 Synopsys, Inc. (www.synopsys.com)
  3. * Copyright (C) 2007 ARC International (UK) LTD
  4. *
  5. * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball.
  6. */
  7. #include <sysdep.h>
  8. ENTRY(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
  79. END(strlen)
  80. libc_hidden_def(strlen)