This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] sim: bfin: tweak saturation handling with TFU/FU modes and MM bit


From: Robin Getz <robin.getz@analog.com>

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.

Committed.

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

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.
---
 sim/bfin/bfin-sim.c |   44 ++++++++++++++++++++++++++++++--------------
 1 files changed, 30 insertions(+), 14 deletions(-)

diff --git a/sim/bfin/bfin-sim.c b/sim/bfin/bfin-sim.c
index 49f2f41..9878c23 100644
--- a/sim/bfin/bfin-sim.c
+++ b/sim/bfin/bfin-sim.c
@@ -1619,10 +1619,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)
@@ -1635,16 +1645,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)
-- 
1.7.5.3


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]