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