diff options
author | Matt Oliver <protogonoi@gmail.com> | 2015-10-28 18:47:16 +1100 |
---|---|---|
committer | Matt Oliver <protogonoi@gmail.com> | 2015-10-31 23:11:32 +1100 |
commit | 6c6ac9cb17c4944514bde833f2fa8aa8dafa974a (patch) | |
tree | ec1b52a8f2e19eab06511a23c121069739af331e /libavutil/x86/intmath.h | |
parent | e82883aa88bfccf2669e914eab9deef6cecfd0db (diff) | |
download | ffmpeg-6c6ac9cb17c4944514bde833f2fa8aa8dafa974a.tar.gz |
avutil/x86/intmath: Use tzcnt in place of bsf.
Signed-off-by: Matt Oliver <protogonoi@gmail.com>
Diffstat (limited to 'libavutil/x86/intmath.h')
-rw-r--r-- | libavutil/x86/intmath.h | 54 |
1 files changed, 15 insertions, 39 deletions
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 */ |