diff options
Diffstat (limited to 'sim/arm/iwmmxt.c')
-rw-r--r-- | sim/arm/iwmmxt.c | 19 |
1 files changed, 11 insertions, 8 deletions
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; |