diff options
author | Bruno Haible <bruno@clisp.org> | 2020-08-04 00:11:02 +0200 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2020-08-04 00:11:02 +0200 |
commit | c728189201864850c562862fa7fc54d925c472e0 (patch) | |
tree | 272912c0ba8d3eb3e10b14960493423251d07d0c /lib/ffsl.h | |
parent | 353cc7c6906f650fa228d295dad270637f9441c7 (diff) | |
download | gnulib-c728189201864850c562862fa7fc54d925c472e0.tar.gz |
ffsll: Optimize for MSVC in 32-bit mode.
* lib/ffsl.h: Include <intrin.h>.
(ffs): Define as inline function, like in lib/ffs.c.
Diffstat (limited to 'lib/ffsl.h')
-rw-r--r-- | lib/ffsl.h | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/lib/ffsl.h b/lib/ffsl.h index cea438607b..d5c5a97509 100644 --- a/lib/ffsl.h +++ b/lib/ffsl.h @@ -27,6 +27,22 @@ #include <limits.h> #include <strings.h> +#if defined _MSC_VER +# include <intrin.h> +/* Copied from ffs.c. */ +static inline int +ffs (int i) +{ + /* _BitScanForward + <https://docs.microsoft.com/en-us/cpp/intrinsics/bitscanforward-bitscanforward64> */ + unsigned long bit; + if (_BitScanForward (&bit, i)) + return bit + 1; + else + return 0; +} +#endif + #if !defined FUNC || !defined TYPE # error #endif |