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