]> Savannah Git Hosting - gnulib.git/commitdiff
ffsll: Optimize for MSVC in 32-bit mode.
authorBruno Haible <bruno@clisp.org>
Mon, 3 Aug 2020 22:11:02 +0000 (00:11 +0200)
committerBruno Haible <bruno@clisp.org>
Mon, 3 Aug 2020 22:11:02 +0000 (00:11 +0200)
* lib/ffsl.h: Include <intrin.h>.
(ffs): Define as inline function, like in lib/ffs.c.

ChangeLog
lib/ffsl.h

index 773a9f5cc59a902c99c9f87d3c284d1ba2c20f34..0a336bf3670173cc24822db34c8227419aeab578 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2020-08-03  Bruno Haible  <bruno@clisp.org>
+
+       ffsll: Optimize for MSVC in 32-bit mode.
+       * lib/ffsl.h: Include <intrin.h>.
+       (ffs): Define as inline function, like in lib/ffs.c.
+
 2020-08-03  Bruno Haible  <bruno@clisp.org>
 
        ffs: Optimize for MSVC.
index cea438607bb86862ae7aee1a16c5fcdb05df9a6c..d5c5a975097cab0d9457efe2cb2deb6605edd5de 100644 (file)
 #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