PR sim/12737
authorNick Clifton <nickc@redhat.com>
Fri, 1 Jul 2011 12:12:16 +0000 (12:12 +0000)
committerNick Clifton <nickc@redhat.com>
Fri, 1 Jul 2011 12:12:16 +0000 (12:12 +0000)
* 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
sim/arm/iwmmxt.c

index 471fdab0865b1aecb8562e48c8c7aaf1e695a05b..628f901c2d3b5928fba34e7ffa2f7b053d4a714d 100644 (file)
@@ -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.
index c44fb7f1a5f749f4c86eb2808d3c66dc44a5866f..02302fc2fd4120f78a613cd9908f39c08419d1b7 100644 (file)
@@ -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;