diff --git a/lib/count-leading-zeros.h b/lib/count-leading-zeros.h index 5904eb7..343c892 100644 --- a/lib/count-leading-zeros.h +++ b/lib/count-leading-zeros.h @@ -39,7 +39,22 @@ _GL_INLINE_HEADER_BEGIN return x ? BUILTIN (x) : CHAR_BIT * sizeof x; #elif _MSC_VER # pragma intrinsic _BitScanReverse -# pragma intrinsic _BitScanReverse64 +# ifndef _M_IX86 +# pragma intrinsic _BitScanReverse64 +# else +COUNT_LEADING_ZEROS_INLINE unsigned char +_BitScanReverse64 (unsigned long *r, unsigned __int64 x) +{ + unsigned char c = _BitScanReverse (r, x >> 32); + if (! c) + { + c = _BitScanReverse (r, x); + if (c) + *r += 32; + } + return c; +} +# endif # define COUNT_LEADING_ZEROS(BUILTIN, MSC_BUILTIN, TYPE) \ do \ { \ diff --git a/lib/count-trailing-zeros.h b/lib/count-trailing-zeros.h index 83ce2fb..39b879f 100644 --- a/lib/count-trailing-zeros.h +++ b/lib/count-trailing-zeros.h @@ -39,7 +39,21 @@ _GL_INLINE_HEADER_BEGIN return x ? BUILTIN (x) : CHAR_BIT * sizeof x; #elif _MSC_VER # pragma intrinsic _BitScanForward -# pragma intrinsic _BitScanForward64 +# ifndef _M_IX86 +# pragma intrinsic _BitScanForward64 +# else +COUNT_TRAILING_ZEROS_INLINE unsigned char +_BitScanForward64 (unsigned long *r, unsigned __int64 x) +{ + unsigned char c = _BitScanForward (r, x); + if (! c) + { + c = _BitScanForward (r, x >> 32); + if (c) + *r += 32; + } + return c; +} # define COUNT_TRAILING_ZEROS(BUILTIN, MSC_BUILTIN, TYPE) \ do \ { \