* m10300-dis.c (disassemble): Don't assume 32-bit longs when
authorAlexandre Oliva <aoliva@redhat.com>
Fri, 26 May 2000 01:54:33 +0000 (01:54 +0000)
committerAlexandre Oliva <aoliva@redhat.com>
Fri, 26 May 2000 01:54:33 +0000 (01:54 +0000)
sign-extending operands.

opcodes/ChangeLog
opcodes/m10300-dis.c

index a69d21ddf3dffbb4571f5d86c082a47a0247ef3a..60ef03bd47752ad9fdefcd7ccae5b82d81f23d70 100644 (file)
@@ -1,3 +1,8 @@
+Thu May 25 22:53:20 2000  Alexandre Oliva  <aoliva@cygnus.com>
+
+       * m10300-dis.c (disassemble): Don't assume 32-bit longs when
+       sign-extending operands.
+
 Mon May 15 15:18:07 2000  Donald Lindsay  <dlindsay@cygnus.com>
 
        * d10v-opc.c (d10v_opcodes): add ALONE tag to all short branches
index 554d3280a6bab9486c4e170bae9eb09b76dd00b0..c15661a34848ad88ae4006a38dd987b355b4d6b2 100644 (file)
@@ -484,6 +484,8 @@ disassemble (memaddr, info, insn, size)
                  temp = extension >> operand->shift;
                  temp &= ((1 << (32 - operand->bits)) - 1);
                  value |= temp;
+                 value = ((value ^ (((unsigned long)1) << 31))
+                          - (((unsigned long)1) << 31));
                }
              else if ((operand->flags & MN10300_OPERAND_24BIT) != 0)
                {
@@ -494,7 +496,7 @@ disassemble (memaddr, info, insn, size)
                  temp &= ((1 << (24 - operand->bits)) - 1);
                  value |= temp;
                  if ((operand->flags & MN10300_OPERAND_SIGNED) != 0)
-                   value = ((value & 0xffffff) ^ (~0x7fffff)) + 0x800000;
+                   value = ((value & 0xffffff) ^ 0x800000) - 0x800000;
                }
              else if ((operand->flags & MN10300_OPERAND_EXTENDED) != 0)
                {
@@ -508,11 +510,10 @@ disassemble (memaddr, info, insn, size)
                }
 
              if ((operand->flags & MN10300_OPERAND_SIGNED) != 0
-                  /* These are properly extended by the code above.  */
-                  && ((operand->flags & MN10300_OPERAND_24BIT) == 0)
-                 )
-               value = ((long)(value << (32 - operand->bits))
-                         >> (32 - operand->bits));
+                 /* These are properly extended by the code above.  */
+                 && ((operand->flags & MN10300_OPERAND_24BIT) == 0))
+               value = ((value ^ (((unsigned long)1) << (operand->bits - 1)))
+                        - (((unsigned long)1) << (operand->bits - 1)));
 
              if (!nocomma
                  && (!paren
@@ -525,14 +526,14 @@ disassemble (memaddr, info, insn, size)
                {
                  value = ((insn >> (operand->shift + extra_shift))
                           & ((1 << operand->bits) - 1));
-                 (*info->fprintf_func) (info->stream, "d%d", value);
+                 (*info->fprintf_func) (info->stream, "d%d", (int)value);
                }
 
              else if ((operand->flags & MN10300_OPERAND_AREG) != 0)
                {
                  value = ((insn >> (operand->shift + extra_shift))
                           & ((1 << operand->bits) - 1));
-                 (*info->fprintf_func) (info->stream, "a%d", value);
+                 (*info->fprintf_func) (info->stream, "a%d", (int)value);
                }
 
              else if ((operand->flags & MN10300_OPERAND_SP) != 0)
@@ -549,11 +550,11 @@ disassemble (memaddr, info, insn, size)
                  value = ((insn >> (operand->shift + extra_shift))
                           & ((1 << operand->bits) - 1));
                  if (value < 8)
-                   (*info->fprintf_func) (info->stream, "r%d", value);
+                   (*info->fprintf_func) (info->stream, "r%d", (int)value);
                  else if (value < 12)
-                   (*info->fprintf_func) (info->stream, "a%d", value - 8);
+                   (*info->fprintf_func) (info->stream, "a%d", (int)value - 8);
                  else
-                   (*info->fprintf_func) (info->stream, "d%d", value - 12);
+                   (*info->fprintf_func) (info->stream, "d%d", (int)value - 12);
                }
 
              else if ((operand->flags & MN10300_OPERAND_XRREG) != 0)
@@ -563,7 +564,7 @@ disassemble (memaddr, info, insn, size)
                  if (value == 0)
                    (*info->fprintf_func) (info->stream, "sp", value);
                  else
-                 (*info->fprintf_func) (info->stream, "xr%d", value);
+                 (*info->fprintf_func) (info->stream, "xr%d", (int)value);
                }
 
              else if ((operand->flags & MN10300_OPERAND_USP) != 0)
@@ -670,7 +671,7 @@ disassemble (memaddr, info, insn, size)
                }
 
              else 
-               (*info->fprintf_func) (info->stream, "%d", value);
+               (*info->fprintf_func) (info->stream, "%ld", (long)value);
            }
          /* All done. */
          break;