From: RĂ©mi Denis-Courmont Date: Sun, 7 Feb 2010 09:39:46 +0000 (+0200) Subject: clz: count leading zeroes X-Git-Tag: 1.1.0-ff~343 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=3c6a0755e70b35b5fc1fe7b931f7eaa350a72ab3;p=vlc clz: count leading zeroes --- 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)