]> Savannah Git Hosting - gnulib.git/commitdiff
ffsll: Optimize for MSVC in 64-bit mode.
authorBruno Haible <bruno@clisp.org>
Mon, 3 Aug 2020 22:13:46 +0000 (00:13 +0200)
committerBruno Haible <bruno@clisp.org>
Mon, 3 Aug 2020 22:13:46 +0000 (00:13 +0200)
* 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.

ChangeLog
lib/ffsl.c
lib/ffsl.h
lib/ffsll.c

index 0a336bf3670173cc24822db34c8227419aeab578..51b2be7bca2d54585b654c3bffcc4314ab7a6994 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2020-08-03  Bruno Haible  <bruno@clisp.org>
+
+       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.
+
 2020-08-03  Bruno Haible  <bruno@clisp.org>
 
        ffsll: Optimize for MSVC in 32-bit mode.
index ee99ba7e0122956dbe98da329c7f09c06ee9de1f..198cacbd88659f2897b64e3166ff44402fa125d2 100644 (file)
@@ -1,4 +1,5 @@
 #define FUNC ffsl
 #define TYPE long int
 #define GCC_BUILTIN __builtin_ffsl
+#define MSVC_BUILTIN _BitScanForward
 #include "ffsl.h"
index d5c5a975097cab0d9457efe2cb2deb6605edd5de..fa5c0935a3e88dda5c5e05bec0bce04dfb9a5674 100644 (file)
@@ -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.  */
index f0e9425eedd53b16e64f345b8249ca81f0e2b755..80a273c3b3cf77b17a969501579cf5d4ba70429d 100644 (file)
@@ -1,4 +1,7 @@
 #define FUNC ffsll
 #define TYPE long long int
 #define GCC_BUILTIN __builtin_ffsll
+#ifdef _WIN64
+# define MSVC_BUILTIN _BitScanForward64
+#endif
 #include "ffsl.h"