Vincent Lefevre <vinc...@vinc17.net> writes: > On 2023-07-19 21:24:03 +0200, Niels Möller wrote: >> I think that's needed, to be able to support any size of >> MINI_GMP_LIMB_TYPE. Something like >> >> #define umullo_limb(u, v) \ >> (sizeof(mp_limb_t) >= sizeof(int)) ? (u)*(v) : (unsigned int)(u) * (v)) >> >> If I understand you correctly, the two multiplies in >> gmp_udiv_qrnnd_preinv and gmp_udiv_qr_3by2 are the only places where we >> need a mullo operation, i.e., producing the low limb of a limb product? > > These are the only ones that affect MPFR, but I haven't looked > at the whole code.
Can you try out the attached patch? Regards, /Niels
diff -r 73d9ef70d14f mini-gmp/mini-gmp.c --- a/mini-gmp/mini-gmp.c Wed Jul 19 11:44:37 2023 +0200 +++ b/mini-gmp/mini-gmp.c Wed Jul 19 21:54:11 2023 +0200 @@ -172,12 +172,19 @@ } \ } while (0) +/* If mp_limb_t is of size smaller than int, plain u*v implies + automatic promotion to *signed* int, and then multiply may overflow + and cause undefined behavior. Explicitly cast to unsigned int for + that case. */ +#define gmp_umullo_limb(u, v) \ + ((sizeof(mp_limb_t) >= sizeof(int)) ? (u)*(v) : (unsigned int)(u) * (v)) + #define gmp_udiv_qrnnd_preinv(q, r, nh, nl, d, di) \ do { \ mp_limb_t _qh, _ql, _r, _mask; \ gmp_umul_ppmm (_qh, _ql, (nh), (di)); \ gmp_add_ssaaaa (_qh, _ql, _qh, _ql, (nh) + 1, (nl)); \ - _r = (nl) - _qh * (d); \ + _r = (nl) - gmp_umullo_limb (_qh, (d)); \ _mask = -(mp_limb_t) (_r > _ql); /* both > and >= are OK */ \ _qh += _mask; \ _r += _mask & (d); \ @@ -198,7 +205,7 @@ gmp_add_ssaaaa ((q), _q0, (q), _q0, (n2), (n1)); \ \ /* Compute the two most significant limbs of n - q'd */ \ - (r1) = (n1) - (d1) * (q); \ + (r1) = (n1) - gmp_umullo_limb ((d1), (q)); \ gmp_sub_ddmmss ((r1), (r0), (r1), (n0), (d1), (d0)); \ gmp_umul_ppmm (_t1, _t0, (d0), (q)); \ gmp_sub_ddmmss ((r1), (r0), (r1), (r0), _t1, _t0); \
-- Niels Möller. PGP key CB4962D070D77D7FCB8BA36271D8F1FF368C6677. Internet email is subject to wholesale government surveillance.
_______________________________________________ gmp-bugs mailing list gmp-bugs@gmplib.org https://gmplib.org/mailman/listinfo/gmp-bugs