Merge tag 'powerpc-4.14-6' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc...
[sfrench/cifs-2.6.git] / arch / sparc / lib / bitops.S
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
14 ENTRY(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
22 1:      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
32 2:      BACKOFF_SPIN(%o3, %o4, 1b)
33 ENDPROC(test_and_set_bit)
34 EXPORT_SYMBOL(test_and_set_bit)
35
36 ENTRY(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
44 1:      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
54 2:      BACKOFF_SPIN(%o3, %o4, 1b)
55 ENDPROC(test_and_clear_bit)
56 EXPORT_SYMBOL(test_and_clear_bit)
57
58 ENTRY(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
66 1:      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
76 2:      BACKOFF_SPIN(%o3, %o4, 1b)
77 ENDPROC(test_and_change_bit)
78 EXPORT_SYMBOL(test_and_change_bit)
79
80 ENTRY(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
88 1:      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
96 2:      BACKOFF_SPIN(%o3, %o4, 1b)
97 ENDPROC(set_bit)
98 EXPORT_SYMBOL(set_bit)
99
100 ENTRY(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
108 1:      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
116 2:      BACKOFF_SPIN(%o3, %o4, 1b)
117 ENDPROC(clear_bit)
118 EXPORT_SYMBOL(clear_bit)
119
120 ENTRY(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
128 1:      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
136 2:      BACKOFF_SPIN(%o3, %o4, 1b)
137 ENDPROC(change_bit)
138 EXPORT_SYMBOL(change_bit)