* m10300-dis.c (disassemble): Don't assume 32-bit longs when

sign-extending operands.
This commit is contained in:
Alexandre Oliva 2000-05-26 01:54:33 +00:00
parent 0a44c2b16f
commit d60622826d
2 changed files with 19 additions and 13 deletions

View 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> Mon May 15 15:18:07 2000 Donald Lindsay <dlindsay@cygnus.com>
* d10v-opc.c (d10v_opcodes): add ALONE tag to all short branches * d10v-opc.c (d10v_opcodes): add ALONE tag to all short branches

View File

@ -484,6 +484,8 @@ disassemble (memaddr, info, insn, size)
temp = extension >> operand->shift; temp = extension >> operand->shift;
temp &= ((1 << (32 - operand->bits)) - 1); temp &= ((1 << (32 - operand->bits)) - 1);
value |= temp; value |= temp;
value = ((value ^ (((unsigned long)1) << 31))
- (((unsigned long)1) << 31));
} }
else if ((operand->flags & MN10300_OPERAND_24BIT) != 0) else if ((operand->flags & MN10300_OPERAND_24BIT) != 0)
{ {
@ -494,7 +496,7 @@ disassemble (memaddr, info, insn, size)
temp &= ((1 << (24 - operand->bits)) - 1); temp &= ((1 << (24 - operand->bits)) - 1);
value |= temp; value |= temp;
if ((operand->flags & MN10300_OPERAND_SIGNED) != 0) 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) else if ((operand->flags & MN10300_OPERAND_EXTENDED) != 0)
{ {
@ -508,11 +510,10 @@ disassemble (memaddr, info, insn, size)
} }
if ((operand->flags & MN10300_OPERAND_SIGNED) != 0 if ((operand->flags & MN10300_OPERAND_SIGNED) != 0
/* These are properly extended by the code above. */ /* These are properly extended by the code above. */
&& ((operand->flags & MN10300_OPERAND_24BIT) == 0) && ((operand->flags & MN10300_OPERAND_24BIT) == 0))
) value = ((value ^ (((unsigned long)1) << (operand->bits - 1)))
value = ((long)(value << (32 - operand->bits)) - (((unsigned long)1) << (operand->bits - 1)));
>> (32 - operand->bits));
if (!nocomma if (!nocomma
&& (!paren && (!paren
@ -525,14 +526,14 @@ disassemble (memaddr, info, insn, size)
{ {
value = ((insn >> (operand->shift + extra_shift)) value = ((insn >> (operand->shift + extra_shift))
& ((1 << operand->bits) - 1)); & ((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) else if ((operand->flags & MN10300_OPERAND_AREG) != 0)
{ {
value = ((insn >> (operand->shift + extra_shift)) value = ((insn >> (operand->shift + extra_shift))
& ((1 << operand->bits) - 1)); & ((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) else if ((operand->flags & MN10300_OPERAND_SP) != 0)
@ -549,11 +550,11 @@ disassemble (memaddr, info, insn, size)
value = ((insn >> (operand->shift + extra_shift)) value = ((insn >> (operand->shift + extra_shift))
& ((1 << operand->bits) - 1)); & ((1 << operand->bits) - 1));
if (value < 8) if (value < 8)
(*info->fprintf_func) (info->stream, "r%d", value); (*info->fprintf_func) (info->stream, "r%d", (int)value);
else if (value < 12) else if (value < 12)
(*info->fprintf_func) (info->stream, "a%d", value - 8); (*info->fprintf_func) (info->stream, "a%d", (int)value - 8);
else 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) else if ((operand->flags & MN10300_OPERAND_XRREG) != 0)
@ -563,7 +564,7 @@ disassemble (memaddr, info, insn, size)
if (value == 0) if (value == 0)
(*info->fprintf_func) (info->stream, "sp", value); (*info->fprintf_func) (info->stream, "sp", value);
else 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) else if ((operand->flags & MN10300_OPERAND_USP) != 0)
@ -670,7 +671,7 @@ disassemble (memaddr, info, insn, size)
} }
else else
(*info->fprintf_func) (info->stream, "%d", value); (*info->fprintf_func) (info->stream, "%ld", (long)value);
} }
/* All done. */ /* All done. */
break; break;