This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [PATCH] MIPS: Opcode membership proposal
- From: Richard Sandiford <rdsandiford at googlemail dot com>
- To: "Maciej W. Rozycki" <macro at codesourcery dot com>
- Cc: David Daney <ddaney at caviumnetworks dot com>, Andrew Pinski <andrew dot pinski at caviumnetworks dot com>, <binutils at sourceware dot org>
- Date: Thu, 17 Nov 2011 18:44:46 +0000
- Subject: Re: [PATCH] MIPS: Opcode membership proposal
- References: <alpine.DEB.1.10.1012181108290.4142@tp.orcam.me.uk> <alpine.DEB.1.10.1110311233290.28657@tp.orcam.me.uk>
"Maciej W. Rozycki" <macro@codesourcery.com> writes:
> @@ -830,37 +833,38 @@ static const unsigned int mips_isa_table
> ISA/ASE bitmask to test against; and CPU is the CPU specific ISA to
> test, or zero if no CPU specific ISA test is desired. */
>
> -#define OPCODE_IS_MEMBER(insn, isa, cpu) \
> - (((isa & INSN_ISA_MASK) != 0 \
> - && ((insn)->membership & INSN_ISA_MASK) != 0 \
> - && ((mips_isa_table [(isa & INSN_ISA_MASK) - 1] >> \
> - (((insn)->membership & INSN_ISA_MASK) - 1)) & 1) != 0) \
> - || ((isa & ~INSN_ISA_MASK) \
> - & ((insn)->membership & ~INSN_ISA_MASK)) != 0 \
> - || (cpu == CPU_R4650 && ((insn)->membership & INSN_4650) != 0) \
> - || (cpu == CPU_RM7000 && ((insn)->membership & INSN_4650) != 0) \
> - || (cpu == CPU_RM9000 && ((insn)->membership & INSN_4650) != 0) \
> - || (cpu == CPU_R4010 && ((insn)->membership & INSN_4010) != 0) \
> - || (cpu == CPU_VR4100 && ((insn)->membership & INSN_4100) != 0) \
> - || (cpu == CPU_R3900 && ((insn)->membership & INSN_3900) != 0) \
> - || ((cpu == CPU_R10000 || cpu == CPU_R12000 || cpu == CPU_R14000 \
> - || cpu == CPU_R16000) \
> - && ((insn)->membership & INSN_10000) != 0) \
> - || (cpu == CPU_SB1 && ((insn)->membership & INSN_SB1) != 0) \
> - || (cpu == CPU_R4111 && ((insn)->membership & INSN_4111) != 0) \
> - || (cpu == CPU_VR4120 && ((insn)->membership & INSN_4120) != 0) \
> - || (cpu == CPU_VR5400 && ((insn)->membership & INSN_5400) != 0) \
> - || (cpu == CPU_VR5500 && ((insn)->membership & INSN_5500) != 0) \
> - || (cpu == CPU_LOONGSON_2E \
> - && ((insn)->membership & INSN_LOONGSON_2E) != 0) \
> - || (cpu == CPU_LOONGSON_2F \
> - && ((insn)->membership & INSN_LOONGSON_2F) != 0) \
> - || (cpu == CPU_LOONGSON_3A \
> - && ((insn)->membership & INSN_LOONGSON_3A) != 0) \
> - || (cpu == CPU_OCTEON \
> - && ((insn)->membership & INSN_OCTEON) != 0) \
> - || (cpu == CPU_XLR && ((insn)->membership & INSN_XLR) != 0) \
> - || 0) /* Please keep this term for easier source merging. */
> +#define OPCODE_IS_MEMBER(insn, isa, cpu) \
> + ((((isa & INSN_ISA_MASK) != 0 \
> + && ((insn)->membership & INSN_ISA_MASK) != 0 \
> + && ((mips_isa_table [(isa & INSN_ISA_MASK) - 1] >> \
> + (((insn)->membership & INSN_ISA_MASK) - 1)) & 1) != 0) \
> + || ((isa & ~INSN_ISA_MASK) \
> + & ((insn)->membership & ~INSN_ISA_MASK)) != 0 \
> + || (cpu == CPU_R4650 && ((insn)->membership & INSN_4650) != 0) \
> + || (cpu == CPU_RM7000 && ((insn)->membership & INSN_4650) != 0) \
> + || (cpu == CPU_RM9000 && ((insn)->membership & INSN_4650) != 0) \
> + || (cpu == CPU_R4010 && ((insn)->membership & INSN_4010) != 0) \
> + || (cpu == CPU_VR4100 && ((insn)->membership & INSN_4100) != 0) \
> + || (cpu == CPU_R3900 && ((insn)->membership & INSN_3900) != 0) \
> + || ((cpu == CPU_R10000 || cpu == CPU_R12000 || cpu == CPU_R14000 \
> + || cpu == CPU_R16000) \
> + && ((insn)->membership & INSN_10000) != 0) \
> + || (cpu == CPU_SB1 && ((insn)->membership & INSN_SB1) != 0) \
> + || (cpu == CPU_R4111 && ((insn)->membership & INSN_4111) != 0) \
> + || (cpu == CPU_VR4120 && ((insn)->membership & INSN_4120) != 0) \
> + || (cpu == CPU_VR5400 && ((insn)->membership & INSN_5400) != 0) \
> + || (cpu == CPU_VR5500 && ((insn)->membership & INSN_5500) != 0) \
> + || (cpu == CPU_LOONGSON_2E \
> + && ((insn)->membership & INSN_LOONGSON_2E) != 0) \
> + || (cpu == CPU_LOONGSON_2F \
> + && ((insn)->membership & INSN_LOONGSON_2F) != 0) \
> + || (cpu == CPU_LOONGSON_3A \
> + && ((insn)->membership & INSN_LOONGSON_3A) != 0) \
> + || (cpu == CPU_OCTEON && ((insn)->membership & INSN_OCTEON) != 0) \
> + || (cpu == CPU_XLR && ((insn)->membership & INSN_XLR) != 0) \
> + || 0) /* Please keep this term for easier source merging. */ \
> + && ((cpu != CPU_OCTEON || ((insn)->exclusions & CPU_OCTEON) == 0) \
Looks like a typo for "((insn)->exclusions & INSN_OCTEON) == 0".
To help avoid this sort of thing, and to avoid making the patch
unnecessarily Octeon-specific, I think the CPU/mask test should
be split out. Specifically:
/* Return true if the given CPU is included in INSN_* mask MASK. */
static bfd_boolean
cpu_is_member (int cpu, unsigned int mask)
{
switch (cpu)
{
case CPU_R4650:
case CPU_RM7000:
case CPU_RM9000:
return (mask & INSN_4650) != 0;
case CPU_R4010:
return (mask & INSN_4010) != 0;
case CPU_VR4100:
return (mask & INSN_4100) != 0;
case CPU_R3900:
return (mask & INSN_3900) != 0;
case CPU_R10000:
case CPU_R12000:
case CPU_R14000:
case CPU_R16000:
return (mask & INSN_10000) != 0;
case CPU_SB1:
return (mask & INSN_SB1) != 0;
case CPU_R4111:
return (mask & INSN_4111) != 0;
case CPU_VR4120:
return (mask & INSN_4120) != 0;
case CPU_VR5400:
return (mask & INSN_5400) != 0;
case CPU_VR5500:
return (mask & INSN_5500) != 0;
case CPU_LOONGSON_2E:
return (mask & INSN_LOONGSON_2E) != 0;
case CPU_LOONGSON_2F:
return (mask & INSN_LOONGSON_2F) != 0;
case CPU_LOONGSON_3A:
return (mask & INSN_LOONGSON_3A) != 0;
case CPU_OCTEON:
return (mask & INSN_OCTEON) != 0;
case CPU_XLR:
return (mask & INSN_XLR) != 0;
default:
return FALSE;
}
/* Return true if instruction MO is available when assembling for
the given ISA and CPU. */
static bfd_boolean
opcode_is_member (const struct mips_opcode *mo, int isa, int cpu)
{
if (!cpu_is_member (cpu, mo->exclusions))
{
/* Test for ISA level compatibility. */
if ((isa & INSN_ISA_MASK) != 0
&& (mo->membership & INSN_ISA_MASK) != 0
&& ((mips_isa_table[(isa & INSN_ISA_MASK) - 1]
>> ((mo->membership & INSN_ISA_MASK) - 1)) & 1) != 0)
return TRUE;
/* Test for ASE compatibility. */
if (((isa & ~INSN_ISA_MASK) & (mo->membership & ~INSN_ISA_MASK)) != 0)
return TRUE;
/* Test for processor-specific extensions. */
if (cpu_is_member (cpu, mo->membership))
return TRUE;
}
return FALSE;
}
(untested, so please fix the inevitable errors).
> +NO_WFIELD = @NO_WFIELD@
I think this name loses too much information. Just call it
NO_WMISSING_FIELD_INITIALIZERS.
OK with those changes.
Richard