1 /* SPDX-License-Identifier: GPL-2.0 */ 1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* bitops.S: Sparc64 atomic bit operations. 2 /* bitops.S: Sparc64 atomic bit operations. 3 * 3 * 4 * Copyright (C) 2000, 2007 David S. Miller (d 4 * Copyright (C) 2000, 2007 David S. Miller (davem@davemloft.net) 5 */ 5 */ 6 6 7 #include <linux/export.h> 7 #include <linux/export.h> 8 #include <linux/linkage.h> 8 #include <linux/linkage.h> 9 #include <asm/asi.h> 9 #include <asm/asi.h> 10 #include <asm/backoff.h> 10 #include <asm/backoff.h> 11 11 12 .text 12 .text 13 13 14 ENTRY(test_and_set_bit) /* %o0=nr, %o1=addr */ 14 ENTRY(test_and_set_bit) /* %o0=nr, %o1=addr */ 15 BACKOFF_SETUP(%o3) 15 BACKOFF_SETUP(%o3) 16 srlx %o0, 6, %g1 16 srlx %o0, 6, %g1 17 mov 1, %o2 17 mov 1, %o2 18 sllx %g1, 3, %g3 18 sllx %g1, 3, %g3 19 and %o0, 63, %g2 19 and %o0, 63, %g2 20 sllx %o2, %g2, %o2 20 sllx %o2, %g2, %o2 21 add %o1, %g3, %o1 21 add %o1, %g3, %o1 22 1: ldx [%o1], %g7 22 1: ldx [%o1], %g7 23 or %g7, %o2, %g1 23 or %g7, %o2, %g1 24 casx [%o1], %g7, %g1 24 casx [%o1], %g7, %g1 25 cmp %g7, %g1 25 cmp %g7, %g1 26 bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 26 bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 27 and %g7, %o2, %g2 27 and %g7, %o2, %g2 28 clr %o0 28 clr %o0 29 movrne %g2, 1, %o0 29 movrne %g2, 1, %o0 30 retl 30 retl 31 nop 31 nop 32 2: BACKOFF_SPIN(%o3, %o4, 1b) 32 2: BACKOFF_SPIN(%o3, %o4, 1b) 33 ENDPROC(test_and_set_bit) 33 ENDPROC(test_and_set_bit) 34 EXPORT_SYMBOL(test_and_set_bit) 34 EXPORT_SYMBOL(test_and_set_bit) 35 35 36 ENTRY(test_and_clear_bit) /* %o0=nr, %o1=addr 36 ENTRY(test_and_clear_bit) /* %o0=nr, %o1=addr */ 37 BACKOFF_SETUP(%o3) 37 BACKOFF_SETUP(%o3) 38 srlx %o0, 6, %g1 38 srlx %o0, 6, %g1 39 mov 1, %o2 39 mov 1, %o2 40 sllx %g1, 3, %g3 40 sllx %g1, 3, %g3 41 and %o0, 63, %g2 41 and %o0, 63, %g2 42 sllx %o2, %g2, %o2 42 sllx %o2, %g2, %o2 43 add %o1, %g3, %o1 43 add %o1, %g3, %o1 44 1: ldx [%o1], %g7 44 1: ldx [%o1], %g7 45 andn %g7, %o2, %g1 45 andn %g7, %o2, %g1 46 casx [%o1], %g7, %g1 46 casx [%o1], %g7, %g1 47 cmp %g7, %g1 47 cmp %g7, %g1 48 bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 48 bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 49 and %g7, %o2, %g2 49 and %g7, %o2, %g2 50 clr %o0 50 clr %o0 51 movrne %g2, 1, %o0 51 movrne %g2, 1, %o0 52 retl 52 retl 53 nop 53 nop 54 2: BACKOFF_SPIN(%o3, %o4, 1b) 54 2: BACKOFF_SPIN(%o3, %o4, 1b) 55 ENDPROC(test_and_clear_bit) 55 ENDPROC(test_and_clear_bit) 56 EXPORT_SYMBOL(test_and_clear_bit) 56 EXPORT_SYMBOL(test_and_clear_bit) 57 57 58 ENTRY(test_and_change_bit) /* %o0=nr, %o1=addr 58 ENTRY(test_and_change_bit) /* %o0=nr, %o1=addr */ 59 BACKOFF_SETUP(%o3) 59 BACKOFF_SETUP(%o3) 60 srlx %o0, 6, %g1 60 srlx %o0, 6, %g1 61 mov 1, %o2 61 mov 1, %o2 62 sllx %g1, 3, %g3 62 sllx %g1, 3, %g3 63 and %o0, 63, %g2 63 and %o0, 63, %g2 64 sllx %o2, %g2, %o2 64 sllx %o2, %g2, %o2 65 add %o1, %g3, %o1 65 add %o1, %g3, %o1 66 1: ldx [%o1], %g7 66 1: ldx [%o1], %g7 67 xor %g7, %o2, %g1 67 xor %g7, %o2, %g1 68 casx [%o1], %g7, %g1 68 casx [%o1], %g7, %g1 69 cmp %g7, %g1 69 cmp %g7, %g1 70 bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 70 bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 71 and %g7, %o2, %g2 71 and %g7, %o2, %g2 72 clr %o0 72 clr %o0 73 movrne %g2, 1, %o0 73 movrne %g2, 1, %o0 74 retl 74 retl 75 nop 75 nop 76 2: BACKOFF_SPIN(%o3, %o4, 1b) 76 2: BACKOFF_SPIN(%o3, %o4, 1b) 77 ENDPROC(test_and_change_bit) 77 ENDPROC(test_and_change_bit) 78 EXPORT_SYMBOL(test_and_change_bit) 78 EXPORT_SYMBOL(test_and_change_bit) 79 79 80 ENTRY(set_bit) /* %o0=nr, %o1=addr */ 80 ENTRY(set_bit) /* %o0=nr, %o1=addr */ 81 BACKOFF_SETUP(%o3) 81 BACKOFF_SETUP(%o3) 82 srlx %o0, 6, %g1 82 srlx %o0, 6, %g1 83 mov 1, %o2 83 mov 1, %o2 84 sllx %g1, 3, %g3 84 sllx %g1, 3, %g3 85 and %o0, 63, %g2 85 and %o0, 63, %g2 86 sllx %o2, %g2, %o2 86 sllx %o2, %g2, %o2 87 add %o1, %g3, %o1 87 add %o1, %g3, %o1 88 1: ldx [%o1], %g7 88 1: ldx [%o1], %g7 89 or %g7, %o2, %g1 89 or %g7, %o2, %g1 90 casx [%o1], %g7, %g1 90 casx [%o1], %g7, %g1 91 cmp %g7, %g1 91 cmp %g7, %g1 92 bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 92 bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 93 nop 93 nop 94 retl 94 retl 95 nop 95 nop 96 2: BACKOFF_SPIN(%o3, %o4, 1b) 96 2: BACKOFF_SPIN(%o3, %o4, 1b) 97 ENDPROC(set_bit) 97 ENDPROC(set_bit) 98 EXPORT_SYMBOL(set_bit) 98 EXPORT_SYMBOL(set_bit) 99 99 100 ENTRY(clear_bit) /* %o0=nr, %o1=addr */ 100 ENTRY(clear_bit) /* %o0=nr, %o1=addr */ 101 BACKOFF_SETUP(%o3) 101 BACKOFF_SETUP(%o3) 102 srlx %o0, 6, %g1 102 srlx %o0, 6, %g1 103 mov 1, %o2 103 mov 1, %o2 104 sllx %g1, 3, %g3 104 sllx %g1, 3, %g3 105 and %o0, 63, %g2 105 and %o0, 63, %g2 106 sllx %o2, %g2, %o2 106 sllx %o2, %g2, %o2 107 add %o1, %g3, %o1 107 add %o1, %g3, %o1 108 1: ldx [%o1], %g7 108 1: ldx [%o1], %g7 109 andn %g7, %o2, %g1 109 andn %g7, %o2, %g1 110 casx [%o1], %g7, %g1 110 casx [%o1], %g7, %g1 111 cmp %g7, %g1 111 cmp %g7, %g1 112 bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 112 bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 113 nop 113 nop 114 retl 114 retl 115 nop 115 nop 116 2: BACKOFF_SPIN(%o3, %o4, 1b) 116 2: BACKOFF_SPIN(%o3, %o4, 1b) 117 ENDPROC(clear_bit) 117 ENDPROC(clear_bit) 118 EXPORT_SYMBOL(clear_bit) 118 EXPORT_SYMBOL(clear_bit) 119 119 120 ENTRY(change_bit) /* %o0=nr, %o1=addr */ 120 ENTRY(change_bit) /* %o0=nr, %o1=addr */ 121 BACKOFF_SETUP(%o3) 121 BACKOFF_SETUP(%o3) 122 srlx %o0, 6, %g1 122 srlx %o0, 6, %g1 123 mov 1, %o2 123 mov 1, %o2 124 sllx %g1, 3, %g3 124 sllx %g1, 3, %g3 125 and %o0, 63, %g2 125 and %o0, 63, %g2 126 sllx %o2, %g2, %o2 126 sllx %o2, %g2, %o2 127 add %o1, %g3, %o1 127 add %o1, %g3, %o1 128 1: ldx [%o1], %g7 128 1: ldx [%o1], %g7 129 xor %g7, %o2, %g1 129 xor %g7, %o2, %g1 130 casx [%o1], %g7, %g1 130 casx [%o1], %g7, %g1 131 cmp %g7, %g1 131 cmp %g7, %g1 132 bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 132 bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 133 nop 133 nop 134 retl 134 retl 135 nop 135 nop 136 2: BACKOFF_SPIN(%o3, %o4, 1b) 136 2: BACKOFF_SPIN(%o3, %o4, 1b) 137 ENDPROC(change_bit) 137 ENDPROC(change_bit) 138 EXPORT_SYMBOL(change_bit) 138 EXPORT_SYMBOL(change_bit)
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.