Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[sfrench/cifs-2.6.git] / arch / sparc / lib / ffs.S
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #include <linux/linkage.h>
3 #include <asm/export.h>
4
5         .register       %g2,#scratch
6
7         .text
8         .align  32
9
10 ENTRY(ffs)
11         brnz,pt %o0, 1f
12          mov    1, %o1
13         retl
14          clr    %o0
15         nop
16         nop
17 ENTRY(__ffs)
18         sllx    %o0, 32, %g1            /* 1  */
19         srlx    %o0, 32, %g2
20
21         clr     %o1                     /* 2  */
22         movrz   %g1, %g2, %o0
23
24         movrz   %g1, 32, %o1            /* 3  */
25 1:      clr     %o2
26
27         sllx    %o0, (64 - 16), %g1     /* 4  */
28         srlx    %o0, 16, %g2
29
30         movrz   %g1, %g2, %o0           /* 5  */
31         clr     %o3
32
33         movrz   %g1, 16, %o2            /* 6  */
34         clr     %o4
35
36         and     %o0, 0xff, %g1          /* 7  */
37         srlx    %o0, 8, %g2
38
39         movrz   %g1, %g2, %o0           /* 8  */
40         clr     %o5
41
42         movrz   %g1, 8, %o3             /* 9  */
43         add     %o2, %o1, %o2
44
45         and     %o0, 0xf, %g1           /* 10 */
46         srlx    %o0, 4, %g2
47
48         movrz   %g1, %g2, %o0           /* 11 */
49         add     %o2, %o3, %o2
50
51         movrz   %g1, 4, %o4             /* 12 */
52
53         and     %o0, 0x3, %g1           /* 13 */
54         srlx    %o0, 2, %g2
55
56         movrz   %g1, %g2, %o0           /* 14 */
57         add     %o2, %o4, %o2
58
59         movrz   %g1, 2, %o5             /* 15 */
60
61         and     %o0, 0x1, %g1           /* 16 */
62
63         add     %o2, %o5, %o2           /* 17 */
64         xor     %g1, 0x1, %g1
65
66         retl                            /* 18 */
67          add    %o2, %g1, %o0
68 ENDPROC(ffs)
69 ENDPROC(__ffs)
70 EXPORT_SYMBOL(__ffs)
71 EXPORT_SYMBOL(ffs)
72
73         .section        .popc_6insn_patch, "ax"
74         .word           ffs
75         brz,pn  %o0, 98f
76          neg    %o0, %g1
77         xnor    %o0, %g1, %o1
78         popc    %o1, %o0
79 98:     retl
80          nop
81         .word           __ffs
82         neg     %o0, %g1
83         xnor    %o0, %g1, %o1
84         popc    %o1, %o0
85         retl
86          sub    %o0, 1, %o0
87         nop
88         .previous