18c2ecf20Sopenharmony_ci/* fls64.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	mov	-1, %g2
168c2ecf20Sopenharmony_ci	sllx	%g2, 32, %g2
178c2ecf20Sopenharmony_ci	and	%o0, %g2, %g2
188c2ecf20Sopenharmony_ci	brnz,pt	%g2, 1f
198c2ecf20Sopenharmony_ci	 mov	63, %g1
208c2ecf20Sopenharmony_ci	sllx	%o0, 32, %o0
218c2ecf20Sopenharmony_ci	mov	31, %g1
228c2ecf20Sopenharmony_ci1:
238c2ecf20Sopenharmony_ci	mov	-1, %g2
248c2ecf20Sopenharmony_ci	sllx	%g2, 48, %g2
258c2ecf20Sopenharmony_ci	and	%o0, %g2, %g2
268c2ecf20Sopenharmony_ci	brnz,pt	%g2, 2f
278c2ecf20Sopenharmony_ci	 mov	-1, %g2
288c2ecf20Sopenharmony_ci	sllx	%o0, 16, %o0
298c2ecf20Sopenharmony_ci	add	%g1, -16, %g1
308c2ecf20Sopenharmony_ci2:
318c2ecf20Sopenharmony_ci	mov	-1, %g2
328c2ecf20Sopenharmony_ci	sllx	%g2, 56, %g2
338c2ecf20Sopenharmony_ci	and	%o0, %g2, %g2
348c2ecf20Sopenharmony_ci	brnz,pt	%g2, 3f
358c2ecf20Sopenharmony_ci	 mov	-1, %g2
368c2ecf20Sopenharmony_ci	sllx	%o0, 8, %o0
378c2ecf20Sopenharmony_ci	add	%g1, -8, %g1
388c2ecf20Sopenharmony_ci3:
398c2ecf20Sopenharmony_ci	sllx	%g2, 60, %g2
408c2ecf20Sopenharmony_ci	and	%o0, %g2, %g2
418c2ecf20Sopenharmony_ci	brnz,pt	%g2, 4f
428c2ecf20Sopenharmony_ci	 mov	-1, %g2
438c2ecf20Sopenharmony_ci	sllx	%o0, 4, %o0
448c2ecf20Sopenharmony_ci	add	%g1, -4, %g1
458c2ecf20Sopenharmony_ci4:
468c2ecf20Sopenharmony_ci	sllx	%g2, 62, %g2
478c2ecf20Sopenharmony_ci	and	%o0, %g2, %g2
488c2ecf20Sopenharmony_ci	brnz,pt	%g2, 5f
498c2ecf20Sopenharmony_ci	 mov	-1, %g3
508c2ecf20Sopenharmony_ci	sllx	%o0, 2, %o0
518c2ecf20Sopenharmony_ci	add	%g1, -2, %g1
528c2ecf20Sopenharmony_ci5:
538c2ecf20Sopenharmony_ci	mov	0, %g2
548c2ecf20Sopenharmony_ci	sllx	%g3, 63, %g3
558c2ecf20Sopenharmony_ci	and	%o0, %g3, %o0
568c2ecf20Sopenharmony_ci	movre	%o0, 1, %g2
578c2ecf20Sopenharmony_ci	sub	%g1, %g2, %g1
588c2ecf20Sopenharmony_ci	jmp	%o7+8
598c2ecf20Sopenharmony_ci	 sra	%g1, 0, %o0
608c2ecf20Sopenharmony_ciENDPROC(__fls)
618c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__fls)
62