From: Richard Henderson <[email protected]>
> > -static inline int divs128(int64_t *plow, int64_t *phigh, int64_t
> > divisor)
> > +static inline void divs128(int64_t *plow, int64_t *phigh, int64_t
> > +divisor)
> > {
> > - if (divisor == 0) {
> > - return 1;
> > - } else {
> > - __int128_t dividend = ((__int128_t)*phigh << 64) | *plow;
> > - __int128_t result = dividend / divisor;
> > - *plow = result;
> > - *phigh = dividend % divisor;
> > - return result != *plow;
> > - }
> > + __int128_t dividend = ((__int128_t)*phigh << 64) | *plow;
>
> This is incorrect, before and after: *plow must be zero-extended here.
This will no longer be a problem after patch 4, when plow is changed to be
uint64_t*, but I can fix it here, too.
> > @@ -97,13 +101,11 @@ int divu128(uint64_t *plow, uint64_t *phigh, uint64_t
> divisor)
> > uint64_t carry = 0;
> >
> > if (divisor == 0) {
> > - return 1;
> > + /* intentionally cause a division by 0 */
> > + *plow = 1 / divisor;
> > } else if (dhi == 0) {
> > *plow = dlo / divisor;
> > *phigh = dlo % divisor;
>
> Let's not do two undefined things and leave *phigh uninitialized (e.g. riscv
> host,
> where div-by-zero does not trap). Just fold the div-by-zero case into the
> dhi == 0
> case.
Will do.
--
Luis Pires
Instituto de Pesquisas ELDORADO
Aviso Legal - Disclaimer <https://www.eldorado.org.br/disclaimer.html>