Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux
[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>
1da177e4 9
b445e26c
DM
10 .text
11
8695c37d 12ENTRY(test_and_set_bit) /* %o0=nr, %o1=addr */
24f287e4 13 BACKOFF_SETUP(%o3)
1da177e4
LT
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
0f58189d 24 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
1da177e4 25 and %g7, %o2, %g2
1da177e4 26 clr %o0
b445e26c 27 movrne %g2, 1, %o0
1da177e4 28 retl
b445e26c 29 nop
24f287e4 302: BACKOFF_SPIN(%o3, %o4, 1b)
8695c37d 31ENDPROC(test_and_set_bit)
1da177e4 32
8695c37d 33ENTRY(test_and_clear_bit) /* %o0=nr, %o1=addr */
24f287e4 34 BACKOFF_SETUP(%o3)
1da177e4
LT
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
0f58189d 45 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
1da177e4 46 and %g7, %o2, %g2
1da177e4 47 clr %o0
b445e26c 48 movrne %g2, 1, %o0
1da177e4 49 retl
b445e26c 50 nop
24f287e4 512: BACKOFF_SPIN(%o3, %o4, 1b)
8695c37d 52ENDPROC(test_and_clear_bit)
1da177e4 53
8695c37d 54ENTRY(test_and_change_bit) /* %o0=nr, %o1=addr */
24f287e4 55 BACKOFF_SETUP(%o3)
1da177e4
LT
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
0f58189d 66 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
1da177e4 67 and %g7, %o2, %g2
1da177e4 68 clr %o0
b445e26c 69 movrne %g2, 1, %o0
1da177e4 70 retl
b445e26c 71 nop
24f287e4 722: BACKOFF_SPIN(%o3, %o4, 1b)
8695c37d 73ENDPROC(test_and_change_bit)
1da177e4 74
8695c37d 75ENTRY(set_bit) /* %o0=nr, %o1=addr */
24f287e4 76 BACKOFF_SETUP(%o3)
1da177e4
LT
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
0f58189d 87 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
1da177e4
LT
88 nop
89 retl
90 nop
24f287e4 912: BACKOFF_SPIN(%o3, %o4, 1b)
8695c37d 92ENDPROC(set_bit)
1da177e4 93
8695c37d 94ENTRY(clear_bit) /* %o0=nr, %o1=addr */
24f287e4 95 BACKOFF_SETUP(%o3)
1da177e4
LT
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
0f58189d 106 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
1da177e4
LT
107 nop
108 retl
109 nop
24f287e4 1102: BACKOFF_SPIN(%o3, %o4, 1b)
8695c37d 111ENDPROC(clear_bit)
1da177e4 112
8695c37d 113ENTRY(change_bit) /* %o0=nr, %o1=addr */
24f287e4 114 BACKOFF_SETUP(%o3)
1da177e4
LT
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
0f58189d 125 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
1da177e4
LT
126 nop
127 retl
128 nop
24f287e4 1292: BACKOFF_SPIN(%o3, %o4, 1b)
8695c37d 130ENDPROC(change_bit)
This page took 0.802425 seconds and 5 git commands to generate.