strlen.S 827 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /* $Id: strlen.S,v 1.2 2001/06/29 14:07:15 gniibe Exp $
  3. *
  4. * "strlen" implementation of SuperH
  5. *
  6. * Copyright (C) 1999 Kaz Kojima
  7. *
  8. */
  9. /* size_t strlen (const char *s) */
  10. #include <linux/linkage.h>
  11. ENTRY(strlen)
  12. mov r4,r0
  13. and #3,r0
  14. tst r0,r0
  15. bt/s 1f
  16. mov #0,r2
  17. add #-1,r0
  18. shll2 r0
  19. shll r0
  20. braf r0
  21. nop
  22. mov.b @r4+,r1
  23. tst r1,r1
  24. bt 8f
  25. add #1,r2
  26. mov.b @r4+,r1
  27. tst r1,r1
  28. bt 8f
  29. add #1,r2
  30. mov.b @r4+,r1
  31. tst r1,r1
  32. bt 8f
  33. add #1,r2
  34. 1:
  35. mov #0,r3
  36. 2:
  37. mov.l @r4+,r1
  38. cmp/str r3,r1
  39. bf/s 2b
  40. add #4,r2
  41. add #-4,r2
  42. #ifndef __LITTLE_ENDIAN__
  43. swap.b r1,r1
  44. swap.w r1,r1
  45. swap.b r1,r1
  46. #endif
  47. extu.b r1,r0
  48. tst r0,r0
  49. bt/s 8f
  50. shlr8 r1
  51. add #1,r2
  52. extu.b r1,r0
  53. tst r0,r0
  54. bt/s 8f
  55. shlr8 r1
  56. add #1,r2
  57. extu.b r1,r0
  58. tst r0,r0
  59. bt 8f
  60. add #1,r2
  61. 8:
  62. rts
  63. mov r2,r0