summaryrefslogtreecommitdiff
path: root/libavutil/intmath.h
diff options
context:
space:
mode:
authorMatthew Oliver <protogonoi@gmail.com>2014-10-27 01:43:15 +1100
committerMichael Niedermayer <michaelni@gmx.at>2014-10-26 17:20:55 +0100
commit2060f4cbba62d80d331624486e3ac106264699f8 (patch)
treede9706bfce9c15bf20b16486ba07002f7a82e1d5 /libavutil/intmath.h
parentc0002ddb019d7f2f22da301b2855f86d697d37bd (diff)
avutil/intmath: enable builtin intrinsics for icl and msvc.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavutil/intmath.h')
-rw-r--r--libavutil/intmath.h40
1 files changed, 36 insertions, 4 deletions
diff --git a/libavutil/intmath.h b/libavutil/intmath.h
index 8f7a69eae1..308c776bb7 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)
+{
+ 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
/**