// SPDX-License-Identifier: GPL-2.0-or-later /* * libgcc replacement - count trailing bits */ #include /** * __ctzti2() - count number of trailing zero bits * * @x: number to check * Return: number of trailing zero bits */ int __ctzti2(long long x) { int ret = 0; if (!x) return 64; if (!(x & 0xFFFFFFFFLL)) { ret += 32; x >>= 32; } if (!(x & 0xFFFFLL)) { ret += 16; x >>= 16; } if (!(x & 0xFFLL)) { ret += 8; x >>= 8; } if (!(x & 0xFLL)) { ret += 4; x >>= 4; } if (!(x & 0x3LL)) { ret += 2; x >>= 2; } if (!(x & 0x1ll)) ret += 1; return ret; } /** * __ctzsi2() - count number of trailing zero bits * * @x: number to check * Return: number of trailing zero bits */ int __ctzsi2(int x) { int ret = 0; if (!x) return 32; if (!(x & 0xFFFF)) { ret += 16; x >>= 16; } if (!(x & 0xFF)) { ret += 8; x >>= 8; } if (!(x & 0xF)) { ret += 4; x >>= 4; } if (!(x & 0x3)) { ret += 2; x >>= 2; } if (!(x & 0x1)) ret += 1; return ret; } /** * __ctzdi2() - count number of trailing zero bits * * @x: number to check * Return: number of trailing zero bits */ int __ctzdi2(long x) { #if BITS_PER_LONG == 64 return __ctzti2(x); #else return __ctzsi2(x); #endif }