[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