>From eb7f785f5ad4fd6a9d9e8e74e42838a27d1dff86 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Tue, 4 Aug 2020 01:17:36 +0200 Subject: [PATCH 6/6] integer_length_ll: Optimize for MSVC in 64-bit mode. * lib/integer_length_l.c (MSVC_BUILTIN): Define for MSVC in 64-bit mode. (FUNC): On MSVC, use MSVC_BUILTIN if defined. --- ChangeLog | 6 ++++++ lib/integer_length_l.c | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/ChangeLog b/ChangeLog index bfd2ade..9919a40 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2020-08-03 Bruno Haible + integer_length_ll: Optimize for MSVC in 64-bit mode. + * lib/integer_length_l.c (MSVC_BUILTIN): Define for MSVC in 64-bit mode. + (FUNC): On MSVC, use MSVC_BUILTIN if defined. + +2020-08-03 Bruno Haible + integer_length_ll: Optimize for MSVC in 32-bit mode. * lib/integer_length_l.c: Include . (integer_length): Define as inline function, like in diff --git a/lib/integer_length_l.c b/lib/integer_length_l.c index ea52ac3..161f1af 100644 --- a/lib/integer_length_l.c +++ b/lib/integer_length_l.c @@ -31,10 +31,14 @@ # define FUNC integer_length_ll # define TYPE unsigned long long # define GCC_BUILTIN __builtin_clzll +# ifdef _WIN64 +# define MSVC_BUILTIN _BitScanReverse64 +# endif #else # define FUNC integer_length_l # define TYPE unsigned long # define GCC_BUILTIN __builtin_clzl +# define MSVC_BUILTIN _BitScanReverse #endif #if defined _MSC_VER @@ -67,6 +71,14 @@ FUNC (TYPE x) return 0; else return NBITS - GCC_BUILTIN (x); +#elif defined _MSC_VER && defined MSVC_BUILTIN + /* _BitScanReverse, _BitScanReverse64 + */ + unsigned long bit; + if (MSVC_BUILTIN (&bit, x)) + return bit + 1; + else + return 0; #else /* Split x into chunks, and look at one chunk after the other. */ if (sizeof (TYPE) > 2 * sizeof (unsigned int)) -- 2.7.4