Skip to content

Instantly share code, notes, and snippets.

@saidwho12
Created August 20, 2023 03:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save saidwho12/816675b6a651589089b09b7e4d6f9f2c to your computer and use it in GitHub Desktop.
Save saidwho12/816675b6a651589089b09b7e4d6f9f2c to your computer and use it in GitHub Desktop.
void CalcMultShift(uint64_t *mult, uint64_t *shift, uint64_t F2, uint64_t F1)
{
uint64_t m = 1, s;
uint64_t maxsft = __lzcnt64(F2);
printf("\nF1:%llu, F2:%llu\n\n", F1,F2);
for (s = 0; s < maxsft; ++s) {
uint64_t dividend = F2 << s;
uint64_t rem;
uint64_t divider = F1;
printf("\nNom: %016llx.0000000000000000, Denom: %016llx\n", dividend, divider);
if (!dividend || !divider)
break;
m = _udiv128(dividend, 0L, divider, &rem);
rem = _shrx_u64(rem, s);
printf("shift:%llu, mult=%016llx, rem=%016llx\n",s,m,rem);
if (!rem)
break;
}
*mult = m;
*shift = s;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment