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