aboutsummaryrefslogtreecommitdiff
path: root/sim
diff options
context:
space:
mode:
Diffstat (limited to 'sim')
-rw-r--r--sim/arm/ChangeLog8
-rw-r--r--sim/arm/iwmmxt.c19
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;