strlen.S 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
  4. */
  5. #include <linux/linkage.h>
  6. ENTRY_CFI(strlen)
  7. or r3,r0,7
  8. ld r2,[r3,-7]
  9. ld.a r6,[r3,-3]
  10. mov r4,0x01010101
  11. ; uses long immediate
  12. #ifdef __LITTLE_ENDIAN__
  13. asl_s r1,r0,3
  14. btst_s r0,2
  15. asl r7,r4,r1
  16. ror r5,r4
  17. sub r1,r2,r7
  18. bic_s r1,r1,r2
  19. mov.eq r7,r4
  20. sub r12,r6,r7
  21. bic r12,r12,r6
  22. or.eq r12,r12,r1
  23. and r12,r12,r5
  24. brne r12,0,.Learly_end
  25. #else /* BIG ENDIAN */
  26. ror r5,r4
  27. btst_s r0,2
  28. mov_s r1,31
  29. sub3 r7,r1,r0
  30. sub r1,r2,r4
  31. bic_s r1,r1,r2
  32. bmsk r1,r1,r7
  33. sub r12,r6,r4
  34. bic r12,r12,r6
  35. bmsk.ne r12,r12,r7
  36. or.eq r12,r12,r1
  37. and r12,r12,r5
  38. brne r12,0,.Learly_end
  39. #endif /* ENDIAN */
  40. .Loop:
  41. ld_s r2,[r3,4]
  42. ld.a r6,[r3,8]
  43. ; stall for load result
  44. sub r1,r2,r4
  45. bic_s r1,r1,r2
  46. sub r12,r6,r4
  47. bic r12,r12,r6
  48. or r12,r12,r1
  49. and r12,r12,r5
  50. breq r12,0,.Loop
  51. .Lend:
  52. and.f r1,r1,r5
  53. sub.ne r3,r3,4
  54. mov.eq r1,r12
  55. #ifdef __LITTLE_ENDIAN__
  56. sub_s r2,r1,1
  57. bic_s r2,r2,r1
  58. norm r1,r2
  59. sub_s r0,r0,3
  60. lsr_s r1,r1,3
  61. sub r0,r3,r0
  62. j_s.d [blink]
  63. sub r0,r0,r1
  64. #else /* BIG ENDIAN */
  65. lsr_s r1,r1,7
  66. mov.eq r2,r6
  67. bic_s r1,r1,r2
  68. norm r1,r1
  69. sub r0,r3,r0
  70. lsr_s r1,r1,3
  71. j_s.d [blink]
  72. add r0,r0,r1
  73. #endif /* ENDIAN */
  74. .Learly_end:
  75. b.d .Lend
  76. sub_s.ne r1,r1,r1
  77. END_CFI(strlen)