Loading...
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
7#include <linux/linkage.h>
8#include <asm/asi.h>
9#include <asm/backoff.h>
10#include <asm/export.h>
11
12 .text
13
14ENTRY(test_and_set_bit) /* %o0=nr, %o1=addr */
15 BACKOFF_SETUP(%o3)
16 srlx %o0, 6, %g1
17 mov 1, %o2
18 sllx %g1, 3, %g3
19 and %o0, 63, %g2
20 sllx %o2, %g2, %o2
21 add %o1, %g3, %o1
221: ldx [%o1], %g7
23 or %g7, %o2, %g1
24 casx [%o1], %g7, %g1
25 cmp %g7, %g1
26 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
27 and %g7, %o2, %g2
28 clr %o0
29 movrne %g2, 1, %o0
30 retl
31 nop
322: BACKOFF_SPIN(%o3, %o4, 1b)
33ENDPROC(test_and_set_bit)
34EXPORT_SYMBOL(test_and_set_bit)
35
36ENTRY(test_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)
55ENDPROC(test_and_clear_bit)
56EXPORT_SYMBOL(test_and_clear_bit)
57
58ENTRY(test_and_change_bit) /* %o0=nr, %o1=addr */
59 BACKOFF_SETUP(%o3)
60 srlx %o0, 6, %g1
61 mov 1, %o2
62 sllx %g1, 3, %g3
63 and %o0, 63, %g2
64 sllx %o2, %g2, %o2
65 add %o1, %g3, %o1
661: ldx [%o1], %g7
67 xor %g7, %o2, %g1
68 casx [%o1], %g7, %g1
69 cmp %g7, %g1
70 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
71 and %g7, %o2, %g2
72 clr %o0
73 movrne %g2, 1, %o0
74 retl
75 nop
762: BACKOFF_SPIN(%o3, %o4, 1b)
77ENDPROC(test_and_change_bit)
78EXPORT_SYMBOL(test_and_change_bit)
79
80ENTRY(set_bit) /* %o0=nr, %o1=addr */
81 BACKOFF_SETUP(%o3)
82 srlx %o0, 6, %g1
83 mov 1, %o2
84 sllx %g1, 3, %g3
85 and %o0, 63, %g2
86 sllx %o2, %g2, %o2
87 add %o1, %g3, %o1
881: ldx [%o1], %g7
89 or %g7, %o2, %g1
90 casx [%o1], %g7, %g1
91 cmp %g7, %g1
92 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
93 nop
94 retl
95 nop
962: BACKOFF_SPIN(%o3, %o4, 1b)
97ENDPROC(set_bit)
98EXPORT_SYMBOL(set_bit)
99
100ENTRY(clear_bit) /* %o0=nr, %o1=addr */
101 BACKOFF_SETUP(%o3)
102 srlx %o0, 6, %g1
103 mov 1, %o2
104 sllx %g1, 3, %g3
105 and %o0, 63, %g2
106 sllx %o2, %g2, %o2
107 add %o1, %g3, %o1
1081: ldx [%o1], %g7
109 andn %g7, %o2, %g1
110 casx [%o1], %g7, %g1
111 cmp %g7, %g1
112 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
113 nop
114 retl
115 nop
1162: BACKOFF_SPIN(%o3, %o4, 1b)
117ENDPROC(clear_bit)
118EXPORT_SYMBOL(clear_bit)
119
120ENTRY(change_bit) /* %o0=nr, %o1=addr */
121 BACKOFF_SETUP(%o3)
122 srlx %o0, 6, %g1
123 mov 1, %o2
124 sllx %g1, 3, %g3
125 and %o0, 63, %g2
126 sllx %o2, %g2, %o2
127 add %o1, %g3, %o1
1281: ldx [%o1], %g7
129 xor %g7, %o2, %g1
130 casx [%o1], %g7, %g1
131 cmp %g7, %g1
132 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
133 nop
134 retl
135 nop
1362: BACKOFF_SPIN(%o3, %o4, 1b)
137ENDPROC(change_bit)
138EXPORT_SYMBOL(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#include <asm/export.h>
10
11 .text
12
13ENTRY(test_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)
32ENDPROC(test_and_set_bit)
33EXPORT_SYMBOL(test_and_set_bit)
34
35ENTRY(test_and_clear_bit) /* %o0=nr, %o1=addr */
36 BACKOFF_SETUP(%o3)
37 srlx %o0, 6, %g1
38 mov 1, %o2
39 sllx %g1, 3, %g3
40 and %o0, 63, %g2
41 sllx %o2, %g2, %o2
42 add %o1, %g3, %o1
431: ldx [%o1], %g7
44 andn %g7, %o2, %g1
45 casx [%o1], %g7, %g1
46 cmp %g7, %g1
47 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
48 and %g7, %o2, %g2
49 clr %o0
50 movrne %g2, 1, %o0
51 retl
52 nop
532: BACKOFF_SPIN(%o3, %o4, 1b)
54ENDPROC(test_and_clear_bit)
55EXPORT_SYMBOL(test_and_clear_bit)
56
57ENTRY(test_and_change_bit) /* %o0=nr, %o1=addr */
58 BACKOFF_SETUP(%o3)
59 srlx %o0, 6, %g1
60 mov 1, %o2
61 sllx %g1, 3, %g3
62 and %o0, 63, %g2
63 sllx %o2, %g2, %o2
64 add %o1, %g3, %o1
651: ldx [%o1], %g7
66 xor %g7, %o2, %g1
67 casx [%o1], %g7, %g1
68 cmp %g7, %g1
69 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
70 and %g7, %o2, %g2
71 clr %o0
72 movrne %g2, 1, %o0
73 retl
74 nop
752: BACKOFF_SPIN(%o3, %o4, 1b)
76ENDPROC(test_and_change_bit)
77EXPORT_SYMBOL(test_and_change_bit)
78
79ENTRY(set_bit) /* %o0=nr, %o1=addr */
80 BACKOFF_SETUP(%o3)
81 srlx %o0, 6, %g1
82 mov 1, %o2
83 sllx %g1, 3, %g3
84 and %o0, 63, %g2
85 sllx %o2, %g2, %o2
86 add %o1, %g3, %o1
871: ldx [%o1], %g7
88 or %g7, %o2, %g1
89 casx [%o1], %g7, %g1
90 cmp %g7, %g1
91 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
92 nop
93 retl
94 nop
952: BACKOFF_SPIN(%o3, %o4, 1b)
96ENDPROC(set_bit)
97EXPORT_SYMBOL(set_bit)
98
99ENTRY(clear_bit) /* %o0=nr, %o1=addr */
100 BACKOFF_SETUP(%o3)
101 srlx %o0, 6, %g1
102 mov 1, %o2
103 sllx %g1, 3, %g3
104 and %o0, 63, %g2
105 sllx %o2, %g2, %o2
106 add %o1, %g3, %o1
1071: ldx [%o1], %g7
108 andn %g7, %o2, %g1
109 casx [%o1], %g7, %g1
110 cmp %g7, %g1
111 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
112 nop
113 retl
114 nop
1152: BACKOFF_SPIN(%o3, %o4, 1b)
116ENDPROC(clear_bit)
117EXPORT_SYMBOL(clear_bit)
118
119ENTRY(change_bit) /* %o0=nr, %o1=addr */
120 BACKOFF_SETUP(%o3)
121 srlx %o0, 6, %g1
122 mov 1, %o2
123 sllx %g1, 3, %g3
124 and %o0, 63, %g2
125 sllx %o2, %g2, %o2
126 add %o1, %g3, %o1
1271: ldx [%o1], %g7
128 xor %g7, %o2, %g1
129 casx [%o1], %g7, %g1
130 cmp %g7, %g1
131 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
132 nop
133 retl
134 nop
1352: BACKOFF_SPIN(%o3, %o4, 1b)
136ENDPROC(change_bit)
137EXPORT_SYMBOL(change_bit)