This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH] sim: bfin: fix sign extension in dsp insns with MM flag
- From: Mike Frysinger <vapier at gentoo dot org>
- To: gdb-patches at sourceware dot org
- Cc: Robin Getz <robin dot getz at analog dot com>
- Date: Sat, 18 Jun 2011 15:42:32 -0400
- Subject: [PATCH] sim: bfin: fix sign extension in dsp insns with MM flag
From: Robin Getz <robin.getz@analog.com>
After testing the hardware with all the different dsp flags, the MM flag
triggers sign extension in all modes. So drop the limited use of it, and
the local custom helper that was also extending unsigned values. We also
can see that the flag checks in the mult/mac insns have the same behavior
with sign extending, so add a helper func to keep the logic the same in
both places.
Committed.
Signed-off-by: Robin Getz <robin.getz@analog.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
include/opcode/:
2011-06-18 Robin Getz <robin.getz@analog.com>
* bfin.h (is_macmod_signed): New func
sim/bfin/:
2011-06-18 Robin Getz <robin.getz@analog.com>
* bfin-sim.c (decode_multfunc): Call new is_macmod_signed, and
allow MM to sign extend all the time.
(decode_macfunc): Likewise. Drop sign extension of unsigned
values.
---
include/opcode/bfin.h | 6 ++++++
sim/bfin/bfin-sim.c | 11 +++--------
2 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/include/opcode/bfin.h b/include/opcode/bfin.h
index 30bb90d..26f0193 100755
--- a/include/opcode/bfin.h
+++ b/include/opcode/bfin.h
@@ -53,6 +53,12 @@ static inline int is_macmod_hmove (int x)
|| (x == M_TFU) || (x == M_S2RND) || (x == M_ISS2) || (x == M_IH);
}
+static inline int is_macmod_signed (int x)
+{
+ return (x == 0) || (x == M_IS) || (x == M_T) || (x == M_S2RND)
+ || (x == M_ISS2) || (x == M_IH) || (x == M_W32);
+}
+
/* dsp32mac
+----+----+---+---|---+----+----+---|---+---+---+---|---+---+---+---+
| 1 | 1 | 0 | 0 |.M.| 0 | 0 |.mmod..........|.MM|.P.|.w1|.op1...|
diff --git a/sim/bfin/bfin-sim.c b/sim/bfin/bfin-sim.c
index 5b8d601..017ddca 100644
--- a/sim/bfin/bfin-sim.c
+++ b/sim/bfin/bfin-sim.c
@@ -1380,8 +1380,8 @@ decode_multfunc (SIM_CPU *cpu, int h0, int h1, int src0, int src1, int mmod,
}
val1 = val;
- if (mmod == 0 || mmod == M_IS || mmod == M_T || mmod == M_S2RND
- || mmod == M_ISS2 || mmod == M_IH || (MM && mmod == M_FU))
+ /* In signed modes, sign extend. */
+ if (is_macmod_signed (mmod) || MM)
val1 |= -(val1 & 0x80000000);
if (*psat)
@@ -1579,16 +1579,11 @@ decode_macfunc (SIM_CPU *cpu, int which, int op, int h0, int h1, int src0,
bu32 sat = 0, tsat, ret;
/* Sign extend accumulator if necessary, otherwise unsigned. */
- if (mmod == 0 || mmod == M_T || mmod == M_IS || mmod == M_ISS2
- || mmod == M_S2RND || mmod == M_IH || mmod == M_W32)
+ if (is_macmod_signed (mmod) || MM)
acc = get_extended_acc (cpu, which);
else
acc = get_unextended_acc (cpu, which);
- if (MM && (mmod == M_T || mmod == M_IS || mmod == M_ISS2
- || mmod == M_S2RND || mmod == M_IH || mmod == M_W32))
- acc |= -(acc & 0x80000000);
-
if (op != 3)
{
bu8 sgn0 = (acc >> 31) & 1;
--
1.7.5.3