[PATCH] sim: bfin: fix dsp insns IH saturation/rounding behavior

Mike Frysinger vapier@gentoo.org
Sat Jun 18 19:24:00 GMT 2011


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

When using the IH modifier, we need to first saturate the value before
rounding it, and then further saturate it a bit more.  This makes the
sim match the hardware behavior with these 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 (extract_mult): When mmod is M_IH, change the order
	from round/saturate to saturate/round/saturate.
---
 sim/bfin/bfin-sim.c |   12 +++++++++++-
 1 files changed, 11 insertions(+), 1 deletions(-)

diff --git a/sim/bfin/bfin-sim.c b/sim/bfin/bfin-sim.c
index 15a804d..480cff0 100644
--- a/sim/bfin/bfin-sim.c
+++ b/sim/bfin/bfin-sim.c
@@ -1536,7 +1536,17 @@ extract_mult (SIM_CPU *cpu, bu64 res, int mmod, int MM,
       case M_W32:
 	return saturate_s16 (rnd16 (res), overflow);
       case M_IH:
-	return saturate_s32 (rnd16 (res), overflow) & 0xFFFF;
+	{
+	  bu32 sgn = !!(res >> 39);
+	  bu16 val = rnd16 (saturate_s32 (res, overflow));
+	  bu32 sgn0 = (val >> 15) & 1;
+	  if (sgn == sgn0 || !val)
+	    return val;
+	  if (sgn)
+	    return 0x8000;
+	  *overflow = 1;
+	  return 0x7FFF;
+	}
       case M_IS:
 	return saturate_s16 (res, overflow);
       case M_FU:
-- 
1.7.5.3



More information about the Gdb-patches mailing list