diff options
-rw-r--r-- | include/opcode/ChangeLog | 4 | ||||
-rwxr-xr-x | include/opcode/bfin.h | 6 | ||||
-rw-r--r-- | sim/bfin/ChangeLog | 7 | ||||
-rw-r--r-- | sim/bfin/bfin-sim.c | 11 |
4 files changed, 20 insertions, 8 deletions
diff --git a/include/opcode/ChangeLog b/include/opcode/ChangeLog index f33c0e6..5474c85 100644 --- a/include/opcode/ChangeLog +++ b/include/opcode/ChangeLog @@ -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> * bfin.h (is_macmod_pmove): Add missing space before func args. 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/ChangeLog b/sim/bfin/ChangeLog index 72bd358..52b75ee 100644 --- a/sim/bfin/ChangeLog +++ b/sim/bfin/ChangeLog @@ -1,5 +1,12 @@ 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> + * bfin-sim.c (extract_mult): When mmod is M_IH, change the order from round/saturate to saturate/round/saturate. 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; |