[prev in list] [next in list] [prev in thread] [next in thread] 

List:       qemu-ppc
Subject:    Re: [PATCH v2 03/19] host-utils: move checks out of divu128/divs128
From:       Richard Henderson <richard.henderson () linaro ! org>
Date:       2021-08-31 17:21:55
Message-ID: 984687eb-4d74-38e4-70ef-b8c527fe828b () linaro ! org
[Download RAW message or body]

On 8/31/21 9:39 AM, Luis Pires wrote:
> -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.


> @@ -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.


r~

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic