MIPS/opcodes: Properly handle ISA exclusion

Remove the hack used for MIPSr6 ISA exclusion from `cpu_is_member' and
handle the exclusion for any ISA levels properly in `opcode_is_member'.
Flatten the structure of the `if' statements there.  No functional
change for the existing opcode tables.

	include/
	* opcode/mips.h (cpu_is_member): Remove code for MIPSr6 ISA
	exclusion.
	(opcode_is_member): Handle ISA level exclusion.
This commit is contained in:
Maciej W. Rozycki
2021-05-29 03:26:32 +02:00
parent b1458c4569
commit 21629cf8bc
2 changed files with 24 additions and 19 deletions

View File

@ -1,3 +1,9 @@
2021-05-29 Maciej W. Rozycki <macro@orcam.me.uk>
* opcode/mips.h (cpu_is_member): Remove code for MIPSr6 ISA
exclusion.
(opcode_is_member): Handle ISA level exclusion.
2021-05-29 Maciej W. Rozycki <macro@orcam.me.uk> 2021-05-29 Maciej W. Rozycki <macro@orcam.me.uk>
* opcode/mips.h (isa_is_member): New inline function, factored * opcode/mips.h (isa_is_member): New inline function, factored

View File

@ -1459,13 +1459,6 @@ cpu_is_member (int cpu, unsigned int mask)
case CPU_INTERAPTIV_MR2: case CPU_INTERAPTIV_MR2:
return (mask & INSN_INTERAPTIV_MR2) != 0; return (mask & INSN_INTERAPTIV_MR2) != 0;
case CPU_MIPS32R6:
return (mask & INSN_ISA_MASK) == INSN_ISA32R6;
case CPU_MIPS64R6:
return ((mask & INSN_ISA_MASK) == INSN_ISA32R6)
|| ((mask & INSN_ISA_MASK) == INSN_ISA64R6);
default: default:
return false; return false;
} }
@ -1500,20 +1493,26 @@ isa_is_member (int isa, unsigned int mask)
static inline bool static inline bool
opcode_is_member (const struct mips_opcode *insn, int isa, int ase, int cpu) opcode_is_member (const struct mips_opcode *insn, int isa, int ase, int cpu)
{ {
if (!cpu_is_member (cpu, insn->exclusions)) /* Test for ISA level exclusion. */
{ if (isa_is_member (isa, insn->exclusions))
/* Test for ISA level compatibility. */ return false;
if (isa_is_member (isa, insn->membership))
return true;
/* Test for ASE compatibility. */ /* Test for processor-specific exclusion. */
if ((ase & insn->ase) != 0) if (cpu_is_member (cpu, insn->exclusions))
return true; return false;
/* Test for ISA level compatibility. */
if (isa_is_member (isa, insn->membership))
return true;
/* Test for ASE compatibility. */
if ((ase & insn->ase) != 0)
return true;
/* Test for processor-specific extensions. */
if (cpu_is_member (cpu, insn->membership))
return true;
/* Test for processor-specific extensions. */
if (cpu_is_member (cpu, insn->membership))
return true;
}
return false; return false;
} }