summaryrefslogtreecommitdiff
path: root/libavutil/x86/intmath.h
diff options
context:
space:
mode:
authorMatt Oliver <protogonoi@gmail.com>2015-10-28 18:47:16 +1100
committerMatt Oliver <protogonoi@gmail.com>2015-10-31 23:11:32 +1100
commit6c6ac9cb17c4944514bde833f2fa8aa8dafa974a (patch)
treeec1b52a8f2e19eab06511a23c121069739af331e /libavutil/x86/intmath.h
parente82883aa88bfccf2669e914eab9deef6cecfd0db (diff)
avutil/x86/intmath: Use tzcnt in place of bsf.
Signed-off-by: Matt Oliver <protogonoi@gmail.com>
Diffstat (limited to 'libavutil/x86/intmath.h')
-rw-r--r--libavutil/x86/intmath.h54
1 files changed, 15 insertions, 39 deletions
diff --git a/libavutil/x86/intmath.h b/libavutil/x86/intmath.h
index 7881e3c7b6..61d1a7347c 100644
--- a/libavutil/x86/intmath.h
+++ b/libavutil/x86/intmath.h
@@ -25,55 +25,31 @@
#include "config.h"
#if HAVE_FAST_CLZ
-#if defined(__INTEL_COMPILER)
-# define ff_log2(x) (_bit_scan_reverse((x)|1))
-# define ff_log2_16bit av_log2
-
-# define ff_ctz(v) _bit_scan_forward(v)
-
-# define ff_ctzll ff_ctzll_x86
-static av_always_inline av_const int ff_ctzll_x86(long long v)
-{
-# if ARCH_X86_64
- uint64_t c;
- __asm__("bsfq %1,%0" : "=r" (c) : "r" (v));
- return c;
+#if defined(__INTEL_COMPILER) || defined(_MSC_VER)
+# if defined(__INTEL_COMPILER)
+# define ff_log2(x) (_bit_scan_reverse((x)|1))
# else
- return ((uint32_t)v == 0) ? _bit_scan_forward((uint32_t)(v >> 32)) + 32 : _bit_scan_forward((uint32_t)v);
-# endif
-}
-#elif defined(_MSC_VER)
-# define ff_log2 ff_log2_x86
-static av_always_inline av_const int ff_log2_x86(unsigned int v) {
+# define ff_log2 ff_log2_x86
+static av_always_inline av_const int ff_log2_x86(unsigned int v)
+{
unsigned long n;
- _BitScanReverse(&n, v | 1);
+ _BitScanReverse(&n, v|1);
return n;
}
+# endif
# define ff_log2_16bit av_log2
-# define ff_ctz ff_ctz_x86
-static av_always_inline av_const int ff_ctz_x86(int v) {
- unsigned long c;
- _BitScanForward(&c, v);
- return c;
-}
+# define ff_ctz(v) _tzcnt_u32(v)
-# define ff_ctzll ff_ctzll_x86
-static av_always_inline av_const int ff_ctzll_x86(long long v)
-{
- unsigned long c;
# if ARCH_X86_64
- _BitScanForward64(&c, v);
+# define ff_ctzll(v) _tzcnt_u64(v)
# else
- if ((uint32_t)v == 0) {
- _BitScanForward(&c, (uint32_t)(v >> 32));
- c += 32;
- } else {
- _BitScanForward(&c, (uint32_t)v);
- }
-# endif
- return c;
+# define ff_ctzll ff_ctzll_x86
+static av_always_inline av_const int ff_ctzll_x86(long long v)
+{
+ return ((uint32_t)v == 0) ? _tzcnt_u32((uint32_t)(v >> 32)) + 32 : _tzcnt_u32((uint32_t)v);
}
+# endif
#endif /* __INTEL_COMPILER */