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> << 9 #include <asm/asi.h> 6 #include <asm/asi.h> 10 #include <asm/backoff.h> 7 #include <asm/backoff.h> 11 8 12 .text 9 .text 13 10 14 ENTRY(test_and_set_bit) /* %o0=nr, %o1=addr */ !! 11 .globl test_and_set_bit >> 12 .type test_and_set_bit,#function >> 13 test_and_set_bit: /* %o0=nr, %o1=addr */ 15 BACKOFF_SETUP(%o3) 14 BACKOFF_SETUP(%o3) 16 srlx %o0, 6, %g1 15 srlx %o0, 6, %g1 17 mov 1, %o2 16 mov 1, %o2 18 sllx %g1, 3, %g3 17 sllx %g1, 3, %g3 19 and %o0, 63, %g2 18 and %o0, 63, %g2 20 sllx %o2, %g2, %o2 19 sllx %o2, %g2, %o2 21 add %o1, %g3, %o1 20 add %o1, %g3, %o1 22 1: ldx [%o1], %g7 21 1: ldx [%o1], %g7 23 or %g7, %o2, %g1 22 or %g7, %o2, %g1 24 casx [%o1], %g7, %g1 23 casx [%o1], %g7, %g1 25 cmp %g7, %g1 24 cmp %g7, %g1 26 bne,pn %xcc, BACKOFF_LABEL(2f, 1b) !! 25 bne,pn %xcc, 2f 27 and %g7, %o2, %g2 26 and %g7, %o2, %g2 28 clr %o0 27 clr %o0 29 movrne %g2, 1, %o0 28 movrne %g2, 1, %o0 30 retl 29 retl 31 nop 30 nop 32 2: BACKOFF_SPIN(%o3, %o4, 1b) 31 2: BACKOFF_SPIN(%o3, %o4, 1b) 33 ENDPROC(test_and_set_bit) !! 32 .size test_and_set_bit, .-test_and_set_bit 34 EXPORT_SYMBOL(test_and_set_bit) << 35 33 36 ENTRY(test_and_clear_bit) /* %o0=nr, %o1=addr !! 34 .globl test_and_clear_bit >> 35 .type test_and_clear_bit,#function >> 36 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, 2f 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 .size test_and_clear_bit, .-test_and_clear_bit 56 EXPORT_SYMBOL(test_and_clear_bit) << 57 56 58 ENTRY(test_and_change_bit) /* %o0=nr, %o1=addr !! 57 .globl test_and_change_bit >> 58 .type test_and_change_bit,#function >> 59 test_and_change_bit: /* %o0=nr, %o1=addr */ 59 BACKOFF_SETUP(%o3) 60 BACKOFF_SETUP(%o3) 60 srlx %o0, 6, %g1 61 srlx %o0, 6, %g1 61 mov 1, %o2 62 mov 1, %o2 62 sllx %g1, 3, %g3 63 sllx %g1, 3, %g3 63 and %o0, 63, %g2 64 and %o0, 63, %g2 64 sllx %o2, %g2, %o2 65 sllx %o2, %g2, %o2 65 add %o1, %g3, %o1 66 add %o1, %g3, %o1 66 1: ldx [%o1], %g7 67 1: ldx [%o1], %g7 67 xor %g7, %o2, %g1 68 xor %g7, %o2, %g1 68 casx [%o1], %g7, %g1 69 casx [%o1], %g7, %g1 69 cmp %g7, %g1 70 cmp %g7, %g1 70 bne,pn %xcc, BACKOFF_LABEL(2f, 1b) !! 71 bne,pn %xcc, 2f 71 and %g7, %o2, %g2 72 and %g7, %o2, %g2 72 clr %o0 73 clr %o0 73 movrne %g2, 1, %o0 74 movrne %g2, 1, %o0 74 retl 75 retl 75 nop 76 nop 76 2: BACKOFF_SPIN(%o3, %o4, 1b) 77 2: BACKOFF_SPIN(%o3, %o4, 1b) 77 ENDPROC(test_and_change_bit) !! 78 .size test_and_change_bit, .-test_and_change_bit 78 EXPORT_SYMBOL(test_and_change_bit) << 79 79 80 ENTRY(set_bit) /* %o0=nr, %o1=addr */ !! 80 .globl set_bit >> 81 .type set_bit,#function >> 82 set_bit: /* %o0=nr, %o1=addr */ 81 BACKOFF_SETUP(%o3) 83 BACKOFF_SETUP(%o3) 82 srlx %o0, 6, %g1 84 srlx %o0, 6, %g1 83 mov 1, %o2 85 mov 1, %o2 84 sllx %g1, 3, %g3 86 sllx %g1, 3, %g3 85 and %o0, 63, %g2 87 and %o0, 63, %g2 86 sllx %o2, %g2, %o2 88 sllx %o2, %g2, %o2 87 add %o1, %g3, %o1 89 add %o1, %g3, %o1 88 1: ldx [%o1], %g7 90 1: ldx [%o1], %g7 89 or %g7, %o2, %g1 91 or %g7, %o2, %g1 90 casx [%o1], %g7, %g1 92 casx [%o1], %g7, %g1 91 cmp %g7, %g1 93 cmp %g7, %g1 92 bne,pn %xcc, BACKOFF_LABEL(2f, 1b) !! 94 bne,pn %xcc, 2f 93 nop 95 nop 94 retl 96 retl 95 nop 97 nop 96 2: BACKOFF_SPIN(%o3, %o4, 1b) 98 2: BACKOFF_SPIN(%o3, %o4, 1b) 97 ENDPROC(set_bit) !! 99 .size set_bit, .-set_bit 98 EXPORT_SYMBOL(set_bit) << 99 100 100 ENTRY(clear_bit) /* %o0=nr, %o1=addr */ !! 101 .globl clear_bit >> 102 .type clear_bit,#function >> 103 clear_bit: /* %o0=nr, %o1=addr */ 101 BACKOFF_SETUP(%o3) 104 BACKOFF_SETUP(%o3) 102 srlx %o0, 6, %g1 105 srlx %o0, 6, %g1 103 mov 1, %o2 106 mov 1, %o2 104 sllx %g1, 3, %g3 107 sllx %g1, 3, %g3 105 and %o0, 63, %g2 108 and %o0, 63, %g2 106 sllx %o2, %g2, %o2 109 sllx %o2, %g2, %o2 107 add %o1, %g3, %o1 110 add %o1, %g3, %o1 108 1: ldx [%o1], %g7 111 1: ldx [%o1], %g7 109 andn %g7, %o2, %g1 112 andn %g7, %o2, %g1 110 casx [%o1], %g7, %g1 113 casx [%o1], %g7, %g1 111 cmp %g7, %g1 114 cmp %g7, %g1 112 bne,pn %xcc, BACKOFF_LABEL(2f, 1b) !! 115 bne,pn %xcc, 2f 113 nop 116 nop 114 retl 117 retl 115 nop 118 nop 116 2: BACKOFF_SPIN(%o3, %o4, 1b) 119 2: BACKOFF_SPIN(%o3, %o4, 1b) 117 ENDPROC(clear_bit) !! 120 .size clear_bit, .-clear_bit 118 EXPORT_SYMBOL(clear_bit) << 119 121 120 ENTRY(change_bit) /* %o0=nr, %o1=addr */ !! 122 .globl change_bit >> 123 .type change_bit,#function >> 124 change_bit: /* %o0=nr, %o1=addr */ 121 BACKOFF_SETUP(%o3) 125 BACKOFF_SETUP(%o3) 122 srlx %o0, 6, %g1 126 srlx %o0, 6, %g1 123 mov 1, %o2 127 mov 1, %o2 124 sllx %g1, 3, %g3 128 sllx %g1, 3, %g3 125 and %o0, 63, %g2 129 and %o0, 63, %g2 126 sllx %o2, %g2, %o2 130 sllx %o2, %g2, %o2 127 add %o1, %g3, %o1 131 add %o1, %g3, %o1 128 1: ldx [%o1], %g7 132 1: ldx [%o1], %g7 129 xor %g7, %o2, %g1 133 xor %g7, %o2, %g1 130 casx [%o1], %g7, %g1 134 casx [%o1], %g7, %g1 131 cmp %g7, %g1 135 cmp %g7, %g1 132 bne,pn %xcc, BACKOFF_LABEL(2f, 1b) !! 136 bne,pn %xcc, 2f 133 nop 137 nop 134 retl 138 retl 135 nop 139 nop 136 2: BACKOFF_SPIN(%o3, %o4, 1b) 140 2: BACKOFF_SPIN(%o3, %o4, 1b) 137 ENDPROC(change_bit) !! 141 .size change_bit, .-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.