[committed,09/18] MIPS/opcodes: Factor out ISA matching against flags

Message ID alpine.DEB.2.21.2105272304110.11113@angie.orcam.me.uk
State New
Headers show
Series
  • MIPS coprocessor opcodes handling fixes
Related show

Commit Message

Maciej W. Rozycki May 29, 2021, 1:37 a.m.
In preparation for the next change factor out code for ISA matching 
against instruction flags used in MIPS opcode tables, similarly to how 
CPU matching is already done.  No functional change, though for clarity 
split the single `if' statement into multiple ones and use temporaries 
rather than repeated expressions.

	include/
	* opcode/mips.h (isa_is_member): New inline function, factored 
	out from...
	(opcode_is_member): ... here.
---
 include/opcode/mips.h |   25 +++++++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)

binutils-mips-opcodes-isa-is-member.diff

Patch

Index: binutils-gdb/include/opcode/mips.h
===================================================================
--- binutils-gdb.orig/include/opcode/mips.h
+++ binutils-gdb/include/opcode/mips.h
@@ -1471,6 +1471,26 @@  cpu_is_member (int cpu, unsigned int mas
     }
 }
 
+/* Return true if the given ISA is included in INSN_* mask MASK.  */
+
+static inline bool
+isa_is_member (int isa, unsigned int mask)
+{
+  isa &= INSN_ISA_MASK;
+  mask &= INSN_ISA_MASK;
+
+  if (isa == 0)
+    return false;
+
+  if (mask == 0)
+    return false;
+
+  if (((mips_isa_table[isa - 1] >> (mask - 1)) & 1) == 0)
+    return false;
+
+  return true;
+}
+
 /* Test for membership in an ISA including chip specific ISAs.  INSN
    is pointer to an element of the opcode table; ISA is the specified
    ISA/ASE bitmask to test against; and CPU is the CPU specific ISA to
@@ -1483,10 +1503,7 @@  opcode_is_member (const struct mips_opco
   if (!cpu_is_member (cpu, insn->exclusions))
     {
       /* Test for ISA level compatibility.  */
-      if ((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)
+      if (isa_is_member (isa, insn->membership))
 	return true;
 
       /* Test for ASE compatibility.  */