| xj | b04a402 | 2021-11-25 15:01:52 +0800 | [diff] [blame] | 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) | ||||