qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [RFC PATCH 1/8] qemu/int128: avoid undefined behavior in int128_lshi


From: Richard Henderson
Subject: Re: [RFC PATCH 1/8] qemu/int128: avoid undefined behavior in int128_lshift
Date: Wed, 30 Mar 2022 12:07:22 -0600
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.7.0

On 3/30/22 11:59, matheus.ferst@eldorado.org.br wrote:
From: Matheus Ferst <matheus.ferst@eldorado.org.br>

Avoid the left shift of negative values in int128_lshift by casting
a/a.hi to unsigned.

Signed-off-by: Matheus Ferst <matheus.ferst@eldorado.org.br>

Eh, maybe. We do this all over qemu, and I think any undefinedness you're thinking of in the base C standard is removed by the -fwrapv with which all files are compiled.


r~

---
  include/qemu/int128.h | 4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/qemu/int128.h b/include/qemu/int128.h
index 2c4064256c..2a19558ac6 100644
--- a/include/qemu/int128.h
+++ b/include/qemu/int128.h
@@ -85,7 +85,7 @@ static inline Int128 int128_rshift(Int128 a, int n)
static inline Int128 int128_lshift(Int128 a, int n)
  {
-    return a << n;
+    return (__uint128_t)a << n;
  }
static inline Int128 int128_add(Int128 a, Int128 b)
@@ -305,7 +305,7 @@ static inline Int128 int128_lshift(Int128 a, int n)
      if (n >= 64) {
          return int128_make128(0, l);
      } else if (n > 0) {
-        return int128_make128(l, (a.hi << n) | (a.lo >> (64 - n)));
+        return int128_make128(l, ((uint64_t)a.hi << n) | (a.lo >> (64 - n)));
      }
      return a;
  }




reply via email to

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