From ef26d60eba5736240c27c545e275667bb4b0fbd1 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Sat, 18 Jun 2011 19:42:55 +0000 Subject: [PATCH] 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 Signed-off-by: Mike Frysinger --- include/opcode/ChangeLog | 4 ++++ include/opcode/bfin.h | 6 ++++++ sim/bfin/ChangeLog | 7 +++++++ sim/bfin/bfin-sim.c | 11 +++-------- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/include/opcode/ChangeLog b/include/opcode/ChangeLog index f33c0e65c8..5474c8569a 100644 --- a/include/opcode/ChangeLog +++ b/include/opcode/ChangeLog @@ -1,3 +1,7 @@ +2011-06-18 Robin Getz + + * bfin.h (is_macmod_signed): New func + 2011-06-18 Mike Frysinger * bfin.h (is_macmod_pmove): Add missing space before func args. diff --git a/include/opcode/bfin.h b/include/opcode/bfin.h index 30bb90d26c..26f019381b 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 72bd358446..52b75ee6fa 100644 --- a/sim/bfin/ChangeLog +++ b/sim/bfin/ChangeLog @@ -1,3 +1,10 @@ +2011-06-18 Robin Getz + + * 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 * bfin-sim.c (extract_mult): When mmod is M_IH, change the order diff --git a/sim/bfin/bfin-sim.c b/sim/bfin/bfin-sim.c index 5b8d601d7d..017ddcad51 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;