* ppc-opc.c: Remove PARAMS from prototypes.

(FXM4): Define.
	(insert_fxm): New function, used by both FXM and FXM4.
	(extract_fxm): Likewise.
	(XFXFXM_MASK): Remove 1 << 20 term.
	(powerpc_opcodes): Add Power4 version of "mfcr".  Simplify "mtcr" mask.
This commit is contained in:
Alan Modra 2003-07-04 13:06:21 +00:00
parent 0cea619061
commit c168870a29
2 changed files with 136 additions and 115 deletions

View file

@ -1,3 +1,12 @@
2003-07-04 Alan Modra <amodra@bigpond.net.au>
* ppc-opc.c: Remove PARAMS from prototypes.
(FXM4): Define.
(insert_fxm): New function, used by both FXM and FXM4.
(extract_fxm): Likewise.
(XFXFXM_MASK): Remove 1 << 20 term.
(powerpc_opcodes): Add Power4 version of "mfcr". Simplify "mtcr" mask.
2003-07-01 Martin Schwidefsky <schwidefsky@de.ibm.com>
* s390-dis.c (s390_extract_operand): Add support for long displacements.
@ -709,7 +718,7 @@
2002-11-06 Aldy Hernandez <aldyh@redhat.com>
* opcodes/ppc-opc.c: Change RD to RS for evmerge*.
* ppc-opc.c: Change RD to RS for evmerge*.
2002-10-07 Nathan Tallent <eraxxon@alumni.rice.edu>
@ -1606,7 +1615,7 @@
* Makefile.am: Run "make dep-am".
* Makefile.in: Regenerate.
* opcodes/po/POTFILES.in: Regenerate.
* po/POTFILES.in: Regenerate.
2002-01-19 Richard Earnshaw <rearnsha@arm.com>
@ -2171,9 +2180,9 @@
2001-08-23 Martin Schwidefsky <schwidefsky@de.ibm.com>
* opcodes/s390-opc.c: Add "low or high" and "not low or high"
* s390-opc.c: Add "low or high" and "not low or high"
branch instructions for gcc 3.0.
* opcodes/s390-opc.txt: Likewise.
* s390-opc.txt: Likewise.
2001-08-21 Andreas Jaeger <aj@suse.de>

View file

@ -38,112 +38,61 @@
/* Local insertion and extraction functions. */
static unsigned long insert_bat
PARAMS ((unsigned long, long, int, const char **));
static long extract_bat
PARAMS ((unsigned long, int, int *));
static unsigned long insert_bba
PARAMS ((unsigned long, long, int, const char **));
static long extract_bba
PARAMS ((unsigned long, int, int *));
static unsigned long insert_bd
PARAMS ((unsigned long, long, int, const char **));
static long extract_bd
PARAMS ((unsigned long, int, int *));
static unsigned long insert_bdm
PARAMS ((unsigned long, long, int, const char **));
static long extract_bdm
PARAMS ((unsigned long, int, int *));
static unsigned long insert_bdp
PARAMS ((unsigned long, long, int, const char **));
static long extract_bdp
PARAMS ((unsigned long, int, int *));
static int valid_bo
PARAMS ((long, int));
static unsigned long insert_bo
PARAMS ((unsigned long, long, int, const char **));
static long extract_bo
PARAMS ((unsigned long, int, int *));
static unsigned long insert_boe
PARAMS ((unsigned long, long, int, const char **));
static long extract_boe
PARAMS ((unsigned long, int, int *));
static unsigned long insert_dq
PARAMS ((unsigned long, long, int, const char **));
static long extract_dq
PARAMS ((unsigned long, int, int *));
static unsigned long insert_ds
PARAMS ((unsigned long, long, int, const char **));
static long extract_ds
PARAMS ((unsigned long, int, int *));
static unsigned long insert_de
PARAMS ((unsigned long, long, int, const char **));
static long extract_de
PARAMS ((unsigned long, int, int *));
static unsigned long insert_des
PARAMS ((unsigned long, long, int, const char **));
static long extract_des
PARAMS ((unsigned long, int, int *));
static unsigned long insert_li
PARAMS ((unsigned long, long, int, const char **));
static long extract_li
PARAMS ((unsigned long, int, int *));
static unsigned long insert_mbe
PARAMS ((unsigned long, long, int, const char **));
static long extract_mbe
PARAMS ((unsigned long, int, int *));
static unsigned long insert_mb6
PARAMS ((unsigned long, long, int, const char **));
static long extract_mb6
PARAMS ((unsigned long, int, int *));
static unsigned long insert_nb
PARAMS ((unsigned long, long, int, const char **));
static long extract_nb
PARAMS ((unsigned long, int, int *));
static unsigned long insert_nsi
PARAMS ((unsigned long, long, int, const char **));
static long extract_nsi
PARAMS ((unsigned long, int, int *));
static unsigned long insert_ral
PARAMS ((unsigned long, long, int, const char **));
static unsigned long insert_ram
PARAMS ((unsigned long, long, int, const char **));
static unsigned long insert_raq
PARAMS ((unsigned long, long, int, const char **));
static unsigned long insert_ras
PARAMS ((unsigned long, long, int, const char **));
static unsigned long insert_rbs
PARAMS ((unsigned long, long, int, const char **));
static long extract_rbs
PARAMS ((unsigned long, int, int *));
static unsigned long insert_rsq
PARAMS ((unsigned long, long, int, const char **));
static unsigned long insert_rtq
PARAMS ((unsigned long, long, int, const char **));
static unsigned long insert_sh6
PARAMS ((unsigned long, long, int, const char **));
static long extract_sh6
PARAMS ((unsigned long, int, int *));
static unsigned long insert_spr
PARAMS ((unsigned long, long, int, const char **));
static long extract_spr
PARAMS ((unsigned long, int, int *));
static unsigned long insert_tbr
PARAMS ((unsigned long, long, int, const char **));
static long extract_tbr
PARAMS ((unsigned long, int, int *));
static unsigned long insert_ev2
PARAMS ((unsigned long, long, int, const char **));
static long extract_ev2
PARAMS ((unsigned long, int, int *));
static unsigned long insert_ev4
PARAMS ((unsigned long, long, int, const char **));
static long extract_ev4
PARAMS ((unsigned long, int, int *));
static unsigned long insert_ev8
PARAMS ((unsigned long, long, int, const char **));
static long extract_ev8
PARAMS ((unsigned long, int, int *));
static unsigned long insert_bat (unsigned long, long, int, const char **);
static long extract_bat (unsigned long, int, int *);
static unsigned long insert_bba (unsigned long, long, int, const char **);
static long extract_bba (unsigned long, int, int *);
static unsigned long insert_bd (unsigned long, long, int, const char **);
static long extract_bd (unsigned long, int, int *);
static unsigned long insert_bdm (unsigned long, long, int, const char **);
static long extract_bdm (unsigned long, int, int *);
static unsigned long insert_bdp (unsigned long, long, int, const char **);
static long extract_bdp (unsigned long, int, int *);
static int valid_bo (long, int);
static unsigned long insert_bo (unsigned long, long, int, const char **);
static long extract_bo (unsigned long, int, int *);
static unsigned long insert_boe (unsigned long, long, int, const char **);
static long extract_boe (unsigned long, int, int *);
static unsigned long insert_dq (unsigned long, long, int, const char **);
static long extract_dq (unsigned long, int, int *);
static unsigned long insert_ds (unsigned long, long, int, const char **);
static long extract_ds (unsigned long, int, int *);
static unsigned long insert_de (unsigned long, long, int, const char **);
static long extract_de (unsigned long, int, int *);
static unsigned long insert_des (unsigned long, long, int, const char **);
static long extract_des (unsigned long, int, int *);
static unsigned long insert_fxm (unsigned long, long, int, const char **);
static long extract_fxm (unsigned long, int, int *);
static unsigned long insert_li (unsigned long, long, int, const char **);
static long extract_li (unsigned long, int, int *);
static unsigned long insert_mbe (unsigned long, long, int, const char **);
static long extract_mbe (unsigned long, int, int *);
static unsigned long insert_mb6 (unsigned long, long, int, const char **);
static long extract_mb6 (unsigned long, int, int *);
static unsigned long insert_nb (unsigned long, long, int, const char **);
static long extract_nb (unsigned long, int, int *);
static unsigned long insert_nsi (unsigned long, long, int, const char **);
static long extract_nsi (unsigned long, int, int *);
static unsigned long insert_ral (unsigned long, long, int, const char **);
static unsigned long insert_ram (unsigned long, long, int, const char **);
static unsigned long insert_raq (unsigned long, long, int, const char **);
static unsigned long insert_ras (unsigned long, long, int, const char **);
static unsigned long insert_rbs (unsigned long, long, int, const char **);
static long extract_rbs (unsigned long, int, int *);
static unsigned long insert_rsq (unsigned long, long, int, const char **);
static unsigned long insert_rtq (unsigned long, long, int, const char **);
static unsigned long insert_sh6 (unsigned long, long, int, const char **);
static long extract_sh6 (unsigned long, int, int *);
static unsigned long insert_spr (unsigned long, long, int, const char **);
static long extract_spr (unsigned long, int, int *);
static unsigned long insert_tbr (unsigned long, long, int, const char **);
static long extract_tbr (unsigned long, int, int *);
static unsigned long insert_ev2 (unsigned long, long, int, const char **);
static long extract_ev2 (unsigned long, int, int *);
static unsigned long insert_ev4 (unsigned long, long, int, const char **);
static long extract_ev4 (unsigned long, int, int *);
static unsigned long insert_ev8 (unsigned long, long, int, const char **);
static long extract_ev8 (unsigned long, int, int *);
/* The operands table.
@ -341,10 +290,14 @@ const struct powerpc_operand powerpc_operands[] =
/* The FXM field in an XFX instruction. */
#define FXM FRS + 1
#define FXM_MASK (0xff << 12)
{ 8, 12, 0, 0, 0 },
{ 8, 12, insert_fxm, extract_fxm, 0 },
/* Power4 version for mfcr. */
#define FXM4 FXM + 1
{ 8, 12, insert_fxm, extract_fxm, PPC_OPERAND_OPTIONAL },
/* The L field in a D or X form instruction. */
#define L FXM + 1
#define L FXM4 + 1
{ 1, 21, 0, 0, PPC_OPERAND_OPTIONAL },
/* The LEV field in a POWER SC form instruction. */
@ -1074,6 +1027,64 @@ extract_des (insn, dialect, invalid)
return (((insn >> 2) & 0x3ffc) ^ 0x2000) - 0x2000;
}
static unsigned long insert_fxm (unsigned long insn,
long value,
int dialect,
const char **errmsg)
{
/* If the optional field on mfcr is missing that means we want to use
the old form of the instruction that moves the whole cr. In that
case we'll have VALUE zero. There doesn't seem to be a way to
distinguish this from the case where someone writes mfcr %r3,0. */
if (value == 0)
;
/* If only one bit of the FXM field is set, we can use the new form
of the instruction, which is faster. */
else if ((dialect & PPC_OPCODE_POWER4) != 0 && (value & -value) == value)
insn |= 1 << 20;
/* Any other value on mfcr is an error. */
else if ((insn & (0x3ff << 1)) == 19 << 1)
{
if (errmsg != NULL)
*errmsg = _("ignoring invalid mfcr mask");
value = 0;
}
return insn | ((value & 0xff) << 12);
}
static long extract_fxm (unsigned long insn, int dialect, int *invalid)
{
long mask = (insn >> 12) & 0xff;
/* Is this a Power4 insn? */
if ((insn & (1 << 20)) != 0)
{
if ((dialect & PPC_OPCODE_POWER4) == 0)
{
if (invalid != NULL)
*invalid = 1;
}
else
{
/* Exactly one bit of MASK should be set. */
if ((mask == 0 || (mask & -mask) != mask) && invalid != NULL)
*invalid = 1;
}
}
/* Check that non-power4 form of mfcr has a zero MASK. */
else if ((insn & (0x3ff << 1)) == 19 << 1)
{
if (mask != 0 && invalid != NULL)
*invalid = 1;
}
return mask;
}
/* The LI field in an I form instruction. The lower two bits are
forced to zero. */
@ -1739,7 +1750,7 @@ extract_tbr (insn, dialect, invalid)
#define XS_MASK XS (0x3f, 0x1ff, 1)
/* A mask for the FXM version of an XFX form instruction. */
#define XFXFXM_MASK (X_MASK | (((unsigned long)1) << 20) | (((unsigned long)1) << 11))
#define XFXFXM_MASK (X_MASK | (1 << 11))
/* An XFX form instruction with the FXM field filled in. */
#define XFXM(op, xop, fxm) \
@ -3286,7 +3297,8 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{ "iseleq", X(31,79), X_MASK, PPCISEL, { RT, RA, RB } },
{ "isel", XISEL(31,15), XISEL_MASK, PPCISEL, { RT, RA, RB, CRB } },
{ "mfcr", X(31,19), XRARB_MASK, COM, { RT } },
{ "mfcr", X(31,19), XRARB_MASK, NOPOWER4, { RT } },
{ "mfcr", X(31,19), XFXFXM_MASK, POWER4, { RT, FXM4 } },
{ "lwarx", X(31,20), X_MASK, PPC, { RT, RA, RB } },
@ -3437,7 +3449,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
{ "dcbtstlse",X(31,142),X_MASK, PPCCHLK64, { CT, RA, RB }},
{ "mtcr", XFXM(31,144,0xff), XFXFXM_MASK|FXM_MASK, COM, { RS }},
{ "mtcr", XFXM(31,144,0xff), XRARB_MASK, COM, { RS }},
{ "mtcrf", X(31,144), XFXFXM_MASK, COM, { FXM, RS } },
{ "mtmsr", X(31,146), XRARB_MASK, COM, { RS } },