[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: [PATCH v2 03/19] host-utils: move checks out of divu128/divs128
From: |
Luis Fernando Fujita Pires |
Subject: |
RE: [PATCH v2 03/19] host-utils: move checks out of divu128/divs128 |
Date: |
Thu, 2 Sep 2021 21:07:46 +0000 |
From: Richard Henderson <richard.henderson@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>
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- RE: [PATCH v2 03/19] host-utils: move checks out of divu128/divs128,
Luis Fernando Fujita Pires <=