1/* 2 * lib/clz_ctz.c 3 * 4 * Copyright (C) 2013 Chanho Min <chanho.min@lge.com> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 * 10 * __c[lt]z[sd]i2 can be overridden by linking arch-specific versions. 11 */ 12 13#include <linux/export.h> 14#include <linux/kernel.h> 15 16int __weak __ctzsi2(int val) 17{ 18 return __ffs(val); 19} 20EXPORT_SYMBOL(__ctzsi2); 21 22int __weak __clzsi2(int val) 23{ 24 return 32 - fls(val); 25} 26EXPORT_SYMBOL(__clzsi2); 27 28#if BITS_PER_LONG == 32 29 30int __weak __clzdi2(long val) 31{ 32 return 32 - fls((int)val); 33} 34EXPORT_SYMBOL(__clzdi2); 35 36int __weak __ctzdi2(long val) 37{ 38 return __ffs((u32)val); 39} 40EXPORT_SYMBOL(__ctzdi2); 41 42#elif BITS_PER_LONG == 64 43 44int __weak __clzdi2(long val) 45{ 46 return 64 - fls64((u64)val); 47} 48EXPORT_SYMBOL(__clzdi2); 49 50int __weak __ctzdi2(long val) 51{ 52 return __ffs64((u64)val); 53} 54EXPORT_SYMBOL(__ctzdi2); 55 56#else 57#error BITS_PER_LONG not 32 or 64 58#endif 59