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

Reply via email to