qemu-devel
[Top][All Lists]
Advanced

[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>

reply via email to

[Prev in Thread] Current Thread [Next in Thread]