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