[FFmpeg-cvslog] avutil/x86/intmath: Use tzcnt in place of bsf.

Matt Oliver git at videolan.org
Sat Oct 31 13:14:21 CET 2015


ffmpeg | branch: master | Matt Oliver <protogonoi at gmail.com> | Wed Oct 28 18:47:16 2015 +1100| [6c6ac9cb17c4944514bde833f2fa8aa8dafa974a] | committer: Matt Oliver

avutil/x86/intmath: Use tzcnt in place of bsf.

Signed-off-by: Matt Oliver <protogonoi at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=6c6ac9cb17c4944514bde833f2fa8aa8dafa974a
---

 libavutil/x86/intmath.h |   54 +++++++++++++----------------------------------
 1 file changed, 15 insertions(+), 39 deletions(-)

diff --git a/libavutil/x86/intmath.h b/libavutil/x86/intmath.h
index 7881e3c..61d1a73 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 */
 



More information about the ffmpeg-cvslog mailing list