* sparc-dis.c (print_insn_sparc): Renamed from print_insn.
If DISASM_RAW_INSN, print insn in hex. Handle v9a as opcode architecture. (print_insn_sparc64): Deleted. * disassemble.c (disassembler, case bfd_arch_sparc): Always use print_insn_sparc.
This commit is contained in:
parent
458bbd1f1e
commit
986c92a711
|
@ -1,7 +1,11 @@
|
||||||
Mon Jan 22 08:29:59 1996 Doug Evans <dje@charmed.cygnus.com>
|
Mon Jan 22 08:29:59 1996 Doug Evans <dje@charmed.cygnus.com>
|
||||||
|
|
||||||
* disassemble.c (disassembler, case bfd_arch_sparc): bfd_mach_sparc64
|
* sparc-dis.c (print_insn_sparc): Renamed from print_insn.
|
||||||
renamed to bfd_mach_sparc_v9. Check for bfd_mach_sparc_v9a.
|
If DISASM_RAW_INSN, print insn in hex. Handle v9a as opcode
|
||||||
|
architecture.
|
||||||
|
(print_insn_sparc64): Deleted.
|
||||||
|
* disassemble.c (disassembler, case bfd_arch_sparc): Always use
|
||||||
|
print_insn_sparc.
|
||||||
|
|
||||||
* sparc-opc.c (architecture_pname): Add v9a.
|
* sparc-opc.c (architecture_pname): Add v9a.
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Print SPARC instructions.
|
/* Print SPARC instructions.
|
||||||
Copyright 1989, 1991, 1992, 1993, 1995 Free Software Foundation, Inc.
|
Copyright (C) 1989, 91-93, 1995, 1996 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -52,19 +52,16 @@ static char *reg_names[] =
|
||||||
"f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
|
"f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
|
||||||
"f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
|
"f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
|
||||||
"f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
|
"f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
|
||||||
#ifndef NO_V9
|
|
||||||
"f32", "f33", "f34", "f35", "f36", "f37", "f38", "f39",
|
"f32", "f33", "f34", "f35", "f36", "f37", "f38", "f39",
|
||||||
"f40", "f41", "f42", "f43", "f44", "f45", "f46", "f47",
|
"f40", "f41", "f42", "f43", "f44", "f45", "f46", "f47",
|
||||||
"f48", "f49", "f50", "f51", "f52", "f53", "f54", "f55",
|
"f48", "f49", "f50", "f51", "f52", "f53", "f54", "f55",
|
||||||
"f56", "f57", "f58", "f59", "f60", "f61", "f62", "f63",
|
"f56", "f57", "f58", "f59", "f60", "f61", "f62", "f63",
|
||||||
/* psr, wim, tbr, fpsr, cpsr are v8 only. */
|
/* psr, wim, tbr, fpsr, cpsr are v8 only. */
|
||||||
#endif
|
|
||||||
"y", "psr", "wim", "tbr", "pc", "npc", "fpsr", "cpsr"
|
"y", "psr", "wim", "tbr", "pc", "npc", "fpsr", "cpsr"
|
||||||
};
|
};
|
||||||
|
|
||||||
#define freg_names (®_names[4 * 8])
|
#define freg_names (®_names[4 * 8])
|
||||||
|
|
||||||
#ifndef NO_V9
|
|
||||||
/* These are ordered according to there register number in
|
/* These are ordered according to there register number in
|
||||||
rdpr and wrpr insns. */
|
rdpr and wrpr insns. */
|
||||||
static char *v9_priv_reg_names[] =
|
static char *v9_priv_reg_names[] =
|
||||||
|
@ -74,7 +71,6 @@ static char *v9_priv_reg_names[] =
|
||||||
"wstate", "fq"
|
"wstate", "fq"
|
||||||
/* "ver" - special cased */
|
/* "ver" - special cased */
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Macros used to extract instruction fields. Not all fields have
|
/* Macros used to extract instruction fields. Not all fields have
|
||||||
macros defined here, only those which are actually used. */
|
macros defined here, only those which are actually used. */
|
||||||
|
@ -89,10 +85,10 @@ static char *v9_priv_reg_names[] =
|
||||||
#define X_IMM22(i) X_DISP22 (i)
|
#define X_IMM22(i) X_DISP22 (i)
|
||||||
#define X_DISP30(i) (((i) >> 0) & 0x3fffffff)
|
#define X_DISP30(i) (((i) >> 0) & 0x3fffffff)
|
||||||
|
|
||||||
#ifndef NO_V9
|
/* These are for v9. */
|
||||||
#define X_DISP16(i) (((((i) >> 20) & 3) << 14) | (((i) >> 0) & 0x3fff))
|
#define X_DISP16(i) (((((i) >> 20) & 3) << 14) | (((i) >> 0) & 0x3fff))
|
||||||
|
#define X_DISP19(i) (((i) >> 0) & 0x7ffff)
|
||||||
#define X_MEMBAR(i) ((i) & 0x7f)
|
#define X_MEMBAR(i) ((i) & 0x7f)
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Here is the union which was used to extract instruction fields
|
/* Here is the union which was used to extract instruction fields
|
||||||
before the shift and mask macros were written.
|
before the shift and mask macros were written.
|
||||||
|
@ -132,7 +128,6 @@ static char *v9_priv_reg_names[] =
|
||||||
#define disp22 branch.DISP22
|
#define disp22 branch.DISP22
|
||||||
#define imm22 disp22
|
#define imm22 disp22
|
||||||
} branch;
|
} branch;
|
||||||
#ifndef NO_V9
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
unsigned int anop:2;
|
unsigned int anop:2;
|
||||||
|
@ -145,7 +140,6 @@ static char *v9_priv_reg_names[] =
|
||||||
unsigned int _rs1:5;
|
unsigned int _rs1:5;
|
||||||
unsigned int DISP16LO:14;
|
unsigned int DISP16LO:14;
|
||||||
} branch16;
|
} branch16;
|
||||||
#endif
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
unsigned int anop:2;
|
unsigned int anop:2;
|
||||||
|
@ -187,17 +181,17 @@ static int compare_opcodes ();
|
||||||
displacement to that register, or it is an `add' or `or' instruction
|
displacement to that register, or it is an `add' or `or' instruction
|
||||||
on that register. */
|
on that register. */
|
||||||
|
|
||||||
static int
|
int
|
||||||
print_insn (memaddr, info, sparc64_p)
|
print_insn_sparc (memaddr, info)
|
||||||
bfd_vma memaddr;
|
bfd_vma memaddr;
|
||||||
disassemble_info *info;
|
disassemble_info *info;
|
||||||
int sparc64_p;
|
|
||||||
{
|
{
|
||||||
FILE *stream = info->stream;
|
FILE *stream = info->stream;
|
||||||
bfd_byte buffer[4];
|
bfd_byte buffer[4];
|
||||||
unsigned long insn;
|
unsigned long insn;
|
||||||
register unsigned int i;
|
register unsigned int i;
|
||||||
register struct opcode_hash *op;
|
register struct opcode_hash *op;
|
||||||
|
int sparc_v9_p = bfd_mach_sparc_v9_p (info->mach);
|
||||||
|
|
||||||
if (!opcodes_initialized)
|
if (!opcodes_initialized)
|
||||||
{
|
{
|
||||||
|
@ -219,6 +213,9 @@ print_insn (memaddr, info, sparc64_p)
|
||||||
|
|
||||||
insn = bfd_getb32 (buffer);
|
insn = bfd_getb32 (buffer);
|
||||||
|
|
||||||
|
if (DISASM_RAW_INSN (info))
|
||||||
|
(*info->fprintf_func) (stream, "0x%08lx\t", insn);
|
||||||
|
|
||||||
info->insn_info_valid = 1; /* We do return this info */
|
info->insn_info_valid = 1; /* We do return this info */
|
||||||
info->insn_type = dis_nonbranch; /* Assume non branch insn */
|
info->insn_type = dis_nonbranch; /* Assume non branch insn */
|
||||||
info->branch_delay_insns = 0; /* Assume no delay */
|
info->branch_delay_insns = 0; /* Assume no delay */
|
||||||
|
@ -229,12 +226,12 @@ print_insn (memaddr, info, sparc64_p)
|
||||||
CONST struct sparc_opcode *opcode = op->opcode;
|
CONST struct sparc_opcode *opcode = op->opcode;
|
||||||
|
|
||||||
/* If the current architecture isn't sparc64, skip sparc64 insns. */
|
/* If the current architecture isn't sparc64, skip sparc64 insns. */
|
||||||
if (!sparc64_p
|
if (!sparc_v9_p
|
||||||
&& opcode->architecture == v9)
|
&& opcode->architecture >= v9)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* If the current architecture is sparc64, skip sparc32 only insns. */
|
/* If the current architecture is sparc64, skip sparc32 only insns. */
|
||||||
if (sparc64_p
|
if (sparc_v9_p
|
||||||
&& (opcode->flags & F_NOTV9))
|
&& (opcode->flags & F_NOTV9))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -283,7 +280,6 @@ print_insn (memaddr, info, sparc64_p)
|
||||||
is_annulled = 1;
|
is_annulled = 1;
|
||||||
++s;
|
++s;
|
||||||
continue;
|
continue;
|
||||||
#ifndef NO_V9
|
|
||||||
case 'N':
|
case 'N':
|
||||||
(*info->fprintf_func) (stream, "pn");
|
(*info->fprintf_func) (stream, "pn");
|
||||||
++s;
|
++s;
|
||||||
|
@ -293,7 +289,6 @@ print_insn (memaddr, info, sparc64_p)
|
||||||
(*info->fprintf_func) (stream, "pt");
|
(*info->fprintf_func) (stream, "pt");
|
||||||
++s;
|
++s;
|
||||||
continue;
|
continue;
|
||||||
#endif /* NO_V9 */
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -400,7 +395,6 @@ print_insn (memaddr, info, sparc64_p)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifndef NO_V9
|
|
||||||
case 'I': /* 11 bit immediate. */
|
case 'I': /* 11 bit immediate. */
|
||||||
case 'j': /* 10 bit immediate. */
|
case 'j': /* 10 bit immediate. */
|
||||||
{
|
{
|
||||||
|
@ -453,12 +447,12 @@ print_insn (memaddr, info, sparc64_p)
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'k':
|
case 'k':
|
||||||
info->target = memaddr + (SEX (X_DISP16 (insn), 16)) * 4;
|
info->target = memaddr + SEX (X_DISP16 (insn), 16) * 4;
|
||||||
(*info->print_address_func) (info->target, info);
|
(*info->print_address_func) (info->target, info);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'G':
|
case 'G':
|
||||||
info->target = memaddr + (SEX (X_DISP22 (insn), 19)) * 4;
|
info->target = memaddr + SEX (X_DISP19 (insn), 19) * 4;
|
||||||
(*info->print_address_func) (info->target, info);
|
(*info->print_address_func) (info->target, info);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -525,7 +519,6 @@ print_insn (memaddr, info, sparc64_p)
|
||||||
(*info->fprintf_func) (stream, "%d", X_RD (insn));
|
(*info->fprintf_func) (stream, "%d", X_RD (insn));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif /* NO_V9 */
|
|
||||||
|
|
||||||
case 'M':
|
case 'M':
|
||||||
(*info->fprintf_func) (stream, "%%asr%d", X_RS1 (insn));
|
(*info->fprintf_func) (stream, "%%asr%d", X_RS1 (insn));
|
||||||
|
@ -536,17 +529,17 @@ print_insn (memaddr, info, sparc64_p)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'L':
|
case 'L':
|
||||||
info->target = memaddr + X_DISP30 (insn) * 4;
|
info->target = memaddr + SEX (X_DISP30 (insn), 30) * 4;
|
||||||
(*info->print_address_func) (info->target, info);
|
(*info->print_address_func) (info->target, info);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'n':
|
case 'n':
|
||||||
(*info->fprintf_func)
|
(*info->fprintf_func)
|
||||||
(stream, "%#x", (SEX (X_DISP22 (insn), 22)));
|
(stream, "%#x", SEX (X_DISP22 (insn), 22));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'l':
|
case 'l':
|
||||||
info->target = memaddr + (SEX (X_DISP22 (insn), 22)) * 4;
|
info->target = memaddr + SEX (X_DISP22 (insn), 22) * 4;
|
||||||
(*info->print_address_func) (info->target, info);
|
(*info->print_address_func) (info->target, info);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -731,8 +724,8 @@ compare_opcodes (a, b)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Put non-sparc64 insns ahead of sparc64 ones. */
|
/* Put non-sparc64 insns ahead of sparc64 ones. */
|
||||||
if ((op0->architecture == v9) != (op1->architecture == v9))
|
if ((op0->architecture >= v9) != (op1->architecture >= v9))
|
||||||
return (op0->architecture == v9) - (op1->architecture == v9);
|
return (op0->architecture >= v9) - (op1->architecture >= v9);
|
||||||
|
|
||||||
/* They are functionally equal. So as long as the opcode table is
|
/* They are functionally equal. So as long as the opcode table is
|
||||||
valid, we can put whichever one first we want, on aesthetic grounds. */
|
valid, we can put whichever one first we want, on aesthetic grounds. */
|
||||||
|
@ -848,19 +841,3 @@ build_hash_table (table, hash_table, num_opcodes)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
print_insn_sparc (memaddr, info)
|
|
||||||
bfd_vma memaddr;
|
|
||||||
disassemble_info *info;
|
|
||||||
{
|
|
||||||
return print_insn (memaddr, info, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
print_insn_sparc64 (memaddr, info)
|
|
||||||
bfd_vma memaddr;
|
|
||||||
disassemble_info *info;
|
|
||||||
{
|
|
||||||
return print_insn (memaddr, info, 1);
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue