>From 1552de7c513ffbedf675de10b77a6d5c264ee3b2 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Tue, 4 Aug 2020 00:13:46 +0200 Subject: [PATCH 3/6] ffsll: Optimize for MSVC in 64-bit mode. * lib/ffsl.h (FUNC): On MSVC, use MSVC_BUILTIN if defined. * lib/ffsll.c (MSVC_BUILTIN): Define for MSVC in 64-bit mode. * lib/ffsl.c (MSVC_BUILTIN): Define for MSVC. --- ChangeLog | 7 +++++++ lib/ffsl.c | 1 + lib/ffsl.h | 8 ++++++++ lib/ffsll.c | 3 +++ 4 files changed, 19 insertions(+) diff --git a/ChangeLog b/ChangeLog index 0a336bf..51b2be7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2020-08-03 Bruno Haible + ffsll: Optimize for MSVC in 64-bit mode. + * lib/ffsl.h (FUNC): On MSVC, use MSVC_BUILTIN if defined. + * lib/ffsll.c (MSVC_BUILTIN): Define for MSVC in 64-bit mode. + * lib/ffsl.c (MSVC_BUILTIN): Define for MSVC. + +2020-08-03 Bruno Haible + ffsll: Optimize for MSVC in 32-bit mode. * lib/ffsl.h: Include . (ffs): Define as inline function, like in lib/ffs.c. diff --git a/lib/ffsl.c b/lib/ffsl.c index ee99ba7..198cacb 100644 --- a/lib/ffsl.c +++ b/lib/ffsl.c @@ -1,4 +1,5 @@ #define FUNC ffsl #define TYPE long int #define GCC_BUILTIN __builtin_ffsl +#define MSVC_BUILTIN _BitScanForward #include "ffsl.h" diff --git a/lib/ffsl.h b/lib/ffsl.h index d5c5a97..fa5c093 100644 --- a/lib/ffsl.h +++ b/lib/ffsl.h @@ -52,6 +52,14 @@ FUNC (TYPE i) { #if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) && defined GCC_BUILTIN return GCC_BUILTIN (i); +#elif defined _MSC_VER && defined MSVC_BUILTIN + /* _BitScanForward, _BitScanForward64 + */ + unsigned long bit; + if (MSVC_BUILTIN (&bit, i)) + return bit + 1; + else + return 0; #else unsigned TYPE j = i; /* Split j into chunks, and look at one chunk after the other. */ diff --git a/lib/ffsll.c b/lib/ffsll.c index f0e9425..80a273c 100644 --- a/lib/ffsll.c +++ b/lib/ffsll.c @@ -1,4 +1,7 @@ #define FUNC ffsll #define TYPE long long int #define GCC_BUILTIN __builtin_ffsll +#ifdef _WIN64 +# define MSVC_BUILTIN _BitScanForward64 +#endif #include "ffsl.h" -- 2.7.4