]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - arch/sparc/lib/bitops.S
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
[mirror_ubuntu-bionic-kernel.git] / arch / sparc / lib / bitops.S
CommitLineData
b2441318 1/* SPDX-License-Identifier: GPL-2.0 */
24f287e4 2/* bitops.S: Sparc64 atomic bit operations.
1da177e4 3 *
24f287e4 4 * Copyright (C) 2000, 2007 David S. Miller (davem@davemloft.net)
1da177e4
LT
5 */
6
8695c37d 7#include <linux/linkage.h>
1da177e4 8#include <asm/asi.h>
24f287e4 9#include <asm/backoff.h>
d3867f04 10#include <asm/export.h>
1da177e4 11
b445e26c
DM
12 .text
13
8695c37d 14ENTRY(test_and_set_bit) /* %o0=nr, %o1=addr */
24f287e4 15 BACKOFF_SETUP(%o3)
1da177e4
LT
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
0f58189d 26 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
1da177e4 27 and %g7, %o2, %g2
1da177e4 28 clr %o0
b445e26c 29 movrne %g2, 1, %o0
1da177e4 30 retl
b445e26c 31 nop
24f287e4 322: BACKOFF_SPIN(%o3, %o4, 1b)
8695c37d 33ENDPROC(test_and_set_bit)
d3867f04 34EXPORT_SYMBOL(test_and_set_bit)
1da177e4 35
8695c37d 36ENTRY(test_and_clear_bit) /* %o0=nr, %o1=addr */
24f287e4 37 BACKOFF_SETUP(%o3)
1da177e4
LT
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
0f58189d 48 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
1da177e4 49 and %g7, %o2, %g2
1da177e4 50 clr %o0
b445e26c 51 movrne %g2, 1, %o0
1da177e4 52 retl
b445e26c 53 nop
24f287e4 542: BACKOFF_SPIN(%o3, %o4, 1b)
8695c37d 55ENDPROC(test_and_clear_bit)
d3867f04 56EXPORT_SYMBOL(test_and_clear_bit)
1da177e4 57
8695c37d 58ENTRY(test_and_change_bit) /* %o0=nr, %o1=addr */
24f287e4 59 BACKOFF_SETUP(%o3)
1da177e4
LT
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
0f58189d 70 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
1da177e4 71 and %g7, %o2, %g2
1da177e4 72 clr %o0
b445e26c 73 movrne %g2, 1, %o0
1da177e4 74 retl
b445e26c 75 nop
24f287e4 762: BACKOFF_SPIN(%o3, %o4, 1b)
8695c37d 77ENDPROC(test_and_change_bit)
d3867f04 78EXPORT_SYMBOL(test_and_change_bit)
1da177e4 79
8695c37d 80ENTRY(set_bit) /* %o0=nr, %o1=addr */
24f287e4 81 BACKOFF_SETUP(%o3)
1da177e4
LT
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
0f58189d 92 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
1da177e4
LT
93 nop
94 retl
95 nop
24f287e4 962: BACKOFF_SPIN(%o3, %o4, 1b)
8695c37d 97ENDPROC(set_bit)
d3867f04 98EXPORT_SYMBOL(set_bit)
1da177e4 99
8695c37d 100ENTRY(clear_bit) /* %o0=nr, %o1=addr */
24f287e4 101 BACKOFF_SETUP(%o3)
1da177e4
LT
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
0f58189d 112 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
1da177e4
LT
113 nop
114 retl
115 nop
24f287e4 1162: BACKOFF_SPIN(%o3, %o4, 1b)
8695c37d 117ENDPROC(clear_bit)
d3867f04 118EXPORT_SYMBOL(clear_bit)
1da177e4 119
8695c37d 120ENTRY(change_bit) /* %o0=nr, %o1=addr */
24f287e4 121 BACKOFF_SETUP(%o3)
1da177e4
LT
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
0f58189d 132 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
1da177e4
LT
133 nop
134 retl
135 nop
24f287e4 1362: BACKOFF_SPIN(%o3, %o4, 1b)
8695c37d 137ENDPROC(change_bit)
d3867f04 138EXPORT_SYMBOL(change_bit)