Gisle Vanem wrote:

These intrinsics should (must?) have '()' around them. Hence:
   # pragma intrinsic (_BitScanReverse64)
   etc.

Thanks, revised patch attached.

I'm not at Win64 (x86_amd64) to check the test-results.

Can you please test it sometime soon?

And maybe the 'ifndef _M_IX86' should be rewritten as:
   'if defined(_M_X64) || defined(_M_AMD64)'.

That would complicate the code slightly, with no advantage that I can see.

diff --git a/lib/count-leading-zeros.h b/lib/count-leading-zeros.h
index 5904eb7..39cce09 100644
--- a/lib/count-leading-zeros.h
+++ b/lib/count-leading-zeros.h
@@ -38,8 +38,23 @@ _GL_INLINE_HEADER_BEGIN
 # define COUNT_LEADING_ZEROS(BUILTIN, MSC_BUILTIN, TYPE)                \
   return x ? BUILTIN (x) : CHAR_BIT * sizeof x;
 #elif _MSC_VER
-# pragma intrinsic _BitScanReverse
-# pragma intrinsic _BitScanReverse64
+# pragma intrinsic (_BitScanReverse)
+# ifndef _M_IX86
+#  pragma intrinsic (_BitScanReverse64)
+# else
+COUNT_LEADING_ZEROS_INLINE unsigned char
+_BitScanReverse64 (unsigned long *r, unsigned __int64 x)
+{
+  unsigned char c = _BitScanReverse (r, x >> 32);
+  if (! c)
+    {
+      c = _BitScanReverse (r, x);
+      if (c)
+        *r += 32;
+    }
+  return c;
+}
+# endif
 # define COUNT_LEADING_ZEROS(BUILTIN, MSC_BUILTIN, TYPE)                \
     do                                                                  \
       {                                                                 \
diff --git a/lib/count-one-bits.h b/lib/count-one-bits.h
index d54397f..528e3f0 100644
--- a/lib/count-one-bits.h
+++ b/lib/count-one-bits.h
@@ -72,9 +72,7 @@ count_one_bits_32 (unsigned int x)
 /* While gcc falls back to its own generic code if the machine
    on which it's running doesn't support popcount, with Microsoft's
    compiler we need to detect and fallback ourselves.  */
-#  pragma intrinsic __cpuid
-#  pragma intrinsic __popcnt
-#  pragma intrinsic __popcnt64
+#  pragma intrinsic (__cpuid, __popcnt, __popcnt64)
 
 /* Return nonzero if popcount is supported.  */
 
diff --git a/lib/count-trailing-zeros.h b/lib/count-trailing-zeros.h
index 83ce2fb..b93236a 100644
--- a/lib/count-trailing-zeros.h
+++ b/lib/count-trailing-zeros.h
@@ -38,8 +38,22 @@ _GL_INLINE_HEADER_BEGIN
 # define COUNT_TRAILING_ZEROS(BUILTIN, MSC_BUILTIN, TYPE)               \
   return x ? BUILTIN (x) : CHAR_BIT * sizeof x;
 #elif _MSC_VER
-# pragma intrinsic _BitScanForward
-# pragma intrinsic _BitScanForward64
+# pragma intrinsic (_BitScanForward)
+# ifndef _M_IX86
+#  pragma intrinsic (_BitScanForward64)
+# else
+COUNT_TRAILING_ZEROS_INLINE unsigned char
+_BitScanForward64 (unsigned long *r, unsigned __int64 x)
+{
+  unsigned char c = _BitScanForward (r, x);
+  if (! c)
+    {
+      c = _BitScanForward (r, x >> 32);
+      if (c)
+        *r += 32;
+    }
+  return c;
+}
 # define COUNT_TRAILING_ZEROS(BUILTIN, MSC_BUILTIN, TYPE)               \
     do                                                                  \
       {                                                                 \

Reply via email to