bzero.S 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. /* bzero.S: Simple prefetching memset, bzero, and clear_user
  2. * implementations.
  3. *
  4. * Copyright (C) 2005 David S. Miller <davem@davemloft.net>
  5. */
  6. .text
  7. .globl __memset
  8. .type __memset, #function
  9. __memset: /* %o0=buf, %o1=pat, %o2=len */
  10. .globl memset
  11. .type memset, #function
  12. memset: /* %o0=buf, %o1=pat, %o2=len */
  13. and %o1, 0xff, %o3
  14. mov %o2, %o1
  15. sllx %o3, 8, %g1
  16. or %g1, %o3, %o2
  17. sllx %o2, 16, %g1
  18. or %g1, %o2, %o2
  19. sllx %o2, 32, %g1
  20. ba,pt %xcc, 1f
  21. or %g1, %o2, %o2
  22. .globl __bzero
  23. .type __bzero, #function
  24. __bzero: /* %o0=buf, %o1=len */
  25. clr %o2
  26. 1: mov %o0, %o3
  27. brz,pn %o1, __bzero_done
  28. cmp %o1, 16
  29. bl,pn %icc, __bzero_tiny
  30. prefetch [%o0 + 0x000], #n_writes
  31. andcc %o0, 0x3, %g0
  32. be,pt %icc, 2f
  33. 1: stb %o2, [%o0 + 0x00]
  34. add %o0, 1, %o0
  35. andcc %o0, 0x3, %g0
  36. bne,pn %icc, 1b
  37. sub %o1, 1, %o1
  38. 2: andcc %o0, 0x7, %g0
  39. be,pt %icc, 3f
  40. stw %o2, [%o0 + 0x00]
  41. sub %o1, 4, %o1
  42. add %o0, 4, %o0
  43. 3: and %o1, 0x38, %g1
  44. cmp %o1, 0x40
  45. andn %o1, 0x3f, %o4
  46. bl,pn %icc, 5f
  47. and %o1, 0x7, %o1
  48. prefetch [%o0 + 0x040], #n_writes
  49. prefetch [%o0 + 0x080], #n_writes
  50. prefetch [%o0 + 0x0c0], #n_writes
  51. prefetch [%o0 + 0x100], #n_writes
  52. prefetch [%o0 + 0x140], #n_writes
  53. 4: prefetch [%o0 + 0x180], #n_writes
  54. stx %o2, [%o0 + 0x00]
  55. stx %o2, [%o0 + 0x08]
  56. stx %o2, [%o0 + 0x10]
  57. stx %o2, [%o0 + 0x18]
  58. stx %o2, [%o0 + 0x20]
  59. stx %o2, [%o0 + 0x28]
  60. stx %o2, [%o0 + 0x30]
  61. stx %o2, [%o0 + 0x38]
  62. subcc %o4, 0x40, %o4
  63. bne,pt %icc, 4b
  64. add %o0, 0x40, %o0
  65. brz,pn %g1, 6f
  66. nop
  67. 5: stx %o2, [%o0 + 0x00]
  68. subcc %g1, 8, %g1
  69. bne,pt %icc, 5b
  70. add %o0, 0x8, %o0
  71. 6: brz,pt %o1, __bzero_done
  72. nop
  73. __bzero_tiny:
  74. 1: stb %o2, [%o0 + 0x00]
  75. subcc %o1, 1, %o1
  76. bne,pt %icc, 1b
  77. add %o0, 1, %o0
  78. __bzero_done:
  79. retl
  80. mov %o3, %o0
  81. .size __bzero, .-__bzero
  82. .size __memset, .-__memset
  83. .size memset, .-memset
  84. #define EX_ST(x,y) \
  85. 98: x,y; \
  86. .section __ex_table,"a";\
  87. .align 4; \
  88. .word 98b, __retl_o1; \
  89. .text; \
  90. .align 4;
  91. .globl __clear_user
  92. .type __clear_user, #function
  93. __clear_user: /* %o0=buf, %o1=len */
  94. brz,pn %o1, __clear_user_done
  95. cmp %o1, 16
  96. bl,pn %icc, __clear_user_tiny
  97. EX_ST(prefetcha [%o0 + 0x00] %asi, #n_writes)
  98. andcc %o0, 0x3, %g0
  99. be,pt %icc, 2f
  100. 1: EX_ST(stba %g0, [%o0 + 0x00] %asi)
  101. add %o0, 1, %o0
  102. andcc %o0, 0x3, %g0
  103. bne,pn %icc, 1b
  104. sub %o1, 1, %o1
  105. 2: andcc %o0, 0x7, %g0
  106. be,pt %icc, 3f
  107. EX_ST(stwa %g0, [%o0 + 0x00] %asi)
  108. sub %o1, 4, %o1
  109. add %o0, 4, %o0
  110. 3: and %o1, 0x38, %g1
  111. cmp %o1, 0x40
  112. andn %o1, 0x3f, %o4
  113. bl,pn %icc, 5f
  114. and %o1, 0x7, %o1
  115. EX_ST(prefetcha [%o0 + 0x040] %asi, #n_writes)
  116. EX_ST(prefetcha [%o0 + 0x080] %asi, #n_writes)
  117. EX_ST(prefetcha [%o0 + 0x0c0] %asi, #n_writes)
  118. EX_ST(prefetcha [%o0 + 0x100] %asi, #n_writes)
  119. EX_ST(prefetcha [%o0 + 0x140] %asi, #n_writes)
  120. 4: EX_ST(prefetcha [%o0 + 0x180] %asi, #n_writes)
  121. EX_ST(stxa %g0, [%o0 + 0x00] %asi)
  122. EX_ST(stxa %g0, [%o0 + 0x08] %asi)
  123. EX_ST(stxa %g0, [%o0 + 0x10] %asi)
  124. EX_ST(stxa %g0, [%o0 + 0x18] %asi)
  125. EX_ST(stxa %g0, [%o0 + 0x20] %asi)
  126. EX_ST(stxa %g0, [%o0 + 0x28] %asi)
  127. EX_ST(stxa %g0, [%o0 + 0x30] %asi)
  128. EX_ST(stxa %g0, [%o0 + 0x38] %asi)
  129. subcc %o4, 0x40, %o4
  130. bne,pt %icc, 4b
  131. add %o0, 0x40, %o0
  132. brz,pn %g1, 6f
  133. nop
  134. 5: EX_ST(stxa %g0, [%o0 + 0x00] %asi)
  135. subcc %g1, 8, %g1
  136. bne,pt %icc, 5b
  137. add %o0, 0x8, %o0
  138. 6: brz,pt %o1, __clear_user_done
  139. nop
  140. __clear_user_tiny:
  141. 1: EX_ST(stba %g0, [%o0 + 0x00] %asi)
  142. subcc %o1, 1, %o1
  143. bne,pt %icc, 1b
  144. add %o0, 1, %o0
  145. __clear_user_done:
  146. retl
  147. clr %o0
  148. .size __clear_user, .-__clear_user