xref: /linux/arch/sparc/lib/fls.S (revision 72bea132f3680ee51e7ed2cee62892b6f5121909)
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/export.h>
9#include <linux/linkage.h>
10
11	.text
12	.register	%g2, #scratch
13	.register	%g3, #scratch
14ENTRY(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
271:
28	add	%o1, -8, %o1
29	sra	%o0, 0, %o0
30	mov	%o0, %g2
312:
32	sethi	%hi(0xf0000000), %g3
333:
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
414:
42	andcc	%g2, %g3, %g0
43	be,a,pt	%icc, 7f
44	 sll	%o0, 2, %o0
455:
46	xnor	%g0, %o0, %o0
47	srl	%o0, 31, %o0
48	sub	%o1, %o0, %o1
496:
50	jmp	%o7 + 8
51	 sra	%o1, 0, %o0
527:
53	add	%o1, -2, %o1
54	ba,pt	%xcc, 5b
55	 sra	%o0, 0, %o0
568:
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
66ENDPROC(fls)
67EXPORT_SYMBOL(fls)
68