From 216cc1f6fe33b256ce708fade5e6638b2bb54d2b Mon Sep 17 00:00:00 2001 From: Matt Oliver Date: Fri, 16 Oct 2015 16:58:43 +1100 Subject: lavu/intmath.h: Add msvc/icl ctzll optimisations. Signed-off-by: Matt Oliver --- libavutil/x86/intmath.h | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'libavutil') diff --git a/libavutil/x86/intmath.h b/libavutil/x86/intmath.h index fefad205e6..3ba5ed072c 100644 --- a/libavutil/x86/intmath.h +++ b/libavutil/x86/intmath.h @@ -24,6 +24,41 @@ #include #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 -- cgit v1.2.3