strlen.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:1k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  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. #include <asm/cprefix.h>
  8. #define LO_MAGIC 0x01010101
  9. #define HI_MAGIC 0x80808080
  10. 0:
  11. ldub [%o0], %o5
  12. cmp %o5, 0
  13. be 1f
  14.  add %o0, 1, %o0
  15. andcc %o0, 3, %g0
  16. be 4f
  17.  or %o4, %lo(HI_MAGIC), %o3
  18. ldub [%o0], %o5
  19. cmp %o5, 0
  20. be 2f
  21.  add %o0, 1, %o0
  22. andcc %o0, 3, %g0
  23. be 5f
  24.  sethi %hi(LO_MAGIC), %o4
  25. ldub [%o0], %o5
  26. cmp %o5, 0
  27. be 3f
  28.  add %o0, 1, %o0
  29. b 8f
  30.  or %o4, %lo(LO_MAGIC), %o2
  31. 1:
  32. retl
  33.  mov 0, %o0
  34. 2:
  35. retl
  36.  mov 1, %o0
  37. 3:
  38. retl
  39.  mov 2, %o0
  40. .align 4
  41. .global C_LABEL(strlen)
  42. C_LABEL(strlen):
  43. mov %o0, %o1
  44. andcc %o0, 3, %g0
  45. bne 0b
  46.  sethi %hi(HI_MAGIC), %o4
  47. or %o4, %lo(HI_MAGIC), %o3
  48. 4:
  49. sethi %hi(LO_MAGIC), %o4
  50. 5:
  51. or %o4, %lo(LO_MAGIC), %o2
  52. 8:
  53. ld [%o0], %o5
  54. 2:
  55. sub %o5, %o2, %o4
  56. andcc %o4, %o3, %g0
  57. be 8b
  58.  add %o0, 4, %o0
  59. /* Check every byte. */
  60. srl %o5, 24, %g5
  61. andcc %g5, 0xff, %g0
  62. be 1f
  63.  add %o0, -4, %o4
  64. srl %o5, 16, %g5
  65. andcc %g5, 0xff, %g0
  66. be 1f
  67.  add %o4, 1, %o4
  68. srl %o5, 8, %g5
  69. andcc %g5, 0xff, %g0
  70. be 1f
  71.  add %o4, 1, %o4
  72. andcc %o5, 0xff, %g0
  73. bne,a 2b
  74.  ld [%o0], %o5
  75. add %o4, 1, %o4
  76. 1:
  77. retl
  78.  sub %o4, %o1, %o0