Merge tag 'iommu-updates-v4.19' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / arch / sparc / lib / fls64.S
1 /* fls64.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         mov     -1, %g2
16         sllx    %g2, 32, %g2
17         and     %o0, %g2, %g2
18         brnz,pt %g2, 1f
19          mov    63, %g1
20         sllx    %o0, 32, %o0
21         mov     31, %g1
22 1:
23         mov     -1, %g2
24         sllx    %g2, 48, %g2
25         and     %o0, %g2, %g2
26         brnz,pt %g2, 2f
27          mov    -1, %g2
28         sllx    %o0, 16, %o0
29         add     %g1, -16, %g1
30 2:
31         mov     -1, %g2
32         sllx    %g2, 56, %g2
33         and     %o0, %g2, %g2
34         brnz,pt %g2, 3f
35          mov    -1, %g2
36         sllx    %o0, 8, %o0
37         add     %g1, -8, %g1
38 3:
39         sllx    %g2, 60, %g2
40         and     %o0, %g2, %g2
41         brnz,pt %g2, 4f
42          mov    -1, %g2
43         sllx    %o0, 4, %o0
44         add     %g1, -4, %g1
45 4:
46         sllx    %g2, 62, %g2
47         and     %o0, %g2, %g2
48         brnz,pt %g2, 5f
49          mov    -1, %g3
50         sllx    %o0, 2, %o0
51         add     %g1, -2, %g1
52 5:
53         mov     0, %g2
54         sllx    %g3, 63, %g3
55         and     %o0, %g3, %o0
56         movre   %o0, 1, %g2
57         sub     %g1, %g2, %g1
58         jmp     %o7+8
59          sra    %g1, 0, %o0
60 ENDPROC(__fls)
61 EXPORT_SYMBOL(__fls)