xref: /OK3568_Linux_fs/kernel/arch/sparc/lib/NG4fls.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/* NG4fls.S: SPARC optimized fls and __fls for T4 and above.
2*4882a593Smuzhiyun *
3*4882a593Smuzhiyun * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
4*4882a593Smuzhiyun */
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun#include <linux/linkage.h>
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun#define LZCNT_O0_G2	\
9*4882a593Smuzhiyun	.word	0x85b002e8
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun	.text
12*4882a593Smuzhiyun	.register	%g2, #scratch
13*4882a593Smuzhiyun	.register	%g3, #scratch
14*4882a593Smuzhiyun
15*4882a593SmuzhiyunENTRY(NG4fls)
16*4882a593Smuzhiyun	LZCNT_O0_G2	!lzcnt	%o0, %g2
17*4882a593Smuzhiyun	mov	64, %g3
18*4882a593Smuzhiyun	retl
19*4882a593Smuzhiyun	 sub	%g3, %g2, %o0
20*4882a593SmuzhiyunENDPROC(NG4fls)
21*4882a593Smuzhiyun
22*4882a593SmuzhiyunENTRY(__NG4fls)
23*4882a593Smuzhiyun	brz,pn	%o0, 1f
24*4882a593Smuzhiyun	LZCNT_O0_G2	!lzcnt	%o0, %g2
25*4882a593Smuzhiyun	mov	63, %g3
26*4882a593Smuzhiyun	sub	%g3, %g2, %o0
27*4882a593Smuzhiyun1:
28*4882a593Smuzhiyun	retl
29*4882a593Smuzhiyun	 nop
30*4882a593SmuzhiyunENDPROC(__NG4fls)
31