bzero.S 3.3 KB

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