From: Bruno Haible Date: Sun, 4 Sep 2022 23:29:26 +0000 (+0200) Subject: count-trailing-zeros: Fix a link error on 32-bit MSVC. X-Git-Tag: v1.0~2068 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=3730c889a4b671ea4513374a6977b941494a29bd;p=gnulib.git count-trailing-zeros: Fix a link error on 32-bit MSVC. * lib/count-trailing-zeros.h: Correct syntax for #pragma intrinsic. (count_trailing_zeros_ll): Use two _BitScanForward invocations instead of a _BitScanForward64 invocation. --- diff --git a/ChangeLog b/ChangeLog index 8556ce5e85..dd1cb2bec0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2022-09-04 Bruno Haible + + count-trailing-zeros: Fix a link error on 32-bit MSVC. + * lib/count-trailing-zeros.h: Correct syntax for #pragma intrinsic. + (count_trailing_zeros_ll): Use two _BitScanForward invocations instead + of a _BitScanForward64 invocation. + 2022-09-04 Bruno Haible unictype/category-none tests: Fix a link error on MSVC. diff --git a/lib/count-trailing-zeros.h b/lib/count-trailing-zeros.h index 9a989a4324..61fbdf2980 100644 --- a/lib/count-trailing-zeros.h +++ b/lib/count-trailing-zeros.h @@ -43,8 +43,10 @@ extern "C" { # define COUNT_TRAILING_ZEROS(BUILTIN, MSC_BUILTIN, TYPE) \ return x ? BUILTIN (x) : CHAR_BIT * sizeof x; #elif _MSC_VER -# pragma intrinsic _BitScanForward -# pragma intrinsic _BitScanForward64 +# pragma intrinsic (_BitScanForward) +# if defined _M_X64 +# pragma intrinsic (_BitScanForward64) +# endif # define COUNT_TRAILING_ZEROS(BUILTIN, MSC_BUILTIN, TYPE) \ do \ { \ @@ -101,8 +103,18 @@ count_trailing_zeros_l (unsigned long int x) COUNT_TRAILING_ZEROS_INLINE int count_trailing_zeros_ll (unsigned long long int x) { +#if (defined _MSC_VER && !defined __clang__) && !defined _M_X64 + /* 32-bit MSVC does not have _BitScanForward64, only _BitScanForward. */ + unsigned long result; + if (_BitScanForward (&result, (unsigned long) x)) + return result; + if (_BitScanForward (&result, (unsigned long) (x >> 32))) + return result + 32; + return CHAR_BIT * sizeof x; +#else COUNT_TRAILING_ZEROS (__builtin_ctzll, _BitScanForward64, unsigned long long int); +#endif } #ifdef __cplusplus