sim: bfin: avoid left shifting negative values
authorMike Frysinger <vapier@gentoo.org>
Sun, 7 Jan 2024 05:22:55 +0000 (00:22 -0500)
committerMike Frysinger <vapier@gentoo.org>
Tue, 9 Jan 2024 01:01:45 +0000 (20:01 -0500)
We just want to create a bitmask here, so cast the mask to unsigned
to avoid left shifting a negative value which is undefined behavior.

sim/bfin/bfin-sim.c

index 1a9b499..2e7a563 100644 (file)
@@ -786,7 +786,7 @@ lshift (SIM_CPU *cpu, bu64 val, int cnt, int size, bool saturate, bool overflow)
      However, it's a little more complex than looking at sign bits, we need
      to see if we are shifting the sign information away...  */
   if (((val << cnt) >> size) == 0
-      || (((val << cnt) >> size) == ~(~0 << cnt)
+      || (((val << cnt) >> size) == ~((bu32)~0 << cnt)
          && ((new_val >> (size - 1)) & 0x1)))
     v_i = 0;
   else
@@ -5880,7 +5880,7 @@ decode_dsp32shiftimm_0 (SIM_CPU *cpu, bu16 iw0, bu16 iw1)
              bu16 inshift = in << shift;
 
              if (((inshift & ~0xFFFF)
-                  && ((inshift & ~0xFFFF) >> 16) != ~(~0 << shift))
+                  && ((inshift & ~0xFFFF) >> 16) != ~((bu32)~0 << shift))
                  || (inshift & 0x8000) != (in & 0x8000))
                {
                  if (in & 0x8000)