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