diff options
author | Thomas Gschwantner <tharre3@gmail.com> | 2019-04-13 22:11:15 +0200 |
---|---|---|
committer | Thomas Gschwantner <tharre3@gmail.com> | 2019-06-02 00:39:36 +0200 |
commit | 1fd03ee3242ee212a63b0ca2dee4a8ae83221d10 (patch) | |
tree | 9362cd6e7b07ab4ef3167d4ad68842a6ada3199c /radix-trie.c | |
parent | radix-trie: remove bits arg from radix_insert_v4/6 (diff) | |
download | wg-dynamic-1fd03ee3242ee212a63b0ca2dee4a8ae83221d10.tar.xz wg-dynamic-1fd03ee3242ee212a63b0ca2dee4a8ae83221d10.zip |
radix-trie: fix fls/fls64
Diffstat (limited to 'radix-trie.c')
-rw-r--r-- | radix-trie.c | 12 |
1 files 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) { |