aarch64: Add a aarch64_cpu_supports_inst_p helper
authorRichard Sandiford <richard.sandiford@arm.com>
Thu, 30 Mar 2023 10:09:09 +0000 (11:09 +0100)
committerRichard Sandiford <richard.sandiford@arm.com>
Thu, 30 Mar 2023 10:09:09 +0000 (11:09 +0100)
Quite a lot of SME2 instructions have an opcode bit that selects
between 32-bit and 64-bit forms of an instruction, with the 32-bit
forms being part of base SME2 and with the 64-bit forms being part
of an optional extension.  It's nevertheless useful to have a single
opcode entry for both forms since (a) that matches the ISA definition
and (b) it tends to improve error reporting.

This patch therefore adds a libopcodes function called
aarch64_cpu_supports_inst_p that tests whether the target
supports a particular instruction.  In future it will depend
on internal libopcodes routines.

gas/config/tc-aarch64.c
include/opcode/aarch64.h
opcodes/aarch64-opc.c

index c8e37623d9e34c71b12b88311bcf0e716df1b829..71b63d3f7b348d89be755e20c5e8d3e9db411e62 100644 (file)
@@ -8116,8 +8116,7 @@ md_assemble (char *str)
          && do_encode (inst_base->opcode, &inst.base, &inst_base->value))
        {
          /* Check that this instruction is supported for this CPU.  */
-         if (!opcode->avariant
-             || !AARCH64_CPU_HAS_ALL_FEATURES (cpu_variant, *opcode->avariant))
+         if (!aarch64_cpu_supports_inst_p (cpu_variant, inst_base))
            {
              as_bad (_("selected processor does not support `%s'"), str);
              return;
index d09897f48d40acab86dd4c96215c19d3768ead75..61afe561a12f83a2636103ad1ba8bb810470df46 100644 (file)
@@ -1471,6 +1471,9 @@ aarch64_get_operand_desc (enum aarch64_opnd);
 extern bool
 aarch64_sve_dupm_mov_immediate_p (uint64_t, int);
 
+extern bool
+aarch64_cpu_supports_inst_p (uint64_t, aarch64_inst *);
+
 #ifdef DEBUG_AARCH64
 extern int debug_dump;
 
index b9029010c47d76fc71ee7eab748b6f0d4a684a92..7a88c19633da765513653020e85fb4b7ba023a01 100644 (file)
@@ -6158,6 +6158,19 @@ aarch64_sve_dupm_mov_immediate_p (uint64_t uvalue, int esize)
   return svalue < -128 || svalue >= 128;
 }
 
+/* Return true if a CPU with the AARCH64_FEATURE_* bits in CPU_VARIANT
+   supports the instruction described by INST.  */
+
+bool
+aarch64_cpu_supports_inst_p (uint64_t cpu_variant, aarch64_inst *inst)
+{
+  if (!inst->opcode->avariant
+      || !AARCH64_CPU_HAS_ALL_FEATURES (cpu_variant, *inst->opcode->avariant))
+    return false;
+
+  return true;
+}
+
 /* Include the opcode description table as well as the operand description
    table.  */
 #define VERIFIER(x) verify_##x