Imported Debian version 2.5.0~trusty1.1
[deb_ffmpeg.git] / ffmpeg / libavutil / intmath.h
index 8f7a69eae12c9877ea15c07069d8bd723b649b5c..308c776bb7ec43734e845dd78a18121af0c16eb8 100644 (file)
  * @{
  */
 
-#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)
+{
+    unsigned long n;
+    _BitScanReverse(&n, v|1);
+    return n;
+}
+#define ff_log2_16bit av_log2
+#endif
 #endif
 
 #ifndef ff_log2_16bit
@@ -94,14 +111,21 @@ 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
 #define ff_ctz ff_ctz_c
+#if !defined( _MSC_VER )
 static av_always_inline av_const int ff_ctz_c(int v)
 {
     int c;
@@ -130,6 +154,14 @@ static av_always_inline av_const int ff_ctz_c(int v)
 
     return c;
 }
+#else
+static av_always_inline av_const int ff_ctz_c( int v )
+{
+    unsigned long c;
+    _BitScanForward(&c, v);
+    return c;
+}
+#endif
 #endif
 
 /**