From 3c6a0755e70b35b5fc1fe7b931f7eaa350a72ab3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sun, 7 Feb 2010 11:39:46 +0200 Subject: [PATCH] clz: count leading zeroes --- include/vlc_common.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/include/vlc_common.h b/include/vlc_common.h index 4ec66cc845..29055a7d51 100644 --- a/include/vlc_common.h +++ b/include/vlc_common.h @@ -621,6 +621,29 @@ static inline uint8_t clip_uint8_vlc( int32_t a ) else return a; } +/* Count leading zeroes */ +LIBVLC_USED +static inline unsigned clz (unsigned x) +{ +#ifdef __GNUC_ + return __builtin_clz (x); +#else + unsigned i = sizeof (x) * 8; + + while (x) + { + x = x >> 1; + i--; + } + return i; +#endif +} + +#define clz8( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint8_t)) * 8)) +#define clz16( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint16_t)) * 8)) +/* XXX: this assumes that int is 32-bits or more */ +#define clz32( x ) (clz(x) - ((sizeof(unsigned) - sizeof (uint32_t)) * 8)) + /* Free and set set the variable to NULL */ #define FREENULL(a) do { free( a ); a = NULL; } while(0) -- 2.39.5