strlen.S 788 B

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