Merge tag 'iommu-updates-v4.19' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / arch / sparc / lib / fls.S
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)