bitops.S 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /* bitops.S: Sparc64 atomic bit operations.
  3. *
  4. * Copyright (C) 2000, 2007 David S. Miller (davem@davemloft.net)
  5. */
  6. #include <linux/linkage.h>
  7. #include <asm/asi.h>
  8. #include <asm/backoff.h>
  9. #include <asm/export.h>
  10. .text
  11. ENTRY(test_and_set_bit) /* %o0=nr, %o1=addr */
  12. BACKOFF_SETUP(%o3)
  13. srlx %o0, 6, %g1
  14. mov 1, %o2
  15. sllx %g1, 3, %g3
  16. and %o0, 63, %g2
  17. sllx %o2, %g2, %o2
  18. add %o1, %g3, %o1
  19. 1: ldx [%o1], %g7
  20. or %g7, %o2, %g1
  21. casx [%o1], %g7, %g1
  22. cmp %g7, %g1
  23. bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
  24. and %g7, %o2, %g2
  25. clr %o0
  26. movrne %g2, 1, %o0
  27. retl
  28. nop
  29. 2: BACKOFF_SPIN(%o3, %o4, 1b)
  30. ENDPROC(test_and_set_bit)
  31. EXPORT_SYMBOL(test_and_set_bit)
  32. ENTRY(test_and_clear_bit) /* %o0=nr, %o1=addr */
  33. BACKOFF_SETUP(%o3)
  34. srlx %o0, 6, %g1
  35. mov 1, %o2
  36. sllx %g1, 3, %g3
  37. and %o0, 63, %g2
  38. sllx %o2, %g2, %o2
  39. add %o1, %g3, %o1
  40. 1: ldx [%o1], %g7
  41. andn %g7, %o2, %g1
  42. casx [%o1], %g7, %g1
  43. cmp %g7, %g1
  44. bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
  45. and %g7, %o2, %g2
  46. clr %o0
  47. movrne %g2, 1, %o0
  48. retl
  49. nop
  50. 2: BACKOFF_SPIN(%o3, %o4, 1b)
  51. ENDPROC(test_and_clear_bit)
  52. EXPORT_SYMBOL(test_and_clear_bit)
  53. ENTRY(test_and_change_bit) /* %o0=nr, %o1=addr */
  54. BACKOFF_SETUP(%o3)
  55. srlx %o0, 6, %g1
  56. mov 1, %o2
  57. sllx %g1, 3, %g3
  58. and %o0, 63, %g2
  59. sllx %o2, %g2, %o2
  60. add %o1, %g3, %o1
  61. 1: ldx [%o1], %g7
  62. xor %g7, %o2, %g1
  63. casx [%o1], %g7, %g1
  64. cmp %g7, %g1
  65. bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
  66. and %g7, %o2, %g2
  67. clr %o0
  68. movrne %g2, 1, %o0
  69. retl
  70. nop
  71. 2: BACKOFF_SPIN(%o3, %o4, 1b)
  72. ENDPROC(test_and_change_bit)
  73. EXPORT_SYMBOL(test_and_change_bit)
  74. ENTRY(set_bit) /* %o0=nr, %o1=addr */
  75. BACKOFF_SETUP(%o3)
  76. srlx %o0, 6, %g1
  77. mov 1, %o2
  78. sllx %g1, 3, %g3
  79. and %o0, 63, %g2
  80. sllx %o2, %g2, %o2
  81. add %o1, %g3, %o1
  82. 1: ldx [%o1], %g7
  83. or %g7, %o2, %g1
  84. casx [%o1], %g7, %g1
  85. cmp %g7, %g1
  86. bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
  87. nop
  88. retl
  89. nop
  90. 2: BACKOFF_SPIN(%o3, %o4, 1b)
  91. ENDPROC(set_bit)
  92. EXPORT_SYMBOL(set_bit)
  93. ENTRY(clear_bit) /* %o0=nr, %o1=addr */
  94. BACKOFF_SETUP(%o3)
  95. srlx %o0, 6, %g1
  96. mov 1, %o2
  97. sllx %g1, 3, %g3
  98. and %o0, 63, %g2
  99. sllx %o2, %g2, %o2
  100. add %o1, %g3, %o1
  101. 1: ldx [%o1], %g7
  102. andn %g7, %o2, %g1
  103. casx [%o1], %g7, %g1
  104. cmp %g7, %g1
  105. bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
  106. nop
  107. retl
  108. nop
  109. 2: BACKOFF_SPIN(%o3, %o4, 1b)
  110. ENDPROC(clear_bit)
  111. EXPORT_SYMBOL(clear_bit)
  112. ENTRY(change_bit) /* %o0=nr, %o1=addr */
  113. BACKOFF_SETUP(%o3)
  114. srlx %o0, 6, %g1
  115. mov 1, %o2
  116. sllx %g1, 3, %g3
  117. and %o0, 63, %g2
  118. sllx %o2, %g2, %o2
  119. add %o1, %g3, %o1
  120. 1: ldx [%o1], %g7
  121. xor %g7, %o2, %g1
  122. casx [%o1], %g7, %g1
  123. cmp %g7, %g1
  124. bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
  125. nop
  126. retl
  127. nop
  128. 2: BACKOFF_SPIN(%o3, %o4, 1b)
  129. ENDPROC(change_bit)
  130. EXPORT_SYMBOL(change_bit)