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
