sim: bfin: fix accumulator edge case saturation
authorMike Frysinger <vapier@gentoo.org>
Sat, 18 Jun 2011 17:27:01 +0000 (17:27 +0000)
committerMike Frysinger <vapier@gentoo.org>
Sat, 18 Jun 2011 17:27:01 +0000 (17:27 +0000)
When the accumulator saturates, it needs to be greater than, but not
equal to, the largest unsigned value as this is what the hardware does.

Signed-off-by: Robin Getz <robin.getz@analog.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
sim/bfin/ChangeLog
sim/bfin/bfin-sim.c

index 5aab117..75de6f4 100644 (file)
@@ -1,3 +1,8 @@
+2011-06-18  Robin Getz  <robin.getz@analog.com>
+
+       * bfin-sim.c (saturate_s40_astat): Change ">" to ">=".
+       (decode_macfunc): Likewise when mmod is M_IH.
+
 2011-06-18  Mike Frysinger  <vapier@gentoo.org>
 
        * interp.c (sim_create_inferior): Change free to freeargv.
index 1cdfd27..31136a0 100644 (file)
@@ -1398,7 +1398,7 @@ saturate_s40_astat (bu64 val, bu32 *v)
       *v = 1;
       return -((bs64)1 << 39);
     }
-  else if ((bs64)val >= ((bs64)1 << 39) - 1)
+  else if ((bs64)val > ((bs64)1 << 39) - 1)
     {
       *v = 1;
       return ((bu64)1 << 39) - 1;
@@ -1645,7 +1645,7 @@ decode_macfunc (SIM_CPU *cpu, int which, int op, int h0, int h1, int src0,
        case M_IH:
          if ((bs64)acc < -0x80000000ll)
            acc = -0x80000000ull, sat = 1;
-         else if ((bs64)acc >= 0x7fffffffll)
+         else if ((bs64)acc > 0x7fffffffll)
            acc = 0x7fffffffull, sat = 1;
          break;
        case M_W32: