The sparc64 popc works in O(lg(n)), the "optimized" code below work in O(n). Could be better to generalize the sparc64 code, like this:

static always_inline int ctpop32 (uint32_t val)
{
        uint32_t i;

        i = (val & 0x55555555) + ((val >>  1) & 0x55555555);
        i = (i   & 0x33333333) + ((i   >>  2) & 0x33333333);
        i = (i   & 0x0f0f0f0f) + ((i   >>  4) & 0x0f0f0f0f);
        i = (i   & 0x00ff00ff) + ((i   >>  8) & 0x00ff00ff);
        i = (i   & 0x0000ffff) + ((i   >> 16) & 0x0000ffff);

        return i;
}

For the 64 bit version see target-sparc/op_helper.c

Best regards,
Eddie

Blue Swirl wrote:
On 10/27/07, J. Mayer <[EMAIL PROTECTED]> wrote:
I also got optimized versions of bit population count which could also
be shared:
static always_inline int ctpop32 (uint32_t val)
{
    int i;

    for (i = 0; val != 0; i++)
        val = val ^ (val - 1);

    return i;
}

If you prefer, I can add those shared functions (ctz32, ctz64, cto32,
cto64, ctpop32, ctpop64) later, as they do not seem as widely used as
clxxx functions.

This would be interesting for Sparc64. Could you compare your version
to do_popc() in target-sparc/op_helper.c?



--
___________________________________________________brainaid_____________
Eddie C. Dost           Rue de la Chapelle 51      phone +32 87 788817
                        B-4850 Moresnet            fax   +32 87 788818
[EMAIL PROTECTED]         Belgium                    cell  +49 172 9312808


Reply via email to