avutil/x86/intmath: Use tzcnt in place of bsf.
authorMatt Oliver <protogonoi@gmail.com>
Wed, 28 Oct 2015 07:47:16 +0000 (18:47 +1100)
committerMatt Oliver <protogonoi@gmail.com>
Sat, 31 Oct 2015 12:11:32 +0000 (23:11 +1100)
Signed-off-by: Matt Oliver <protogonoi@gmail.com>
libavutil/x86/intmath.h

index 7881e3c..61d1a73 100644 (file)
 #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 */