NG4memset.S 2.3 KB

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