1#pragma once
2
3#include <limits.h>
4//#include <stdbit.h> not in libc yet, using __builtin_* functions
5
6#ifdef __cplusplus
7extern "C" {
8#endif
9
10XXX unnecessary?
11
12static inline unsigned first_leading_one(unsigned value)
13{
14 //return stdc_first_leading_one(value);
15 return UINT_WIDTH - __builtin_clz(value) - 1;
16}
17
18static inline unsigned count_leading_zeros(unsigned value)
19{
20 //return __builtin_stdc_leading_zeros(value);
21 return __builtin_clz(value);
22}
23
24static inline unsigned count_trailing_zeros(unsigned value)
25{
26 //return stdc_trailing_zeros(value);
27 return __builtin_ctz(value);
28}
29
30static inline unsigned count_trailing_ones(unsigned value)
31{
32 return count_trailing_zeros(~value);
33}
34
35#ifdef __cplusplus
36}
37#endif