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 "opcode/sparc.h"
-
-extern int fputs();
+#include "objdump.h"
extern int print_address();
static char *reg_names[] =
&& insn.rs1 == insn.rd)
imm_added_to_rs1 = 1;
- if (index (opcode->args, 'S') != 0)
+ if (strchr (opcode->args, 'S') != 0)
/* Reject the special case for `set'.
The real `sethi' will match. */
continue;
if (insn.rs1 != insn.rd
- && index (opcode->args, 'r') != 0)
+ && strchr (opcode->args, 'r') != 0)
/* Can't do simple format if source and dest are different. */
continue;
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;
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 +,
break;
#ifndef NO_V9
+ case 'I': /* 11 bit immediate. */
+ case 'j': /* 10 bit immediate. */
+ {
+ /* We cannot trust the compiler to sign-extend
+ when extracting the bitfield, hence the shifts. */
+ int imm;
+
+ if (*s == 'I')
+ imm = ((int) insn.imm13 << 21) >> 21;
+ else
+ imm = ((int) insn.imm13 << 22) >> 22;
+
+ /* 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 +,
+ not before it. */
+ if (found_plus)
+ imm_added_to_rs1 = 1;
+
+ if (imm <= 9)
+ fprintf (stream, "%d", imm);
+ else
+ fprintf (stream, "%#x", (unsigned) imm);
+ }
+ break;
+
+
+
+
case 'k':
print_address ((bfd_vma)
(memaddr
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':
- fputs ("%amr", stream);
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ fprintf (stream, "fcc%c", *s - '6' + '0');
break;
-#endif /* NO_V9 */
+ case 'z':
+ fputs ("icc", stream);
+ break;
+
+ case 'Z':
+ fputs ("xcc", stream);
+ break;
+
+ case 'E':
+ fputs ("%ccr", stream);
+ break;
+
+ case 's':
+ fputs ("%fprs", 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));
/* Put 1+i before i+1. */
{
- char *p0 = (char *) index(op0->args, '+');
- char *p1 = (char *) index(op1->args, '+');
+ char *p0 = (char *) strchr(op0->args, '+');
+ char *p1 = (char *) strchr(op1->args, '+');
if (p0 && p1)
{