From df2c71ea5ad313e16c73e7eeaf42bbfa826866e3 Mon Sep 17 00:00:00 2001 From: "Timothy B. Terriberry" <tterribe@xiph.org> Date: Thu, 23 Dec 2010 08:06:48 -0800 Subject: [PATCH] Use _BitScanReverse for EC_ILOG with MSVC. Also updates the TI dsplib macros to use the same EC_CLZ mechanism as everything else. --- libcelt/ecintrin.h | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/libcelt/ecintrin.h b/libcelt/ecintrin.h index 54ae90a17..e6e0f9b0c 100644 --- a/libcelt/ecintrin.h +++ b/libcelt/ecintrin.h @@ -83,17 +83,30 @@ /*Count leading zeros. This macro should only be used for implementing ec_ilog(), if it is defined. All other code should use EC_ILOG() instead.*/ -#ifdef __GNUC_PREREQ -#if __GNUC_PREREQ(3,4) -# if INT_MAX>=2147483647 -# define EC_CLZ0 sizeof(unsigned)*CHAR_BIT -# define EC_CLZ(_x) (__builtin_clz(_x)) -# elif LONG_MAX>=2147483647L -# define EC_CLZ0 sizeof(unsigned long)*CHAR_BIT -# define EC_CLZ(_x) (__builtin_clzl(_x)) +#if defined(_MSC_VER) +# include <intrin.h> +static __inline int ec_bsr(unsigned long _x){ + unsigned long ret; + _BitScanReverse(&ret,_x); + return (int)ret; +} +# define EC_CLZ0 (1) +# define EC_CLZ(_x) (-ec_bsr(_x)) +#elif defined(ENABLE_TI_DSPLIB) +# include "dsplib.h" +# define EC_CLZ0 (31) +# define EC_CLZ(_x) (_lnorm(x)) +#elif defined(__GNUC_PREREQ) +# if __GNUC_PREREQ(3,4) +# if INT_MAX>=2147483647 +# define EC_CLZ0 ((int)sizeof(unsigned)*CHAR_BIT) +# define EC_CLZ(_x) (__builtin_clz(_x)) +# elif LONG_MAX>=2147483647L +# define EC_CLZ0 ((int)sizeof(unsigned long)*CHAR_BIT) +# define EC_CLZ(_x) (__builtin_clzl(_x)) +# endif # endif #endif -#endif #if defined(EC_CLZ) /*Note that __builtin_clz is not defined when _x==0, according to the gcc @@ -101,9 +114,6 @@ The majority of the time we can never pass it zero. When we need to, it can be special cased.*/ # define EC_ILOG(_x) (EC_CLZ0-EC_CLZ(_x)) -#elif defined(ENABLE_TI_DSPLIB) -#include "dsplib.h" -#define EC_ILOG(x) (31 - _lnorm(x)) #else # define EC_ILOG(_x) (ec_ilog(_x)) #endif -- GitLab