From 8b2a0cc3e265750650b4399ad051ae2e98a24f42 Mon Sep 17 00:00:00 2001
From: Matthew Oliver <protogonoi@gmail.com>
Date: Wed, 22 Oct 2014 00:30:53 +1100
Subject: [PATCH] avutil/intmath: enable builtin intrinsics for icl and
 msvc.

---
 libavutil/intmath.h | 37 +++++++++++++++++++++++++++++++------
 1 file changed, 31 insertions(+), 6 deletions(-)

diff --git a/libavutil/intmath.h b/libavutil/intmath.h
index 8f7a69e..7d836d9 100644
--- a/libavutil/intmath.h
+++ b/libavutil/intmath.h
@@ -35,21 +35,29 @@
  * @{
  */
 
-#if HAVE_FAST_CLZ && AV_GCC_VERSION_AT_LEAST(3,4)
-
+#if HAVE_FAST_CLZ
+#if AV_GCC_VERSION_AT_LEAST(3,4)
 #ifndef ff_log2
 #   define ff_log2(x) (31 - __builtin_clz((x)|1))
 #   ifndef ff_log2_16bit
 #      define ff_log2_16bit av_log2
 #   endif
 #endif /* ff_log2 */
-
+#elif defined( __INTEL_COMPILER )
+#ifndef ff_log2
+#   define ff_log2(x) (_bit_scan_reverse(x|1))
+#   ifndef ff_log2_16bit
+#      define ff_log2_16bit av_log2
+#   endif
+#endif /* ff_log2 */
+#endif
 #endif /* AV_GCC_VERSION_AT_LEAST(3,4) */
 
 extern const uint8_t ff_log2_tab[256];
 
 #ifndef ff_log2
 #define ff_log2 ff_log2_c
+#if !defined( _MSC_VER )
 static av_always_inline av_const int ff_log2_c(unsigned int v)
 {
     int n = 0;
@@ -65,6 +73,15 @@ static av_always_inline av_const int ff_log2_c(unsigned int v)
 
     return n;
 }
+#else
+static av_always_inline av_const int ff_log2_c(unsigned int v)
+{
+    int n = 0;
+    _BitScanReverse((unsigned long *)&n, v|1);
+    return n;
+}
+#define ff_log2_16bit av_log2
+#endif
 #endif
 
 #ifndef ff_log2_16bit
@@ -94,10 +111,16 @@ static av_always_inline av_const int ff_log2_16bit_c(unsigned int v)
  * @{
  */
 
-#if HAVE_FAST_CLZ && AV_GCC_VERSION_AT_LEAST(3,4)
+#if HAVE_FAST_CLZ
+#if AV_GCC_VERSION_AT_LEAST(3,4)
 #ifndef ff_ctz
 #define ff_ctz(v) __builtin_ctz(v)
 #endif
+#elif defined( __INTEL_COMPILER )
+#ifndef ff_ctz
+#define ff_ctz(v) _bit_scan_forward(v)
+#endif
+#endif
 #endif
 
 #ifndef ff_ctz
@@ -105,7 +128,7 @@ static av_always_inline av_const int ff_log2_16bit_c(unsigned int v)
 static av_always_inline av_const int ff_ctz_c(int v)
 {
     int c;
-
+#if !defined( _MSC_VER )
     if (v & 0x1)
         return 0;
 
@@ -127,7 +150,9 @@ static av_always_inline av_const int ff_ctz_c(int v)
         c += 2;
     }
     c -= v & 0x1;
-
+#else
+    _BitScanForward( (unsigned long *)&c, v );
+#endif
     return c;
 }
 #endif
-- 
1.9.4.msysgit.1

