]> Savannah Git Hosting - gnulib.git/commitdiff
integer_length_ll: Optimize for MSVC in 32-bit mode.
authorBruno Haible <bruno@clisp.org>
Mon, 3 Aug 2020 23:10:23 +0000 (01:10 +0200)
committerBruno Haible <bruno@clisp.org>
Mon, 3 Aug 2020 23:10:23 +0000 (01:10 +0200)
* lib/integer_length_l.c: Include <intrin.h>.
(integer_length): Define as inline function, like in
lib/integer_length.c.

ChangeLog
lib/integer_length_l.c

index b2169e369fa9158bd624557c1d9d8ff502a4aec2..bfd2ade8d6d40ae40a366e40ebb7a85189cb4ae7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2020-08-03  Bruno Haible  <bruno@clisp.org>
+
+       integer_length_ll: Optimize for MSVC in 32-bit mode.
+       * lib/integer_length_l.c: Include <intrin.h>.
+       (integer_length): Define as inline function, like in
+       lib/integer_length.c.
+
 2020-08-03  Bruno Haible  <bruno@clisp.org>
 
        integer_length: Optimize for MSVC.
index 7a6035768c118c1947cb4a4e4c541fe27eb54bb3..ea52ac34fb77dec86a82ecd9166c17e9488f5551 100644 (file)
 # define GCC_BUILTIN __builtin_clzl
 #endif
 
+#if defined _MSC_VER
+# include <intrin.h>
+/* Copied from integer_length.c.  */
+static inline int
+integer_length (unsigned int x)
+{
+  /* _BitScanReverse
+     <https://docs.microsoft.com/en-us/cpp/intrinsics/bitscanreverse-bitscanreverse64> */
+  unsigned long bit;
+  if (_BitScanReverse (&bit, x))
+    return bit + 1;
+  else
+    return 0;
+}
+#endif
+
 #define NBITS (sizeof (TYPE) * CHAR_BIT)
 
 /* Modify shift count to be in bounds, even in dead code, otherwise GCC