bzero.S 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  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 .fixup; \
  87. .align 4; \
  88. 99: retl; \
  89. mov %o1, %o0; \
  90. .section __ex_table; \
  91. .align 4; \
  92. .word 98b, 99b; \
  93. .text; \
  94. .align 4;
  95. .globl __bzero_noasi
  96. .type __bzero_noasi, #function
  97. __bzero_noasi: /* %o0=buf, %o1=len */
  98. brz,pn %o1, __bzero_noasi_done
  99. cmp %o1, 16
  100. bl,pn %icc, __bzero_noasi_tiny
  101. EX_ST(prefetcha [%o0 + 0x00] %asi, #n_writes)
  102. andcc %o0, 0x3, %g0
  103. be,pt %icc, 2f
  104. 1: EX_ST(stba %g0, [%o0 + 0x00] %asi)
  105. add %o0, 1, %o0
  106. andcc %o0, 0x3, %g0
  107. bne,pn %icc, 1b
  108. sub %o1, 1, %o1
  109. 2: andcc %o0, 0x7, %g0
  110. be,pt %icc, 3f
  111. EX_ST(stwa %g0, [%o0 + 0x00] %asi)
  112. sub %o1, 4, %o1
  113. add %o0, 4, %o0
  114. 3: and %o1, 0x38, %g1
  115. cmp %o1, 0x40
  116. andn %o1, 0x3f, %o4
  117. bl,pn %icc, 5f
  118. and %o1, 0x7, %o1
  119. EX_ST(prefetcha [%o0 + 0x040] %asi, #n_writes)
  120. EX_ST(prefetcha [%o0 + 0x080] %asi, #n_writes)
  121. EX_ST(prefetcha [%o0 + 0x0c0] %asi, #n_writes)
  122. EX_ST(prefetcha [%o0 + 0x100] %asi, #n_writes)
  123. EX_ST(prefetcha [%o0 + 0x140] %asi, #n_writes)
  124. 4: EX_ST(prefetcha [%o0 + 0x180] %asi, #n_writes)
  125. EX_ST(stxa %g0, [%o0 + 0x00] %asi)
  126. EX_ST(stxa %g0, [%o0 + 0x08] %asi)
  127. EX_ST(stxa %g0, [%o0 + 0x10] %asi)
  128. EX_ST(stxa %g0, [%o0 + 0x18] %asi)
  129. EX_ST(stxa %g0, [%o0 + 0x20] %asi)
  130. EX_ST(stxa %g0, [%o0 + 0x28] %asi)
  131. EX_ST(stxa %g0, [%o0 + 0x30] %asi)
  132. EX_ST(stxa %g0, [%o0 + 0x38] %asi)
  133. subcc %o4, 0x40, %o4
  134. bne,pt %icc, 4b
  135. add %o0, 0x40, %o0
  136. brz,pn %g1, 6f
  137. nop
  138. 5: EX_ST(stxa %g0, [%o0 + 0x00] %asi)
  139. subcc %g1, 8, %g1
  140. bne,pt %icc, 5b
  141. add %o0, 0x8, %o0
  142. 6: brz,pt %o1, __bzero_noasi_done
  143. nop
  144. __bzero_noasi_tiny:
  145. 1: EX_ST(stba %g0, [%o0 + 0x00] %asi)
  146. subcc %o1, 1, %o1
  147. bne,pt %icc, 1b
  148. add %o0, 1, %o0
  149. __bzero_noasi_done:
  150. retl
  151. clr %o0
  152. .size __bzero_noasi, .-__bzero_noasi