2023-01-30 17:13:34 +05:30
|
|
|
/*
|
|
|
|
* SPDX-FileCopyrightText: 2022 - 2023, Alejandro Colomar <alx@kernel.org>
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef SHADOW_INCLUDE_LIB_BIT_H_
|
|
|
|
#define SHADOW_INCLUDE_LIB_BIT_H_
|
|
|
|
|
|
|
|
|
|
|
|
#include <config.h>
|
|
|
|
|
|
|
|
#include <limits.h>
|
|
|
|
|
|
|
|
|
2023-02-21 22:05:48 +05:30
|
|
|
#ifndef ULONG_WIDTH
|
|
|
|
#define ULONG_WIDTH (sizeof(unsigned long) * CHAR_BIT)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
2023-01-30 17:13:34 +05:30
|
|
|
inline unsigned long bit_ceilul(unsigned long x);
|
|
|
|
inline unsigned long bit_ceil_wrapul(unsigned long x);
|
|
|
|
inline int leading_zerosul(unsigned long x);
|
|
|
|
|
|
|
|
|
|
|
|
/* stdc_bit_ceilul(3) */
|
|
|
|
inline unsigned long
|
|
|
|
bit_ceilul(unsigned long x)
|
|
|
|
{
|
|
|
|
return 1 + (ULONG_MAX >> leading_zerosul(x));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* stdc_bit_ceilul(3), but wrap instead of having Undefined Behavior */
|
|
|
|
inline unsigned long
|
|
|
|
bit_ceil_wrapul(unsigned long x)
|
|
|
|
{
|
|
|
|
if (x == 0)
|
|
|
|
return 0;
|
|
|
|
|
2023-02-22 15:24:28 +05:30
|
|
|
return bit_ceilul(x);
|
2023-01-30 17:13:34 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/* stdc_leading_zerosul(3) */
|
|
|
|
inline int
|
|
|
|
leading_zerosul(unsigned long x)
|
|
|
|
{
|
2023-01-31 21:17:40 +05:30
|
|
|
return (x == 0) ? ULONG_WIDTH : __builtin_clzl(x);
|
2023-01-30 17:13:34 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endif // include guard
|