diff options
Diffstat (limited to 'sim')
-rw-r--r-- | sim/arm/ChangeLog | 8 | ||||
-rw-r--r-- | sim/arm/iwmmxt.c | 19 |
2 files changed, 19 insertions, 8 deletions
diff --git a/sim/arm/ChangeLog b/sim/arm/ChangeLog index 471fdab..628f901 100644 --- a/sim/arm/ChangeLog +++ b/sim/arm/ChangeLog @@ -1,3 +1,11 @@ +2011-07-01 Nick Clifton <nickc@redhat.com> + + PR sim/12737 + * iwmmxt.c (WCMPGT): Sign extend 32-bit values before performing a + signed compare. + (WMAC): Extend computed result before adding to result register. + (WRSA): Sign extend 32-bit values before shifting. + 2011-04-16 Mike Frysinger <vapier@gentoo.org> * wrapper.c (sim_complete_command): New stub function. diff --git a/sim/arm/iwmmxt.c b/sim/arm/iwmmxt.c index c44fb7f..02302fc 100644 --- a/sim/arm/iwmmxt.c +++ b/sim/arm/iwmmxt.c @@ -1744,11 +1744,12 @@ WCMPGT (ARMul_State * state, ARMword instr) { signed long a, b; - a = wRWORD (BITS (16, 19), i); - b = wRWORD (BITS (0, 3), i); + a = EXTEND32 (wRWORD (BITS (16, 19), i)); + b = EXTEND32 (wRWORD (BITS (0, 3), i)); s = (a > b) ? 0xffffffff : 0; r |= s << (i * 32); + SIMD32_SET (psr, NBIT32 (s), SIMD_NBIT, i); SIMD32_SET (psr, ZBIT32 (s), SIMD_ZBIT, i); } @@ -2128,13 +2129,15 @@ WMAC (ARMword instr) } } - if (BIT (20)) - wR [BITS (12, 15)] = 0; + if (BIT (21)) + t = EXTEND32 (t); + else + t &= 0xffffffff; - if (BIT (21)) /* Signed. */ - wR[BITS (12, 15)] += t; + if (BIT (20)) + wR [BITS (12, 15)] = t; else - wR [BITS (12, 15)] += t; + wR[BITS (12, 15)] += t; wC [wCon] |= WCON_MUP; @@ -2904,7 +2907,7 @@ WSRA (ARMul_State * state, ARMword instr) t = (wRWORD (BITS (16, 19), i) & 0x80000000) ? 0xffffffff : 0; else { - t = wRWORD (BITS (16, 19), i); + t = EXTEND32 (wRWORD (BITS (16, 19), i)); t >>= shift; } s = t; |