From 161fc4527694bbd47b51aa277536c52802cabb5f Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Fri, 1 Jul 2011 12:12:16 +0000 Subject: [PATCH] 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. --- sim/arm/ChangeLog | 8 ++++++++ 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 + + 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 * 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; -- 2.7.4