void magicu64()

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;
            }
        }
    }
}