LCOV - code coverage report
Current view: top level - include/linux - math.h (source / functions) Hit Total Coverage
Test: landlock.info Lines: 2 2 100.0 %
Date: 2021-04-22 12:43:58 Functions: 0 0 -

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0 */
       2             : #ifndef _LINUX_MATH_H
       3             : #define _LINUX_MATH_H
       4             : 
       5             : #include <asm/div64.h>
       6             : #include <uapi/linux/kernel.h>
       7             : 
       8             : /*
       9             :  * This looks more complex than it should be. But we need to
      10             :  * get the type for the ~ right in round_down (it needs to be
      11             :  * as wide as the result!), and we want to evaluate the macro
      12             :  * arguments just once each.
      13             :  */
      14             : #define __round_mask(x, y) ((__typeof__(x))((y)-1))
      15             : 
      16             : /**
      17             :  * round_up - round up to next specified power of 2
      18             :  * @x: the value to round
      19             :  * @y: multiple to round up to (must be a power of 2)
      20             :  *
      21             :  * Rounds @x up to next multiple of @y (which must be a power of 2).
      22             :  * To perform arbitrary rounding up, use roundup() below.
      23             :  */
      24             : #define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)
      25             : 
      26             : /**
      27             :  * round_down - round down to next specified power of 2
      28             :  * @x: the value to round
      29             :  * @y: multiple to round down to (must be a power of 2)
      30             :  *
      31             :  * Rounds @x down to next multiple of @y (which must be a power of 2).
      32             :  * To perform arbitrary rounding down, use rounddown() below.
      33             :  */
      34             : #define round_down(x, y) ((x) & ~__round_mask(x, y))
      35             : 
      36             : #define DIV_ROUND_UP __KERNEL_DIV_ROUND_UP
      37             : 
      38             : #define DIV_ROUND_DOWN_ULL(ll, d) \
      39             :         ({ unsigned long long _tmp = (ll); do_div(_tmp, d); _tmp; })
      40             : 
      41             : #define DIV_ROUND_UP_ULL(ll, d) \
      42             :         DIV_ROUND_DOWN_ULL((unsigned long long)(ll) + (d) - 1, (d))
      43             : 
      44             : #if BITS_PER_LONG == 32
      45             : # define DIV_ROUND_UP_SECTOR_T(ll,d) DIV_ROUND_UP_ULL(ll, d)
      46             : #else
      47             : # define DIV_ROUND_UP_SECTOR_T(ll,d) DIV_ROUND_UP(ll,d)
      48             : #endif
      49             : 
      50             : /**
      51             :  * roundup - round up to the next specified multiple
      52             :  * @x: the value to up
      53             :  * @y: multiple to round up to
      54             :  *
      55             :  * Rounds @x up to next multiple of @y. If @y will always be a power
      56             :  * of 2, consider using the faster round_up().
      57             :  */
      58             : #define roundup(x, y) (                                 \
      59             : {                                                       \
      60             :         typeof(y) __y = y;                              \
      61             :         (((x) + (__y - 1)) / __y) * __y;                \
      62             : }                                                       \
      63             : )
      64             : /**
      65             :  * rounddown - round down to next specified multiple
      66             :  * @x: the value to round
      67             :  * @y: multiple to round down to
      68             :  *
      69             :  * Rounds @x down to next multiple of @y. If @y will always be a power
      70             :  * of 2, consider using the faster round_down().
      71             :  */
      72             : #define rounddown(x, y) (                               \
      73             : {                                                       \
      74             :         typeof(x) __x = (x);                            \
      75             :         __x - (__x % (y));                              \
      76             : }                                                       \
      77             : )
      78             : 
      79             : /*
      80             :  * Divide positive or negative dividend by positive or negative divisor
      81             :  * and round to closest integer. Result is undefined for negative
      82             :  * divisors if the dividend variable type is unsigned and for negative
      83             :  * dividends if the divisor variable type is unsigned.
      84             :  */
      85             : #define DIV_ROUND_CLOSEST(x, divisor)(                  \
      86             : {                                                       \
      87             :         typeof(x) __x = x;                              \
      88             :         typeof(divisor) __d = divisor;                  \
      89             :         (((typeof(x))-1) > 0 ||                              \
      90             :          ((typeof(divisor))-1) > 0 ||                        \
      91             :          (((__x) > 0) == ((__d) > 0))) ?          \
      92             :                 (((__x) + ((__d) / 2)) / (__d)) :       \
      93             :                 (((__x) - ((__d) / 2)) / (__d));        \
      94             : }                                                       \
      95             : )
      96             : /*
      97             :  * Same as above but for u64 dividends. divisor must be a 32-bit
      98             :  * number.
      99             :  */
     100             : #define DIV_ROUND_CLOSEST_ULL(x, divisor)(              \
     101             : {                                                       \
     102             :         typeof(divisor) __d = divisor;                  \
     103             :         unsigned long long _tmp = (x) + (__d) / 2;      \
     104             :         do_div(_tmp, __d);                              \
     105             :         _tmp;                                           \
     106             : }                                                       \
     107             : )
     108             : 
     109             : /*
     110             :  * Multiplies an integer by a fraction, while avoiding unnecessary
     111             :  * overflow or loss of precision.
     112             :  */
     113             : #define mult_frac(x, numer, denom)(                     \
     114             : {                                                       \
     115             :         typeof(x) quot = (x) / (denom);                 \
     116             :         typeof(x) rem  = (x) % (denom);                 \
     117             :         (quot * (numer)) + ((rem * (numer)) / (denom)); \
     118             : }                                                       \
     119             : )
     120             : 
     121             : #define sector_div(a, b) do_div(a, b)
     122             : 
     123             : /**
     124             :  * abs - return absolute value of an argument
     125             :  * @x: the value.  If it is unsigned type, it is converted to signed type first.
     126             :  *     char is treated as if it was signed (regardless of whether it really is)
     127             :  *     but the macro's return type is preserved as char.
     128             :  *
     129             :  * Return: an absolute value of x.
     130             :  */
     131             : #define abs(x)  __abs_choose_expr(x, long long,                         \
     132             :                 __abs_choose_expr(x, long,                              \
     133             :                 __abs_choose_expr(x, int,                               \
     134             :                 __abs_choose_expr(x, short,                             \
     135             :                 __abs_choose_expr(x, char,                              \
     136             :                 __builtin_choose_expr(                                  \
     137             :                         __builtin_types_compatible_p(typeof(x), char),  \
     138             :                         (char)({ signed char __x = (x); __x<0?-__x:__x; }), \
     139             :                         ((void)0)))))))
     140             : 
     141             : #define __abs_choose_expr(x, type, other) __builtin_choose_expr(        \
     142             :         __builtin_types_compatible_p(typeof(x),   signed type) ||       \
     143             :         __builtin_types_compatible_p(typeof(x), unsigned type),         \
     144             :         ({ signed type __x = (x); __x < 0 ? -__x : __x; }), other)
     145             : 
     146             : /**
     147             :  * reciprocal_scale - "scale" a value into range [0, ep_ro)
     148             :  * @val: value
     149             :  * @ep_ro: right open interval endpoint
     150             :  *
     151             :  * Perform a "reciprocal multiplication" in order to "scale" a value into
     152             :  * range [0, @ep_ro), where the upper interval endpoint is right-open.
     153             :  * This is useful, e.g. for accessing a index of an array containing
     154             :  * @ep_ro elements, for example. Think of it as sort of modulus, only that
     155             :  * the result isn't that of modulo. ;) Note that if initial input is a
     156             :  * small value, then result will return 0.
     157             :  *
     158             :  * Return: a result based on @val in interval [0, @ep_ro).
     159             :  */
     160          33 : static inline u32 reciprocal_scale(u32 val, u32 ep_ro)
     161             : {
     162          33 :         return (u32)(((u64) val * ep_ro) >> 32);
     163             : }
     164             : 
     165             : u64 int_pow(u64 base, unsigned int exp);
     166             : unsigned long int_sqrt(unsigned long);
     167             : 
     168             : #if BITS_PER_LONG < 64
     169             : u32 int_sqrt64(u64 x);
     170             : #else
     171             : static inline u32 int_sqrt64(u64 x)
     172             : {
     173             :         return (u32)int_sqrt(x);
     174             : }
     175             : #endif
     176             : 
     177             : #endif  /* _LINUX_MATH_H */

Generated by: LCOV version 1.14