#include #include inline int popcount_simple(uint64_t x) { int c = 0; for (uint64_t i = 0; i < 64; i++) { if ((x & (1ull << i)) != 0) { c++; } } return c; } // Simple, very fast pseudo-random number generator uint64_t RandLFSR(uint64_t &seed) { uint64_t bit; uint64_t temp = seed; bit = ((temp >> 0) ^ (temp >> 1) ^ (temp >> 3) ^ (temp >> 4)) & 0x1llu; seed = (temp >> 1) | (bit << 63); return seed; } int identity(uint64_t x) { return x; } int main(int argc, char *argv[]) { uint64_t key = 0xdeadbeef; if (argc != 2) { printf("%s \n",argv[0]); exit(-1); } int count = 100000000; int method = atoi(argv[1]); uint64_t sum = 0; #define ALG(ALG_NUM, ALG_NAME) case ALG_NUM: \ for (int i=0; i < count; i++) \ { sum += ALG_NAME (RandLFSR(key)); } \ printf("%d %s result: %llu\n",ALG_NUM, #ALG_NAME, sum); \ break switch(method) { ALG(0, identity); ALG(1, popcount_simple); } return sum; }