OSDN Git Service

host-utils: fix missing zero-extension in divs128
authorLuis Pires <luis.pires@eldorado.org.br>
Fri, 10 Sep 2021 11:26:04 +0000 (08:26 -0300)
committerDavid Gibson <david@gibson.dropbear.id.au>
Wed, 29 Sep 2021 09:37:38 +0000 (19:37 +1000)
*plow (lower 64 bits of the dividend) is passed into divs128() as
a signed 64-bit integer. When building an __int128_t from it, it
must be zero-extended, instead of sign-extended.

Suggested-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Luis Pires <luis.pires@eldorado.org.br>
Message-Id: <20210910112624.72748-3-luis.pires@eldorado.org.br>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
include/qemu/host-utils.h

index 711b221..753b9fb 100644 (file)
@@ -70,7 +70,7 @@ static inline int 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 dividend = ((__int128_t)*phigh << 64) | (uint64_t)*plow;
         __int128_t result = dividend / divisor;
         *plow = result;
         *phigh = dividend % divisor;