bitops.S 2.7 KB

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