|
@@ -5,9 +5,10 @@
|
|
|
#include <stdlib.h> //To define "exit", req'd by XLC.
|
|
#include <stdlib.h> //To define "exit", req'd by XLC.
|
|
|
#include <ctime>
|
|
#include <ctime>
|
|
|
|
|
|
|
|
-unsigned rotatel(unsigned x, int n) {
|
|
|
|
|
- if ((unsigned)n > 63) {printf("rotatel, n out of range.\n"); exit(1);}
|
|
|
|
|
- return (x << n) | (x >> (32 - n));
|
|
|
|
|
|
|
+unsigned rotatel(unsigned x, int n)
|
|
|
|
|
+{
|
|
|
|
|
+ if ((unsigned)n > 63) {printf("rotatel, n out of range.\n"); exit(1);}
|
|
|
|
|
+ return (x << n) | (x >> (32 - n));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
int pop0(unsigned x)
|
|
int pop0(unsigned x)
|
|
@@ -20,45 +21,49 @@ int pop0(unsigned x)
|
|
|
return x;
|
|
return x;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-int pop1(unsigned x) {
|
|
|
|
|
- x = x - ((x >> 1) & 0x55555555);
|
|
|
|
|
- x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
|
|
|
|
|
- x = (x + (x >> 4)) & 0x0F0F0F0F;
|
|
|
|
|
- x = x + (x >> 8);
|
|
|
|
|
- x = x + (x >> 16);
|
|
|
|
|
- return x & 0x0000003F;
|
|
|
|
|
|
|
+int pop1(unsigned x)
|
|
|
|
|
+{
|
|
|
|
|
+ x = x - ((x >> 1) & 0x55555555);
|
|
|
|
|
+ x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
|
|
|
|
|
+ x = (x + (x >> 4)) & 0x0F0F0F0F;
|
|
|
|
|
+ x = x + (x >> 8);
|
|
|
|
|
+ x = x + (x >> 16);
|
|
|
|
|
+ return x & 0x0000003F;
|
|
|
}
|
|
}
|
|
|
/* Note: an alternative to the last three executable lines above is:
|
|
/* Note: an alternative to the last three executable lines above is:
|
|
|
return x*0x01010101 >> 24;
|
|
return x*0x01010101 >> 24;
|
|
|
if your machine has a fast multiplier (suggested by Jari Kirma). */
|
|
if your machine has a fast multiplier (suggested by Jari Kirma). */
|
|
|
|
|
|
|
|
-int pop2(unsigned x) {
|
|
|
|
|
- unsigned n;
|
|
|
|
|
-
|
|
|
|
|
- n = (x >> 1) & 033333333333; // Count bits in
|
|
|
|
|
- x = x - n; // each 3-bit
|
|
|
|
|
- n = (n >> 1) & 033333333333; // field.
|
|
|
|
|
- x = x - n;
|
|
|
|
|
- x = (x + (x >> 3)) & 030707070707; // 6-bit sums.
|
|
|
|
|
- return x%63; // Add 6-bit sums.
|
|
|
|
|
|
|
+int pop2(unsigned x)
|
|
|
|
|
+{
|
|
|
|
|
+ unsigned n;
|
|
|
|
|
+
|
|
|
|
|
+ n = (x >> 1) & 033333333333; // Count bits in
|
|
|
|
|
+ x = x - n; // each 3-bit
|
|
|
|
|
+ n = (n >> 1) & 033333333333; // field.
|
|
|
|
|
+ x = x - n;
|
|
|
|
|
+ x = (x + (x >> 3)) & 030707070707; // 6-bit sums.
|
|
|
|
|
+ return x%63; // Add 6-bit sums.
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
/* An alternative to the "return" statement above is:
|
|
/* An alternative to the "return" statement above is:
|
|
|
return ((x * 0404040404) >> 26) + // Add 6-bit sums.
|
|
return ((x * 0404040404) >> 26) + // Add 6-bit sums.
|
|
|
(x >> 30);
|
|
(x >> 30);
|
|
|
which runs faster on most machines (suggested by Norbert Juffa). */
|
|
which runs faster on most machines (suggested by Norbert Juffa). */
|
|
|
|
|
|
|
|
-int pop3(unsigned x) {
|
|
|
|
|
- unsigned n;
|
|
|
|
|
-
|
|
|
|
|
- n = (x >> 1) & 0x77777777; // Count bits in
|
|
|
|
|
- x = x - n; // each 4-bit
|
|
|
|
|
- n = (n >> 1) & 0x77777777; // field.
|
|
|
|
|
- x = x - n;
|
|
|
|
|
- n = (n >> 1) & 0x77777777;
|
|
|
|
|
- x = x - n;
|
|
|
|
|
- x = (x + (x >> 4)) & 0x0F0F0F0F; // Get byte sums.
|
|
|
|
|
- x = x*0x01010101; // Add the bytes.
|
|
|
|
|
- return x >> 24;
|
|
|
|
|
|
|
+int pop3(unsigned x)
|
|
|
|
|
+{
|
|
|
|
|
+ unsigned n;
|
|
|
|
|
+
|
|
|
|
|
+ n = (x >> 1) & 0x77777777; // Count bits in
|
|
|
|
|
+ x = x - n; // each 4-bit
|
|
|
|
|
+ n = (n >> 1) & 0x77777777; // field.
|
|
|
|
|
+ x = x - n;
|
|
|
|
|
+ n = (n >> 1) & 0x77777777;
|
|
|
|
|
+ x = x - n;
|
|
|
|
|
+ x = (x + (x >> 4)) & 0x0F0F0F0F; // Get byte sums.
|
|
|
|
|
+ x = x*0x01010101; // Add the bytes.
|
|
|
|
|
+ return x >> 24;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
int pop4(unsigned x)
|
|
int pop4(unsigned x)
|
|
@@ -101,67 +106,72 @@ int pop5a(unsigned x)
|
|
|
return sum;
|
|
return sum;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-int pop6(unsigned x) { // Table lookup.
|
|
|
|
|
- static char table[256] = {
|
|
|
|
|
- 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
|
|
|
|
|
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
|
|
|
|
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
|
|
|
|
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
|
|
|
-
|
|
|
|
|
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
|
|
|
|
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
|
|
|
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
|
|
|
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
|
|
|
|
-
|
|
|
|
|
- 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
|
|
|
|
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
|
|
|
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
|
|
|
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
|
|
|
|
-
|
|
|
|
|
- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
|
|
|
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
|
|
|
|
- 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
|
|
|
|
- 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8};
|
|
|
|
|
-
|
|
|
|
|
- return table[x & 0xFF] +
|
|
|
|
|
- table[(x >> 8) & 0xFF] +
|
|
|
|
|
- table[(x >> 16) & 0xFF] +
|
|
|
|
|
- table[(x >> 24)];
|
|
|
|
|
|
|
+int pop6(unsigned x)
|
|
|
|
|
+{ // Table lookup.
|
|
|
|
|
+ static char table[256] = {
|
|
|
|
|
+ 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
|
|
|
|
|
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
|
|
|
|
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
|
|
|
|
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
|
|
|
+
|
|
|
|
|
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
|
|
|
|
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
|
|
|
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
|
|
|
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
|
|
|
|
+
|
|
|
|
|
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
|
|
|
|
|
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
|
|
|
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
|
|
|
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
|
|
|
|
+
|
|
|
|
|
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
|
|
|
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
|
|
|
|
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
|
|
|
|
+ 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8};
|
|
|
|
|
+
|
|
|
|
|
+ return table[x & 0xFF] +
|
|
|
|
|
+ table[(x >> 8) & 0xFF] +
|
|
|
|
|
+ table[(x >> 16) & 0xFF] +
|
|
|
|
|
+ table[(x >> 24)];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// The following works only for 8-bit quantities.
|
|
// The following works only for 8-bit quantities.
|
|
|
-int pop7(unsigned x) {
|
|
|
|
|
- x = x*0x08040201; // Make 4 copies.
|
|
|
|
|
- x = x >> 3; // So next step hits proper bits.
|
|
|
|
|
- x = x & 0x11111111; // Every 4th bit.
|
|
|
|
|
- x = x*0x11111111; // Sum the digits (each 0 or 1).
|
|
|
|
|
- x = x >> 28; // Position the result.
|
|
|
|
|
- return x;
|
|
|
|
|
|
|
+int pop7(unsigned x)
|
|
|
|
|
+{
|
|
|
|
|
+ x = x*0x08040201; // Make 4 copies.
|
|
|
|
|
+ x = x >> 3; // So next step hits proper bits.
|
|
|
|
|
+ x = x & 0x11111111; // Every 4th bit.
|
|
|
|
|
+ x = x*0x11111111; // Sum the digits (each 0 or 1).
|
|
|
|
|
+ x = x >> 28; // Position the result.
|
|
|
|
|
+ return x;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// The following works only for 7-bit quantities.
|
|
// The following works only for 7-bit quantities.
|
|
|
-int pop8(unsigned x) {
|
|
|
|
|
- x = x*0x02040810; // Make 4 copies, left-adjusted.
|
|
|
|
|
- x = x & 0x11111111; // Every 4th bit.
|
|
|
|
|
- x = x*0x11111111; // Sum the digits (each 0 or 1).
|
|
|
|
|
- x = x >> 28; // Position the result.
|
|
|
|
|
- return x;
|
|
|
|
|
|
|
+int pop8(unsigned x)
|
|
|
|
|
+{
|
|
|
|
|
+ x = x*0x02040810; // Make 4 copies, left-adjusted.
|
|
|
|
|
+ x = x & 0x11111111; // Every 4th bit.
|
|
|
|
|
+ x = x*0x11111111; // Sum the digits (each 0 or 1).
|
|
|
|
|
+ x = x >> 28; // Position the result.
|
|
|
|
|
+ return x;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// The following works only for 15-bit quantities.
|
|
// The following works only for 15-bit quantities.
|
|
|
-int pop9(unsigned x) {
|
|
|
|
|
- unsigned long long y;
|
|
|
|
|
- y = x * 0x0002000400080010ULL;
|
|
|
|
|
- y = y & 0x1111111111111111ULL;
|
|
|
|
|
- y = y * 0x1111111111111111ULL;
|
|
|
|
|
- y = y >> 60;
|
|
|
|
|
- return y;
|
|
|
|
|
|
|
+int pop9(unsigned x)
|
|
|
|
|
+{
|
|
|
|
|
+ unsigned long long y;
|
|
|
|
|
+ y = x * 0x0002000400080010ULL;
|
|
|
|
|
+ y = y & 0x1111111111111111ULL;
|
|
|
|
|
+ y = y * 0x1111111111111111ULL;
|
|
|
|
|
+ y = y >> 60;
|
|
|
|
|
+ return y;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
int errors;
|
|
int errors;
|
|
|
-void error(int x, int y) {
|
|
|
|
|
- errors = errors + 1;
|
|
|
|
|
- printf("Error for x = %08x, got %08x\n", x, y);
|
|
|
|
|
|
|
+void error(int x, int y)
|
|
|
|
|
+{
|
|
|
|
|
+ errors = errors + 1;
|
|
|
|
|
+ printf("Error for x = %08x, got %08x\n", x, y);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
int main()
|
|
int main()
|