18c2ecf20Sopenharmony_ci/* fls.S: SPARC default fls definition.
28c2ecf20Sopenharmony_ci *
38c2ecf20Sopenharmony_ci * SPARC default fls definition, which follows the same algorithm as
48c2ecf20Sopenharmony_ci * in generic fls(). This function will be boot time patched on T4
58c2ecf20Sopenharmony_ci * and onward.
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include <linux/linkage.h>
98c2ecf20Sopenharmony_ci#include <asm/export.h>
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci	.text
128c2ecf20Sopenharmony_ci	.register	%g2, #scratch
138c2ecf20Sopenharmony_ci	.register	%g3, #scratch
148c2ecf20Sopenharmony_ciENTRY(fls)
158c2ecf20Sopenharmony_ci	brz,pn	%o0, 6f
168c2ecf20Sopenharmony_ci	 mov	0, %o1
178c2ecf20Sopenharmony_ci	sethi	%hi(0xffff0000), %g3
188c2ecf20Sopenharmony_ci	mov	%o0, %g2
198c2ecf20Sopenharmony_ci	andcc	%o0, %g3, %g0
208c2ecf20Sopenharmony_ci	be,pt	%icc, 8f
218c2ecf20Sopenharmony_ci	 mov	32, %o1
228c2ecf20Sopenharmony_ci	sethi	%hi(0xff000000), %g3
238c2ecf20Sopenharmony_ci	andcc	%g2, %g3, %g0
248c2ecf20Sopenharmony_ci	bne,pt	%icc, 3f
258c2ecf20Sopenharmony_ci	 sethi	%hi(0xf0000000), %g3
268c2ecf20Sopenharmony_ci	sll	%o0, 8, %o0
278c2ecf20Sopenharmony_ci1:
288c2ecf20Sopenharmony_ci	add	%o1, -8, %o1
298c2ecf20Sopenharmony_ci	sra	%o0, 0, %o0
308c2ecf20Sopenharmony_ci	mov	%o0, %g2
318c2ecf20Sopenharmony_ci2:
328c2ecf20Sopenharmony_ci	sethi	%hi(0xf0000000), %g3
338c2ecf20Sopenharmony_ci3:
348c2ecf20Sopenharmony_ci	andcc	%g2, %g3, %g0
358c2ecf20Sopenharmony_ci	bne,pt	%icc, 4f
368c2ecf20Sopenharmony_ci	 sethi	%hi(0xc0000000), %g3
378c2ecf20Sopenharmony_ci	sll	%o0, 4, %o0
388c2ecf20Sopenharmony_ci	add	%o1, -4, %o1
398c2ecf20Sopenharmony_ci	sra	%o0, 0, %o0
408c2ecf20Sopenharmony_ci	mov	%o0, %g2
418c2ecf20Sopenharmony_ci4:
428c2ecf20Sopenharmony_ci	andcc	%g2, %g3, %g0
438c2ecf20Sopenharmony_ci	be,a,pt	%icc, 7f
448c2ecf20Sopenharmony_ci	 sll	%o0, 2, %o0
458c2ecf20Sopenharmony_ci5:
468c2ecf20Sopenharmony_ci	xnor	%g0, %o0, %o0
478c2ecf20Sopenharmony_ci	srl	%o0, 31, %o0
488c2ecf20Sopenharmony_ci	sub	%o1, %o0, %o1
498c2ecf20Sopenharmony_ci6:
508c2ecf20Sopenharmony_ci	jmp	%o7 + 8
518c2ecf20Sopenharmony_ci	 sra	%o1, 0, %o0
528c2ecf20Sopenharmony_ci7:
538c2ecf20Sopenharmony_ci	add	%o1, -2, %o1
548c2ecf20Sopenharmony_ci	ba,pt	%xcc, 5b
558c2ecf20Sopenharmony_ci	 sra	%o0, 0, %o0
568c2ecf20Sopenharmony_ci8:
578c2ecf20Sopenharmony_ci	sll	%o0, 16, %o0
588c2ecf20Sopenharmony_ci	sethi	%hi(0xff000000), %g3
598c2ecf20Sopenharmony_ci	sra	%o0, 0, %o0
608c2ecf20Sopenharmony_ci	mov	%o0, %g2
618c2ecf20Sopenharmony_ci	andcc	%g2, %g3, %g0
628c2ecf20Sopenharmony_ci	bne,pt	%icc, 2b
638c2ecf20Sopenharmony_ci	 mov	16, %o1
648c2ecf20Sopenharmony_ci	ba,pt	%xcc, 1b
658c2ecf20Sopenharmony_ci	 sll	%o0, 8, %o0
668c2ecf20Sopenharmony_ciENDPROC(fls)
678c2ecf20Sopenharmony_ciEXPORT_SYMBOL(fls)
68