^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /* Integer base 2 logarithm calculation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Written by David Howells (dhowells@redhat.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #ifndef _TOOLS_LINUX_LOG2_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #define _TOOLS_LINUX_LOG2_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/bitops.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * non-constant log of base 2 calculators
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * - the arch may override these in asm/bitops.h if they can be implemented
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * more efficiently than using fls() and fls64()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * - the arch is not required to handle n==0 if implementing the fallback
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) static inline __attribute__((const))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) int __ilog2_u32(u32 n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) return fls(n) - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) static inline __attribute__((const))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) int __ilog2_u64(u64 n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) return fls64(n) - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * Determine whether some value is a power of two, where zero is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) * *not* considered a power of two.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) static inline __attribute__((const))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) bool is_power_of_2(unsigned long n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) return (n != 0 && ((n & (n - 1)) == 0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) * round up to nearest power of two
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) static inline __attribute__((const))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) unsigned long __roundup_pow_of_two(unsigned long n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) return 1UL << fls_long(n - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) * round down to nearest power of two
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) static inline __attribute__((const))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) unsigned long __rounddown_pow_of_two(unsigned long n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) return 1UL << (fls_long(n) - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) * ilog2 - log of base 2 of 32-bit or a 64-bit unsigned value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) * @n - parameter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) * constant-capable log of base 2 calculation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) * - this can be used to initialise global variables from constant data, hence
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) * the massive ternary operator construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) * selects the appropriately-sized optimised version depending on sizeof(n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #define ilog2(n) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) ( \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) __builtin_constant_p(n) ? ( \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) (n) < 2 ? 0 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) (n) & (1ULL << 63) ? 63 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) (n) & (1ULL << 62) ? 62 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) (n) & (1ULL << 61) ? 61 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) (n) & (1ULL << 60) ? 60 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) (n) & (1ULL << 59) ? 59 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) (n) & (1ULL << 58) ? 58 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) (n) & (1ULL << 57) ? 57 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) (n) & (1ULL << 56) ? 56 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) (n) & (1ULL << 55) ? 55 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) (n) & (1ULL << 54) ? 54 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) (n) & (1ULL << 53) ? 53 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) (n) & (1ULL << 52) ? 52 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) (n) & (1ULL << 51) ? 51 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) (n) & (1ULL << 50) ? 50 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) (n) & (1ULL << 49) ? 49 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) (n) & (1ULL << 48) ? 48 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) (n) & (1ULL << 47) ? 47 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) (n) & (1ULL << 46) ? 46 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) (n) & (1ULL << 45) ? 45 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) (n) & (1ULL << 44) ? 44 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) (n) & (1ULL << 43) ? 43 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) (n) & (1ULL << 42) ? 42 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) (n) & (1ULL << 41) ? 41 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) (n) & (1ULL << 40) ? 40 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) (n) & (1ULL << 39) ? 39 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) (n) & (1ULL << 38) ? 38 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) (n) & (1ULL << 37) ? 37 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) (n) & (1ULL << 36) ? 36 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) (n) & (1ULL << 35) ? 35 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) (n) & (1ULL << 34) ? 34 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) (n) & (1ULL << 33) ? 33 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) (n) & (1ULL << 32) ? 32 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) (n) & (1ULL << 31) ? 31 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) (n) & (1ULL << 30) ? 30 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) (n) & (1ULL << 29) ? 29 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) (n) & (1ULL << 28) ? 28 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) (n) & (1ULL << 27) ? 27 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) (n) & (1ULL << 26) ? 26 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) (n) & (1ULL << 25) ? 25 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) (n) & (1ULL << 24) ? 24 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) (n) & (1ULL << 23) ? 23 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) (n) & (1ULL << 22) ? 22 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) (n) & (1ULL << 21) ? 21 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) (n) & (1ULL << 20) ? 20 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) (n) & (1ULL << 19) ? 19 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) (n) & (1ULL << 18) ? 18 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) (n) & (1ULL << 17) ? 17 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) (n) & (1ULL << 16) ? 16 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) (n) & (1ULL << 15) ? 15 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) (n) & (1ULL << 14) ? 14 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) (n) & (1ULL << 13) ? 13 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) (n) & (1ULL << 12) ? 12 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) (n) & (1ULL << 11) ? 11 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) (n) & (1ULL << 10) ? 10 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) (n) & (1ULL << 9) ? 9 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) (n) & (1ULL << 8) ? 8 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) (n) & (1ULL << 7) ? 7 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) (n) & (1ULL << 6) ? 6 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) (n) & (1ULL << 5) ? 5 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) (n) & (1ULL << 4) ? 4 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) (n) & (1ULL << 3) ? 3 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) (n) & (1ULL << 2) ? 2 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 1 ) : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) (sizeof(n) <= 4) ? \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) __ilog2_u32(n) : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) __ilog2_u64(n) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) * roundup_pow_of_two - round the given value up to nearest power of two
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) * @n - parameter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) * round the given value up to the nearest power of two
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) * - the result is undefined when n == 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) * - this can be used to initialise global variables from constant data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #define roundup_pow_of_two(n) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) ( \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) __builtin_constant_p(n) ? ( \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) (n == 1) ? 1 : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) (1UL << (ilog2((n) - 1) + 1)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) ) : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) __roundup_pow_of_two(n) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) * rounddown_pow_of_two - round the given value down to nearest power of two
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) * @n - parameter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) * round the given value down to the nearest power of two
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) * - the result is undefined when n == 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) * - this can be used to initialise global variables from constant data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #define rounddown_pow_of_two(n) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) ( \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) __builtin_constant_p(n) ? ( \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) (1UL << ilog2(n))) : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) __rounddown_pow_of_two(n) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) #endif /* _TOOLS_LINUX_LOG2_H */