blob: 7031bf1587cb6136569f9f56af3c502a77f1350f [file] [log] [blame]
David S. Miller24f287e2007-10-15 16:41:44 -07001/* bitops.S: Sparc64 atomic bit operations.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 *
David S. Miller24f287e2007-10-15 16:41:44 -07003 * Copyright (C) 2000, 2007 David S. Miller (davem@davemloft.net)
Linus Torvalds1da177e2005-04-16 15:20:36 -07004 */
5
David S. Miller8695c372012-05-11 20:33:22 -07006#include <linux/linkage.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -07007#include <asm/asi.h>
David S. Miller24f287e2007-10-15 16:41:44 -07008#include <asm/backoff.h>
Al Virod3867f042016-01-16 21:39:30 -05009#include <asm/export.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070010
David S. Millerb445e262005-06-27 15:42:04 -070011 .text
12
David S. Miller8695c372012-05-11 20:33:22 -070013ENTRY(test_and_set_bit) /* %o0=nr, %o1=addr */
David S. Miller24f287e2007-10-15 16:41:44 -070014 BACKOFF_SETUP(%o3)
Linus Torvalds1da177e2005-04-16 15:20:36 -070015 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
David S. Miller0f581892010-08-18 22:53:26 -070025 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
Linus Torvalds1da177e2005-04-16 15:20:36 -070026 and %g7, %o2, %g2
Linus Torvalds1da177e2005-04-16 15:20:36 -070027 clr %o0
David S. Millerb445e262005-06-27 15:42:04 -070028 movrne %g2, 1, %o0
Linus Torvalds1da177e2005-04-16 15:20:36 -070029 retl
David S. Millerb445e262005-06-27 15:42:04 -070030 nop
David S. Miller24f287e2007-10-15 16:41:44 -0700312: BACKOFF_SPIN(%o3, %o4, 1b)
David S. Miller8695c372012-05-11 20:33:22 -070032ENDPROC(test_and_set_bit)
Al Virod3867f042016-01-16 21:39:30 -050033EXPORT_SYMBOL(test_and_set_bit)
Linus Torvalds1da177e2005-04-16 15:20:36 -070034
David S. Miller8695c372012-05-11 20:33:22 -070035ENTRY(test_and_clear_bit) /* %o0=nr, %o1=addr */
David S. Miller24f287e2007-10-15 16:41:44 -070036 BACKOFF_SETUP(%o3)
Linus Torvalds1da177e2005-04-16 15:20:36 -070037 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
David S. Miller0f581892010-08-18 22:53:26 -070047 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
Linus Torvalds1da177e2005-04-16 15:20:36 -070048 and %g7, %o2, %g2
Linus Torvalds1da177e2005-04-16 15:20:36 -070049 clr %o0
David S. Millerb445e262005-06-27 15:42:04 -070050 movrne %g2, 1, %o0
Linus Torvalds1da177e2005-04-16 15:20:36 -070051 retl
David S. Millerb445e262005-06-27 15:42:04 -070052 nop
David S. Miller24f287e2007-10-15 16:41:44 -0700532: BACKOFF_SPIN(%o3, %o4, 1b)
David S. Miller8695c372012-05-11 20:33:22 -070054ENDPROC(test_and_clear_bit)
Al Virod3867f042016-01-16 21:39:30 -050055EXPORT_SYMBOL(test_and_clear_bit)
Linus Torvalds1da177e2005-04-16 15:20:36 -070056
David S. Miller8695c372012-05-11 20:33:22 -070057ENTRY(test_and_change_bit) /* %o0=nr, %o1=addr */
David S. Miller24f287e2007-10-15 16:41:44 -070058 BACKOFF_SETUP(%o3)
Linus Torvalds1da177e2005-04-16 15:20:36 -070059 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
David S. Miller0f581892010-08-18 22:53:26 -070069 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
Linus Torvalds1da177e2005-04-16 15:20:36 -070070 and %g7, %o2, %g2
Linus Torvalds1da177e2005-04-16 15:20:36 -070071 clr %o0
David S. Millerb445e262005-06-27 15:42:04 -070072 movrne %g2, 1, %o0
Linus Torvalds1da177e2005-04-16 15:20:36 -070073 retl
David S. Millerb445e262005-06-27 15:42:04 -070074 nop
David S. Miller24f287e2007-10-15 16:41:44 -0700752: BACKOFF_SPIN(%o3, %o4, 1b)
David S. Miller8695c372012-05-11 20:33:22 -070076ENDPROC(test_and_change_bit)
Al Virod3867f042016-01-16 21:39:30 -050077EXPORT_SYMBOL(test_and_change_bit)
Linus Torvalds1da177e2005-04-16 15:20:36 -070078
David S. Miller8695c372012-05-11 20:33:22 -070079ENTRY(set_bit) /* %o0=nr, %o1=addr */
David S. Miller24f287e2007-10-15 16:41:44 -070080 BACKOFF_SETUP(%o3)
Linus Torvalds1da177e2005-04-16 15:20:36 -070081 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
David S. Miller0f581892010-08-18 22:53:26 -070091 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
Linus Torvalds1da177e2005-04-16 15:20:36 -070092 nop
93 retl
94 nop
David S. Miller24f287e2007-10-15 16:41:44 -0700952: BACKOFF_SPIN(%o3, %o4, 1b)
David S. Miller8695c372012-05-11 20:33:22 -070096ENDPROC(set_bit)
Al Virod3867f042016-01-16 21:39:30 -050097EXPORT_SYMBOL(set_bit)
Linus Torvalds1da177e2005-04-16 15:20:36 -070098
David S. Miller8695c372012-05-11 20:33:22 -070099ENTRY(clear_bit) /* %o0=nr, %o1=addr */
David S. Miller24f287e2007-10-15 16:41:44 -0700100 BACKOFF_SETUP(%o3)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700101 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
David S. Miller0f581892010-08-18 22:53:26 -0700111 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112 nop
113 retl
114 nop
David S. Miller24f287e2007-10-15 16:41:44 -07001152: BACKOFF_SPIN(%o3, %o4, 1b)
David S. Miller8695c372012-05-11 20:33:22 -0700116ENDPROC(clear_bit)
Al Virod3867f042016-01-16 21:39:30 -0500117EXPORT_SYMBOL(clear_bit)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700118
David S. Miller8695c372012-05-11 20:33:22 -0700119ENTRY(change_bit) /* %o0=nr, %o1=addr */
David S. Miller24f287e2007-10-15 16:41:44 -0700120 BACKOFF_SETUP(%o3)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700121 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
David S. Miller0f581892010-08-18 22:53:26 -0700131 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700132 nop
133 retl
134 nop
David S. Miller24f287e2007-10-15 16:41:44 -07001352: BACKOFF_SPIN(%o3, %o4, 1b)
David S. Miller8695c372012-05-11 20:33:22 -0700136ENDPROC(change_bit)
Al Virod3867f042016-01-16 21:39:30 -0500137EXPORT_SYMBOL(change_bit)