d2912cb15bdda (Thomas Gleixner 2019-06-04 10:11:33 +0200 1) // SPDX-License-Identifier: GPL-2.0-only
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 2) /*
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 3) * lib/clz_ctz.c
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 4) *
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 5) * Copyright (C) 2013 Chanho Min <chanho.min@lge.com>
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 6) *
3c516cdd02633 (Rashika Kheria 2014-04-03 14:49:09 -0700 7) * The functions in this file aren't called directly, but are required by
3c516cdd02633 (Rashika Kheria 2014-04-03 14:49:09 -0700 8) * GCC builtins such as __builtin_ctz, and therefore they can't be removed
3c516cdd02633 (Rashika Kheria 2014-04-03 14:49:09 -0700 9) * despite appearing unreferenced in kernel source.
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 10) *
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 11) * __c[lt]z[sd]i2 can be overridden by linking arch-specific versions.
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 12) */
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 13)
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 14) #include <linux/export.h>
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 15) #include <linux/kernel.h>
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 16)
3c516cdd02633 (Rashika Kheria 2014-04-03 14:49:09 -0700 17) int __weak __ctzsi2(int val);
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 18) int __weak __ctzsi2(int val)
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 19) {
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 20) return __ffs(val);
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 21) }
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 22) EXPORT_SYMBOL(__ctzsi2);
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 23)
3c516cdd02633 (Rashika Kheria 2014-04-03 14:49:09 -0700 24) int __weak __clzsi2(int val);
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 25) int __weak __clzsi2(int val)
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 26) {
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 27) return 32 - fls(val);
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 28) }
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 29) EXPORT_SYMBOL(__clzsi2);
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 30)
3c516cdd02633 (Rashika Kheria 2014-04-03 14:49:09 -0700 31) int __weak __clzdi2(long val);
3c516cdd02633 (Rashika Kheria 2014-04-03 14:49:09 -0700 32) int __weak __ctzdi2(long val);
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 33) #if BITS_PER_LONG == 32
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 34)
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 35) int __weak __clzdi2(long val)
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 36) {
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 37) return 32 - fls((int)val);
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 38) }
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 39) EXPORT_SYMBOL(__clzdi2);
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 40)
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 41) int __weak __ctzdi2(long val)
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 42) {
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 43) return __ffs((u32)val);
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 44) }
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 45) EXPORT_SYMBOL(__ctzdi2);
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 46)
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 47) #elif BITS_PER_LONG == 64
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 48)
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 49) int __weak __clzdi2(long val)
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 50) {
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 51) return 64 - fls64((u64)val);
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 52) }
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 53) EXPORT_SYMBOL(__clzdi2);
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 54)
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 55) int __weak __ctzdi2(long val)
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 56) {
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 57) return __ffs64((u64)val);
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 58) }
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 59) EXPORT_SYMBOL(__ctzdi2);
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 60)
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 61) #else
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 62) #error BITS_PER_LONG not 32 or 64
4df87bb7b6a22 (Chanho Min 2013-07-08 16:01:43 -0700 63) #endif