diff options
author | Bruno Haible <bruno@clisp.org> | 2020-08-04 00:13:46 +0200 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2020-08-04 00:13:46 +0200 |
commit | 1552de7c513ffbedf675de10b77a6d5c264ee3b2 (patch) | |
tree | 344b8ca5eccae93340134b1a0c5fe0e636f5c6f1 /lib/ffsl.h | |
parent | c728189201864850c562862fa7fc54d925c472e0 (diff) | |
download | gnulib-1552de7c513ffbedf675de10b77a6d5c264ee3b2.tar.gz |
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.
Diffstat (limited to 'lib/ffsl.h')
-rw-r--r-- | lib/ffsl.h | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/lib/ffsl.h b/lib/ffsl.h index d5c5a97509..fa5c0935a3 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 + <https://docs.microsoft.com/en-us/cpp/intrinsics/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. */ |