OSDN Git Service

lavu/intmath.h: Add msvc/icl ctzll optimisations.
authorMatt Oliver <protogonoi@gmail.com>
Fri, 16 Oct 2015 05:58:43 +0000 (16:58 +1100)
committerMatt Oliver <protogonoi@gmail.com>
Mon, 19 Oct 2015 02:40:27 +0000 (13:40 +1100)
Signed-off-by: Matt Oliver <protogonoi@gmail.com>
libavutil/x86/intmath.h

index fefad20..3ba5ed0 100644 (file)
 #include <stdint.h>
 #include "config.h"
 
+#if HAVE_FAST_CLZ
+#if defined(__INTEL_COMPILER)
+#   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;
+#   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_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);
+#   else
+    if ((uint32_t)v == 0) {
+        _BitScanForward(&c, (uint32_t)(v >> 32));
+        c += 32;
+    } else {
+        _BitScanForward(&c, (uint32_t)v);
+    }
+#   endif
+    return c;
+}
+
+#endif /* __INTEL_COMPILER */
+
+#endif /* HAVE_FAST_CLZ */
+
 #if defined(__GNUC__)
 
 /* Our generic version of av_popcount is faster than GCC's built-in on