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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: memscan.S,v 1.4 1996/09/08 02:01:20 davem Exp $
  2.  * memscan.S: Optimized memscan for the Sparc.
  3.  *
  4.  * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
  5.  */
  6. #include <asm/cprefix.h>
  7. /* In essence, this is just a fancy strlen. */
  8. #define LO_MAGIC 0x01010101
  9. #define HI_MAGIC 0x80808080
  10. .text
  11. .align 4
  12. .globl C_LABEL(__memscan_zero), C_LABEL(__memscan_generic)
  13. .globl C_LABEL(memscan)
  14. C_LABEL(__memscan_zero):
  15. /* %o0 = addr, %o1 = size */
  16. cmp %o1, 0
  17. bne,a 1f
  18.  andcc %o0, 3, %g0
  19. retl
  20.  nop
  21. 1:
  22. be mzero_scan_word
  23.  sethi %hi(HI_MAGIC), %g2
  24. ldsb [%o0], %g3
  25. mzero_still_not_word_aligned:
  26. cmp %g3, 0
  27. bne 1f
  28.  add %o0, 1, %o0
  29. retl
  30.  sub %o0, 1, %o0
  31. 1:
  32. subcc %o1, 1, %o1
  33. bne,a 1f
  34.  andcc %o0, 3, %g0
  35. retl
  36.  nop
  37. 1:
  38. bne,a mzero_still_not_word_aligned
  39.  ldsb [%o0], %g3
  40. sethi %hi(HI_MAGIC), %g2
  41. mzero_scan_word:
  42. or %g2, %lo(HI_MAGIC), %o3
  43. sethi %hi(LO_MAGIC), %g3
  44. or %g3, %lo(LO_MAGIC), %o2
  45. mzero_next_word:
  46. ld [%o0], %g2
  47. mzero_next_word_preloaded:
  48. sub %g2, %o2, %g2
  49. mzero_next_word_preloaded_next:
  50. andcc %g2, %o3, %g0
  51. bne mzero_byte_zero
  52.  add %o0, 4, %o0
  53. mzero_check_out_of_fuel:
  54. subcc %o1, 4, %o1
  55. bg,a 1f
  56.  ld [%o0], %g2
  57. retl
  58.  nop
  59. 1:
  60. b mzero_next_word_preloaded_next
  61.  sub %g2, %o2, %g2
  62. /* Check every byte. */
  63. mzero_byte_zero:
  64. ldsb [%o0 - 4], %g2
  65. cmp %g2, 0
  66. bne mzero_byte_one
  67.  sub %o0, 4, %g3
  68. retl
  69.  mov %g3, %o0
  70. mzero_byte_one:
  71. ldsb [%o0 - 3], %g2
  72. cmp %g2, 0
  73. bne,a mzero_byte_two_and_three
  74.  ldsb [%o0 - 2], %g2
  75. retl
  76.  sub %o0, 3, %o0
  77. mzero_byte_two_and_three:
  78. cmp %g2, 0
  79. bne,a 1f
  80.  ldsb [%o0 - 1], %g2
  81. retl
  82.  sub %o0, 2, %o0
  83. 1:
  84. cmp %g2, 0
  85. bne,a mzero_next_word_preloaded
  86.  ld [%o0], %g2
  87. retl
  88.  sub %o0, 1, %o0
  89. mzero_found_it:
  90. retl
  91.  sub %o0, 2, %o0
  92. C_LABEL(memscan):
  93. C_LABEL(__memscan_generic):
  94. /* %o0 = addr, %o1 = c, %o2 = size */
  95. cmp %o2, 0
  96. bne,a 0f
  97.  ldub [%o0], %g2
  98. b,a 2f
  99. 1:
  100. ldub [%o0], %g2
  101. 0:
  102. cmp %g2, %o1
  103. be 2f
  104.  addcc %o2, -1, %o2
  105. bne 1b
  106.  add %o0, 1, %o0
  107. 2:
  108. retl
  109.  nop