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