Loading include/asm-mips/bitops.h +32 −26 Original line number Diff line number Diff line Loading @@ -644,20 +644,26 @@ static inline unsigned long ffz(unsigned long word) } /* * flz - find last zero in word. * fls - find last bit set. * @word: The word to search * * Returns 0..SZLONG-1 * Undefined if no zero exists, so code should check against ~0UL first. * Returns 1..SZLONG * Returns 0 if no bit exists */ static inline unsigned long flz(unsigned long word) static inline unsigned long fls(unsigned long word) { #if defined(CONFIG_CPU_MIPS32) || defined(CONFIG_CPU_MIPS64) return __ilog2(~word); #else #ifdef CONFIG_32BIT int r = 31, s; word = ~word; #ifdef CONFIG_CPU_MIPS32 __asm__ ("clz %0, %1" : "=r" (word) : "r" (word)); return 32 - word; #else { int r = 32, s; if (word == 0) return 0; s = 16; if ((word & 0xffff0000)) s = 0; r -= s; word <<= s; s = 8; if ((word & 0xff000000)) s = 0; r -= s; word <<= s; s = 4; if ((word & 0xf0000000)) s = 0; r -= s; word <<= s; Loading @@ -665,10 +671,23 @@ static inline unsigned long flz(unsigned long word) s = 1; if ((word & 0x80000000)) s = 0; r -= s; return r; } #endif #endif /* CONFIG_32BIT */ #ifdef CONFIG_64BIT int r = 63, s; word = ~word; #ifdef CONFIG_CPU_MIPS64 __asm__ ("dclz %0, %1" : "=r" (word) : "r" (word)); return 64 - word; #else { int r = 64, s; if (word == 0) return 0; s = 32; if ((word & 0xffffffff00000000UL)) s = 0; r -= s; word <<= s; s = 16; if ((word & 0xffff000000000000UL)) s = 0; r -= s; word <<= s; s = 8; if ((word & 0xff00000000000000UL)) s = 0; r -= s; word <<= s; Loading @@ -677,24 +696,11 @@ static inline unsigned long flz(unsigned long word) s = 1; if ((word & 0x8000000000000000UL)) s = 0; r -= s; return r; } #endif #endif #endif /* CONFIG_64BIT */ } /* * fls - find last bit set. * @word: The word to search * * Returns 1..SZLONG * Returns 0 if no bit exists */ static inline unsigned long fls(unsigned long word) { if (word == 0) return 0; return flz(~word) + 1; } #define fls64(x) generic_fls64(x) /* Loading Loading
include/asm-mips/bitops.h +32 −26 Original line number Diff line number Diff line Loading @@ -644,20 +644,26 @@ static inline unsigned long ffz(unsigned long word) } /* * flz - find last zero in word. * fls - find last bit set. * @word: The word to search * * Returns 0..SZLONG-1 * Undefined if no zero exists, so code should check against ~0UL first. * Returns 1..SZLONG * Returns 0 if no bit exists */ static inline unsigned long flz(unsigned long word) static inline unsigned long fls(unsigned long word) { #if defined(CONFIG_CPU_MIPS32) || defined(CONFIG_CPU_MIPS64) return __ilog2(~word); #else #ifdef CONFIG_32BIT int r = 31, s; word = ~word; #ifdef CONFIG_CPU_MIPS32 __asm__ ("clz %0, %1" : "=r" (word) : "r" (word)); return 32 - word; #else { int r = 32, s; if (word == 0) return 0; s = 16; if ((word & 0xffff0000)) s = 0; r -= s; word <<= s; s = 8; if ((word & 0xff000000)) s = 0; r -= s; word <<= s; s = 4; if ((word & 0xf0000000)) s = 0; r -= s; word <<= s; Loading @@ -665,10 +671,23 @@ static inline unsigned long flz(unsigned long word) s = 1; if ((word & 0x80000000)) s = 0; r -= s; return r; } #endif #endif /* CONFIG_32BIT */ #ifdef CONFIG_64BIT int r = 63, s; word = ~word; #ifdef CONFIG_CPU_MIPS64 __asm__ ("dclz %0, %1" : "=r" (word) : "r" (word)); return 64 - word; #else { int r = 64, s; if (word == 0) return 0; s = 32; if ((word & 0xffffffff00000000UL)) s = 0; r -= s; word <<= s; s = 16; if ((word & 0xffff000000000000UL)) s = 0; r -= s; word <<= s; s = 8; if ((word & 0xff00000000000000UL)) s = 0; r -= s; word <<= s; Loading @@ -677,24 +696,11 @@ static inline unsigned long flz(unsigned long word) s = 1; if ((word & 0x8000000000000000UL)) s = 0; r -= s; return r; } #endif #endif #endif /* CONFIG_64BIT */ } /* * fls - find last bit set. * @word: The word to search * * Returns 1..SZLONG * Returns 0 if no bit exists */ static inline unsigned long fls(unsigned long word) { if (word == 0) return 0; return flz(~word) + 1; } #define fls64(x) generic_fls64(x) /* Loading