]> Savannah Git Hosting - gnulib.git/commitdiff
ffs: Optimize for MSVC.
authorBruno Haible <bruno@clisp.org>
Mon, 3 Aug 2020 22:05:05 +0000 (00:05 +0200)
committerBruno Haible <bruno@clisp.org>
Mon, 3 Aug 2020 22:05:05 +0000 (00:05 +0200)
* lib/ffs.c: Include <intrin.h>.
(ffs): With MSVC, use the _BitScanForward built-in.

ChangeLog
lib/ffs.c

index 526747ed849119fd7612736f55d97586c3f8d0e0..773a9f5cc59a902c99c9f87d3c284d1ba2c20f34 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2020-08-03  Bruno Haible  <bruno@clisp.org>
+
+       ffs: Optimize for MSVC.
+       * lib/ffs.c: Include <intrin.h>.
+       (ffs): With MSVC, use the _BitScanForward built-in.
+
 2020-08-03  Bruno Haible  <bruno@clisp.org>
 
        sigprocmask: Try to avoid breakage for people who use an Autoconf cache.
index ba4915ee81d30f018d6967e2c5e483ea07ccf029..d8a65cac011a64c925d03724a7f561511f8135d8 100644 (file)
--- a/lib/ffs.c
+++ b/lib/ffs.c
 
 #include <limits.h>
 
+#if defined _MSC_VER
+# include <intrin.h>
+#endif
+
 int
 ffs (int i)
 {
 #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
   return __builtin_ffs (i);
+#elif defined _MSC_VER
+  /* _BitScanForward
+     <https://docs.microsoft.com/en-us/cpp/intrinsics/bitscanforward-bitscanforward64> */
+  unsigned long bit;
+  if (_BitScanForward (&bit, i))
+    return bit + 1;
+  else
+    return 0;
 #else
   /* <https://github.com/gibsjose/BitHacks>
      gives this deBruijn constant for a branch-less computation, although