#include <stdint.h>
-static uint16_t floor_log2(uint16_t x)
+static inline uint32_t floor_log2(uint32_t x)
{
- if (x < 2) return 0;
- if (x < 4) return 1;
- if (x < 8) return 2;
- if (x < 16) return 3;
- if (x < 32) return 4;
- if (x < 64) return 5;
- if (x < 128) return 6;
- if (x < 256) return 7;
- if (x < 512) return 8;
- if (x < 1024) return 9;
- if (x < 2048) return 10;
- if (x < 4096) return 11;
- if (x < 8192) return 12;
- if (x < 16384) return 13;
- if (x < 32768) return 14;
- /*if (x < 65536)*/ return 15;
+ return 31 - (uint32_t) __builtin_clz(x);
}
freq = freq_tbl->freq[s];
self->entries[s].start = start - freq;
self->entries[s].next = freq;
- k = self->log2_tblsz - floor_log2(freq);
+ k = (uint16_t) (self->log2_tblsz - floor_log2(freq));
self->entries[s].nb = (uint32_t) ((k << (self->log2_tblsz + 1)) - (freq << k));
start += freq;
for (i = 0; i < freq; ++i) {