add fast floor_log2
authorGeoffrey Allott <geoffrey@allott.email>
Sun, 31 Jul 2022 20:17:39 +0000 (21:17 +0100)
committerGeoffrey Allott <geoffrey@allott.email>
Sun, 31 Jul 2022 20:17:39 +0000 (21:17 +0100)
src/floor_log2.h
src/tans_symbol_tbl.c

index 64e1e0bc332054ccebe82676546f578a37a7a93e..a1311b2dfaef7950615e685a961417582243dc38 100644 (file)
@@ -2,22 +2,7 @@
 
 #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);
 }
index fe105fd8b945dac2aac0544f15190f550a8b3114..46a9356f9558dbb6a4c94f62b675ec8f2e035ffb 100644 (file)
@@ -18,7 +18,7 @@ int tans_symbol_tbl_init(struct tans_symbol_tbl *self, const struct tans_freq_tb
         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) {