From: Richard Henderson <richard.hender...@linaro.org> > > -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>