|
@@ -11,11 +11,18 @@
|
|
|
|
|
|
unsigned int hweight32(unsigned int w)
|
|
|
{
|
|
|
+#ifdef ARCH_HAS_FAST_MULTIPLIER
|
|
|
+ w -= (w >> 1) & 0x55555555;
|
|
|
+ w = (w & 0x33333333) + ((w >> 2) & 0x33333333);
|
|
|
+ w = (w + (w >> 4)) & 0x0f0f0f0f;
|
|
|
+ return (w * 0x01010101) >> 24;
|
|
|
+#else
|
|
|
unsigned int res = w - ((w >> 1) & 0x55555555);
|
|
|
res = (res & 0x33333333) + ((res >> 2) & 0x33333333);
|
|
|
res = (res + (res >> 4)) & 0x0F0F0F0F;
|
|
|
res = res + (res >> 8);
|
|
|
return (res + (res >> 16)) & 0x000000FF;
|
|
|
+#endif
|
|
|
}
|
|
|
EXPORT_SYMBOL(hweight32);
|
|
|
|