summaryrefslogtreecommitdiff
path: root/lib/ffsl.h
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2020-08-04 00:11:02 +0200
committerBruno Haible <bruno@clisp.org>2020-08-04 00:11:02 +0200
commitc728189201864850c562862fa7fc54d925c472e0 (patch)
tree272912c0ba8d3eb3e10b14960493423251d07d0c /lib/ffsl.h
parent353cc7c6906f650fa228d295dad270637f9441c7 (diff)
downloadgnulib-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.h16
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