t...@gmplib.org (Torbjörn Granlund) writes: > So I think plain / is the way to go for certain systems!
Then we should use that for the double limb loop too! It gets a bit tricky, since we need special handling of large quotients, but something like this should work: mp_limb_t q = ah / bh; mp_limb_t th, tl; if (UNLIKELY (q > bh)) { /* Poor accuracy, q may be more than one unit too small. Need normalize bh, and get quotient approximation with udiv_qrnnd */ ... /* And this will always be the last double-limb iteration. */ } else { ah -= q * bh; umul_ppmm (th, tl, q, bl); /* Unlikely because th < q, which usually is small */ if (UNLIKELY (th >= ah) && (th > ah || tl > al)) { ASSERT_ALWAYS (q > 0); /* Must be one off */ q--; ah += bh; sub_ddmmss (th, tl, th, tl, 0, bl); } sub_ddmmss (ah, al, ah, al, th, tl); } Regards, /Niels -- Niels Möller. PGP-encrypted email is preferred. Keyid 368C6677. Internet email is subject to wholesale government surveillance. _______________________________________________ gmp-devel mailing list gmp-devel@gmplib.org https://gmplib.org/mailman/listinfo/gmp-devel