33 #ifndef FLAC__PRIVATE__BITMATH_H
34 #define FLAC__PRIVATE__BITMATH_H
36 #include "../../../ordinals.h"
37 #include "../../../assert.h"
41 #include "../../../compat.h"
43 #if defined(_MSC_VER) && (_MSC_VER >= 1400)
48 static inline unsigned int FLAC__clz_soft_uint32(
unsigned int word)
50 static const unsigned char byte_to_unary_table[] = {
51 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
52 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
53 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
54 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
55 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
56 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
57 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
58 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
59 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
60 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
61 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
62 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
63 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
64 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
65 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
66 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
69 return (word) > 0xffffff ? byte_to_unary_table[(word) >> 24] :
70 (word) > 0xffff ? byte_to_unary_table[(word) >> 16] + 8 :
71 (word) > 0xff ? byte_to_unary_table[(word) >> 8] + 16 :
72 byte_to_unary_table[(word)] + 24;
75 static inline unsigned int FLAC__clz_uint32(
FLAC__uint32 v)
79 #if defined(__INTEL_COMPILER)
80 return _bit_scan_reverse(v) ^ 31U;
81 #elif defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
84 return __builtin_clz(v);
85 #elif defined(_MSC_VER) && (_MSC_VER >= 1400)
88 _BitScanReverse(&idx, v);
92 return FLAC__clz_soft_uint32(v);
97 static inline unsigned int FLAC__clz2_uint32(
FLAC__uint32 v)
101 return FLAC__clz_uint32(v);
127 static inline unsigned FLAC__bitmath_ilog2(
FLAC__uint32 v)
130 #if defined(__INTEL_COMPILER)
131 return _bit_scan_reverse(v);
132 #elif defined(_MSC_VER) && (_MSC_VER >= 1400)
135 _BitScanReverse(&idx, v);
139 return sizeof(
FLAC__uint32) * CHAR_BIT - 1 - FLAC__clz_uint32(v);
144 #ifdef FLAC__INTEGER_ONLY_LIBRARY
146 static inline unsigned FLAC__bitmath_ilog2_wide(
FLAC__uint64 v)
149 #if defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
150 return sizeof(
FLAC__uint64) * CHAR_BIT - 1 - __builtin_clzll(v);
152 #elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && (defined(_M_IA64) || defined(_M_X64))
155 _BitScanReverse64(&idx, v);
164 static const unsigned char DEBRUIJN_IDX64[64]={
165 0, 1, 2, 7, 3,13, 8,19, 4,25,14,28, 9,34,20,40,
166 5,17,26,38,15,46,29,48,10,31,35,54,21,50,41,57,
167 63, 6,12,18,24,27,33,39,16,37,45,47,30,53,49,56,
168 62,11,23,32,36,44,52,55,61,22,43,51,60,42,59,58
177 return DEBRUIJN_IDX64[v*0x218A392CD3D5DBF>>58&0x3F];
uint32_t FLAC__uint32
Definition: ordinals.h:65
unsigned FLAC__bitmath_silog2_wide(FLAC__int64 v)
Definition: bitmath.c:87
#define FLAC__ASSERT(x)
Definition: assert.h:42
unsigned FLAC__bitmath_silog2(int v)
Definition: bitmath.c:63
int64_t FLAC__int64
Definition: ordinals.h:63
uint64_t FLAC__uint64
Definition: ordinals.h:66