0001
0002
0003
0004
0005
0006
0007 #include <linux/linkage.h>
0008 #include <asm/asi.h>
0009 #include <asm/backoff.h>
0010 #include <asm/export.h>
0011
0012 .text
0013
0014 ENTRY(test_and_set_bit)
0015 BACKOFF_SETUP(%o3)
0016 srlx %o0, 6, %g1
0017 mov 1, %o2
0018 sllx %g1, 3, %g3
0019 and %o0, 63, %g2
0020 sllx %o2, %g2, %o2
0021 add %o1, %g3, %o1
0022 1: ldx [%o1], %g7
0023 or %g7, %o2, %g1
0024 casx [%o1], %g7, %g1
0025 cmp %g7, %g1
0026 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
0027 and %g7, %o2, %g2
0028 clr %o0
0029 movrne %g2, 1, %o0
0030 retl
0031 nop
0032 2: BACKOFF_SPIN(%o3, %o4, 1b)
0033 ENDPROC(test_and_set_bit)
0034 EXPORT_SYMBOL(test_and_set_bit)
0035
0036 ENTRY(test_and_clear_bit)
0037 BACKOFF_SETUP(%o3)
0038 srlx %o0, 6, %g1
0039 mov 1, %o2
0040 sllx %g1, 3, %g3
0041 and %o0, 63, %g2
0042 sllx %o2, %g2, %o2
0043 add %o1, %g3, %o1
0044 1: ldx [%o1], %g7
0045 andn %g7, %o2, %g1
0046 casx [%o1], %g7, %g1
0047 cmp %g7, %g1
0048 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
0049 and %g7, %o2, %g2
0050 clr %o0
0051 movrne %g2, 1, %o0
0052 retl
0053 nop
0054 2: BACKOFF_SPIN(%o3, %o4, 1b)
0055 ENDPROC(test_and_clear_bit)
0056 EXPORT_SYMBOL(test_and_clear_bit)
0057
0058 ENTRY(test_and_change_bit)
0059 BACKOFF_SETUP(%o3)
0060 srlx %o0, 6, %g1
0061 mov 1, %o2
0062 sllx %g1, 3, %g3
0063 and %o0, 63, %g2
0064 sllx %o2, %g2, %o2
0065 add %o1, %g3, %o1
0066 1: ldx [%o1], %g7
0067 xor %g7, %o2, %g1
0068 casx [%o1], %g7, %g1
0069 cmp %g7, %g1
0070 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
0071 and %g7, %o2, %g2
0072 clr %o0
0073 movrne %g2, 1, %o0
0074 retl
0075 nop
0076 2: BACKOFF_SPIN(%o3, %o4, 1b)
0077 ENDPROC(test_and_change_bit)
0078 EXPORT_SYMBOL(test_and_change_bit)
0079
0080 ENTRY(set_bit)
0081 BACKOFF_SETUP(%o3)
0082 srlx %o0, 6, %g1
0083 mov 1, %o2
0084 sllx %g1, 3, %g3
0085 and %o0, 63, %g2
0086 sllx %o2, %g2, %o2
0087 add %o1, %g3, %o1
0088 1: ldx [%o1], %g7
0089 or %g7, %o2, %g1
0090 casx [%o1], %g7, %g1
0091 cmp %g7, %g1
0092 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
0093 nop
0094 retl
0095 nop
0096 2: BACKOFF_SPIN(%o3, %o4, 1b)
0097 ENDPROC(set_bit)
0098 EXPORT_SYMBOL(set_bit)
0099
0100 ENTRY(clear_bit)
0101 BACKOFF_SETUP(%o3)
0102 srlx %o0, 6, %g1
0103 mov 1, %o2
0104 sllx %g1, 3, %g3
0105 and %o0, 63, %g2
0106 sllx %o2, %g2, %o2
0107 add %o1, %g3, %o1
0108 1: ldx [%o1], %g7
0109 andn %g7, %o2, %g1
0110 casx [%o1], %g7, %g1
0111 cmp %g7, %g1
0112 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
0113 nop
0114 retl
0115 nop
0116 2: BACKOFF_SPIN(%o3, %o4, 1b)
0117 ENDPROC(clear_bit)
0118 EXPORT_SYMBOL(clear_bit)
0119
0120 ENTRY(change_bit)
0121 BACKOFF_SETUP(%o3)
0122 srlx %o0, 6, %g1
0123 mov 1, %o2
0124 sllx %g1, 3, %g3
0125 and %o0, 63, %g2
0126 sllx %o2, %g2, %o2
0127 add %o1, %g3, %o1
0128 1: ldx [%o1], %g7
0129 xor %g7, %o2, %g1
0130 casx [%o1], %g7, %g1
0131 cmp %g7, %g1
0132 bne,pn %xcc, BACKOFF_LABEL(2f, 1b)
0133 nop
0134 retl
0135 nop
0136 2: BACKOFF_SPIN(%o3, %o4, 1b)
0137 ENDPROC(change_bit)
0138 EXPORT_SYMBOL(change_bit)