From 1fd03ee3242ee212a63b0ca2dee4a8ae83221d10 Mon Sep 17 00:00:00 2001 From: Thomas Gschwantner Date: Sat, 13 Apr 2019 22:11:15 +0200 Subject: radix-trie: fix fls/fls64 --- radix-trie.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/radix-trie.c b/radix-trie.c index 4786c69..6e086cf 100644 --- a/radix-trie.c +++ b/radix-trie.c @@ -25,22 +25,22 @@ struct radix_node { uint8_t cidr, bit_at_a, bit_at_b; }; -// TODO: sort out #ifdef business to make this portable -static unsigned int fls64(uint64_t a) +static unsigned int fls64(uint64_t x) { - return __builtin_ctzl(a) + 1; + return x ? sizeof(unsigned long long) * 8 - __builtin_clzll(x) : 0; } -static unsigned int fls(uint32_t a) +static unsigned int fls(uint32_t x) { - return __builtin_ctz(a) + 1; + return x ? sizeof(unsigned long) * 8 - __builtin_clzl(x) : 0; } static unsigned int fls128(uint64_t a, uint64_t b) { - return a ? fls64(a) + 64U : (b ? fls64(b) : 0); + return a ? fls64(a) + 64U : fls64(b); } +/* TODO: portable implementations */ static void swap_endian(uint8_t *dst, const uint8_t *src, uint8_t bits) { if (bits == 32) { -- cgit v1.2.3-59-g8ed1b