cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

log2.h (4572B)


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