Daniel Verkamp <[email protected]> writes:

> ---
>  libavutil/common.h |   18 ++++++++++++++++++
>  1 files changed, 18 insertions(+), 0 deletions(-)
>
> diff --git a/libavutil/common.h b/libavutil/common.h
> index 7e93a1a..847b8d6 100644
> --- a/libavutil/common.h
> +++ b/libavutil/common.h
> @@ -218,6 +218,21 @@ static av_always_inline av_const int 
> av_popcount_c(uint32_t x)
>      return (x + (x >> 16)) & 0x3F;
>  }
>
> +/**
> + * Count number of bits set to one in x
> + * @param x value to count bits of
> + * @return the number of bits set to one in x
> + */
> +static av_always_inline av_const int av_popcount64_c(uint64_t x)
> +{
> +    x -= ((x >> 1) & 0x5555555555555555);
> +    x = (x & 0x3333333333333333) + ((x  >> 2) & 0x3333333333333333);
> +    x =    (x + (x >> 4))  & 0x0F0F0F0F0F0F0F0F;
> +    x =    (x + (x >> 8))  & 0x00FF00FF00FF00FF;
> +    x =    (x + (x >> 16)) & 0x0000FFFF0000FFFF;
> +    return (x + (x >> 32)) & 0x7F;
> +}

Why not av_popcount32(x) + av_popcount32(x >> 32)?  That way it will
make use of any special 32-bit popcount implementation that might be
available.  If there is none, it should compile to the same code as your
version.

-- 
Måns Rullgård
[email protected]
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to