strlen.S 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /* strlen.S: Sparc optimized strlen code
  2. * Hand optimized from GNU libc's strlen
  3. * Copyright (C) 1991,1996 Free Software Foundation
  4. * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
  5. * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
  6. */
  7. #define LO_MAGIC 0x01010101
  8. #define HI_MAGIC 0x80808080
  9. 0:
  10. ldub [%o0], %o5
  11. cmp %o5, 0
  12. be 1f
  13. add %o0, 1, %o0
  14. andcc %o0, 3, %g0
  15. be 4f
  16. or %o4, %lo(HI_MAGIC), %o3
  17. ldub [%o0], %o5
  18. cmp %o5, 0
  19. be 2f
  20. add %o0, 1, %o0
  21. andcc %o0, 3, %g0
  22. be 5f
  23. sethi %hi(LO_MAGIC), %o4
  24. ldub [%o0], %o5
  25. cmp %o5, 0
  26. be 3f
  27. add %o0, 1, %o0
  28. b 8f
  29. or %o4, %lo(LO_MAGIC), %o2
  30. 1:
  31. retl
  32. mov 0, %o0
  33. 2:
  34. retl
  35. mov 1, %o0
  36. 3:
  37. retl
  38. mov 2, %o0
  39. .align 4
  40. .global strlen
  41. strlen:
  42. mov %o0, %o1
  43. andcc %o0, 3, %g0
  44. bne 0b
  45. sethi %hi(HI_MAGIC), %o4
  46. or %o4, %lo(HI_MAGIC), %o3
  47. 4:
  48. sethi %hi(LO_MAGIC), %o4
  49. 5:
  50. or %o4, %lo(LO_MAGIC), %o2
  51. 8:
  52. ld [%o0], %o5
  53. 2:
  54. sub %o5, %o2, %o4
  55. andcc %o4, %o3, %g0
  56. be 8b
  57. add %o0, 4, %o0
  58. /* Check every byte. */
  59. srl %o5, 24, %g5
  60. andcc %g5, 0xff, %g0
  61. be 1f
  62. add %o0, -4, %o4
  63. srl %o5, 16, %g5
  64. andcc %g5, 0xff, %g0
  65. be 1f
  66. add %o4, 1, %o4
  67. srl %o5, 8, %g5
  68. andcc %g5, 0xff, %g0
  69. be 1f
  70. add %o4, 1, %o4
  71. andcc %o5, 0xff, %g0
  72. bne,a 2b
  73. ld [%o0], %o5
  74. add %o4, 1, %o4
  75. 1:
  76. retl
  77. sub %o4, %o1, %o0