xref: /OK3568_Linux_fs/kernel/arch/sparc/lib/fls.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/* fls.S: SPARC default fls definition.
2*4882a593Smuzhiyun *
3*4882a593Smuzhiyun * SPARC default fls definition, which follows the same algorithm as
4*4882a593Smuzhiyun * in generic fls(). This function will be boot time patched on T4
5*4882a593Smuzhiyun * and onward.
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun#include <linux/linkage.h>
9*4882a593Smuzhiyun#include <asm/export.h>
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun	.text
12*4882a593Smuzhiyun	.register	%g2, #scratch
13*4882a593Smuzhiyun	.register	%g3, #scratch
14*4882a593SmuzhiyunENTRY(fls)
15*4882a593Smuzhiyun	brz,pn	%o0, 6f
16*4882a593Smuzhiyun	 mov	0, %o1
17*4882a593Smuzhiyun	sethi	%hi(0xffff0000), %g3
18*4882a593Smuzhiyun	mov	%o0, %g2
19*4882a593Smuzhiyun	andcc	%o0, %g3, %g0
20*4882a593Smuzhiyun	be,pt	%icc, 8f
21*4882a593Smuzhiyun	 mov	32, %o1
22*4882a593Smuzhiyun	sethi	%hi(0xff000000), %g3
23*4882a593Smuzhiyun	andcc	%g2, %g3, %g0
24*4882a593Smuzhiyun	bne,pt	%icc, 3f
25*4882a593Smuzhiyun	 sethi	%hi(0xf0000000), %g3
26*4882a593Smuzhiyun	sll	%o0, 8, %o0
27*4882a593Smuzhiyun1:
28*4882a593Smuzhiyun	add	%o1, -8, %o1
29*4882a593Smuzhiyun	sra	%o0, 0, %o0
30*4882a593Smuzhiyun	mov	%o0, %g2
31*4882a593Smuzhiyun2:
32*4882a593Smuzhiyun	sethi	%hi(0xf0000000), %g3
33*4882a593Smuzhiyun3:
34*4882a593Smuzhiyun	andcc	%g2, %g3, %g0
35*4882a593Smuzhiyun	bne,pt	%icc, 4f
36*4882a593Smuzhiyun	 sethi	%hi(0xc0000000), %g3
37*4882a593Smuzhiyun	sll	%o0, 4, %o0
38*4882a593Smuzhiyun	add	%o1, -4, %o1
39*4882a593Smuzhiyun	sra	%o0, 0, %o0
40*4882a593Smuzhiyun	mov	%o0, %g2
41*4882a593Smuzhiyun4:
42*4882a593Smuzhiyun	andcc	%g2, %g3, %g0
43*4882a593Smuzhiyun	be,a,pt	%icc, 7f
44*4882a593Smuzhiyun	 sll	%o0, 2, %o0
45*4882a593Smuzhiyun5:
46*4882a593Smuzhiyun	xnor	%g0, %o0, %o0
47*4882a593Smuzhiyun	srl	%o0, 31, %o0
48*4882a593Smuzhiyun	sub	%o1, %o0, %o1
49*4882a593Smuzhiyun6:
50*4882a593Smuzhiyun	jmp	%o7 + 8
51*4882a593Smuzhiyun	 sra	%o1, 0, %o0
52*4882a593Smuzhiyun7:
53*4882a593Smuzhiyun	add	%o1, -2, %o1
54*4882a593Smuzhiyun	ba,pt	%xcc, 5b
55*4882a593Smuzhiyun	 sra	%o0, 0, %o0
56*4882a593Smuzhiyun8:
57*4882a593Smuzhiyun	sll	%o0, 16, %o0
58*4882a593Smuzhiyun	sethi	%hi(0xff000000), %g3
59*4882a593Smuzhiyun	sra	%o0, 0, %o0
60*4882a593Smuzhiyun	mov	%o0, %g2
61*4882a593Smuzhiyun	andcc	%g2, %g3, %g0
62*4882a593Smuzhiyun	bne,pt	%icc, 2b
63*4882a593Smuzhiyun	 mov	16, %o1
64*4882a593Smuzhiyun	ba,pt	%xcc, 1b
65*4882a593Smuzhiyun	 sll	%o0, 8, %o0
66*4882a593SmuzhiyunENDPROC(fls)
67*4882a593SmuzhiyunEXPORT_SYMBOL(fls)
68