in src/gpu_types.cc [92:119]
void magicu64(uint d, uint &magic, uint &shift)
{
// common cases
if (d == 1) { magic = 1; shift = 0; }
else if (d == 2) { magic = 1; shift = 1; }
else if (d == 4) { magic = 1; shift = 2; }
else if (d == 8) { magic = 1; shift = 3; }
else
{
// 3 is a special case that only ends up in the high bits if the nmax is 0xffffffff
// we can't use 0xffffffff for all cases as some return a 33 bit magic number
uint nbits = d == 3 ? (2*32)+1 : (2*31)+1;
uint64 nmax = d == 3 ? 0xffffffff : 0x7fffffff;
uint64 d64 = d;
uint64 nc = ((nmax + 1ull) / d64) * d64 - 1ull;
for (uint p = 0; p < nbits; p++)
{
if ((1ull << p) > nc * (d64 - 1ull - ((1ull << p) - 1ull) % d64))
{
magic = (uint)(((1ull << p) + d64 - 1ull - ((1ull << p) - 1ull) % d64) / d64);
shift = magic == 1 ? p : p - 32;
//printf("div:%u magic:%u shift:%u\n", d, magic, shift);
return;
}
}
}
}