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/export.h> |
9 | #include <linux/linkage.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) |
62 | |