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
89