sim: bfin: fix sign extension in dsp insns with MM flag

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.

Signed-off-by: Robin Getz <robin.getz@analog.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
This commit is contained in:
Mike Frysinger 2011-06-18 19:42:55 +00:00
parent 075a845a92
commit ef26d60eba
4 changed files with 20 additions and 8 deletions

View File

@ -1,3 +1,7 @@
2011-06-18 Robin Getz <robin.getz@analog.com>
* bfin.h (is_macmod_signed): New func
2011-06-18 Mike Frysinger <vapier@gentoo.org> 2011-06-18 Mike Frysinger <vapier@gentoo.org>
* bfin.h (is_macmod_pmove): Add missing space before func args. * bfin.h (is_macmod_pmove): Add missing space before func args.

View File

@ -53,6 +53,12 @@ static inline int is_macmod_hmove (int x)
|| (x == M_TFU) || (x == M_S2RND) || (x == M_ISS2) || (x == M_IH); || (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 /* dsp32mac
+----+----+---+---|---+----+----+---|---+---+---+---|---+---+---+---+ +----+----+---+---|---+----+----+---|---+---+---+---|---+---+---+---+
| 1 | 1 | 0 | 0 |.M.| 0 | 0 |.mmod..........|.MM|.P.|.w1|.op1...| | 1 | 1 | 0 | 0 |.M.| 0 | 0 |.mmod..........|.MM|.P.|.w1|.op1...|

View File

@ -1,3 +1,10 @@
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.
2011-06-18 Robin Getz <robin.getz@analog.com> 2011-06-18 Robin Getz <robin.getz@analog.com>
* bfin-sim.c (extract_mult): When mmod is M_IH, change the order * bfin-sim.c (extract_mult): When mmod is M_IH, change the order

View File

@ -1380,8 +1380,8 @@ decode_multfunc (SIM_CPU *cpu, int h0, int h1, int src0, int src1, int mmod,
} }
val1 = val; val1 = val;
if (mmod == 0 || mmod == M_IS || mmod == M_T || mmod == M_S2RND /* In signed modes, sign extend. */
|| mmod == M_ISS2 || mmod == M_IH || (MM && mmod == M_FU)) if (is_macmod_signed (mmod) || MM)
val1 |= -(val1 & 0x80000000); val1 |= -(val1 & 0x80000000);
if (*psat) 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; bu32 sat = 0, tsat, ret;
/* Sign extend accumulator if necessary, otherwise unsigned. */ /* Sign extend accumulator if necessary, otherwise unsigned. */
if (mmod == 0 || mmod == M_T || mmod == M_IS || mmod == M_ISS2 if (is_macmod_signed (mmod) || MM)
|| mmod == M_S2RND || mmod == M_IH || mmod == M_W32)
acc = get_extended_acc (cpu, which); acc = get_extended_acc (cpu, which);
else else
acc = get_unextended_acc (cpu, which); 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) if (op != 3)
{ {
bu8 sgn0 = (acc >> 31) & 1; bu8 sgn0 = (acc >> 31) & 1;