bitops.S 2.6 KB

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