^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* fls.S: SPARC default fls definition.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * SPARC default fls definition, which follows the same algorithm as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * in generic fls(). This function will be boot time patched on T4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * and onward.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/linkage.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <asm/export.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) .text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) .register %g2, #scratch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) .register %g3, #scratch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) ENTRY(fls)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) brz,pn %o0, 6f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) mov 0, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) sethi %hi(0xffff0000), %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) mov %o0, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) andcc %o0, %g3, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) be,pt %icc, 8f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) mov 32, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) sethi %hi(0xff000000), %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) andcc %g2, %g3, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) bne,pt %icc, 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) sethi %hi(0xf0000000), %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) sll %o0, 8, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) add %o1, -8, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) sra %o0, 0, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) mov %o0, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) sethi %hi(0xf0000000), %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) andcc %g2, %g3, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) bne,pt %icc, 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) sethi %hi(0xc0000000), %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) sll %o0, 4, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) add %o1, -4, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) sra %o0, 0, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) mov %o0, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) andcc %g2, %g3, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) be,a,pt %icc, 7f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) sll %o0, 2, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) 5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) xnor %g0, %o0, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) srl %o0, 31, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) sub %o1, %o0, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) 6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) jmp %o7 + 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) sra %o1, 0, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) 7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) add %o1, -2, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) ba,pt %xcc, 5b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) sra %o0, 0, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) 8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) sll %o0, 16, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) sethi %hi(0xff000000), %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) sra %o0, 0, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) mov %o0, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) andcc %g2, %g3, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) bne,pt %icc, 2b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) mov 16, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) ba,pt %xcc, 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) sll %o0, 8, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) ENDPROC(fls)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) EXPORT_SYMBOL(fls)