/* 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.
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
}
/* 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. */
*insn0 = insn[0];
}
-typedef (*find_byte_func_type)
+typedef void (*find_byte_func_type)
PARAMS ((char *, unsigned char *, unsigned char *,
unsigned char *, unsigned char *));
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 =
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)
{
case 'a':
print_general (insn8, info);
break;
-
+
case 'b':
print_general (insn0, info);
break;
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,
/* 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
&prev_insn16, &prev_insn24);
}
}
-
+
/* If there was a problem reading memory, then assume
the previous instruction was not const. */
if (errcode == 0)