strlen.S
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:1k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

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