]> Savannah Git Hosting - gnulib.git/commitdiff
integer_length_ll: Optimize for MSVC in 64-bit mode.
authorBruno Haible <bruno@clisp.org>
Mon, 3 Aug 2020 23:17:36 +0000 (01:17 +0200)
committerBruno Haible <bruno@clisp.org>
Mon, 3 Aug 2020 23:17:36 +0000 (01:17 +0200)
* lib/integer_length_l.c (MSVC_BUILTIN): Define for MSVC in 64-bit mode.
(FUNC): On MSVC, use MSVC_BUILTIN if defined.

ChangeLog
lib/integer_length_l.c

index bfd2ade8d6d40ae40a366e40ebb7a85189cb4ae7..9919a406742d8ce3342d5c4acb158bfd08f4b445 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2020-08-03  Bruno Haible  <bruno@clisp.org>
+
+       integer_length_ll: Optimize for MSVC in 64-bit mode.
+       * lib/integer_length_l.c (MSVC_BUILTIN): Define for MSVC in 64-bit mode.
+       (FUNC): On MSVC, use MSVC_BUILTIN if defined.
+
 2020-08-03  Bruno Haible  <bruno@clisp.org>
 
        integer_length_ll: Optimize for MSVC in 32-bit mode.
index ea52ac34fb77dec86a82ecd9166c17e9488f5551..161f1afa127bf0ac535164cc826ae41de2ae6b46 100644 (file)
 # define FUNC integer_length_ll
 # define TYPE unsigned long long
 # define GCC_BUILTIN __builtin_clzll
+# ifdef _WIN64
+#  define MSVC_BUILTIN _BitScanReverse64
+# endif
 #else
 # define FUNC integer_length_l
 # define TYPE unsigned long
 # define GCC_BUILTIN __builtin_clzl
+# define MSVC_BUILTIN _BitScanReverse
 #endif
 
 #if defined _MSC_VER
@@ -67,6 +71,14 @@ FUNC (TYPE x)
     return 0;
   else
     return NBITS - GCC_BUILTIN (x);
+#elif defined _MSC_VER && defined MSVC_BUILTIN
+  /* _BitScanReverse, _BitScanReverse64
+     <https://docs.microsoft.com/en-us/cpp/intrinsics/bitscanreverse-bitscanreverse64> */
+  unsigned long bit;
+  if (MSVC_BUILTIN (&bit, x))
+    return bit + 1;
+  else
+    return 0;
 #else
   /* Split x into chunks, and look at one chunk after the other.  */
   if (sizeof (TYPE) > 2 * sizeof (unsigned int))