NG4memset.S 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /* NG4memset.S: Niagara-4 optimized memset/bzero.
  2. *
  3. * Copyright (C) 2012 David S. Miller (davem@davemloft.net)
  4. */
  5. #include <asm/asi.h>
  6. .register %g2, #scratch
  7. .register %g3, #scratch
  8. .text
  9. .align 32
  10. .globl NG4memset
  11. NG4memset:
  12. andcc %o1, 0xff, %o4
  13. be,pt %icc, 1f
  14. mov %o2, %o1
  15. sllx %o4, 8, %g1
  16. or %g1, %o4, %o2
  17. sllx %o2, 16, %g1
  18. or %g1, %o2, %o2
  19. sllx %o2, 32, %g1
  20. ba,pt %icc, 1f
  21. or %g1, %o2, %o4
  22. .size NG4memset,.-NG4memset
  23. .align 32
  24. .globl NG4bzero
  25. NG4bzero:
  26. clr %o4
  27. 1: cmp %o1, 16
  28. ble %icc, .Ltiny
  29. mov %o0, %o3
  30. sub %g0, %o0, %g1
  31. and %g1, 0x7, %g1
  32. brz,pt %g1, .Laligned8
  33. sub %o1, %g1, %o1
  34. 1: stb %o4, [%o0 + 0x00]
  35. subcc %g1, 1, %g1
  36. bne,pt %icc, 1b
  37. add %o0, 1, %o0
  38. .Laligned8:
  39. cmp %o1, 64 + (64 - 8)
  40. ble .Lmedium
  41. sub %g0, %o0, %g1
  42. andcc %g1, (64 - 1), %g1
  43. brz,pn %g1, .Laligned64
  44. sub %o1, %g1, %o1
  45. 1: stx %o4, [%o0 + 0x00]
  46. subcc %g1, 8, %g1
  47. bne,pt %icc, 1b
  48. add %o0, 0x8, %o0
  49. .Laligned64:
  50. andn %o1, 64 - 1, %g1
  51. sub %o1, %g1, %o1
  52. brnz,pn %o4, .Lnon_bzero_loop
  53. mov 0x20, %g2
  54. 1: stxa %o4, [%o0 + %g0] ASI_BLK_INIT_QUAD_LDD_P
  55. subcc %g1, 0x40, %g1
  56. stxa %o4, [%o0 + %g2] ASI_BLK_INIT_QUAD_LDD_P
  57. bne,pt %icc, 1b
  58. add %o0, 0x40, %o0
  59. .Lpostloop:
  60. cmp %o1, 8
  61. bl,pn %icc, .Ltiny
  62. membar #StoreStore|#StoreLoad
  63. .Lmedium:
  64. andn %o1, 0x7, %g1
  65. sub %o1, %g1, %o1
  66. 1: stx %o4, [%o0 + 0x00]
  67. subcc %g1, 0x8, %g1
  68. bne,pt %icc, 1b
  69. add %o0, 0x08, %o0
  70. andcc %o1, 0x4, %g1
  71. be,pt %icc, .Ltiny
  72. sub %o1, %g1, %o1
  73. stw %o4, [%o0 + 0x00]
  74. add %o0, 0x4, %o0
  75. .Ltiny:
  76. cmp %o1, 0
  77. be,pn %icc, .Lexit
  78. 1: subcc %o1, 1, %o1
  79. stb %o4, [%o0 + 0x00]
  80. bne,pt %icc, 1b
  81. add %o0, 1, %o0
  82. .Lexit:
  83. retl
  84. mov %o3, %o0
  85. .Lnon_bzero_loop:
  86. mov 0x08, %g3
  87. mov 0x28, %o5
  88. 1: stxa %o4, [%o0 + %g0] ASI_BLK_INIT_QUAD_LDD_P
  89. subcc %g1, 0x40, %g1
  90. stxa %o4, [%o0 + %g2] ASI_BLK_INIT_QUAD_LDD_P
  91. stxa %o4, [%o0 + %g3] ASI_BLK_INIT_QUAD_LDD_P
  92. stxa %o4, [%o0 + %o5] ASI_BLK_INIT_QUAD_LDD_P
  93. add %o0, 0x10, %o0
  94. stxa %o4, [%o0 + %g0] ASI_BLK_INIT_QUAD_LDD_P
  95. stxa %o4, [%o0 + %g2] ASI_BLK_INIT_QUAD_LDD_P
  96. stxa %o4, [%o0 + %g3] ASI_BLK_INIT_QUAD_LDD_P
  97. stxa %o4, [%o0 + %o5] ASI_BLK_INIT_QUAD_LDD_P
  98. bne,pt %icc, 1b
  99. add %o0, 0x30, %o0
  100. ba,a,pt %icc, .Lpostloop
  101. .size NG4bzero,.-NG4bzero