memscan_32.S 1.8 KB

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