Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /* bitops.S: Sparc64 atomic bit operations.
0003  *
0004  * Copyright (C) 2000, 2007 David S. Miller (davem@davemloft.net)
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) /* %o0=nr, %o1=addr */
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) /* %o0=nr, %o1=addr */
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) /* %o0=nr, %o1=addr */
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) /* %o0=nr, %o1=addr */
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) /* %o0=nr, %o1=addr */
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) /* %o0=nr, %o1=addr */
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)