1999-05-03 07:29:11 +00:00
|
|
|
/* ppc-dis.c -- Disassemble PowerPC instructions
|
2008-07-30 06:29:22 +00:00
|
|
|
Copyright 1994, 1995, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
include/opcode/
* ppc.h: Add PPC_OPCODE_ALTIVEC2, PPC_OPCODE_E6500, PPC_OPCODE_TMR.
opcodes/
* ppc-dis.c (ppc_opts): Add entries for "e5500" and "e6500".
* ppc-opc.c (insert_ls, TMR, ESYNC, XSYNCLE_MASK): New.
(PPCVEC2, PPCTMR, E6500): New short names.
(powerpc_opcodes): Add vabsdub, vabsduh, vabsduw, dni, mvidsplt,
mviwsplt, icblq., mftmr, mttmr, dcblq., miso, lvexbx, lvexhx,
lvexwx, stvexbx, stvexhx, stvexwx, lvepx, lvepxl, stvepx, stvepxl,
lvtrx, lvtrxl, lvtlx, lvtlxl, stvfrx, stvfrxl, stvflx, stvflxl,
lvswx, lvswxl, stvswx, stvswxl, lvsm mnemonics. Accept LS, ESYNC
optional operands on sync instruction for E6500 target.
bfd/
* archures.c: Add bfd_mach_ppc_e5500 and bfd_mach_ppc_e6500.
* bfd-in2.h: Regenerate.
* cpu-powerpc.c (bfd_powerpc_archs): Add entryies for
bfd_mach_ppc_e5500 and bfd_mach_ppc_e6500.
gas/
* config/tc-ppc.c (md_show_usage): Document -me5500 and -me6500.
(ppc_handle_align): Add termination nop opcode for e500mc family.
* doc/as.texinfo: Document options -me5500 and -me6500.
* doc/c-ppc.texi: Likewise.
gas/testsuite/
* gas/ppc/e500mc64_nop.s: New test case for e500mc family
termination nops.
* gas/ppc/e500mc64_nop.d: Likewise.
* gas/ppc/e5500_nop.s: Likewise.
* gas/ppc/e5500_nop.d: Likewise.
* gas/ppc/e6500_nop.s: Likewise.
* gas/ppc/e6500_nop.d: Likewise.
* gas/ppc/e6500.s: New.
* gas/ppc/e6500.d: Likewise.
* gas/ppc/ppc.exp: Run e6500, e500mc64_nop, e5500_nop, and e6500_nop.
2012-03-09 23:39:06 +00:00
|
|
|
2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
|
1999-05-03 07:29:11 +00:00
|
|
|
Written by Ian Lance Taylor, Cygnus Support
|
|
|
|
|
2007-07-05 09:49:03 +00:00
|
|
|
This file is part of the GNU opcodes library.
|
|
|
|
|
|
|
|
This library is 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 3, or (at your option)
|
|
|
|
any later version.
|
|
|
|
|
|
|
|
It is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
|
|
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
|
|
|
License for more details.
|
|
|
|
|
|
|
|
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 Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
|
|
|
|
MA 02110-1301, USA. */
|
1999-05-03 07:29:11 +00:00
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "sysdep.h"
|
|
|
|
#include "dis-asm.h"
|
2009-03-10 06:53:46 +00:00
|
|
|
#include "opintl.h"
|
1999-05-03 07:29:11 +00:00
|
|
|
#include "opcode/ppc.h"
|
|
|
|
|
|
|
|
/* This file provides several disassembler functions, all of which use
|
|
|
|
the disassembler interface defined in dis-asm.h. Several functions
|
|
|
|
are provided because this file handles disassembly for the PowerPC
|
|
|
|
in both big and little endian mode and also for the POWER (RS/6000)
|
|
|
|
chip. */
|
include/opcode/
* ppc.h (ppc_cpu_t): New typedef.
(struct powerpc_opcode <flags>): Use it.
(struct powerpc_operand <insert, extract>): Likewise.
(struct powerpc_macro <flags>): Likewise.
gas/
* config/tc-ppc.c (ppc_cpu): Use ppc_cpu_t typedef.
(ppc_insert_operand): Likewise.
(ppc_machine): Likewise.
* config/tc-ppc.h: #include "opcode/ppc.h"
(struct _ppc_fix_extra <ppc_cpu>): Use ppc_cpu_t typedef.
(ppc_cpu): Update extern decl.
opcodes/
* ppc-dis.c (print_insn_powerpc): Update prototye to use new
ppc_cpu_t typedef.
(struct dis_private): New.
(POWERPC_DIALECT): New define.
(powerpc_dialect): Renamed to...
(powerpc_init_dialect): This. Update to use ppc_cpu_t and
struct dis_private.
(print_insn_big_powerpc): Update for using structure in
info->private_data.
(print_insn_little_powerpc): Likewise.
(operand_value_powerpc): Change type of dialect param to ppc_cpu_t.
(skip_optional_operands): Likewise.
(print_insn_powerpc): Likewise. Remove initialization of dialect.
* ppc-opc.c (extract_bat, extract_bba, extract_bdm, extract_bdp,
extract_bo, extract_boe, extract_fxm, extract_mb6, extract_mbe,
extract_nb, extract_nsi, extract_rbs, extract_sh6, extract_spr,
extract_sprg, extract_tbr insert_bat, insert_bba, insert_bdm,
insert_bdp, insert_bo, insert_boe, insert_fxm, insert_mb6, insert_mbe,
insert_nsi, insert_ral, insert_ram, insert_raq, insert_ras, insert_rbs,
insert_sh6, insert_spr, insert_sprg, insert_tbr): Change the dialect
param to be of type ppc_cpu_t. Update prototype.
2008-06-13 20:16:00 +00:00
|
|
|
static int print_insn_powerpc (bfd_vma, struct disassemble_info *, int,
|
|
|
|
ppc_cpu_t);
|
1999-05-03 07:29:11 +00:00
|
|
|
|
include/opcode/
* ppc.h (ppc_cpu_t): New typedef.
(struct powerpc_opcode <flags>): Use it.
(struct powerpc_operand <insert, extract>): Likewise.
(struct powerpc_macro <flags>): Likewise.
gas/
* config/tc-ppc.c (ppc_cpu): Use ppc_cpu_t typedef.
(ppc_insert_operand): Likewise.
(ppc_machine): Likewise.
* config/tc-ppc.h: #include "opcode/ppc.h"
(struct _ppc_fix_extra <ppc_cpu>): Use ppc_cpu_t typedef.
(ppc_cpu): Update extern decl.
opcodes/
* ppc-dis.c (print_insn_powerpc): Update prototye to use new
ppc_cpu_t typedef.
(struct dis_private): New.
(POWERPC_DIALECT): New define.
(powerpc_dialect): Renamed to...
(powerpc_init_dialect): This. Update to use ppc_cpu_t and
struct dis_private.
(print_insn_big_powerpc): Update for using structure in
info->private_data.
(print_insn_little_powerpc): Likewise.
(operand_value_powerpc): Change type of dialect param to ppc_cpu_t.
(skip_optional_operands): Likewise.
(print_insn_powerpc): Likewise. Remove initialization of dialect.
* ppc-opc.c (extract_bat, extract_bba, extract_bdm, extract_bdp,
extract_bo, extract_boe, extract_fxm, extract_mb6, extract_mbe,
extract_nb, extract_nsi, extract_rbs, extract_sh6, extract_spr,
extract_sprg, extract_tbr insert_bat, insert_bba, insert_bdm,
insert_bdp, insert_bo, insert_boe, insert_fxm, insert_mb6, insert_mbe,
insert_nsi, insert_ral, insert_ram, insert_raq, insert_ras, insert_rbs,
insert_sh6, insert_spr, insert_sprg, insert_tbr): Change the dialect
param to be of type ppc_cpu_t. Update prototype.
2008-06-13 20:16:00 +00:00
|
|
|
struct dis_private
|
|
|
|
{
|
|
|
|
/* Stash the result of parsing disassembler_options here. */
|
|
|
|
ppc_cpu_t dialect;
|
2012-03-15 12:58:48 +00:00
|
|
|
} private;
|
include/opcode/
* ppc.h (ppc_cpu_t): New typedef.
(struct powerpc_opcode <flags>): Use it.
(struct powerpc_operand <insert, extract>): Likewise.
(struct powerpc_macro <flags>): Likewise.
gas/
* config/tc-ppc.c (ppc_cpu): Use ppc_cpu_t typedef.
(ppc_insert_operand): Likewise.
(ppc_machine): Likewise.
* config/tc-ppc.h: #include "opcode/ppc.h"
(struct _ppc_fix_extra <ppc_cpu>): Use ppc_cpu_t typedef.
(ppc_cpu): Update extern decl.
opcodes/
* ppc-dis.c (print_insn_powerpc): Update prototye to use new
ppc_cpu_t typedef.
(struct dis_private): New.
(POWERPC_DIALECT): New define.
(powerpc_dialect): Renamed to...
(powerpc_init_dialect): This. Update to use ppc_cpu_t and
struct dis_private.
(print_insn_big_powerpc): Update for using structure in
info->private_data.
(print_insn_little_powerpc): Likewise.
(operand_value_powerpc): Change type of dialect param to ppc_cpu_t.
(skip_optional_operands): Likewise.
(print_insn_powerpc): Likewise. Remove initialization of dialect.
* ppc-opc.c (extract_bat, extract_bba, extract_bdm, extract_bdp,
extract_bo, extract_boe, extract_fxm, extract_mb6, extract_mbe,
extract_nb, extract_nsi, extract_rbs, extract_sh6, extract_spr,
extract_sprg, extract_tbr insert_bat, insert_bba, insert_bdm,
insert_bdp, insert_bo, insert_boe, insert_fxm, insert_mb6, insert_mbe,
insert_nsi, insert_ral, insert_ram, insert_raq, insert_ras, insert_rbs,
insert_sh6, insert_spr, insert_sprg, insert_tbr): Change the dialect
param to be of type ppc_cpu_t. Update prototype.
2008-06-13 20:16:00 +00:00
|
|
|
|
|
|
|
#define POWERPC_DIALECT(INFO) \
|
|
|
|
(((struct dis_private *) ((INFO)->private_data))->dialect)
|
[gas/ChangeLog]
* config/tc-ppc.c (md_parse_option): New -m7410, -m7450 and -m7455
flags, equivalent to -m7400. New -maltivec to enable AltiVec
instructions. New -mbook64 and -mbooke/-mbooke32 flags to enable
64-bit and 32-bit BookE support, respectively. Change -m403 and
-m405 to set PPC403 option.
(md_show_usage): Adjust for new options.
* doc/all.texi: Set PPC.
* doc/as.texinfo: Add PPC support and pull in c-ppc.texi.
* doc/c-ppc.texi: New file.
* doc/Makefile.am (CPU_DOCS): Add c-ppc.texi.
* doc/Makefile.in: Regenerate.
[gas/testsuite/ChangeLog]
* gas/ppc/booke.s: New test for Motorola BookE.
* gas/ppc/booke.d: New file.
* gas/ppc/ppc.exp: Test booke.s.
[include/opcode/ChangeLog]
* ppc.h (PPC_OPCODE_BOOKE, PPC_OPCODE_403): New opcode flags for
BookE and PowerPC403 instructions.
[opcodes/ChangeLog]
* ppc-opc.c (insert_de, extract_de, insert_des, extract_des): New
instruction field instruction/extraction functions for new BookE
DE form instructions.
(CT): New macro for CT field in an X form instruction.
(DE, DES, DEO, DE_MASK): New macros for DE/DES fields in DE form
instructions.
(PPC64): Don't include PPC_OPCODE_PPC.
(403): New opcode macro for PPC403 processors.
(BOOKE): New opcode macro for BookE processors.
(bce, bcel, bcea, bcela, bclre, bclrel: New BookE instructions.
(bcctre, bcctrel, be, bel, bea, bela, icbt, icbte, lwzxe): Likewise.
(dcbste, lwzuxe, luxe, dcbfe, lbzxe, lwarxe, lbzuxe): Likewise.
(stwcxe, stwxe, stxe, stwuxe, stuxe, stbxe, dcbtste, stbuxe): Likewise.
(mfapidi, dcbte, lhzxe, lhzuxe, lhaxe, lhauxe, subfe64): Likewise.
(subfeo64, adde64, addeo64, sthxe, sthuxe, subfze64): Likewise.
(subfzeo64, addze64, addzeo64, dcbie, subfme64, subfmeo64): Likewise.
(addme64, addmeo64, stdcxe., mcrxr64, lwbrxe, lfsxe, lfsuxe): Likewise.
(lfdxe, lfduxe, stwbrxe, stfsxe, stfsuxe, stfdxe, dcbae): Likewise.
(stfduxe, tlbivax, tlbivaxe, lhbrxe, ldxe, lduxe, tlbsx): Likewise.
(tlbsxe, sthbrxe, stdxe, stduxe, icbie, stfiwxe, dcbze, lbze): Likewise.
(lbzue, ldue, lhze, lhzue, lhae, lhaue, lwze, lwzue): Likewise.
(stbe, stbue, sthe, sthue, stwe, stwue, lfse, lfsue, lfde): Likewise.
(lfdue, stde, stdue, stfse, stfsue, stfde, stfdue): Likewise.
* ppc-dis.c (print_insn_big_powerpc, print_insn_little_powerpc): Look
for a disassembler option of `booke', `booke32' or `booke64' to enable
BookE support in the disassembler.
2001-10-13 01:59:09 +00:00
|
|
|
|
2009-03-10 06:53:46 +00:00
|
|
|
struct ppc_mopt {
|
|
|
|
const char *opt;
|
|
|
|
ppc_cpu_t cpu;
|
|
|
|
ppc_cpu_t sticky;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct ppc_mopt ppc_opts[] = {
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "403", (PPC_OPCODE_PPC | PPC_OPCODE_403),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "405", (PPC_OPCODE_PPC | PPC_OPCODE_403 | PPC_OPCODE_405),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "440", (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_440
|
|
|
|
| PPC_OPCODE_ISEL | PPC_OPCODE_RFMCI),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "464", (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_440
|
|
|
|
| PPC_OPCODE_ISEL | PPC_OPCODE_RFMCI),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "476", (PPC_OPCODE_PPC | PPC_OPCODE_ISEL | PPC_OPCODE_440
|
|
|
|
| PPC_OPCODE_476 | PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5),
|
2009-10-02 14:42:42 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "601", (PPC_OPCODE_PPC | PPC_OPCODE_601),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "603", (PPC_OPCODE_PPC),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "604", (PPC_OPCODE_PPC),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "620", (PPC_OPCODE_PPC | PPC_OPCODE_64),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "7400", (PPC_OPCODE_PPC | PPC_OPCODE_ALTIVEC),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "7410", (PPC_OPCODE_PPC | PPC_OPCODE_ALTIVEC),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "7450", (PPC_OPCODE_PPC | PPC_OPCODE_ALTIVEC),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "7455", (PPC_OPCODE_PPC | PPC_OPCODE_ALTIVEC),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
|
|
|
{ "750cl", (PPC_OPCODE_PPC | PPC_OPCODE_PPCPS)
|
|
|
|
, 0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "a2", (PPC_OPCODE_PPC | PPC_OPCODE_ISEL | PPC_OPCODE_POWER4
|
|
|
|
| PPC_OPCODE_POWER5 | PPC_OPCODE_CACHELCK | PPC_OPCODE_64
|
|
|
|
| PPC_OPCODE_A2),
|
2010-02-10 19:59:07 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "altivec", (PPC_OPCODE_PPC),
|
2009-03-10 06:53:46 +00:00
|
|
|
PPC_OPCODE_ALTIVEC },
|
|
|
|
{ "any", 0,
|
|
|
|
PPC_OPCODE_ANY },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "booke", (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "booke32", (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "cell", (PPC_OPCODE_PPC | PPC_OPCODE_64 | PPC_OPCODE_POWER4
|
|
|
|
| PPC_OPCODE_CELL | PPC_OPCODE_ALTIVEC),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "com", (PPC_OPCODE_COMMON),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "e300", (PPC_OPCODE_PPC | PPC_OPCODE_E300),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
|
|
|
{ "e500", (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_SPE
|
|
|
|
| PPC_OPCODE_ISEL | PPC_OPCODE_EFS | PPC_OPCODE_BRLOCK
|
|
|
|
| PPC_OPCODE_PMR | PPC_OPCODE_CACHELCK | PPC_OPCODE_RFMCI
|
2010-06-14 14:48:05 +00:00
|
|
|
| PPC_OPCODE_E500),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
|
|
|
{ "e500mc", (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_ISEL
|
|
|
|
| PPC_OPCODE_PMR | PPC_OPCODE_CACHELCK | PPC_OPCODE_RFMCI
|
|
|
|
| PPC_OPCODE_E500MC),
|
|
|
|
0 },
|
2010-01-04 02:32:56 +00:00
|
|
|
{ "e500mc64", (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_ISEL
|
|
|
|
| PPC_OPCODE_PMR | PPC_OPCODE_CACHELCK | PPC_OPCODE_RFMCI
|
2010-02-25 01:00:13 +00:00
|
|
|
| PPC_OPCODE_E500MC | PPC_OPCODE_64 | PPC_OPCODE_POWER5
|
|
|
|
| PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7),
|
2010-01-04 02:32:56 +00:00
|
|
|
0 },
|
include/opcode/
* ppc.h: Add PPC_OPCODE_ALTIVEC2, PPC_OPCODE_E6500, PPC_OPCODE_TMR.
opcodes/
* ppc-dis.c (ppc_opts): Add entries for "e5500" and "e6500".
* ppc-opc.c (insert_ls, TMR, ESYNC, XSYNCLE_MASK): New.
(PPCVEC2, PPCTMR, E6500): New short names.
(powerpc_opcodes): Add vabsdub, vabsduh, vabsduw, dni, mvidsplt,
mviwsplt, icblq., mftmr, mttmr, dcblq., miso, lvexbx, lvexhx,
lvexwx, stvexbx, stvexhx, stvexwx, lvepx, lvepxl, stvepx, stvepxl,
lvtrx, lvtrxl, lvtlx, lvtlxl, stvfrx, stvfrxl, stvflx, stvflxl,
lvswx, lvswxl, stvswx, stvswxl, lvsm mnemonics. Accept LS, ESYNC
optional operands on sync instruction for E6500 target.
bfd/
* archures.c: Add bfd_mach_ppc_e5500 and bfd_mach_ppc_e6500.
* bfd-in2.h: Regenerate.
* cpu-powerpc.c (bfd_powerpc_archs): Add entryies for
bfd_mach_ppc_e5500 and bfd_mach_ppc_e6500.
gas/
* config/tc-ppc.c (md_show_usage): Document -me5500 and -me6500.
(ppc_handle_align): Add termination nop opcode for e500mc family.
* doc/as.texinfo: Document options -me5500 and -me6500.
* doc/c-ppc.texi: Likewise.
gas/testsuite/
* gas/ppc/e500mc64_nop.s: New test case for e500mc family
termination nops.
* gas/ppc/e500mc64_nop.d: Likewise.
* gas/ppc/e5500_nop.s: Likewise.
* gas/ppc/e5500_nop.d: Likewise.
* gas/ppc/e6500_nop.s: Likewise.
* gas/ppc/e6500_nop.d: Likewise.
* gas/ppc/e6500.s: New.
* gas/ppc/e6500.d: Likewise.
* gas/ppc/ppc.exp: Run e6500, e500mc64_nop, e5500_nop, and e6500_nop.
2012-03-09 23:39:06 +00:00
|
|
|
{ "e5500", (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_ISEL
|
|
|
|
| PPC_OPCODE_PMR | PPC_OPCODE_CACHELCK | PPC_OPCODE_RFMCI
|
|
|
|
| PPC_OPCODE_E500MC | PPC_OPCODE_64 | PPC_OPCODE_POWER4
|
|
|
|
| PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6
|
|
|
|
| PPC_OPCODE_POWER7),
|
|
|
|
0 },
|
|
|
|
{ "e6500", (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_ISEL
|
|
|
|
| PPC_OPCODE_PMR | PPC_OPCODE_CACHELCK | PPC_OPCODE_RFMCI
|
|
|
|
| PPC_OPCODE_E500MC | PPC_OPCODE_64 | PPC_OPCODE_ALTIVEC
|
|
|
|
| PPC_OPCODE_ALTIVEC2 | PPC_OPCODE_E6500 | PPC_OPCODE_POWER4
|
|
|
|
| PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7),
|
|
|
|
0 },
|
2009-03-10 06:53:46 +00:00
|
|
|
{ "e500x2", (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_SPE
|
|
|
|
| PPC_OPCODE_ISEL | PPC_OPCODE_EFS | PPC_OPCODE_BRLOCK
|
|
|
|
| PPC_OPCODE_PMR | PPC_OPCODE_CACHELCK | PPC_OPCODE_RFMCI
|
2010-06-14 14:48:05 +00:00
|
|
|
| PPC_OPCODE_E500),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
|
|
|
{ "efs", (PPC_OPCODE_PPC | PPC_OPCODE_EFS),
|
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "power4", (PPC_OPCODE_PPC | PPC_OPCODE_64 | PPC_OPCODE_POWER4),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "power5", (PPC_OPCODE_PPC | PPC_OPCODE_64 | PPC_OPCODE_POWER4
|
|
|
|
| PPC_OPCODE_POWER5),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "power6", (PPC_OPCODE_PPC | PPC_OPCODE_64 | PPC_OPCODE_POWER4
|
|
|
|
| PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_ALTIVEC),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "power7", (PPC_OPCODE_PPC | PPC_OPCODE_ISEL | PPC_OPCODE_64
|
|
|
|
| PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6
|
|
|
|
| PPC_OPCODE_POWER7 | PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "ppc", (PPC_OPCODE_PPC),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "ppc32", (PPC_OPCODE_PPC),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "ppc64", (PPC_OPCODE_PPC | PPC_OPCODE_64),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "ppc64bridge", (PPC_OPCODE_PPC | PPC_OPCODE_64_BRIDGE),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
|
|
|
{ "ppcps", (PPC_OPCODE_PPC | PPC_OPCODE_PPCPS),
|
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "pwr", (PPC_OPCODE_POWER),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "pwr2", (PPC_OPCODE_POWER | PPC_OPCODE_POWER2),
|
2010-02-10 19:59:07 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "pwr4", (PPC_OPCODE_PPC | PPC_OPCODE_64 | PPC_OPCODE_POWER4),
|
2010-02-10 19:59:07 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "pwr5", (PPC_OPCODE_PPC | PPC_OPCODE_64 | PPC_OPCODE_POWER4
|
|
|
|
| PPC_OPCODE_POWER5),
|
2010-02-10 19:59:07 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "pwr5x", (PPC_OPCODE_PPC | PPC_OPCODE_64 | PPC_OPCODE_POWER4
|
|
|
|
| PPC_OPCODE_POWER5),
|
2010-02-10 19:59:07 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "pwr6", (PPC_OPCODE_PPC | PPC_OPCODE_64 | PPC_OPCODE_POWER4
|
|
|
|
| PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_ALTIVEC),
|
2010-02-10 19:59:07 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "pwr7", (PPC_OPCODE_PPC | PPC_OPCODE_ISEL | PPC_OPCODE_64
|
|
|
|
| PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6
|
|
|
|
| PPC_OPCODE_POWER7 | PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "pwrx", (PPC_OPCODE_POWER | PPC_OPCODE_POWER2),
|
2009-03-10 06:53:46 +00:00
|
|
|
0 },
|
|
|
|
{ "spe", (PPC_OPCODE_PPC | PPC_OPCODE_EFS),
|
|
|
|
PPC_OPCODE_SPE },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "titan", (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_PMR
|
|
|
|
| PPC_OPCODE_RFMCI | PPC_OPCODE_TITAN),
|
2010-02-08 01:59:38 +00:00
|
|
|
0 },
|
2010-07-03 06:51:56 +00:00
|
|
|
{ "vsx", (PPC_OPCODE_PPC),
|
2009-03-10 06:53:46 +00:00
|
|
|
PPC_OPCODE_VSX },
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Handle -m and -M options that set cpu type, and .machine arg. */
|
|
|
|
|
|
|
|
ppc_cpu_t
|
|
|
|
ppc_parse_cpu (ppc_cpu_t ppc_cpu, const char *arg)
|
|
|
|
{
|
|
|
|
/* Sticky bits. */
|
|
|
|
ppc_cpu_t retain_flags = ppc_cpu & (PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX
|
|
|
|
| PPC_OPCODE_SPE | PPC_OPCODE_ANY);
|
|
|
|
unsigned int i;
|
|
|
|
|
|
|
|
for (i = 0; i < sizeof (ppc_opts) / sizeof (ppc_opts[0]); i++)
|
|
|
|
if (strcmp (ppc_opts[i].opt, arg) == 0)
|
|
|
|
{
|
|
|
|
if (ppc_opts[i].sticky)
|
|
|
|
{
|
|
|
|
retain_flags |= ppc_opts[i].sticky;
|
2010-07-03 08:27:23 +00:00
|
|
|
if ((ppc_cpu & ~(ppc_cpu_t) (PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX
|
|
|
|
| PPC_OPCODE_SPE | PPC_OPCODE_ANY)) != 0)
|
2009-03-10 06:53:46 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
ppc_cpu = ppc_opts[i].cpu;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (i >= sizeof (ppc_opts) / sizeof (ppc_opts[0]))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
ppc_cpu |= retain_flags;
|
|
|
|
return ppc_cpu;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Determine which set of machines to disassemble for. */
|
[gas/ChangeLog]
* config/tc-ppc.c (md_parse_option): New -m7410, -m7450 and -m7455
flags, equivalent to -m7400. New -maltivec to enable AltiVec
instructions. New -mbook64 and -mbooke/-mbooke32 flags to enable
64-bit and 32-bit BookE support, respectively. Change -m403 and
-m405 to set PPC403 option.
(md_show_usage): Adjust for new options.
* doc/all.texi: Set PPC.
* doc/as.texinfo: Add PPC support and pull in c-ppc.texi.
* doc/c-ppc.texi: New file.
* doc/Makefile.am (CPU_DOCS): Add c-ppc.texi.
* doc/Makefile.in: Regenerate.
[gas/testsuite/ChangeLog]
* gas/ppc/booke.s: New test for Motorola BookE.
* gas/ppc/booke.d: New file.
* gas/ppc/ppc.exp: Test booke.s.
[include/opcode/ChangeLog]
* ppc.h (PPC_OPCODE_BOOKE, PPC_OPCODE_403): New opcode flags for
BookE and PowerPC403 instructions.
[opcodes/ChangeLog]
* ppc-opc.c (insert_de, extract_de, insert_des, extract_des): New
instruction field instruction/extraction functions for new BookE
DE form instructions.
(CT): New macro for CT field in an X form instruction.
(DE, DES, DEO, DE_MASK): New macros for DE/DES fields in DE form
instructions.
(PPC64): Don't include PPC_OPCODE_PPC.
(403): New opcode macro for PPC403 processors.
(BOOKE): New opcode macro for BookE processors.
(bce, bcel, bcea, bcela, bclre, bclrel: New BookE instructions.
(bcctre, bcctrel, be, bel, bea, bela, icbt, icbte, lwzxe): Likewise.
(dcbste, lwzuxe, luxe, dcbfe, lbzxe, lwarxe, lbzuxe): Likewise.
(stwcxe, stwxe, stxe, stwuxe, stuxe, stbxe, dcbtste, stbuxe): Likewise.
(mfapidi, dcbte, lhzxe, lhzuxe, lhaxe, lhauxe, subfe64): Likewise.
(subfeo64, adde64, addeo64, sthxe, sthuxe, subfze64): Likewise.
(subfzeo64, addze64, addzeo64, dcbie, subfme64, subfmeo64): Likewise.
(addme64, addmeo64, stdcxe., mcrxr64, lwbrxe, lfsxe, lfsuxe): Likewise.
(lfdxe, lfduxe, stwbrxe, stfsxe, stfsuxe, stfdxe, dcbae): Likewise.
(stfduxe, tlbivax, tlbivaxe, lhbrxe, ldxe, lduxe, tlbsx): Likewise.
(tlbsxe, sthbrxe, stdxe, stduxe, icbie, stfiwxe, dcbze, lbze): Likewise.
(lbzue, ldue, lhze, lhzue, lhae, lhaue, lwze, lwzue): Likewise.
(stbe, stbue, sthe, sthue, stwe, stwue, lfse, lfsue, lfde): Likewise.
(lfdue, stde, stdue, stfse, stfsue, stfde, stfdue): Likewise.
* ppc-dis.c (print_insn_big_powerpc, print_insn_little_powerpc): Look
for a disassembler option of `booke', `booke32' or `booke64' to enable
BookE support in the disassembler.
2001-10-13 01:59:09 +00:00
|
|
|
|
2012-03-15 12:58:48 +00:00
|
|
|
static void
|
include/opcode/
* ppc.h (ppc_cpu_t): New typedef.
(struct powerpc_opcode <flags>): Use it.
(struct powerpc_operand <insert, extract>): Likewise.
(struct powerpc_macro <flags>): Likewise.
gas/
* config/tc-ppc.c (ppc_cpu): Use ppc_cpu_t typedef.
(ppc_insert_operand): Likewise.
(ppc_machine): Likewise.
* config/tc-ppc.h: #include "opcode/ppc.h"
(struct _ppc_fix_extra <ppc_cpu>): Use ppc_cpu_t typedef.
(ppc_cpu): Update extern decl.
opcodes/
* ppc-dis.c (print_insn_powerpc): Update prototye to use new
ppc_cpu_t typedef.
(struct dis_private): New.
(POWERPC_DIALECT): New define.
(powerpc_dialect): Renamed to...
(powerpc_init_dialect): This. Update to use ppc_cpu_t and
struct dis_private.
(print_insn_big_powerpc): Update for using structure in
info->private_data.
(print_insn_little_powerpc): Likewise.
(operand_value_powerpc): Change type of dialect param to ppc_cpu_t.
(skip_optional_operands): Likewise.
(print_insn_powerpc): Likewise. Remove initialization of dialect.
* ppc-opc.c (extract_bat, extract_bba, extract_bdm, extract_bdp,
extract_bo, extract_boe, extract_fxm, extract_mb6, extract_mbe,
extract_nb, extract_nsi, extract_rbs, extract_sh6, extract_spr,
extract_sprg, extract_tbr insert_bat, insert_bba, insert_bdm,
insert_bdp, insert_bo, insert_boe, insert_fxm, insert_mb6, insert_mbe,
insert_nsi, insert_ral, insert_ram, insert_raq, insert_ras, insert_rbs,
insert_sh6, insert_spr, insert_sprg, insert_tbr): Change the dialect
param to be of type ppc_cpu_t. Update prototype.
2008-06-13 20:16:00 +00:00
|
|
|
powerpc_init_dialect (struct disassemble_info *info)
|
[gas/ChangeLog]
* config/tc-ppc.c (md_parse_option): New -m7410, -m7450 and -m7455
flags, equivalent to -m7400. New -maltivec to enable AltiVec
instructions. New -mbook64 and -mbooke/-mbooke32 flags to enable
64-bit and 32-bit BookE support, respectively. Change -m403 and
-m405 to set PPC403 option.
(md_show_usage): Adjust for new options.
* doc/all.texi: Set PPC.
* doc/as.texinfo: Add PPC support and pull in c-ppc.texi.
* doc/c-ppc.texi: New file.
* doc/Makefile.am (CPU_DOCS): Add c-ppc.texi.
* doc/Makefile.in: Regenerate.
[gas/testsuite/ChangeLog]
* gas/ppc/booke.s: New test for Motorola BookE.
* gas/ppc/booke.d: New file.
* gas/ppc/ppc.exp: Test booke.s.
[include/opcode/ChangeLog]
* ppc.h (PPC_OPCODE_BOOKE, PPC_OPCODE_403): New opcode flags for
BookE and PowerPC403 instructions.
[opcodes/ChangeLog]
* ppc-opc.c (insert_de, extract_de, insert_des, extract_des): New
instruction field instruction/extraction functions for new BookE
DE form instructions.
(CT): New macro for CT field in an X form instruction.
(DE, DES, DEO, DE_MASK): New macros for DE/DES fields in DE form
instructions.
(PPC64): Don't include PPC_OPCODE_PPC.
(403): New opcode macro for PPC403 processors.
(BOOKE): New opcode macro for BookE processors.
(bce, bcel, bcea, bcela, bclre, bclrel: New BookE instructions.
(bcctre, bcctrel, be, bel, bea, bela, icbt, icbte, lwzxe): Likewise.
(dcbste, lwzuxe, luxe, dcbfe, lbzxe, lwarxe, lbzuxe): Likewise.
(stwcxe, stwxe, stxe, stwuxe, stuxe, stbxe, dcbtste, stbuxe): Likewise.
(mfapidi, dcbte, lhzxe, lhzuxe, lhaxe, lhauxe, subfe64): Likewise.
(subfeo64, adde64, addeo64, sthxe, sthuxe, subfze64): Likewise.
(subfzeo64, addze64, addzeo64, dcbie, subfme64, subfmeo64): Likewise.
(addme64, addmeo64, stdcxe., mcrxr64, lwbrxe, lfsxe, lfsuxe): Likewise.
(lfdxe, lfduxe, stwbrxe, stfsxe, stfsuxe, stfdxe, dcbae): Likewise.
(stfduxe, tlbivax, tlbivaxe, lhbrxe, ldxe, lduxe, tlbsx): Likewise.
(tlbsxe, sthbrxe, stdxe, stduxe, icbie, stfiwxe, dcbze, lbze): Likewise.
(lbzue, ldue, lhze, lhzue, lhae, lhaue, lwze, lwzue): Likewise.
(stbe, stbue, sthe, sthue, stwe, stwue, lfse, lfsue, lfde): Likewise.
(lfdue, stde, stdue, stfse, stfsue, stfde, stfdue): Likewise.
* ppc-dis.c (print_insn_big_powerpc, print_insn_little_powerpc): Look
for a disassembler option of `booke', `booke32' or `booke64' to enable
BookE support in the disassembler.
2001-10-13 01:59:09 +00:00
|
|
|
{
|
2009-03-10 06:53:46 +00:00
|
|
|
ppc_cpu_t dialect = 0;
|
|
|
|
char *arg;
|
include/opcode/
* ppc.h (ppc_cpu_t): New typedef.
(struct powerpc_opcode <flags>): Use it.
(struct powerpc_operand <insert, extract>): Likewise.
(struct powerpc_macro <flags>): Likewise.
gas/
* config/tc-ppc.c (ppc_cpu): Use ppc_cpu_t typedef.
(ppc_insert_operand): Likewise.
(ppc_machine): Likewise.
* config/tc-ppc.h: #include "opcode/ppc.h"
(struct _ppc_fix_extra <ppc_cpu>): Use ppc_cpu_t typedef.
(ppc_cpu): Update extern decl.
opcodes/
* ppc-dis.c (print_insn_powerpc): Update prototye to use new
ppc_cpu_t typedef.
(struct dis_private): New.
(POWERPC_DIALECT): New define.
(powerpc_dialect): Renamed to...
(powerpc_init_dialect): This. Update to use ppc_cpu_t and
struct dis_private.
(print_insn_big_powerpc): Update for using structure in
info->private_data.
(print_insn_little_powerpc): Likewise.
(operand_value_powerpc): Change type of dialect param to ppc_cpu_t.
(skip_optional_operands): Likewise.
(print_insn_powerpc): Likewise. Remove initialization of dialect.
* ppc-opc.c (extract_bat, extract_bba, extract_bdm, extract_bdp,
extract_bo, extract_boe, extract_fxm, extract_mb6, extract_mbe,
extract_nb, extract_nsi, extract_rbs, extract_sh6, extract_spr,
extract_sprg, extract_tbr insert_bat, insert_bba, insert_bdm,
insert_bdp, insert_bo, insert_boe, insert_fxm, insert_mb6, insert_mbe,
insert_nsi, insert_ral, insert_ram, insert_raq, insert_ras, insert_rbs,
insert_sh6, insert_spr, insert_sprg, insert_tbr): Change the dialect
param to be of type ppc_cpu_t. Update prototype.
2008-06-13 20:16:00 +00:00
|
|
|
struct dis_private *priv = calloc (sizeof (*priv), 1);
|
|
|
|
|
|
|
|
if (priv == NULL)
|
2012-03-15 12:58:48 +00:00
|
|
|
priv = &private;
|
[gas/ChangeLog]
* config/tc-ppc.c (md_parse_option): New -m7410, -m7450 and -m7455
flags, equivalent to -m7400. New -maltivec to enable AltiVec
instructions. New -mbook64 and -mbooke/-mbooke32 flags to enable
64-bit and 32-bit BookE support, respectively. Change -m403 and
-m405 to set PPC403 option.
(md_show_usage): Adjust for new options.
* doc/all.texi: Set PPC.
* doc/as.texinfo: Add PPC support and pull in c-ppc.texi.
* doc/c-ppc.texi: New file.
* doc/Makefile.am (CPU_DOCS): Add c-ppc.texi.
* doc/Makefile.in: Regenerate.
[gas/testsuite/ChangeLog]
* gas/ppc/booke.s: New test for Motorola BookE.
* gas/ppc/booke.d: New file.
* gas/ppc/ppc.exp: Test booke.s.
[include/opcode/ChangeLog]
* ppc.h (PPC_OPCODE_BOOKE, PPC_OPCODE_403): New opcode flags for
BookE and PowerPC403 instructions.
[opcodes/ChangeLog]
* ppc-opc.c (insert_de, extract_de, insert_des, extract_des): New
instruction field instruction/extraction functions for new BookE
DE form instructions.
(CT): New macro for CT field in an X form instruction.
(DE, DES, DEO, DE_MASK): New macros for DE/DES fields in DE form
instructions.
(PPC64): Don't include PPC_OPCODE_PPC.
(403): New opcode macro for PPC403 processors.
(BOOKE): New opcode macro for BookE processors.
(bce, bcel, bcea, bcela, bclre, bclrel: New BookE instructions.
(bcctre, bcctrel, be, bel, bea, bela, icbt, icbte, lwzxe): Likewise.
(dcbste, lwzuxe, luxe, dcbfe, lbzxe, lwarxe, lbzuxe): Likewise.
(stwcxe, stwxe, stxe, stwuxe, stuxe, stbxe, dcbtste, stbuxe): Likewise.
(mfapidi, dcbte, lhzxe, lhzuxe, lhaxe, lhauxe, subfe64): Likewise.
(subfeo64, adde64, addeo64, sthxe, sthuxe, subfze64): Likewise.
(subfzeo64, addze64, addzeo64, dcbie, subfme64, subfmeo64): Likewise.
(addme64, addmeo64, stdcxe., mcrxr64, lwbrxe, lfsxe, lfsuxe): Likewise.
(lfdxe, lfduxe, stwbrxe, stfsxe, stfsuxe, stfdxe, dcbae): Likewise.
(stfduxe, tlbivax, tlbivaxe, lhbrxe, ldxe, lduxe, tlbsx): Likewise.
(tlbsxe, sthbrxe, stdxe, stduxe, icbie, stfiwxe, dcbze, lbze): Likewise.
(lbzue, ldue, lhze, lhzue, lhae, lhaue, lwze, lwzue): Likewise.
(stbe, stbue, sthe, sthue, stwe, stwue, lfse, lfsue, lfde): Likewise.
(lfdue, stde, stdue, stfse, stfsue, stfde, stfdue): Likewise.
* ppc-dis.c (print_insn_big_powerpc, print_insn_little_powerpc): Look
for a disassembler option of `booke', `booke32' or `booke64' to enable
BookE support in the disassembler.
2001-10-13 01:59:09 +00:00
|
|
|
|
2009-03-10 06:53:46 +00:00
|
|
|
arg = info->disassembler_options;
|
|
|
|
while (arg != NULL)
|
|
|
|
{
|
|
|
|
ppc_cpu_t new_cpu = 0;
|
|
|
|
char *end = strchr (arg, ',');
|
gas/
* config/tc-ppc.c (parse_cpu): Rename altivec_or_spe to retain_flags.
Handle -mvsx and -mpower7.
(md_show_usage): Document -mpower7 and -mvsx.
* doc/as.texinfo (Target PowerPC): Document -mvsx.
* doc/c-ppc.texi (PowerPC-Opts): Document -mvsx and -mpower7.
gas/testsuite/
* gas/ppc/power7.d: New.
* gas/ppc/power7.s: Likewise.
* gas/ppc/ppc.exp: Run power7 test.
include/opcode/
* ppc.h (PPC_OPCODE_VSX, PPC_OPERAND_VSR): New.
opcodes/
* ppc-dis.c (powerpc_init_dialect): Handle power7 and vsx options.
(print_insn_powerpc): Prepend 'vs' when printing VSX registers.
(print_ppc_disassembler_options): Document -Mpower7 and -Mvsx.
* ppc-opc.c (insert_xt6): New static function.
(extract_xt6): Likewise.
(insert_xa6): Likewise.
(extract_xa6: Likewise.
(insert_xb6): Likewise.
(extract_xb6): Likewise.
(insert_xb6s): Likewise.
(extract_xb6s): Likewise.
(XS6, XT6, XA6, XB6, XB6S, DM, XX3, XX3DM, XX1_MASK, XX3_MASK,
XX3DM_MASK, PPCVSX): New.
(powerpc_opcodes): Add opcodes "lxvd2x", "lxvd2ux", "stxvd2x",
"stxvd2ux", "xxmrghd", "xxmrgld", "xxpermdi", "xvmovdp", "xvcpsgndp".
2008-08-02 04:38:51 +00:00
|
|
|
|
2009-03-10 06:53:46 +00:00
|
|
|
if (end != NULL)
|
|
|
|
*end = 0;
|
gas/
* config/tc-ppc.c (parse_cpu): Rename altivec_or_spe to retain_flags.
Handle -mvsx and -mpower7.
(md_show_usage): Document -mpower7 and -mvsx.
* doc/as.texinfo (Target PowerPC): Document -mvsx.
* doc/c-ppc.texi (PowerPC-Opts): Document -mvsx and -mpower7.
gas/testsuite/
* gas/ppc/power7.d: New.
* gas/ppc/power7.s: Likewise.
* gas/ppc/ppc.exp: Run power7 test.
include/opcode/
* ppc.h (PPC_OPCODE_VSX, PPC_OPERAND_VSR): New.
opcodes/
* ppc-dis.c (powerpc_init_dialect): Handle power7 and vsx options.
(print_insn_powerpc): Prepend 'vs' when printing VSX registers.
(print_ppc_disassembler_options): Document -Mpower7 and -Mvsx.
* ppc-opc.c (insert_xt6): New static function.
(extract_xt6): Likewise.
(insert_xa6): Likewise.
(extract_xa6: Likewise.
(insert_xb6): Likewise.
(extract_xb6): Likewise.
(insert_xb6s): Likewise.
(extract_xb6s): Likewise.
(XS6, XT6, XA6, XB6, XB6S, DM, XX3, XX3DM, XX1_MASK, XX3_MASK,
XX3DM_MASK, PPCVSX): New.
(powerpc_opcodes): Add opcodes "lxvd2x", "lxvd2ux", "stxvd2x",
"stxvd2ux", "xxmrghd", "xxmrgld", "xxpermdi", "xvmovdp", "xvcpsgndp".
2008-08-02 04:38:51 +00:00
|
|
|
|
2009-03-10 06:53:46 +00:00
|
|
|
if ((new_cpu = ppc_parse_cpu (dialect, arg)) != 0)
|
|
|
|
dialect = new_cpu;
|
|
|
|
else if (strcmp (arg, "32") == 0)
|
2010-07-03 08:27:23 +00:00
|
|
|
dialect &= ~(ppc_cpu_t) PPC_OPCODE_64;
|
2009-03-10 06:53:46 +00:00
|
|
|
else if (strcmp (arg, "64") == 0)
|
2010-07-03 06:51:56 +00:00
|
|
|
dialect |= PPC_OPCODE_64;
|
2009-03-10 06:53:46 +00:00
|
|
|
else
|
|
|
|
fprintf (stderr, _("warning: ignoring unknown -M%s option\n"), arg);
|
2006-06-07 05:23:59 +00:00
|
|
|
|
2009-03-10 06:53:46 +00:00
|
|
|
if (end != NULL)
|
|
|
|
*end++ = ',';
|
|
|
|
arg = end;
|
|
|
|
}
|
* ppc-dis.c (struct dis_private): New.
(powerpc_dialect): Make static. Accept -Many in addition to existing
options. Save dialect in dis_private.
(print_insn_big_powerpc): Retrieve dialect from dis_private.
(print_insn_little_powerpc): Likewise.
(print_insn_powerpc): Call powpc_dialect here. Remove unnecessary
efs/altivec check. Try harder to disassemble if given -Many.
* ppc-opc.c (insert_fxm): Expand comment.
(PPC, PPCCOM, PPC32, PPC64, PPCVEC): Remove PPC_OPCODE_ANY.
(POWER, POWER2, PPCPWR2, POWER32, COM, COM32, M601, PWRCOM): Likewise.
(POWER4): Remove PPCCOM.
(PPCONLY): Don't define. Update all occurrences to PPC.
2003-09-04 01:51:37 +00:00
|
|
|
|
2010-07-03 08:27:23 +00:00
|
|
|
if ((dialect & ~(ppc_cpu_t) PPC_OPCODE_64) == 0)
|
binutils/ChangeLog
* doc/binutils.texi (objdump): Document ppc -M options.
gas/ChangeLog
* config/tc-ppc.c (ppc_insert_operand): Pass (ppc_cpu | ppc_size)
to operand->insert.
(md_assemble): Likewise.
gas/testsuite/ChangeLog
* gas/ppc/booke.d: Modify reloc and target matches for powerpc64.
include/opcode/ChangeLog
* ppc.h (struct powerpc_operand <insert, extract>): Add dialect param.
opcodes/ChangeLog
* ppc-opc.c (PPC64): Revert 2001-10-12. Do include PPC_OPCODE_PPC.
(insert_bat, extract_bat, insert_bba, extract_bba,
insert_bd, extract_bd, insert_bdm, extract_bdm,
insert_bdp, extract_bdp, valid_bo,
insert_bo, extract_bo, insert_boe, extract_boe,
insert_ds, extract_ds, insert_de, extract_de,
insert_des, extract_des, insert_li, extract_li,
insert_mbe, extract_mbe, insert_mb6, extract_mb6,
insert_nb, extract_nb, insert_nsi, extract_nsi,
insert_ral, insert_ram, insert_ras,
insert_rbs, extract_rbs, insert_sh6, extract_sh6,
insert_spr, extract_spr, insert_tbr, extract_tbr): Add dialect param.
(extract_bd, extract_bdm, extract_bdp,
extract_ds, extract_des,
extract_li, extract_nsi): Implement sign extension without conditional.
(insert_bdm, extract_bdm,
insert_bdp, extract_bdp, valid_bo): Handle 64 bit branch hints.
(extract_bdm, extract_bdp): Correct 32 bit validation.
(AT1_MASK, AT2_MASK): Define.
(BBOAT_MASK): Define.
(BBOATCB_MASK, BBOAT2CB_MASK, BBOATBI_MASK): Define.
(BOFM64, BOFP64, BOTM64, BOTP64): Define.
(BODNZM64, BODNZP64, BODZM64, BODZP64): Define.
(PPCCOM32, PPCCOM64): Define.
(powerpc_opcodes): Modify existing 32 bit insns with branch hints
and add new patterns to implement 64 bit branches with hints. Move
booke instructions so they match before ppc64.
* ppc-dis.c (powerpc_dialect): Set PPC_OPCODE_64 in dialect for
64 bit default targets, and parse "32" and "64" in options.
Formatting fixes.
(print_insn_powerpc): Pass dialect to operand->extract.
2001-11-15 01:08:53 +00:00
|
|
|
{
|
2009-04-02 13:30:56 +00:00
|
|
|
if (info->mach == bfd_mach_ppc64)
|
|
|
|
dialect |= PPC_OPCODE_64;
|
|
|
|
else
|
2010-07-03 08:27:23 +00:00
|
|
|
dialect &= ~(ppc_cpu_t) PPC_OPCODE_64;
|
2009-03-10 06:53:46 +00:00
|
|
|
/* Choose a reasonable default. */
|
2010-07-03 06:51:56 +00:00
|
|
|
dialect |= (PPC_OPCODE_PPC | PPC_OPCODE_COMMON | PPC_OPCODE_601
|
|
|
|
| PPC_OPCODE_ALTIVEC);
|
binutils/ChangeLog
* doc/binutils.texi (objdump): Document ppc -M options.
gas/ChangeLog
* config/tc-ppc.c (ppc_insert_operand): Pass (ppc_cpu | ppc_size)
to operand->insert.
(md_assemble): Likewise.
gas/testsuite/ChangeLog
* gas/ppc/booke.d: Modify reloc and target matches for powerpc64.
include/opcode/ChangeLog
* ppc.h (struct powerpc_operand <insert, extract>): Add dialect param.
opcodes/ChangeLog
* ppc-opc.c (PPC64): Revert 2001-10-12. Do include PPC_OPCODE_PPC.
(insert_bat, extract_bat, insert_bba, extract_bba,
insert_bd, extract_bd, insert_bdm, extract_bdm,
insert_bdp, extract_bdp, valid_bo,
insert_bo, extract_bo, insert_boe, extract_boe,
insert_ds, extract_ds, insert_de, extract_de,
insert_des, extract_des, insert_li, extract_li,
insert_mbe, extract_mbe, insert_mb6, extract_mb6,
insert_nb, extract_nb, insert_nsi, extract_nsi,
insert_ral, insert_ram, insert_ras,
insert_rbs, extract_rbs, insert_sh6, extract_sh6,
insert_spr, extract_spr, insert_tbr, extract_tbr): Add dialect param.
(extract_bd, extract_bdm, extract_bdp,
extract_ds, extract_des,
extract_li, extract_nsi): Implement sign extension without conditional.
(insert_bdm, extract_bdm,
insert_bdp, extract_bdp, valid_bo): Handle 64 bit branch hints.
(extract_bdm, extract_bdp): Correct 32 bit validation.
(AT1_MASK, AT2_MASK): Define.
(BBOAT_MASK): Define.
(BBOATCB_MASK, BBOAT2CB_MASK, BBOATBI_MASK): Define.
(BOFM64, BOFP64, BOTM64, BOTP64): Define.
(BODNZM64, BODNZP64, BODZM64, BODZP64): Define.
(PPCCOM32, PPCCOM64): Define.
(powerpc_opcodes): Modify existing 32 bit insns with branch hints
and add new patterns to implement 64 bit branches with hints. Move
booke instructions so they match before ppc64.
* ppc-dis.c (powerpc_dialect): Set PPC_OPCODE_64 in dialect for
64 bit default targets, and parse "32" and "64" in options.
Formatting fixes.
(print_insn_powerpc): Pass dialect to operand->extract.
2001-11-15 01:08:53 +00:00
|
|
|
}
|
|
|
|
|
include/opcode/
* ppc.h (ppc_cpu_t): New typedef.
(struct powerpc_opcode <flags>): Use it.
(struct powerpc_operand <insert, extract>): Likewise.
(struct powerpc_macro <flags>): Likewise.
gas/
* config/tc-ppc.c (ppc_cpu): Use ppc_cpu_t typedef.
(ppc_insert_operand): Likewise.
(ppc_machine): Likewise.
* config/tc-ppc.h: #include "opcode/ppc.h"
(struct _ppc_fix_extra <ppc_cpu>): Use ppc_cpu_t typedef.
(ppc_cpu): Update extern decl.
opcodes/
* ppc-dis.c (print_insn_powerpc): Update prototye to use new
ppc_cpu_t typedef.
(struct dis_private): New.
(POWERPC_DIALECT): New define.
(powerpc_dialect): Renamed to...
(powerpc_init_dialect): This. Update to use ppc_cpu_t and
struct dis_private.
(print_insn_big_powerpc): Update for using structure in
info->private_data.
(print_insn_little_powerpc): Likewise.
(operand_value_powerpc): Change type of dialect param to ppc_cpu_t.
(skip_optional_operands): Likewise.
(print_insn_powerpc): Likewise. Remove initialization of dialect.
* ppc-opc.c (extract_bat, extract_bba, extract_bdm, extract_bdp,
extract_bo, extract_boe, extract_fxm, extract_mb6, extract_mbe,
extract_nb, extract_nsi, extract_rbs, extract_sh6, extract_spr,
extract_sprg, extract_tbr insert_bat, insert_bba, insert_bdm,
insert_bdp, insert_bo, insert_boe, insert_fxm, insert_mb6, insert_mbe,
insert_nsi, insert_ral, insert_ram, insert_raq, insert_ras, insert_rbs,
insert_sh6, insert_spr, insert_sprg, insert_tbr): Change the dialect
param to be of type ppc_cpu_t. Update prototype.
2008-06-13 20:16:00 +00:00
|
|
|
info->private_data = priv;
|
|
|
|
POWERPC_DIALECT(info) = dialect;
|
2012-03-15 12:58:48 +00:00
|
|
|
}
|
|
|
|
|
2012-03-16 12:14:32 +00:00
|
|
|
static unsigned short powerpc_opcd_indices[65];
|
2012-03-15 12:58:48 +00:00
|
|
|
|
|
|
|
/* Calculate opcode table indices to speed up disassembly,
|
|
|
|
and init dialect. */
|
|
|
|
|
|
|
|
void
|
|
|
|
disassemble_init_powerpc (struct disassemble_info *info)
|
|
|
|
{
|
|
|
|
int i;
|
2012-03-16 12:14:32 +00:00
|
|
|
unsigned short last;
|
include/opcode/
* ppc.h (ppc_cpu_t): New typedef.
(struct powerpc_opcode <flags>): Use it.
(struct powerpc_operand <insert, extract>): Likewise.
(struct powerpc_macro <flags>): Likewise.
gas/
* config/tc-ppc.c (ppc_cpu): Use ppc_cpu_t typedef.
(ppc_insert_operand): Likewise.
(ppc_machine): Likewise.
* config/tc-ppc.h: #include "opcode/ppc.h"
(struct _ppc_fix_extra <ppc_cpu>): Use ppc_cpu_t typedef.
(ppc_cpu): Update extern decl.
opcodes/
* ppc-dis.c (print_insn_powerpc): Update prototye to use new
ppc_cpu_t typedef.
(struct dis_private): New.
(POWERPC_DIALECT): New define.
(powerpc_dialect): Renamed to...
(powerpc_init_dialect): This. Update to use ppc_cpu_t and
struct dis_private.
(print_insn_big_powerpc): Update for using structure in
info->private_data.
(print_insn_little_powerpc): Likewise.
(operand_value_powerpc): Change type of dialect param to ppc_cpu_t.
(skip_optional_operands): Likewise.
(print_insn_powerpc): Likewise. Remove initialization of dialect.
* ppc-opc.c (extract_bat, extract_bba, extract_bdm, extract_bdp,
extract_bo, extract_boe, extract_fxm, extract_mb6, extract_mbe,
extract_nb, extract_nsi, extract_rbs, extract_sh6, extract_spr,
extract_sprg, extract_tbr insert_bat, insert_bba, insert_bdm,
insert_bdp, insert_bo, insert_boe, insert_fxm, insert_mb6, insert_mbe,
insert_nsi, insert_ral, insert_ram, insert_raq, insert_ras, insert_rbs,
insert_sh6, insert_spr, insert_sprg, insert_tbr): Change the dialect
param to be of type ppc_cpu_t. Update prototype.
2008-06-13 20:16:00 +00:00
|
|
|
|
2012-03-15 12:58:48 +00:00
|
|
|
i = powerpc_num_opcodes;
|
|
|
|
while (--i >= 0)
|
|
|
|
{
|
|
|
|
unsigned op = PPC_OP (powerpc_opcodes[i].opcode);
|
|
|
|
|
2012-03-16 12:14:32 +00:00
|
|
|
powerpc_opcd_indices[op] = i;
|
|
|
|
}
|
|
|
|
|
|
|
|
last = powerpc_num_opcodes;
|
|
|
|
for (i = 64; i > 0; --i)
|
|
|
|
{
|
|
|
|
if (powerpc_opcd_indices[i] == 0)
|
|
|
|
powerpc_opcd_indices[i] = last;
|
|
|
|
last = powerpc_opcd_indices[i];
|
2012-03-15 12:58:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (info->arch == bfd_arch_powerpc)
|
|
|
|
powerpc_init_dialect (info);
|
[gas/ChangeLog]
* config/tc-ppc.c (md_parse_option): New -m7410, -m7450 and -m7455
flags, equivalent to -m7400. New -maltivec to enable AltiVec
instructions. New -mbook64 and -mbooke/-mbooke32 flags to enable
64-bit and 32-bit BookE support, respectively. Change -m403 and
-m405 to set PPC403 option.
(md_show_usage): Adjust for new options.
* doc/all.texi: Set PPC.
* doc/as.texinfo: Add PPC support and pull in c-ppc.texi.
* doc/c-ppc.texi: New file.
* doc/Makefile.am (CPU_DOCS): Add c-ppc.texi.
* doc/Makefile.in: Regenerate.
[gas/testsuite/ChangeLog]
* gas/ppc/booke.s: New test for Motorola BookE.
* gas/ppc/booke.d: New file.
* gas/ppc/ppc.exp: Test booke.s.
[include/opcode/ChangeLog]
* ppc.h (PPC_OPCODE_BOOKE, PPC_OPCODE_403): New opcode flags for
BookE and PowerPC403 instructions.
[opcodes/ChangeLog]
* ppc-opc.c (insert_de, extract_de, insert_des, extract_des): New
instruction field instruction/extraction functions for new BookE
DE form instructions.
(CT): New macro for CT field in an X form instruction.
(DE, DES, DEO, DE_MASK): New macros for DE/DES fields in DE form
instructions.
(PPC64): Don't include PPC_OPCODE_PPC.
(403): New opcode macro for PPC403 processors.
(BOOKE): New opcode macro for BookE processors.
(bce, bcel, bcea, bcela, bclre, bclrel: New BookE instructions.
(bcctre, bcctrel, be, bel, bea, bela, icbt, icbte, lwzxe): Likewise.
(dcbste, lwzuxe, luxe, dcbfe, lbzxe, lwarxe, lbzuxe): Likewise.
(stwcxe, stwxe, stxe, stwuxe, stuxe, stbxe, dcbtste, stbuxe): Likewise.
(mfapidi, dcbte, lhzxe, lhzuxe, lhaxe, lhauxe, subfe64): Likewise.
(subfeo64, adde64, addeo64, sthxe, sthuxe, subfze64): Likewise.
(subfzeo64, addze64, addzeo64, dcbie, subfme64, subfmeo64): Likewise.
(addme64, addmeo64, stdcxe., mcrxr64, lwbrxe, lfsxe, lfsuxe): Likewise.
(lfdxe, lfduxe, stwbrxe, stfsxe, stfsuxe, stfdxe, dcbae): Likewise.
(stfduxe, tlbivax, tlbivaxe, lhbrxe, ldxe, lduxe, tlbsx): Likewise.
(tlbsxe, sthbrxe, stdxe, stduxe, icbie, stfiwxe, dcbze, lbze): Likewise.
(lbzue, ldue, lhze, lhzue, lhae, lhaue, lwze, lwzue): Likewise.
(stbe, stbue, sthe, sthue, stwe, stwue, lfse, lfsue, lfde): Likewise.
(lfdue, stde, stdue, stfse, stfsue, stfde, stfdue): Likewise.
* ppc-dis.c (print_insn_big_powerpc, print_insn_little_powerpc): Look
for a disassembler option of `booke', `booke32' or `booke64' to enable
BookE support in the disassembler.
2001-10-13 01:59:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Print a big endian PowerPC instruction. */
|
1999-05-03 07:29:11 +00:00
|
|
|
|
|
|
|
int
|
2003-09-02 04:15:29 +00:00
|
|
|
print_insn_big_powerpc (bfd_vma memaddr, struct disassemble_info *info)
|
1999-05-03 07:29:11 +00:00
|
|
|
{
|
include/opcode/
* ppc.h (ppc_cpu_t): New typedef.
(struct powerpc_opcode <flags>): Use it.
(struct powerpc_operand <insert, extract>): Likewise.
(struct powerpc_macro <flags>): Likewise.
gas/
* config/tc-ppc.c (ppc_cpu): Use ppc_cpu_t typedef.
(ppc_insert_operand): Likewise.
(ppc_machine): Likewise.
* config/tc-ppc.h: #include "opcode/ppc.h"
(struct _ppc_fix_extra <ppc_cpu>): Use ppc_cpu_t typedef.
(ppc_cpu): Update extern decl.
opcodes/
* ppc-dis.c (print_insn_powerpc): Update prototye to use new
ppc_cpu_t typedef.
(struct dis_private): New.
(POWERPC_DIALECT): New define.
(powerpc_dialect): Renamed to...
(powerpc_init_dialect): This. Update to use ppc_cpu_t and
struct dis_private.
(print_insn_big_powerpc): Update for using structure in
info->private_data.
(print_insn_little_powerpc): Likewise.
(operand_value_powerpc): Change type of dialect param to ppc_cpu_t.
(skip_optional_operands): Likewise.
(print_insn_powerpc): Likewise. Remove initialization of dialect.
* ppc-opc.c (extract_bat, extract_bba, extract_bdm, extract_bdp,
extract_bo, extract_boe, extract_fxm, extract_mb6, extract_mbe,
extract_nb, extract_nsi, extract_rbs, extract_sh6, extract_spr,
extract_sprg, extract_tbr insert_bat, insert_bba, insert_bdm,
insert_bdp, insert_bo, insert_boe, insert_fxm, insert_mb6, insert_mbe,
insert_nsi, insert_ral, insert_ram, insert_raq, insert_ras, insert_rbs,
insert_sh6, insert_spr, insert_sprg, insert_tbr): Change the dialect
param to be of type ppc_cpu_t. Update prototype.
2008-06-13 20:16:00 +00:00
|
|
|
return print_insn_powerpc (memaddr, info, 1, POWERPC_DIALECT(info));
|
1999-05-03 07:29:11 +00:00
|
|
|
}
|
|
|
|
|
[gas/ChangeLog]
* config/tc-ppc.c (md_parse_option): New -m7410, -m7450 and -m7455
flags, equivalent to -m7400. New -maltivec to enable AltiVec
instructions. New -mbook64 and -mbooke/-mbooke32 flags to enable
64-bit and 32-bit BookE support, respectively. Change -m403 and
-m405 to set PPC403 option.
(md_show_usage): Adjust for new options.
* doc/all.texi: Set PPC.
* doc/as.texinfo: Add PPC support and pull in c-ppc.texi.
* doc/c-ppc.texi: New file.
* doc/Makefile.am (CPU_DOCS): Add c-ppc.texi.
* doc/Makefile.in: Regenerate.
[gas/testsuite/ChangeLog]
* gas/ppc/booke.s: New test for Motorola BookE.
* gas/ppc/booke.d: New file.
* gas/ppc/ppc.exp: Test booke.s.
[include/opcode/ChangeLog]
* ppc.h (PPC_OPCODE_BOOKE, PPC_OPCODE_403): New opcode flags for
BookE and PowerPC403 instructions.
[opcodes/ChangeLog]
* ppc-opc.c (insert_de, extract_de, insert_des, extract_des): New
instruction field instruction/extraction functions for new BookE
DE form instructions.
(CT): New macro for CT field in an X form instruction.
(DE, DES, DEO, DE_MASK): New macros for DE/DES fields in DE form
instructions.
(PPC64): Don't include PPC_OPCODE_PPC.
(403): New opcode macro for PPC403 processors.
(BOOKE): New opcode macro for BookE processors.
(bce, bcel, bcea, bcela, bclre, bclrel: New BookE instructions.
(bcctre, bcctrel, be, bel, bea, bela, icbt, icbte, lwzxe): Likewise.
(dcbste, lwzuxe, luxe, dcbfe, lbzxe, lwarxe, lbzuxe): Likewise.
(stwcxe, stwxe, stxe, stwuxe, stuxe, stbxe, dcbtste, stbuxe): Likewise.
(mfapidi, dcbte, lhzxe, lhzuxe, lhaxe, lhauxe, subfe64): Likewise.
(subfeo64, adde64, addeo64, sthxe, sthuxe, subfze64): Likewise.
(subfzeo64, addze64, addzeo64, dcbie, subfme64, subfmeo64): Likewise.
(addme64, addmeo64, stdcxe., mcrxr64, lwbrxe, lfsxe, lfsuxe): Likewise.
(lfdxe, lfduxe, stwbrxe, stfsxe, stfsuxe, stfdxe, dcbae): Likewise.
(stfduxe, tlbivax, tlbivaxe, lhbrxe, ldxe, lduxe, tlbsx): Likewise.
(tlbsxe, sthbrxe, stdxe, stduxe, icbie, stfiwxe, dcbze, lbze): Likewise.
(lbzue, ldue, lhze, lhzue, lhae, lhaue, lwze, lwzue): Likewise.
(stbe, stbue, sthe, sthue, stwe, stwue, lfse, lfsue, lfde): Likewise.
(lfdue, stde, stdue, stfse, stfsue, stfde, stfdue): Likewise.
* ppc-dis.c (print_insn_big_powerpc, print_insn_little_powerpc): Look
for a disassembler option of `booke', `booke32' or `booke64' to enable
BookE support in the disassembler.
2001-10-13 01:59:09 +00:00
|
|
|
/* Print a little endian PowerPC instruction. */
|
1999-05-03 07:29:11 +00:00
|
|
|
|
|
|
|
int
|
2003-09-02 04:15:29 +00:00
|
|
|
print_insn_little_powerpc (bfd_vma memaddr, struct disassemble_info *info)
|
1999-05-03 07:29:11 +00:00
|
|
|
{
|
include/opcode/
* ppc.h (ppc_cpu_t): New typedef.
(struct powerpc_opcode <flags>): Use it.
(struct powerpc_operand <insert, extract>): Likewise.
(struct powerpc_macro <flags>): Likewise.
gas/
* config/tc-ppc.c (ppc_cpu): Use ppc_cpu_t typedef.
(ppc_insert_operand): Likewise.
(ppc_machine): Likewise.
* config/tc-ppc.h: #include "opcode/ppc.h"
(struct _ppc_fix_extra <ppc_cpu>): Use ppc_cpu_t typedef.
(ppc_cpu): Update extern decl.
opcodes/
* ppc-dis.c (print_insn_powerpc): Update prototye to use new
ppc_cpu_t typedef.
(struct dis_private): New.
(POWERPC_DIALECT): New define.
(powerpc_dialect): Renamed to...
(powerpc_init_dialect): This. Update to use ppc_cpu_t and
struct dis_private.
(print_insn_big_powerpc): Update for using structure in
info->private_data.
(print_insn_little_powerpc): Likewise.
(operand_value_powerpc): Change type of dialect param to ppc_cpu_t.
(skip_optional_operands): Likewise.
(print_insn_powerpc): Likewise. Remove initialization of dialect.
* ppc-opc.c (extract_bat, extract_bba, extract_bdm, extract_bdp,
extract_bo, extract_boe, extract_fxm, extract_mb6, extract_mbe,
extract_nb, extract_nsi, extract_rbs, extract_sh6, extract_spr,
extract_sprg, extract_tbr insert_bat, insert_bba, insert_bdm,
insert_bdp, insert_bo, insert_boe, insert_fxm, insert_mb6, insert_mbe,
insert_nsi, insert_ral, insert_ram, insert_raq, insert_ras, insert_rbs,
insert_sh6, insert_spr, insert_sprg, insert_tbr): Change the dialect
param to be of type ppc_cpu_t. Update prototype.
2008-06-13 20:16:00 +00:00
|
|
|
return print_insn_powerpc (memaddr, info, 0, POWERPC_DIALECT(info));
|
1999-05-03 07:29:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Print a POWER (RS/6000) instruction. */
|
|
|
|
|
|
|
|
int
|
2003-09-02 04:15:29 +00:00
|
|
|
print_insn_rs6000 (bfd_vma memaddr, struct disassemble_info *info)
|
1999-05-03 07:29:11 +00:00
|
|
|
{
|
|
|
|
return print_insn_powerpc (memaddr, info, 1, PPC_OPCODE_POWER);
|
|
|
|
}
|
|
|
|
|
2007-05-17 00:52:14 +00:00
|
|
|
/* Extract the operand value from the PowerPC or POWER instruction. */
|
|
|
|
|
|
|
|
static long
|
|
|
|
operand_value_powerpc (const struct powerpc_operand *operand,
|
include/opcode/
* ppc.h (ppc_cpu_t): New typedef.
(struct powerpc_opcode <flags>): Use it.
(struct powerpc_operand <insert, extract>): Likewise.
(struct powerpc_macro <flags>): Likewise.
gas/
* config/tc-ppc.c (ppc_cpu): Use ppc_cpu_t typedef.
(ppc_insert_operand): Likewise.
(ppc_machine): Likewise.
* config/tc-ppc.h: #include "opcode/ppc.h"
(struct _ppc_fix_extra <ppc_cpu>): Use ppc_cpu_t typedef.
(ppc_cpu): Update extern decl.
opcodes/
* ppc-dis.c (print_insn_powerpc): Update prototye to use new
ppc_cpu_t typedef.
(struct dis_private): New.
(POWERPC_DIALECT): New define.
(powerpc_dialect): Renamed to...
(powerpc_init_dialect): This. Update to use ppc_cpu_t and
struct dis_private.
(print_insn_big_powerpc): Update for using structure in
info->private_data.
(print_insn_little_powerpc): Likewise.
(operand_value_powerpc): Change type of dialect param to ppc_cpu_t.
(skip_optional_operands): Likewise.
(print_insn_powerpc): Likewise. Remove initialization of dialect.
* ppc-opc.c (extract_bat, extract_bba, extract_bdm, extract_bdp,
extract_bo, extract_boe, extract_fxm, extract_mb6, extract_mbe,
extract_nb, extract_nsi, extract_rbs, extract_sh6, extract_spr,
extract_sprg, extract_tbr insert_bat, insert_bba, insert_bdm,
insert_bdp, insert_bo, insert_boe, insert_fxm, insert_mb6, insert_mbe,
insert_nsi, insert_ral, insert_ram, insert_raq, insert_ras, insert_rbs,
insert_sh6, insert_spr, insert_sprg, insert_tbr): Change the dialect
param to be of type ppc_cpu_t. Update prototype.
2008-06-13 20:16:00 +00:00
|
|
|
unsigned long insn, ppc_cpu_t dialect)
|
2007-05-17 00:52:14 +00:00
|
|
|
{
|
|
|
|
long value;
|
|
|
|
int invalid;
|
|
|
|
/* Extract the value from the instruction. */
|
|
|
|
if (operand->extract)
|
|
|
|
value = (*operand->extract) (insn, dialect, &invalid);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
value = (insn >> operand->shift) & operand->bitm;
|
|
|
|
if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
|
|
|
|
{
|
|
|
|
/* BITM is always some number of zeros followed by some
|
|
|
|
number of ones, followed by some numer of zeros. */
|
|
|
|
unsigned long top = operand->bitm;
|
|
|
|
/* top & -top gives the rightmost 1 bit, so this
|
|
|
|
fills in any trailing zeros. */
|
|
|
|
top |= (top & -top) - 1;
|
|
|
|
top &= ~(top >> 1);
|
|
|
|
value = (value ^ top) - top;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Determine whether the optional operand(s) should be printed. */
|
|
|
|
|
|
|
|
static int
|
|
|
|
skip_optional_operands (const unsigned char *opindex,
|
include/opcode/
* ppc.h (ppc_cpu_t): New typedef.
(struct powerpc_opcode <flags>): Use it.
(struct powerpc_operand <insert, extract>): Likewise.
(struct powerpc_macro <flags>): Likewise.
gas/
* config/tc-ppc.c (ppc_cpu): Use ppc_cpu_t typedef.
(ppc_insert_operand): Likewise.
(ppc_machine): Likewise.
* config/tc-ppc.h: #include "opcode/ppc.h"
(struct _ppc_fix_extra <ppc_cpu>): Use ppc_cpu_t typedef.
(ppc_cpu): Update extern decl.
opcodes/
* ppc-dis.c (print_insn_powerpc): Update prototye to use new
ppc_cpu_t typedef.
(struct dis_private): New.
(POWERPC_DIALECT): New define.
(powerpc_dialect): Renamed to...
(powerpc_init_dialect): This. Update to use ppc_cpu_t and
struct dis_private.
(print_insn_big_powerpc): Update for using structure in
info->private_data.
(print_insn_little_powerpc): Likewise.
(operand_value_powerpc): Change type of dialect param to ppc_cpu_t.
(skip_optional_operands): Likewise.
(print_insn_powerpc): Likewise. Remove initialization of dialect.
* ppc-opc.c (extract_bat, extract_bba, extract_bdm, extract_bdp,
extract_bo, extract_boe, extract_fxm, extract_mb6, extract_mbe,
extract_nb, extract_nsi, extract_rbs, extract_sh6, extract_spr,
extract_sprg, extract_tbr insert_bat, insert_bba, insert_bdm,
insert_bdp, insert_bo, insert_boe, insert_fxm, insert_mb6, insert_mbe,
insert_nsi, insert_ral, insert_ram, insert_raq, insert_ras, insert_rbs,
insert_sh6, insert_spr, insert_sprg, insert_tbr): Change the dialect
param to be of type ppc_cpu_t. Update prototype.
2008-06-13 20:16:00 +00:00
|
|
|
unsigned long insn, ppc_cpu_t dialect)
|
2007-05-17 00:52:14 +00:00
|
|
|
{
|
|
|
|
const struct powerpc_operand *operand;
|
|
|
|
|
|
|
|
for (; *opindex != 0; opindex++)
|
|
|
|
{
|
|
|
|
operand = &powerpc_operands[*opindex];
|
|
|
|
if ((operand->flags & PPC_OPERAND_NEXT) != 0
|
|
|
|
|| ((operand->flags & PPC_OPERAND_OPTIONAL) != 0
|
|
|
|
&& operand_value_powerpc (operand, insn, dialect) != 0))
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2012-03-16 12:14:32 +00:00
|
|
|
/* Find a match for INSN in the opcode table, given machine DIALECT.
|
|
|
|
A DIALECT of -1 is special, matching all machine opcode variations. */
|
|
|
|
|
|
|
|
static const struct powerpc_opcode *
|
|
|
|
lookup_powerpc (unsigned long insn, ppc_cpu_t dialect)
|
|
|
|
{
|
|
|
|
const struct powerpc_opcode *opcode;
|
|
|
|
const struct powerpc_opcode *opcode_end;
|
|
|
|
unsigned long op;
|
|
|
|
|
|
|
|
/* Get the major opcode of the instruction. */
|
|
|
|
op = PPC_OP (insn);
|
|
|
|
|
|
|
|
/* Find the first match in the opcode table for this major opcode. */
|
|
|
|
opcode_end = powerpc_opcodes + powerpc_opcd_indices[op + 1];
|
|
|
|
for (opcode = powerpc_opcodes + powerpc_opcd_indices[op];
|
|
|
|
opcode < opcode_end;
|
|
|
|
++opcode)
|
|
|
|
{
|
|
|
|
const unsigned char *opindex;
|
|
|
|
const struct powerpc_operand *operand;
|
|
|
|
int invalid;
|
|
|
|
|
|
|
|
if ((insn & opcode->mask) != opcode->opcode
|
|
|
|
|| (dialect != (ppc_cpu_t) -1
|
|
|
|
&& ((opcode->flags & dialect) == 0
|
|
|
|
|| (opcode->deprecated & dialect) != 0)))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
/* Check validity of operands. */
|
|
|
|
invalid = 0;
|
|
|
|
for (opindex = opcode->operands; *opindex != 0; opindex++)
|
|
|
|
{
|
|
|
|
operand = powerpc_operands + *opindex;
|
|
|
|
if (operand->extract)
|
|
|
|
(*operand->extract) (insn, dialect, &invalid);
|
|
|
|
}
|
|
|
|
if (invalid)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
return opcode;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
1999-05-03 07:29:11 +00:00
|
|
|
/* Print a PowerPC or POWER instruction. */
|
|
|
|
|
|
|
|
static int
|
2003-09-02 04:15:29 +00:00
|
|
|
print_insn_powerpc (bfd_vma memaddr,
|
|
|
|
struct disassemble_info *info,
|
|
|
|
int bigendian,
|
include/opcode/
* ppc.h (ppc_cpu_t): New typedef.
(struct powerpc_opcode <flags>): Use it.
(struct powerpc_operand <insert, extract>): Likewise.
(struct powerpc_macro <flags>): Likewise.
gas/
* config/tc-ppc.c (ppc_cpu): Use ppc_cpu_t typedef.
(ppc_insert_operand): Likewise.
(ppc_machine): Likewise.
* config/tc-ppc.h: #include "opcode/ppc.h"
(struct _ppc_fix_extra <ppc_cpu>): Use ppc_cpu_t typedef.
(ppc_cpu): Update extern decl.
opcodes/
* ppc-dis.c (print_insn_powerpc): Update prototye to use new
ppc_cpu_t typedef.
(struct dis_private): New.
(POWERPC_DIALECT): New define.
(powerpc_dialect): Renamed to...
(powerpc_init_dialect): This. Update to use ppc_cpu_t and
struct dis_private.
(print_insn_big_powerpc): Update for using structure in
info->private_data.
(print_insn_little_powerpc): Likewise.
(operand_value_powerpc): Change type of dialect param to ppc_cpu_t.
(skip_optional_operands): Likewise.
(print_insn_powerpc): Likewise. Remove initialization of dialect.
* ppc-opc.c (extract_bat, extract_bba, extract_bdm, extract_bdp,
extract_bo, extract_boe, extract_fxm, extract_mb6, extract_mbe,
extract_nb, extract_nsi, extract_rbs, extract_sh6, extract_spr,
extract_sprg, extract_tbr insert_bat, insert_bba, insert_bdm,
insert_bdp, insert_bo, insert_boe, insert_fxm, insert_mb6, insert_mbe,
insert_nsi, insert_ral, insert_ram, insert_raq, insert_ras, insert_rbs,
insert_sh6, insert_spr, insert_sprg, insert_tbr): Change the dialect
param to be of type ppc_cpu_t. Update prototype.
2008-06-13 20:16:00 +00:00
|
|
|
ppc_cpu_t dialect)
|
1999-05-03 07:29:11 +00:00
|
|
|
{
|
|
|
|
bfd_byte buffer[4];
|
|
|
|
int status;
|
|
|
|
unsigned long insn;
|
|
|
|
const struct powerpc_opcode *opcode;
|
|
|
|
|
|
|
|
status = (*info->read_memory_func) (memaddr, buffer, 4, info);
|
|
|
|
if (status != 0)
|
|
|
|
{
|
|
|
|
(*info->memory_error_func) (status, memaddr, info);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (bigendian)
|
|
|
|
insn = bfd_getb32 (buffer);
|
|
|
|
else
|
|
|
|
insn = bfd_getl32 (buffer);
|
|
|
|
|
2012-03-16 12:14:32 +00:00
|
|
|
opcode = lookup_powerpc (insn, dialect);
|
|
|
|
if (opcode == NULL && (dialect & PPC_OPCODE_ANY) != 0)
|
|
|
|
opcode = lookup_powerpc (insn, (ppc_cpu_t) -1);
|
1999-05-03 07:29:11 +00:00
|
|
|
|
2012-03-16 12:14:32 +00:00
|
|
|
if (opcode != NULL)
|
1999-05-03 07:29:11 +00:00
|
|
|
{
|
|
|
|
const unsigned char *opindex;
|
|
|
|
const struct powerpc_operand *operand;
|
|
|
|
int need_comma;
|
|
|
|
int need_paren;
|
2007-05-17 00:52:14 +00:00
|
|
|
int skip_optional;
|
1999-05-03 07:29:11 +00:00
|
|
|
|
|
|
|
if (opcode->operands[0] != 0)
|
opcodes/
* ppc-dis.c (print_insn_powerpc): Don't print tabs. Handle
PPC_OPERANDS_GPR_0.
* ppc-opc.c (RA0): Define.
(RAQ, RAL, RAM, RAS, RSQ, RTQ, RSO): Use PPC_OPERAND_GPR_0.
(RAOPT): Rename from RAO. Update all uses.
(powerpc_opcodes): Use RA0 as appropriate. Add "lsdx", "lsdi",
"stsdx", "stsdi", "lmd" and "stmd" insns.
include/opcode/
* ppc.h (PPC_OPERAND_GPR_0): Define. Bump other operand defines.
gas/testsuite/
Update gas/ppc/.
ld/testsuite/
Update ld-powerpc/.
2004-03-16 00:58:43 +00:00
|
|
|
(*info->fprintf_func) (info->stream, "%-7s ", opcode->name);
|
|
|
|
else
|
|
|
|
(*info->fprintf_func) (info->stream, "%s", opcode->name);
|
1999-05-03 07:29:11 +00:00
|
|
|
|
|
|
|
/* Now extract and print the operands. */
|
|
|
|
need_comma = 0;
|
|
|
|
need_paren = 0;
|
2007-05-17 00:52:14 +00:00
|
|
|
skip_optional = -1;
|
1999-05-03 07:29:11 +00:00
|
|
|
for (opindex = opcode->operands; *opindex != 0; opindex++)
|
|
|
|
{
|
|
|
|
long value;
|
|
|
|
|
|
|
|
operand = powerpc_operands + *opindex;
|
|
|
|
|
|
|
|
/* Operands that are marked FAKE are simply ignored. We
|
|
|
|
already made sure that the extract function considered
|
|
|
|
the instruction to be valid. */
|
|
|
|
if ((operand->flags & PPC_OPERAND_FAKE) != 0)
|
|
|
|
continue;
|
|
|
|
|
2007-05-17 00:52:14 +00:00
|
|
|
/* If all of the optional operands have the value zero,
|
|
|
|
then don't print any of them. */
|
2007-05-18 01:32:58 +00:00
|
|
|
if ((operand->flags & PPC_OPERAND_OPTIONAL) != 0)
|
|
|
|
{
|
|
|
|
if (skip_optional < 0)
|
|
|
|
skip_optional = skip_optional_operands (opindex, insn,
|
|
|
|
dialect);
|
|
|
|
if (skip_optional)
|
|
|
|
continue;
|
|
|
|
}
|
1999-05-03 07:29:11 +00:00
|
|
|
|
2007-05-17 00:52:14 +00:00
|
|
|
value = operand_value_powerpc (operand, insn, dialect);
|
|
|
|
|
1999-05-03 07:29:11 +00:00
|
|
|
if (need_comma)
|
|
|
|
{
|
|
|
|
(*info->fprintf_func) (info->stream, ",");
|
|
|
|
need_comma = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Print the operand as directed by the flags. */
|
opcodes/
* ppc-dis.c (print_insn_powerpc): Don't print tabs. Handle
PPC_OPERANDS_GPR_0.
* ppc-opc.c (RA0): Define.
(RAQ, RAL, RAM, RAS, RSQ, RTQ, RSO): Use PPC_OPERAND_GPR_0.
(RAOPT): Rename from RAO. Update all uses.
(powerpc_opcodes): Use RA0 as appropriate. Add "lsdx", "lsdi",
"stsdx", "stsdi", "lmd" and "stmd" insns.
include/opcode/
* ppc.h (PPC_OPERAND_GPR_0): Define. Bump other operand defines.
gas/testsuite/
Update gas/ppc/.
ld/testsuite/
Update ld-powerpc/.
2004-03-16 00:58:43 +00:00
|
|
|
if ((operand->flags & PPC_OPERAND_GPR) != 0
|
|
|
|
|| ((operand->flags & PPC_OPERAND_GPR_0) != 0 && value != 0))
|
1999-05-03 07:29:11 +00:00
|
|
|
(*info->fprintf_func) (info->stream, "r%ld", value);
|
|
|
|
else if ((operand->flags & PPC_OPERAND_FPR) != 0)
|
|
|
|
(*info->fprintf_func) (info->stream, "f%ld", value);
|
* ppc-opc.c (VA, VB, VC, VD, VS, SIMM, UIMM, SHB): New macros, for
vector unit operands.
(VX, VX_MASK, VXA, VXA_MASK, VXR, VXR_MASK): New macros, for vector
unit instruction formats.
(PPCVEC): New macro, mask for vector instructions.
(powerpc_operands): Add table entries for above operand types.
(powerpc_opcodes): Add table entries for vector instructions.
* ppc-dis.c (print_insn_big_powerpc): Add PPC_OPCODE_ALTIVEC to mask.
(print_insn_little_powerpc): Likewise.
(print_insn_powerpc): Prepend 'v' when printing vector registers.
2000-05-03 22:25:08 +00:00
|
|
|
else if ((operand->flags & PPC_OPERAND_VR) != 0)
|
|
|
|
(*info->fprintf_func) (info->stream, "v%ld", value);
|
gas/
* config/tc-ppc.c (parse_cpu): Rename altivec_or_spe to retain_flags.
Handle -mvsx and -mpower7.
(md_show_usage): Document -mpower7 and -mvsx.
* doc/as.texinfo (Target PowerPC): Document -mvsx.
* doc/c-ppc.texi (PowerPC-Opts): Document -mvsx and -mpower7.
gas/testsuite/
* gas/ppc/power7.d: New.
* gas/ppc/power7.s: Likewise.
* gas/ppc/ppc.exp: Run power7 test.
include/opcode/
* ppc.h (PPC_OPCODE_VSX, PPC_OPERAND_VSR): New.
opcodes/
* ppc-dis.c (powerpc_init_dialect): Handle power7 and vsx options.
(print_insn_powerpc): Prepend 'vs' when printing VSX registers.
(print_ppc_disassembler_options): Document -Mpower7 and -Mvsx.
* ppc-opc.c (insert_xt6): New static function.
(extract_xt6): Likewise.
(insert_xa6): Likewise.
(extract_xa6: Likewise.
(insert_xb6): Likewise.
(extract_xb6): Likewise.
(insert_xb6s): Likewise.
(extract_xb6s): Likewise.
(XS6, XT6, XA6, XB6, XB6S, DM, XX3, XX3DM, XX1_MASK, XX3_MASK,
XX3DM_MASK, PPCVSX): New.
(powerpc_opcodes): Add opcodes "lxvd2x", "lxvd2ux", "stxvd2x",
"stxvd2ux", "xxmrghd", "xxmrgld", "xxpermdi", "xvmovdp", "xvcpsgndp".
2008-08-02 04:38:51 +00:00
|
|
|
else if ((operand->flags & PPC_OPERAND_VSR) != 0)
|
|
|
|
(*info->fprintf_func) (info->stream, "vs%ld", value);
|
1999-05-03 07:29:11 +00:00
|
|
|
else if ((operand->flags & PPC_OPERAND_RELATIVE) != 0)
|
|
|
|
(*info->print_address_func) (memaddr + value, info);
|
|
|
|
else if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0)
|
|
|
|
(*info->print_address_func) ((bfd_vma) value & 0xffffffff, info);
|
2008-07-30 06:29:22 +00:00
|
|
|
else if ((operand->flags & PPC_OPERAND_FSL) != 0)
|
|
|
|
(*info->fprintf_func) (info->stream, "fsl%ld", value);
|
|
|
|
else if ((operand->flags & PPC_OPERAND_FCR) != 0)
|
|
|
|
(*info->fprintf_func) (info->stream, "fcr%ld", value);
|
|
|
|
else if ((operand->flags & PPC_OPERAND_UDI) != 0)
|
|
|
|
(*info->fprintf_func) (info->stream, "%ld", value);
|
2009-04-02 13:30:56 +00:00
|
|
|
else if ((operand->flags & PPC_OPERAND_CR) != 0
|
|
|
|
&& (dialect & PPC_OPCODE_PPC) != 0)
|
1999-05-03 07:29:11 +00:00
|
|
|
{
|
include/opcode/
* ppc.h (struct powerpc_operand): Replace "bits" with "bitm".
(num_powerpc_operands): Declare.
(PPC_OPERAND_SIGNED et al): Redefine as hex.
(PPC_OPERAND_PLUS1): Define.
opcodes/
* ppc-dis.c (print_insn_powerpc): Adjust for struct powerpc_operand
change.
* ppc-opc.c (powerpc_operands): Replace bit count with bit mask
in all entries. Add PPC_OPERAND_SIGNED to DE entry. Remove
references to following deleted functions.
(insert_bd, extract_bd, insert_dq, extract_dq): Delete.
(insert_ds, extract_ds, insert_de, extract_de): Delete.
(insert_des, extract_des, insert_li, extract_li): Delete.
(insert_nb, insert_rsq, insert_rtq, insert_ev2, extract_ev2): Delete.
(insert_ev4, extract_ev4, insert_ev8, extract_ev8): Delete.
(num_powerpc_operands): New constant.
(XSPRG_MASK): Remove entire SPRG field.
(powerpc_opcodes <bcctre, bcctrel>): Use XLBB_MASK not XLYBB_MASK.
gas/
* messages.c (as_internal_value_out_of_range): Extend to report
errors for values with invalid low bits set.
* config/tc-ppc.c (ppc_setup_opcodes): Check powerpc_operands bitm
fields. Check that operands and opcode fields are disjoint.
(ppc_insert_operand): Check operands using mask rather than bit
count. Check low bits too. Handle PPC_OPERAND_PLUS1. Adjust
insertion code.
(md_apply_fix): Adjust for struct powerpc_operand change.
2007-04-20 12:25:15 +00:00
|
|
|
if (operand->bitm == 7)
|
Kaveh Ghazi's printf format attribute checking patch.
bfd:
* elf32-xtensa.c (vsprint_msg): Add format attribute. Fix
format bugs.
* vms.h (_bfd_vms_debug): Add format attribute.
(_bfd_vms_debug, _bfd_hexdump): Fix typos.
binutils:
* bucomm.h (report): Add format attribute.
* dlltool.c (inform): Likewise.
* dllwrap.c (display, inform, warn): Likewise.
* objdump.c (objdump_sprintf): Likewise.
* readelf.c (error, warn): Likewise. Fix format bugs.
gas:
* config/tc-tic30.c (debug): Add format attribute. Fix format
bugs.
include:
* dis-asm.h (fprintf_ftype): Add format attribute.
opcodes:
* arc-dis.c, arm-dis.c, cris-dis.c, crx-dis.c, d10v-dis.c,
d30v-dis.c, fr30-dis.c, h8300-dis.c, h8500-dis.c, i860-dis.c,
ia64-dis.c, ip2k-dis.c, m10200-dis.c, m10300-dis.c,
m88k-dis.c, mcore-dis.c, mips-dis.c, ms1-dis.c, or32-dis.c,
ppc-dis.c, sh64-dis.c, sparc-dis.c, tic4x-dis.c, tic80-dis.c,
v850-dis.c: Fix format bugs.
* ia64-gen.c (fail, warn): Add format attribute.
* or32-opc.c (debug): Likewise.
2005-07-07 19:27:52 +00:00
|
|
|
(*info->fprintf_func) (info->stream, "cr%ld", value);
|
1999-05-03 07:29:11 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
static const char *cbnames[4] = { "lt", "gt", "eq", "so" };
|
|
|
|
int cr;
|
|
|
|
int cc;
|
|
|
|
|
|
|
|
cr = value >> 2;
|
|
|
|
if (cr != 0)
|
2002-11-12 04:03:31 +00:00
|
|
|
(*info->fprintf_func) (info->stream, "4*cr%d+", cr);
|
1999-05-03 07:29:11 +00:00
|
|
|
cc = value & 3;
|
2002-11-12 04:03:31 +00:00
|
|
|
(*info->fprintf_func) (info->stream, "%s", cbnames[cc]);
|
1999-05-03 07:29:11 +00:00
|
|
|
}
|
|
|
|
}
|
2009-04-02 13:30:56 +00:00
|
|
|
else
|
|
|
|
(*info->fprintf_func) (info->stream, "%ld", value);
|
1999-05-03 07:29:11 +00:00
|
|
|
|
|
|
|
if (need_paren)
|
|
|
|
{
|
|
|
|
(*info->fprintf_func) (info->stream, ")");
|
|
|
|
need_paren = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((operand->flags & PPC_OPERAND_PARENS) == 0)
|
|
|
|
need_comma = 1;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
(*info->fprintf_func) (info->stream, "(");
|
|
|
|
need_paren = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* We have found and printed an instruction; return. */
|
|
|
|
return 4;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* We could not find a match. */
|
|
|
|
(*info->fprintf_func) (info->stream, ".long 0x%lx", insn);
|
|
|
|
|
|
|
|
return 4;
|
|
|
|
}
|
2002-09-04 10:08:08 +00:00
|
|
|
|
|
|
|
void
|
2003-09-02 04:15:29 +00:00
|
|
|
print_ppc_disassembler_options (FILE *stream)
|
2002-09-04 10:08:08 +00:00
|
|
|
{
|
2009-03-10 06:53:46 +00:00
|
|
|
unsigned int i, col;
|
|
|
|
|
|
|
|
fprintf (stream, _("\n\
|
2002-09-04 10:08:08 +00:00
|
|
|
The following PPC specific disassembler options are supported for use with\n\
|
2009-03-10 06:53:46 +00:00
|
|
|
the -M switch:\n"));
|
|
|
|
|
|
|
|
for (col = 0, i = 0; i < sizeof (ppc_opts) / sizeof (ppc_opts[0]); i++)
|
|
|
|
{
|
|
|
|
col += fprintf (stream, " %s,", ppc_opts[i].opt);
|
|
|
|
if (col > 66)
|
|
|
|
{
|
|
|
|
fprintf (stream, "\n");
|
|
|
|
col = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fprintf (stream, " 32, 64\n");
|
2002-09-04 10:08:08 +00:00
|
|
|
}
|