Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #include <linux/linkage.h>
0003 #include <asm/export.h>
0004 
0005     .register   %g2,#scratch
0006 
0007     .text
0008     .align  32
0009 
0010 ENTRY(ffs)
0011     brnz,pt %o0, 1f
0012      mov    1, %o1
0013     retl
0014      clr    %o0
0015     nop
0016     nop
0017 ENTRY(__ffs)
0018     sllx    %o0, 32, %g1        /* 1  */
0019     srlx    %o0, 32, %g2
0020 
0021     clr %o1         /* 2  */
0022     movrz   %g1, %g2, %o0
0023 
0024     movrz   %g1, 32, %o1        /* 3  */
0025 1:  clr %o2
0026 
0027     sllx    %o0, (64 - 16), %g1 /* 4  */
0028     srlx    %o0, 16, %g2
0029 
0030     movrz   %g1, %g2, %o0       /* 5  */
0031     clr %o3
0032 
0033     movrz   %g1, 16, %o2        /* 6  */
0034     clr %o4
0035 
0036     and %o0, 0xff, %g1      /* 7  */
0037     srlx    %o0, 8, %g2
0038 
0039     movrz   %g1, %g2, %o0       /* 8  */
0040     clr %o5
0041 
0042     movrz   %g1, 8, %o3     /* 9  */
0043     add %o2, %o1, %o2
0044 
0045     and %o0, 0xf, %g1       /* 10 */
0046     srlx    %o0, 4, %g2
0047 
0048     movrz   %g1, %g2, %o0       /* 11 */
0049     add %o2, %o3, %o2
0050 
0051     movrz   %g1, 4, %o4     /* 12 */
0052 
0053     and %o0, 0x3, %g1       /* 13 */
0054     srlx    %o0, 2, %g2
0055 
0056     movrz   %g1, %g2, %o0       /* 14 */
0057     add %o2, %o4, %o2
0058 
0059     movrz   %g1, 2, %o5     /* 15 */
0060 
0061     and %o0, 0x1, %g1       /* 16 */
0062 
0063     add %o2, %o5, %o2       /* 17 */
0064     xor %g1, 0x1, %g1
0065 
0066     retl                /* 18 */
0067      add    %o2, %g1, %o0
0068 ENDPROC(ffs)
0069 ENDPROC(__ffs)
0070 EXPORT_SYMBOL(__ffs)
0071 EXPORT_SYMBOL(ffs)
0072 
0073     .section    .popc_6insn_patch, "ax"
0074     .word       ffs
0075     brz,pn  %o0, 98f
0076      neg    %o0, %g1
0077     xnor    %o0, %g1, %o1
0078     popc    %o1, %o0
0079 98: retl
0080      nop
0081     .word       __ffs
0082     neg %o0, %g1
0083     xnor    %o0, %g1, %o1
0084     popc    %o1, %o0
0085     retl
0086      sub    %o0, 1, %o0
0087     nop
0088     .previous