util: Use win32 intrinsics for util_last_bit if present.
authorMathias Fröhlich <mathias.froehlich@web.de>
Sat, 6 Aug 2016 05:26:51 +0000 (07:26 +0200)
committerMathias Fröhlich <Mathias.Froehlich@gmx.net>
Wed, 10 Aug 2016 07:30:07 +0000 (09:30 +0200)
v2: Split into two patches.
v3: Fix off by one problem.

Signed-off-by: Mathias Fröhlich <Mathias.Froehlich@web.de>
Reviewed-by: Brian Paul <brianp@vmware.com>
Tested-by: Brian Paul <brianp@vmware.com>
src/util/bitscan.h

index 0743fe7d321c2f4fd963596da988edec1403a764..8afef81a990afadd2e85f4e8fd23f02c5359152f 100644 (file)
@@ -157,6 +157,12 @@ util_last_bit(unsigned u)
 {
 #if defined(HAVE___BUILTIN_CLZ)
    return u == 0 ? 0 : 32 - __builtin_clz(u);
+#elif defined(_MSC_VER) && (_M_IX86 || _M_ARM || _M_AMD64 || _M_IA64)
+   unsigned long index;
+   if (_BitScanReverse(&index, u))
+      return index + 1;
+   else
+      return 0;
 #else
    unsigned r = 0;
    while (u) {
@@ -177,6 +183,12 @@ util_last_bit64(uint64_t u)
 {
 #if defined(HAVE___BUILTIN_CLZLL)
    return u == 0 ? 0 : 64 - __builtin_clzll(u);
+#elif defined(_MSC_VER) && (_M_AMD64 || _M_ARM || _M_IA64)
+   unsigned long index;
+   if (_BitScanReverse64(&index, u))
+      return index + 1;
+   else
+      return 0;
 #else
    unsigned r = 0;
    while (u) {