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