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