From 6c6ac9cb17c4944514bde833f2fa8aa8dafa974a Mon Sep 17 00:00:00 2001 From: Matt Oliver Date: Wed, 28 Oct 2015 18:47:16 +1100 Subject: avutil/x86/intmath: Use tzcnt in place of bsf. Signed-off-by: Matt Oliver --- libavutil/x86/intmath.h | 54 ++++++++++++++----------------------------------- 1 file changed, 15 insertions(+), 39 deletions(-) (limited to 'libavutil') 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 */ -- cgit v1.2.3