sim: bfin: tweak saturation handling with TFU/FU modes and MM bit
authorMike Frysinger <vapier@gentoo.org>
Sat, 18 Jun 2011 21:22:50 +0000 (21:22 +0000)
committerMike Frysinger <vapier@gentoo.org>
Sat, 18 Jun 2011 21:22:50 +0000 (21:22 +0000)
This too should have been squashed into an earlier change.  It covers
a few more cases in the V/VS saturation patch when working with TFU
and FU modes of dsp insns.

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 31efa11cbce05849b2cf6b6f59ba211157451534..5033c22d66d0078fdbe528fa158bf5fb13e7f2bc 100644 (file)
@@ -1,3 +1,8 @@
+2011-06-18  Robin Getz  <robin.getz@analog.com>
+
+       * bfin-sim.c (decode_macfunc): Handle MM when mmod is M_TFU.
+       Check MM once when mmod is M_FU to match M_TFU better.
+
 2011-06-18  Robin Getz  <robin.getz@analog.com>
 
        * bfin-sim.c (decode_dsp32shiftimm_0): When shift is greater than
index b982aaf70a084be1a2ce3de090ec38c0ae0013e5..20602b752e6c4ea064ba1236b878d2f367004196 100644 (file)
@@ -1617,10 +1617,20 @@ decode_macfunc (SIM_CPU *cpu, int which, int op, int h0, int h1, int src0,
            acc = 0x7fffffffffull, sat = 1;
          break;
        case M_TFU:
-         if (!MM && (bs64)acc < 0)
-           acc = 0, sat = 1;
-         if (!MM && (bs64)acc > 0xFFFFFFFFFFull)
-           acc = 0xFFFFFFFFFFull, sat = 1;
+         if (MM)
+           {
+             if ((bs64)acc < -((bs64)1 << 39))
+               acc = -((bu64)1 << 39), sat = 1;
+             if ((bs64)acc > 0x7FFFFFFFFFll)
+               acc = 0x7FFFFFFFFFull, sat = 1;
+           }
+         else
+           {
+             if ((bs64)acc < 0)
+               acc = 0, sat = 1;
+             if ((bs64)acc > 0xFFFFFFFFFFull)
+               acc = 0xFFFFFFFFFFull, sat = 1;
+           }
          break;
        case M_IU:
          if (!MM && acc & 0x8000000000000000ull)
@@ -1633,16 +1643,22 @@ decode_macfunc (SIM_CPU *cpu, int which, int op, int h0, int h1, int src0,
            acc |= 0xffffff0000000000ull;
          break;
        case M_FU:
-         if (!MM && (bs64)acc < 0)
-           acc = 0x0, sat = 1;
-         if (MM && (bs64)acc < -((bs64)1 << 39))
-           acc = -((bu64)1 << 39), sat = 1;
-         if (!MM && (bs64)acc > (bs64)0xFFFFFFFFFFll)
-           acc = 0xFFFFFFFFFFull, sat = 1;
-         if (MM && acc > 0xFFFFFFFFFFull)
-           acc &= 0xFFFFFFFFFFull;
-         if (MM && acc & 0x8000000000ull)
-           acc |= 0xffffff0000000000ull;
+         if (MM)
+           {
+             if ((bs64)acc < -((bs64)1 << 39))
+               acc = -((bu64)1 << 39), sat = 1;
+             if ((bs64)acc > 0x7FFFFFFFFFll)
+               acc = 0x7FFFFFFFFFull, sat = 1;
+             else if (acc & 0x8000000000ull)
+               acc |= 0xffffff0000000000ull;
+           }
+         else
+           {
+             if ((bs64)acc < 0)
+               acc = 0x0, sat = 1;
+             else if ((bs64)acc > (bs64)0xFFFFFFFFFFll)
+               acc = 0xFFFFFFFFFFull, sat = 1;
+           }
          break;
        case M_IH:
          if ((bs64)acc < -0x80000000ll)