Merge remote-tracking branch 'omap_dss2/for-next'
[deliverable/linux.git] / arch / sparc / lib / bitops.S
CommitLineData
24f287e4 1/* bitops.S: Sparc64 atomic bit operations.
1da177e4 2 *
24f287e4 3 * Copyright (C) 2000, 2007 David S. Miller (davem@davemloft.net)
1da177e4
LT
4 */
5
8695c37d 6#include <linux/linkage.h>
1da177e4 7#include <asm/asi.h>
24f287e4 8#include <asm/backoff.h>
d3867f04 9#include <asm/export.h>
1da177e4 10
b445e26c
DM
11 .text
12
8695c37d 13ENTRY(test_and_set_bit) /* %o0=nr, %o1=addr */
24f287e4 14 BACKOFF_SETUP(%o3)
1da177e4
LT
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
0f58189d 25 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
1da177e4 26 and %g7, %o2, %g2
1da177e4 27 clr %o0
b445e26c 28 movrne %g2, 1, %o0
1da177e4 29 retl
b445e26c 30 nop
24f287e4 312: BACKOFF_SPIN(%o3, %o4, 1b)
8695c37d 32ENDPROC(test_and_set_bit)
d3867f04 33EXPORT_SYMBOL(test_and_set_bit)
1da177e4 34
8695c37d 35ENTRY(test_and_clear_bit) /* %o0=nr, %o1=addr */
24f287e4 36 BACKOFF_SETUP(%o3)
1da177e4
LT
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
0f58189d 47 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
1da177e4 48 and %g7, %o2, %g2
1da177e4 49 clr %o0
b445e26c 50 movrne %g2, 1, %o0
1da177e4 51 retl
b445e26c 52 nop
24f287e4 532: BACKOFF_SPIN(%o3, %o4, 1b)
8695c37d 54ENDPROC(test_and_clear_bit)
d3867f04 55EXPORT_SYMBOL(test_and_clear_bit)
1da177e4 56
8695c37d 57ENTRY(test_and_change_bit) /* %o0=nr, %o1=addr */
24f287e4 58 BACKOFF_SETUP(%o3)
1da177e4
LT
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
0f58189d 69 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
1da177e4 70 and %g7, %o2, %g2
1da177e4 71 clr %o0
b445e26c 72 movrne %g2, 1, %o0
1da177e4 73 retl
b445e26c 74 nop
24f287e4 752: BACKOFF_SPIN(%o3, %o4, 1b)
8695c37d 76ENDPROC(test_and_change_bit)
d3867f04 77EXPORT_SYMBOL(test_and_change_bit)
1da177e4 78
8695c37d 79ENTRY(set_bit) /* %o0=nr, %o1=addr */
24f287e4 80 BACKOFF_SETUP(%o3)
1da177e4
LT
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
0f58189d 91 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
1da177e4
LT
92 nop
93 retl
94 nop
24f287e4 952: BACKOFF_SPIN(%o3, %o4, 1b)
8695c37d 96ENDPROC(set_bit)
d3867f04 97EXPORT_SYMBOL(set_bit)
1da177e4 98
8695c37d 99ENTRY(clear_bit) /* %o0=nr, %o1=addr */
24f287e4 100 BACKOFF_SETUP(%o3)
1da177e4
LT
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
0f58189d 111 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
1da177e4
LT
112 nop
113 retl
114 nop
24f287e4 1152: BACKOFF_SPIN(%o3, %o4, 1b)
8695c37d 116ENDPROC(clear_bit)
d3867f04 117EXPORT_SYMBOL(clear_bit)
1da177e4 118
8695c37d 119ENTRY(change_bit) /* %o0=nr, %o1=addr */
24f287e4 120 BACKOFF_SETUP(%o3)
1da177e4
LT
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
0f58189d 131 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
1da177e4
LT
132 nop
133 retl
134 nop
24f287e4 1352: BACKOFF_SPIN(%o3, %o4, 1b)
8695c37d 136ENDPROC(change_bit)
d3867f04 137EXPORT_SYMBOL(change_bit)
This page took 0.967847 seconds and 5 git commands to generate.