[POWERPC] Import updated version of ppc disassembly code for xmon
This includes: * version 1.24 of ppc-dis.c * version 1.88 of ppc-opc.c * version 1.23 of ppc.h I can't vouch for the accuracy etc. of these changes, but it brings us into line with binutils - and from a cursory test appears to work fine. Signed-off-by: Michael Ellerman <michael@ellerman.id.au> Signed-off-by: Arnd Bergmann <arnd.bergmann@de.ibm.com>
This commit is contained in:
Родитель
0b8e2e1310
Коммит
897f112bb4
|
@ -1,5 +1,6 @@
|
||||||
/* ppc-dis.c -- Disassemble PowerPC instructions
|
/* ppc-dis.c -- Disassemble PowerPC instructions
|
||||||
Copyright 1994 Free Software Foundation, Inc.
|
Copyright 1994, 1995, 2000, 2001, 2002, 2003, 2004, 2005, 2006
|
||||||
|
Free Software Foundation, Inc.
|
||||||
Written by Ian Lance Taylor, Cygnus Support
|
Written by Ian Lance Taylor, Cygnus Support
|
||||||
|
|
||||||
This file is part of GDB, GAS, and the GNU binutils.
|
This file is part of GDB, GAS, and the GNU binutils.
|
||||||
|
@ -16,8 +17,9 @@ the GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this file; see the file COPYING. If not, write to the Free
|
along with this file; see the file COPYING. If not, write to the Free
|
||||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#include <asm/cputable.h>
|
||||||
#include "nonstdio.h"
|
#include "nonstdio.h"
|
||||||
#include "ansidecl.h"
|
#include "ansidecl.h"
|
||||||
#include "ppc.h"
|
#include "ppc.h"
|
||||||
|
@ -36,6 +38,15 @@ print_insn_powerpc (unsigned long insn, unsigned long memaddr)
|
||||||
dialect = PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_COMMON
|
dialect = PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_COMMON
|
||||||
| PPC_OPCODE_64 | PPC_OPCODE_POWER4 | PPC_OPCODE_ALTIVEC;
|
| PPC_OPCODE_64 | PPC_OPCODE_POWER4 | PPC_OPCODE_ALTIVEC;
|
||||||
|
|
||||||
|
if (cpu_has_feature(CPU_FTRS_POWER5))
|
||||||
|
dialect |= PPC_OPCODE_POWER5;
|
||||||
|
|
||||||
|
if (cpu_has_feature(CPU_FTRS_CELL))
|
||||||
|
dialect |= PPC_OPCODE_CELL | PPC_OPCODE_ALTIVEC;
|
||||||
|
|
||||||
|
if (cpu_has_feature(CPU_FTRS_POWER6))
|
||||||
|
dialect |= PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_ALTIVEC;
|
||||||
|
|
||||||
/* Get the major opcode of the instruction. */
|
/* Get the major opcode of the instruction. */
|
||||||
op = PPC_OP (insn);
|
op = PPC_OP (insn);
|
||||||
|
|
||||||
|
@ -120,7 +131,8 @@ print_insn_powerpc (unsigned long insn, unsigned long memaddr)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Print the operand as directed by the flags. */
|
/* Print the operand as directed by the flags. */
|
||||||
if ((operand->flags & PPC_OPERAND_GPR) != 0)
|
if ((operand->flags & PPC_OPERAND_GPR) != 0
|
||||||
|
|| ((operand->flags & PPC_OPERAND_GPR_0) != 0 && value != 0))
|
||||||
printf("r%ld", value);
|
printf("r%ld", value);
|
||||||
else if ((operand->flags & PPC_OPERAND_FPR) != 0)
|
else if ((operand->flags & PPC_OPERAND_FPR) != 0)
|
||||||
printf("f%ld", value);
|
printf("f%ld", value);
|
||||||
|
@ -136,7 +148,7 @@ print_insn_powerpc (unsigned long insn, unsigned long memaddr)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (operand->bits == 3)
|
if (operand->bits == 3)
|
||||||
printf("cr%d", value);
|
printf("cr%ld", value);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
static const char *cbnames[4] = { "lt", "gt", "eq", "so" };
|
static const char *cbnames[4] = { "lt", "gt", "eq", "so" };
|
||||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1,5 +1,5 @@
|
||||||
/* ppc.h -- Header file for PowerPC opcode table
|
/* ppc.h -- Header file for PowerPC opcode table
|
||||||
Copyright 1994, 1995, 1999, 2000, 2001, 2002, 2003
|
Copyright 1994, 1995, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
Written by Ian Lance Taylor, Cygnus Support
|
Written by Ian Lance Taylor, Cygnus Support
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ the GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this file; see the file COPYING. If not, write to the Free
|
along with this file; see the file COPYING. If not, write to the Free
|
||||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
#ifndef PPC_H
|
#ifndef PPC_H
|
||||||
#define PPC_H
|
#define PPC_H
|
||||||
|
@ -134,6 +134,18 @@ extern const int powerpc_num_opcodes;
|
||||||
/* Opcode is supported by machine check APU. */
|
/* Opcode is supported by machine check APU. */
|
||||||
#define PPC_OPCODE_RFMCI 0x800000
|
#define PPC_OPCODE_RFMCI 0x800000
|
||||||
|
|
||||||
|
/* Opcode is only supported by Power5 architecture. */
|
||||||
|
#define PPC_OPCODE_POWER5 0x1000000
|
||||||
|
|
||||||
|
/* Opcode is supported by PowerPC e300 family. */
|
||||||
|
#define PPC_OPCODE_E300 0x2000000
|
||||||
|
|
||||||
|
/* Opcode is only supported by Power6 architecture. */
|
||||||
|
#define PPC_OPCODE_POWER6 0x4000000
|
||||||
|
|
||||||
|
/* Opcode is only supported by PowerPC Cell family. */
|
||||||
|
#define PPC_OPCODE_CELL 0x8000000
|
||||||
|
|
||||||
/* A macro to extract the major opcode from an instruction. */
|
/* A macro to extract the major opcode from an instruction. */
|
||||||
#define PPC_OP(i) (((i) >> 26) & 0x3f)
|
#define PPC_OP(i) (((i) >> 26) & 0x3f)
|
||||||
|
|
||||||
|
@ -233,25 +245,28 @@ extern const struct powerpc_operand powerpc_operands[];
|
||||||
register names with a leading 'r'. */
|
register names with a leading 'r'. */
|
||||||
#define PPC_OPERAND_GPR (040)
|
#define PPC_OPERAND_GPR (040)
|
||||||
|
|
||||||
|
/* Like PPC_OPERAND_GPR, but don't print a leading 'r' for r0. */
|
||||||
|
#define PPC_OPERAND_GPR_0 (0100)
|
||||||
|
|
||||||
/* This operand names a floating point register. The disassembler
|
/* This operand names a floating point register. The disassembler
|
||||||
prints these with a leading 'f'. */
|
prints these with a leading 'f'. */
|
||||||
#define PPC_OPERAND_FPR (0100)
|
#define PPC_OPERAND_FPR (0200)
|
||||||
|
|
||||||
/* This operand is a relative branch displacement. The disassembler
|
/* This operand is a relative branch displacement. The disassembler
|
||||||
prints these symbolically if possible. */
|
prints these symbolically if possible. */
|
||||||
#define PPC_OPERAND_RELATIVE (0200)
|
#define PPC_OPERAND_RELATIVE (0400)
|
||||||
|
|
||||||
/* This operand is an absolute branch address. The disassembler
|
/* This operand is an absolute branch address. The disassembler
|
||||||
prints these symbolically if possible. */
|
prints these symbolically if possible. */
|
||||||
#define PPC_OPERAND_ABSOLUTE (0400)
|
#define PPC_OPERAND_ABSOLUTE (01000)
|
||||||
|
|
||||||
/* This operand is optional, and is zero if omitted. This is used for
|
/* This operand is optional, and is zero if omitted. This is used for
|
||||||
the optional BF and L fields in the comparison instructions. The
|
example, in the optional BF field in the comparison instructions. The
|
||||||
assembler must count the number of operands remaining on the line,
|
assembler must count the number of operands remaining on the line,
|
||||||
and the number of operands remaining for the opcode, and decide
|
and the number of operands remaining for the opcode, and decide
|
||||||
whether this operand is present or not. The disassembler should
|
whether this operand is present or not. The disassembler should
|
||||||
print this operand out only if it is not zero. */
|
print this operand out only if it is not zero. */
|
||||||
#define PPC_OPERAND_OPTIONAL (01000)
|
#define PPC_OPERAND_OPTIONAL (02000)
|
||||||
|
|
||||||
/* This flag is only used with PPC_OPERAND_OPTIONAL. If this operand
|
/* This flag is only used with PPC_OPERAND_OPTIONAL. If this operand
|
||||||
is omitted, then for the next operand use this operand value plus
|
is omitted, then for the next operand use this operand value plus
|
||||||
|
@ -259,24 +274,24 @@ extern const struct powerpc_operand powerpc_operands[];
|
||||||
hack is needed because the Power rotate instructions can take
|
hack is needed because the Power rotate instructions can take
|
||||||
either 4 or 5 operands. The disassembler should print this operand
|
either 4 or 5 operands. The disassembler should print this operand
|
||||||
out regardless of the PPC_OPERAND_OPTIONAL field. */
|
out regardless of the PPC_OPERAND_OPTIONAL field. */
|
||||||
#define PPC_OPERAND_NEXT (02000)
|
#define PPC_OPERAND_NEXT (04000)
|
||||||
|
|
||||||
/* This operand should be regarded as a negative number for the
|
/* This operand should be regarded as a negative number for the
|
||||||
purposes of overflow checking (i.e., the normal most negative
|
purposes of overflow checking (i.e., the normal most negative
|
||||||
number is disallowed and one more than the normal most positive
|
number is disallowed and one more than the normal most positive
|
||||||
number is allowed). This flag will only be set for a signed
|
number is allowed). This flag will only be set for a signed
|
||||||
operand. */
|
operand. */
|
||||||
#define PPC_OPERAND_NEGATIVE (04000)
|
#define PPC_OPERAND_NEGATIVE (010000)
|
||||||
|
|
||||||
/* This operand names a vector unit register. The disassembler
|
/* This operand names a vector unit register. The disassembler
|
||||||
prints these with a leading 'v'. */
|
prints these with a leading 'v'. */
|
||||||
#define PPC_OPERAND_VR (010000)
|
#define PPC_OPERAND_VR (020000)
|
||||||
|
|
||||||
/* This operand is for the DS field in a DS form instruction. */
|
/* This operand is for the DS field in a DS form instruction. */
|
||||||
#define PPC_OPERAND_DS (020000)
|
#define PPC_OPERAND_DS (040000)
|
||||||
|
|
||||||
/* This operand is for the DQ field in a DQ form instruction. */
|
/* This operand is for the DQ field in a DQ form instruction. */
|
||||||
#define PPC_OPERAND_DQ (040000)
|
#define PPC_OPERAND_DQ (0100000)
|
||||||
|
|
||||||
/* The POWER and PowerPC assemblers use a few macros. We keep them
|
/* The POWER and PowerPC assemblers use a few macros. We keep them
|
||||||
with the operands table for simplicity. The macro table is an
|
with the operands table for simplicity. The macro table is an
|
||||||
|
|
Загрузка…
Ссылка в новой задаче