X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=opcodes%2Fa29k-dis.c;h=a3090c3e21b0d0e10a539dc6cadcbe80b15a14a4;hb=dc1d03fc4210aa19e0d6d618837ff2ec34be0465;hp=2766902f22b80e30c126c12f74bc19e4801a0e5b;hpb=e96a2b1d468ec328e24cdbf0585ec754d9d941fa;p=deliverable%2Fbinutils-gdb.git diff --git a/opcodes/a29k-dis.c b/opcodes/a29k-dis.c index 2766902f22..a3090c3e21 100644 --- a/opcodes/a29k-dis.c +++ b/opcodes/a29k-dis.c @@ -1,5 +1,6 @@ /* Instruction printing code for the AMD 29000 - Copyright (C) 1990 Free Software Foundation, Inc. + Copyright 1990, 1993, 1994, 1995, 1998, 2000, 2001, 2002 + Free Software Foundation, Inc. Contributed by Cygnus Support. Written by Jim Kingdon. This file is part of GDB. @@ -16,11 +17,24 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include "sysdep.h" #include "dis-asm.h" #include "opcode/a29k.h" +static void print_general PARAMS ((int, struct disassemble_info *)); +static void print_special PARAMS ((unsigned int, struct disassemble_info *)); +static int is_delayed_branch PARAMS ((int)); +static void find_bytes_little + PARAMS ((char *, unsigned char *, unsigned char *, unsigned char *, + unsigned char *)); +static void find_bytes_big + PARAMS ((char *, unsigned char *, unsigned char *, unsigned char *, + unsigned char *)); +static int print_insn PARAMS ((bfd_vma, struct disassemble_info *)); + + /* Print a symbolic representation of a general-purpose register number NUM on STREAM. NUM is a number as found in the instruction, not as found in @@ -37,19 +51,21 @@ print_general (num, info) } /* Like print_general but a special-purpose register. - + The mnemonics used by the AMD assembler are not quite the same as the ones in the User's Manual. We use the ones that the assembler uses. */ static void print_special (num, info) - int num; + unsigned int num; struct disassemble_info *info; { /* Register names of registers 0-SPEC0_NUM-1. */ static char *spec0_names[] = { "vab", "ops", "cps", "cfg", "cha", "chd", "chc", "rbp", "tmc", "tmr", - "pc0", "pc1", "pc2", "mmu", "lru" + "pc0", "pc1", "pc2", "mmu", "lru", "rsn", "rma0", "rmc0", "rma1", "rmc1", + "spc0", "spc1", "spc2", "iba0", "ibc0", "iba1", "ibc1", "dba", "dbc", + "cir", "cdr" }; #define SPEC0_NUM ((sizeof spec0_names) / (sizeof spec0_names[0])) @@ -117,7 +133,7 @@ find_bytes_little (insn, insn0, insn8, insn16, insn24) *insn0 = insn[0]; } -typedef (*find_byte_func_type) +typedef void (*find_byte_func_type) PARAMS ((char *, unsigned char *, unsigned char *, unsigned char *, unsigned char *)); @@ -137,7 +153,7 @@ print_insn (memaddr, info) find_byte_func_type find_byte_func = (find_byte_func_type)info->private_data; - struct a29k_opcode CONST * opcode; + struct a29k_opcode const * opcode; { int status = @@ -164,10 +180,10 @@ print_insn (memaddr, info) opcode < &a29k_opcodes[num_opcodes]; ++opcode) { - if ((insn24<<24) == opcode->opcode) + if (((unsigned long) insn24 << 24) == opcode->opcode) { char *s; - + (*info->fprintf_func) (info->stream, "%s ", opcode->name); for (s = opcode->args; *s != '\0'; ++s) { @@ -176,7 +192,7 @@ print_insn (memaddr, info) case 'a': print_general (insn8, info); break; - + case 'b': print_general (insn0, info); break; @@ -244,6 +260,11 @@ print_insn (memaddr, info) (*info->fprintf_func) (info->stream, "%d", (insn0 >> 4) & 7); break; + case 'I': + if ((insn16 & 3) != 0) + (*info->fprintf_func) (info->stream, "%d", insn16 & 3); + break; + case 'd': (*info->fprintf_func) (info->stream, "%d", (insn0 >> 2) & 3); break; @@ -272,7 +293,7 @@ print_insn (memaddr, info) int errcode; char prev_insn[4]; unsigned char prev_insn0, prev_insn8, prev_insn16, prev_insn24; - + errcode = (*info->read_memory_func) (memaddr - 4, (bfd_byte *) &prev_insn[0], 4, @@ -282,7 +303,7 @@ print_insn (memaddr, info) /* If it is a delayed branch, we need to look at the instruction before the delayed brach to handle things like - + const _foo call _printf consth _foo @@ -297,7 +318,7 @@ print_insn (memaddr, info) &prev_insn16, &prev_insn24); } } - + /* If there was a problem reading memory, then assume the previous instruction was not const. */ if (errcode == 0)