* ppc-opc.c (insert_bdm): -Many comment.

(valid_bo): Add "extract" param.  Accept both powerpc and power4
	BO fields when disassembling with -Many.
	(insert_bo, extract_bo, insert_boe, extract_boe): Adjust valid_bo call.
This commit is contained in:
Alan Modra 2007-02-02 01:24:43 +00:00
parent efd37f3573
commit ba4e851b3a
2 changed files with 50 additions and 31 deletions

View file

@ -1,3 +1,10 @@
2007-02-02 Alan Modra <amodra@bigpond.net.au>
* ppc-opc.c (insert_bdm): -Many comment.
(valid_bo): Add "extract" param. Accept both powerpc and power4
BO fields when disassembling with -Many.
(insert_bo, extract_bo, insert_boe, extract_boe): Adjust valid_bo call.
2007-01-08 Kazu Hirata <kazu@codesourcery.com>
* m68k-opc.c (m68k_opcodes): Replace cpu32 with

View file

@ -1,6 +1,6 @@
/* ppc-opc.c -- PowerPC opcode list
Copyright 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004,
2005 Free Software Foundation, Inc.
2005, 2006, 2007 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Cygnus Support
This file is part of GDB, GAS, and the GNU binutils.
@ -683,7 +683,11 @@ extract_bd (unsigned long insn,
the "y" bit. "at" == 00 => no hint, "at" == 01 => unpredictable,
"at" == 10 => not taken, "at" == 11 => taken. The "t" bit is 00001
in BO field, the "a" bit is 00010 for branch on CR(BI) and 01000
for branch on CTR. We only handle the taken/not-taken hint here. */
for branch on CTR. We only handle the taken/not-taken hint here.
Note that we don't relax the conditions tested here when
disassembling with -Many because insns using extract_bdm and
extract_bdp always occur in pairs. One or the other will always
be valid. */
static unsigned long
insert_bdm (unsigned long insn,
@ -774,10 +778,11 @@ extract_bdp (unsigned long insn,
/* Check for legal values of a BO field. */
static int
valid_bo (long value, int dialect)
valid_bo (long value, int dialect, int extract)
{
if ((dialect & PPC_OPCODE_POWER4) == 0)
{
int valid;
/* Certain encodings have bits that are required to be zero.
These are (z must be zero, y may be anything):
001zy
@ -790,36 +795,43 @@ valid_bo (long value, int dialect)
{
default:
case 0:
return 1;
valid = 1;
break;
case 0x4:
return (value & 0x2) == 0;
valid = (value & 0x2) == 0;
break;
case 0x10:
return (value & 0x8) == 0;
valid = (value & 0x8) == 0;
break;
case 0x14:
return value == 0x14;
valid = value == 0x14;
break;
}
/* When disassembling with -Many, accept power4 encodings too. */
if (valid
|| (dialect & PPC_OPCODE_ANY) == 0
|| !extract)
return valid;
}
/* Certain encodings have bits that are required to be zero.
These are (z must be zero, a & t may be anything):
0000z
0001z
0100z
0101z
001at
011at
1a00t
1a01t
1z1zz
*/
if ((value & 0x14) == 0)
return (value & 0x1) == 0;
else if ((value & 0x14) == 0x14)
return value == 0x14;
else
{
/* Certain encodings have bits that are required to be zero.
These are (z must be zero, a & t may be anything):
0000z
0001z
0100z
0101z
001at
011at
1a00t
1a01t
1z1zz
*/
if ((value & 0x14) == 0)
return (value & 0x1) == 0;
else if ((value & 0x14) == 0x14)
return value == 0x14;
else
return 1;
}
return 1;
}
/* The BO field in a B form instruction. Warn about attempts to set
@ -831,7 +843,7 @@ insert_bo (unsigned long insn,
int dialect,
const char **errmsg)
{
if (!valid_bo (value, dialect))
if (!valid_bo (value, dialect, 0))
*errmsg = _("invalid conditional option");
return insn | ((value & 0x1f) << 21);
}
@ -844,7 +856,7 @@ extract_bo (unsigned long insn,
long value;
value = (insn >> 21) & 0x1f;
if (!valid_bo (value, dialect))
if (!valid_bo (value, dialect, 1))
*invalid = 1;
return value;
}
@ -859,7 +871,7 @@ insert_boe (unsigned long insn,
int dialect,
const char **errmsg)
{
if (!valid_bo (value, dialect))
if (!valid_bo (value, dialect, 0))
*errmsg = _("invalid conditional option");
else if ((value & 1) != 0)
*errmsg = _("attempt to set y bit when using + or - modifier");
@ -875,7 +887,7 @@ extract_boe (unsigned long insn,
long value;
value = (insn >> 21) & 0x1f;
if (!valid_bo (value, dialect))
if (!valid_bo (value, dialect, 1))
*invalid = 1;
return value & 0x1e;
}