/* disassemble sparc instructions for objdump
- Copyright (C) 1986, 1987, 1989 Free Software Foundation, Inc.
+ Copyright (C) 1986, 1987, 1989, 1991 Free Software Foundation, Inc.
This file is part of the binutils.
The binutils are free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 1, or (at your option)
+the Free Software Foundation; either version 2, or (at your option)
any later version.
The binutils are distributed in the hope that they will be useful,
along with the binutils; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
-/* $Id$ */
-
#include "bfd.h"
#include "sysdep.h"
#include <stdio.h>
-#include "sparc-opcode.h"
-
-extern int fputs();
+#include "opcode/sparc.h"
+#include "objdump.h"
extern int print_address();
static char *reg_names[] =
if (opcode->args[0] != ',')
fputs (" ", stream);
- for (s = opcode->args; *s != '\0'; ++s) {
- while (*s == ',') {
- fputs (",", stream);
- ++s;
-
- switch (*s) {
- case 'a':
- fputs ("a", stream);
- ++s;
- continue;
+ for (s = opcode->args; *s != '\0'; ++s)
+ {
+ while (*s == ',')
+ {
+ fputs (",", stream);
+ ++s;
+
+ switch (*s) {
+ case 'a':
+ fputs ("a", stream);
+ ++s;
+ continue;
#ifndef NO_V9
- case 'N':
- fputs("pn", stream);
- ++s;
- continue;
-
- case 'T':
- fputs("pt", stream);
- ++s;
- continue;
-#endif /* NO_V9 */
-
- default:
- break;
- } /* switch on arg */
- } /* while there are comma started args */
+ case 'N':
+ fputs("pn", stream);
+ ++s;
+ continue;
+
+ case 'T':
+ fputs("pt", stream);
+ ++s;
+ continue;
+#endif /* NO_V9 */
+
+ default:
+ break;
+ } /* switch on arg */
+ } /* while there are comma started args */
fputs (" ", stream);
#define freg(n) fprintf (stream, "%%%s", freg_names[n])
case 'e':
+ case 'v': /* double/even */
+ case 'V': /* quad/multiple of 4 */
freg (insn.rs1);
break;
case 'f':
+ case 'B': /* double/even */
+ case 'R': /* quad/multiple of 4 */
freg (insn.rs2);
break;
+#ifndef NO_V9
+/* Somebody who know needs to define rs3.
+ case 'j':
+ case 'u': * double/even *
+ case 'U': * quad/multiple of 4 *
+ freg (insn.rs3);
+ break;
+*/
+#endif /* NO_V9 */
+
case 'g':
+ case 'H': /* double/even */
+ case 'J': /* quad/multiple of 4 */
freg (insn.rd);
break;
#undef freg
case 'h':
fprintf (stream, "%%hi(%#x)",
- (unsigned int) insn.imm22 << 10);
+ (unsigned int) insn.imm22 << 10);
break;
case 'i':
/* Check to see whether we have a 1+i, and take
note of that fact.
-
+
Note: because of the way we sort the table,
we will be matching 1+i rather than i+1,
so it is OK to assume that i is after +,
stream);
break;
- case 'K':
+ case 'G':
print_address ((bfd_vma)
(memaddr
- + (((int) insn.disp21 << 11) >> 11) * 4),
+ /* We use only 19 of the 21 bits. */
+ + (((int) insn.disp21 << 13) >> 13) * 4),
stream);
break;
- case 'Y':
+ case 'Y':
fputs ("%amr", stream);
break;
-#endif /* NO_V9 */
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ fprintf (stream, "fcc%c", *s - '6' + '0');
+ break;
+
+ case 'z':
+ fputs ("icc", stream);
+ break;
+
+ case 'Z':
+ fputs ("xcc", stream);
+ break;
+#endif /* NO_V9 */
- case 'M':
+ case 'M':
fprintf(stream, "%%asr%d", insn.rs1);
break;
- case 'm':
+ case 'm':
fprintf(stream, "%%asr%d", insn.rd);
break;
- case 'L':
+ case 'L':
print_address ((bfd_vma) memaddr + insn.disp30 * 4,
stream);
break;
/* Special case for `unimp'. Don't try to turn
it's operand into a function offset. */
fprintf (stream, "%#x",
- (unsigned) (((int) insn.disp22 << 10) >> 10));
+ (unsigned) (((int) insn.disp22 << 10) >> 10));
else
/* We cannot trust the compiler to sign-extend
when extracting the bitfield, hence the shifts. */
if (imm_added_to_rs1)
{
union sparc_insn prev_insn;
- int errcode;
+ int errcode = 0;
memcpy(&prev_insn, buffer -4, sizeof (prev_insn));