* 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> 2003-07-01 Martin Schwidefsky <schwidefsky@de.ibm.com>
* s390-dis.c (s390_extract_operand): Add support for long displacements. * s390-dis.c (s390_extract_operand): Add support for long displacements.
@ -709,7 +718,7 @@
2002-11-06 Aldy Hernandez <aldyh@redhat.com> 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> 2002-10-07 Nathan Tallent <eraxxon@alumni.rice.edu>
@ -1606,7 +1615,7 @@
* Makefile.am: Run "make dep-am". * Makefile.am: Run "make dep-am".
* Makefile.in: Regenerate. * Makefile.in: Regenerate.
* opcodes/po/POTFILES.in: Regenerate. * po/POTFILES.in: Regenerate.
2002-01-19 Richard Earnshaw <rearnsha@arm.com> 2002-01-19 Richard Earnshaw <rearnsha@arm.com>
@ -2171,9 +2180,9 @@
2001-08-23 Martin Schwidefsky <schwidefsky@de.ibm.com> 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. branch instructions for gcc 3.0.
* opcodes/s390-opc.txt: Likewise. * s390-opc.txt: Likewise.
2001-08-21 Andreas Jaeger <aj@suse.de> 2001-08-21 Andreas Jaeger <aj@suse.de>

View file

@ -38,112 +38,61 @@
/* Local insertion and extraction functions. */ /* Local insertion and extraction functions. */
static unsigned long insert_bat static unsigned long insert_bat (unsigned long, long, int, const char **);
PARAMS ((unsigned long, long, int, const char **)); static long extract_bat (unsigned long, int, int *);
static long extract_bat static unsigned long insert_bba (unsigned long, long, int, const char **);
PARAMS ((unsigned long, int, int *)); static long extract_bba (unsigned long, int, int *);
static unsigned long insert_bba static unsigned long insert_bd (unsigned long, long, int, const char **);
PARAMS ((unsigned long, long, int, const char **)); static long extract_bd (unsigned long, int, int *);
static long extract_bba static unsigned long insert_bdm (unsigned long, long, int, const char **);
PARAMS ((unsigned long, int, int *)); static long extract_bdm (unsigned long, int, int *);
static unsigned long insert_bd static unsigned long insert_bdp (unsigned long, long, int, const char **);
PARAMS ((unsigned long, long, int, const char **)); static long extract_bdp (unsigned long, int, int *);
static long extract_bd static int valid_bo (long, int);
PARAMS ((unsigned long, int, int *)); static unsigned long insert_bo (unsigned long, long, int, const char **);
static unsigned long insert_bdm static long extract_bo (unsigned long, int, int *);
PARAMS ((unsigned long, long, int, const char **)); static unsigned long insert_boe (unsigned long, long, int, const char **);
static long extract_bdm static long extract_boe (unsigned long, int, int *);
PARAMS ((unsigned long, int, int *)); static unsigned long insert_dq (unsigned long, long, int, const char **);
static unsigned long insert_bdp static long extract_dq (unsigned long, int, int *);
PARAMS ((unsigned long, long, int, const char **)); static unsigned long insert_ds (unsigned long, long, int, const char **);
static long extract_bdp static long extract_ds (unsigned long, int, int *);
PARAMS ((unsigned long, int, int *)); static unsigned long insert_de (unsigned long, long, int, const char **);
static int valid_bo static long extract_de (unsigned long, int, int *);
PARAMS ((long, int)); static unsigned long insert_des (unsigned long, long, int, const char **);
static unsigned long insert_bo static long extract_des (unsigned long, int, int *);
PARAMS ((unsigned long, long, int, const char **)); static unsigned long insert_fxm (unsigned long, long, int, const char **);
static long extract_bo static long extract_fxm (unsigned long, int, int *);
PARAMS ((unsigned long, int, int *)); static unsigned long insert_li (unsigned long, long, int, const char **);
static unsigned long insert_boe static long extract_li (unsigned long, int, int *);
PARAMS ((unsigned long, long, int, const char **)); static unsigned long insert_mbe (unsigned long, long, int, const char **);
static long extract_boe static long extract_mbe (unsigned long, int, int *);
PARAMS ((unsigned long, int, int *)); static unsigned long insert_mb6 (unsigned long, long, int, const char **);
static unsigned long insert_dq static long extract_mb6 (unsigned long, int, int *);
PARAMS ((unsigned long, long, int, const char **)); static unsigned long insert_nb (unsigned long, long, int, const char **);
static long extract_dq static long extract_nb (unsigned long, int, int *);
PARAMS ((unsigned long, int, int *)); static unsigned long insert_nsi (unsigned long, long, int, const char **);
static unsigned long insert_ds static long extract_nsi (unsigned long, int, int *);
PARAMS ((unsigned long, long, int, const char **)); static unsigned long insert_ral (unsigned long, long, int, const char **);
static long extract_ds static unsigned long insert_ram (unsigned long, long, int, const char **);
PARAMS ((unsigned long, int, int *)); static unsigned long insert_raq (unsigned long, long, int, const char **);
static unsigned long insert_de static unsigned long insert_ras (unsigned long, long, int, const char **);
PARAMS ((unsigned long, long, int, const char **)); static unsigned long insert_rbs (unsigned long, long, int, const char **);
static long extract_de static long extract_rbs (unsigned long, int, int *);
PARAMS ((unsigned long, int, int *)); static unsigned long insert_rsq (unsigned long, long, int, const char **);
static unsigned long insert_des static unsigned long insert_rtq (unsigned long, long, int, const char **);
PARAMS ((unsigned long, long, int, const char **)); static unsigned long insert_sh6 (unsigned long, long, int, const char **);
static long extract_des static long extract_sh6 (unsigned long, int, int *);
PARAMS ((unsigned long, int, int *)); static unsigned long insert_spr (unsigned long, long, int, const char **);
static unsigned long insert_li static long extract_spr (unsigned long, int, int *);
PARAMS ((unsigned long, long, int, const char **)); static unsigned long insert_tbr (unsigned long, long, int, const char **);
static long extract_li static long extract_tbr (unsigned long, int, int *);
PARAMS ((unsigned long, int, int *)); static unsigned long insert_ev2 (unsigned long, long, int, const char **);
static unsigned long insert_mbe static long extract_ev2 (unsigned long, int, int *);
PARAMS ((unsigned long, long, int, const char **)); static unsigned long insert_ev4 (unsigned long, long, int, const char **);
static long extract_mbe static long extract_ev4 (unsigned long, int, int *);
PARAMS ((unsigned long, int, int *)); static unsigned long insert_ev8 (unsigned long, long, int, const char **);
static unsigned long insert_mb6 static long extract_ev8 (unsigned long, int, int *);
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 *));
/* The operands table. /* The operands table.
@ -341,10 +290,14 @@ const struct powerpc_operand powerpc_operands[] =
/* The FXM field in an XFX instruction. */ /* The FXM field in an XFX instruction. */
#define FXM FRS + 1 #define FXM FRS + 1
#define FXM_MASK (0xff << 12) #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. */ /* 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 }, { 1, 21, 0, 0, PPC_OPERAND_OPTIONAL },
/* The LEV field in a POWER SC form instruction. */ /* The LEV field in a POWER SC form instruction. */
@ -1074,6 +1027,64 @@ extract_des (insn, dialect, invalid)
return (((insn >> 2) & 0x3ffc) ^ 0x2000) - 0x2000; 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 /* The LI field in an I form instruction. The lower two bits are
forced to zero. */ forced to zero. */
@ -1739,7 +1750,7 @@ extract_tbr (insn, dialect, invalid)
#define XS_MASK XS (0x3f, 0x1ff, 1) #define XS_MASK XS (0x3f, 0x1ff, 1)
/* A mask for the FXM version of an XFX form instruction. */ /* 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. */ /* An XFX form instruction with the FXM field filled in. */
#define XFXM(op, xop, fxm) \ #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 } }, { "iseleq", X(31,79), X_MASK, PPCISEL, { RT, RA, RB } },
{ "isel", XISEL(31,15), XISEL_MASK, PPCISEL, { RT, RA, RB, CRB } }, { "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 } }, { "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 }}, { "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 } }, { "mtcrf", X(31,144), XFXFXM_MASK, COM, { FXM, RS } },
{ "mtmsr", X(31,146), XRARB_MASK, COM, { RS } }, { "mtmsr", X(31,146), XRARB_MASK, COM, { RS } },