X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=opcodes%2Fm10300-dis.c;h=a8d4b510dcd8884d5f081aa7dbd0967cc77f1d98;hb=294b41b344851e9bd963817c555a4e5ace97863d;hp=1346b697e39d4f8555de10b1b34d4778ba3dbf51;hpb=0d8dfecfe98596d2999f2616d7f2b904260022cc;p=deliverable%2Fbinutils-gdb.git diff --git a/opcodes/m10300-dis.c b/opcodes/m10300-dis.c index 1346b697e3..a8d4b510dc 100644 --- a/opcodes/m10300-dis.c +++ b/opcodes/m10300-dis.c @@ -1,5 +1,5 @@ /* Disassemble MN10300 instructions. - Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. + Copyright 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,14 +19,17 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include "sysdep.h" -#include "opcode/mn10300.h" +#include "opcode/mn10300.h" #include "dis-asm.h" #include "opintl.h" static void disassemble PARAMS ((bfd_vma, struct disassemble_info *, unsigned long insn, unsigned int)); -int +#define HAVE_AM33 (info->mach == AM33) +#define HAVE_AM30 (info->mach == AM30) + +int print_insn_mn10300 (memaddr, info) bfd_vma memaddr; struct disassemble_info *info; @@ -100,7 +103,7 @@ print_insn_mn10300 (memaddr, info) if (status != 0) { (*info->memory_error_func) (status, memaddr, info); - return -1; + return -1; } insn = bfd_getb16 (buffer); consume = 2; @@ -108,7 +111,7 @@ print_insn_mn10300 (memaddr, info) /* These are three byte insns. */ else if ((insn & 0xff) == 0xf8 - || (insn & 0xff) == 0xcc + || (insn & 0xff) == 0xcc || (insn & 0xff) == 0xf9 || (insn & 0xf3) == 0x01 || (insn & 0xf3) == 0x02 @@ -137,7 +140,7 @@ print_insn_mn10300 (memaddr, info) (*info->memory_error_func) (status, memaddr, info); return -1; } - insn |= *(unsigned char *)buffer; + insn |= *(unsigned char *) buffer; consume = 3; } @@ -246,16 +249,17 @@ disassemble (memaddr, info, insn, size) mysize = 7; else mysize = 7; - + if ((op->mask & insn) == op->opcode && size == (unsigned int) mysize && (op->machine == 0 - || op->machine == info->mach)) + || (op->machine == AM33 && HAVE_AM33) + || (op->machine == AM30 && HAVE_AM30))) { const unsigned char *opindex_ptr; unsigned int nocomma; int paren = 0; - + if (op->format == FMT_D1 || op->format == FMT_S1) extra_shift = 8; else if (op->format == FMT_D2 || op->format == FMT_D4 @@ -359,7 +363,7 @@ disassemble (memaddr, info, insn, size) (*info->memory_error_func) (status, memaddr, info); return; } - extension = *(unsigned char *)buffer; + extension = *(unsigned char *) buffer; } else if (size == 6 && op->format == FMT_D8) { @@ -370,7 +374,7 @@ disassemble (memaddr, info, insn, size) (*info->memory_error_func) (status, memaddr, info); return; } - insn |= *(unsigned char *)buffer; + insn |= *(unsigned char *) buffer; status = (*info->read_memory_func) (memaddr + 3, buffer, 2, info); if (status != 0) @@ -422,7 +426,7 @@ disassemble (memaddr, info, insn, size) insn &= 0xff000000; insn |= (temp >> 8) & 0xffffff; extension = (temp & 0xff) << 16; - + status = (*info->read_memory_func) (memaddr + 5, buffer, 2, info); if (status != 0) { @@ -445,14 +449,14 @@ disassemble (memaddr, info, insn, size) insn &= 0xffff0000; insn |= (temp >> 16) & 0xffff; extension = (temp & 0xffff) << 8; - + status = (*info->read_memory_func) (memaddr + 6, buffer, 1, info); if (status != 0) { (*info->memory_error_func) (status, memaddr, info); return; } - extension |= *(unsigned char *)buffer; + extension |= *(unsigned char *) buffer; } match = 1; @@ -480,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) { @@ -490,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) { @@ -504,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 @@ -516,19 +521,19 @@ disassemble (memaddr, info, insn, size) (*info->fprintf_func) (info->stream, ","); nocomma = 0; - + if ((operand->flags & MN10300_OPERAND_DREG) != 0) { 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) @@ -545,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) @@ -559,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) @@ -665,8 +670,8 @@ disassemble (memaddr, info, insn, size) (*info->fprintf_func) (info->stream, "]"); } - else - (*info->fprintf_func) (info->stream, "%d", value); + else + (*info->fprintf_func) (info->stream, "%ld", (long) value); } /* All done. */ break;