diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2000-05-26 01:54:33 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@redhat.com> | 2000-05-26 01:54:33 +0000 |
commit | 95f85a519e206165fe72f9ba7cbf8fcb06747c21 (patch) | |
tree | f815cc3be447e9ef28589f74fa638925e0af3002 /opcodes/m10300-dis.c | |
parent | 4ac52116c4e19736093678aeb57749bd9ea93c0a (diff) | |
download | gdb-95f85a519e206165fe72f9ba7cbf8fcb06747c21.tar.gz |
* m10300-dis.c (disassemble): Don't assume 32-bit longs when
sign-extending operands.
Diffstat (limited to 'opcodes/m10300-dis.c')
-rw-r--r-- | opcodes/m10300-dis.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/opcodes/m10300-dis.c b/opcodes/m10300-dis.c index 554d3280a6b..c15661a3484 100644 --- a/opcodes/m10300-dis.c +++ b/opcodes/m10300-dis.c @@ -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; |