[binutils-gdb] aarch64: Add new qualifier AARCH64_OPND_QLF_UNUSED

Alice Carlotti acarlotti@sourceware.org
Fri May 15 14:09:59 GMT 2026


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=1b01d9a735c75573b10e9d89a3201d811062b889

commit 1b01d9a735c75573b10e9d89a3201d811062b889
Author: Alice Carlotti <alice.carlotti@arm.com>
Date:   Thu May 7 07:08:53 2026 +0100

    aarch64: Add new qualifier AARCH64_OPND_QLF_UNUSED
    
    Replace QLF_NIL with QLF_UNUSED for qualifier sequence list padding.
    This splits apart distinct qualifier meanings, and simplifies detection
    of empty qualifier sequences.

Diff:
---
 gas/config/tc-aarch64.c  |  2 +-
 include/opcode/aarch64.h | 12 ++++++------
 opcodes/aarch64-dis.c    |  8 ++++----
 opcodes/aarch64-opc.c    |  3 ++-
 4 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c
index f88f1b27c9f..fb58bcca9b1 100644
--- a/gas/config/tc-aarch64.c
+++ b/gas/config/tc-aarch64.c
@@ -6003,7 +6003,7 @@ output_operand_error_record (const operand_error_record *record, char *str)
 	  for (i = 0; i < AARCH64_MAX_QLF_SEQ_NUM; ++i, ++qualifiers_list)
 	    {
 	      /* Most opcodes has much fewer patterns in the list.
-		 First NIL qualifier indicates the end in the list.   */
+		 First UNUSED qualifier indicates the end in the list.  */
 	      if (empty_qualifier_sequence_p (*qualifiers_list))
 		break;
 
diff --git a/include/opcode/aarch64.h b/include/opcode/aarch64.h
index 9a1767fa6c0..6d1b414444a 100644
--- a/include/opcode/aarch64.h
+++ b/include/opcode/aarch64.h
@@ -1010,6 +1010,11 @@ enum aarch64_opnd
 
 enum aarch64_opnd_qualifier
 {
+  /* Indicating an unused entry in a list of qualifier sequences (assigned via
+     empty initialization of unused array elements), or some other unused
+     value.  */
+  AARCH64_OPND_QLF_UNUSED,
+
   /* Indicating no further qualification on an operand.  */
   AARCH64_OPND_QLF_NIL,
 
@@ -1353,15 +1358,10 @@ typedef enum aarch64_opnd_qualifier aarch64_opnd_qualifier_t;
 typedef aarch64_opnd_qualifier_t	\
 	  aarch64_opnd_qualifier_seq_t [AARCH64_MAX_OPND_NUM];
 
-/* FIXME: improve the efficiency.  */
 static inline bool
 empty_qualifier_sequence_p (const aarch64_opnd_qualifier_t *qualifiers)
 {
-  int i;
-  for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i)
-    if (qualifiers[i] != AARCH64_OPND_QLF_NIL)
-      return false;
-  return true;
+  return qualifiers[0] == AARCH64_OPND_QLF_UNUSED;
 }
 
 /*  Forward declare error reporting type.  */
diff --git a/opcodes/aarch64-dis.c b/opcodes/aarch64-dis.c
index 95d70d79294..c3a809ef576 100644
--- a/opcodes/aarch64-dis.c
+++ b/opcodes/aarch64-dis.c
@@ -2516,7 +2516,7 @@ aarch64_ext_plain_shrimm (const aarch64_operand *self, aarch64_opnd_info *info,
 
    N.B. CANDIDATES is a group of possible qualifiers that are valid for
    one operand; it has a maximum of AARCH64_MAX_QLF_SEQ_NUM qualifiers and
-   may end with AARCH64_OPND_QLF_NIL.  */
+   may end with AARCH64_OPND_QLF_UNUSED.  */
 
 static enum aarch64_opnd_qualifier
 get_qualifier_from_partial_encoding (aarch64_insn value,
@@ -2529,7 +2529,7 @@ get_qualifier_from_partial_encoding (aarch64_insn value,
   for (i = 0; i < AARCH64_MAX_QLF_SEQ_NUM; ++i)
     {
       aarch64_insn standard_value;
-      if (candidates[i] == AARCH64_OPND_QLF_NIL)
+      if (candidates[i] == AARCH64_OPND_QLF_UNUSED)
 	break;
       standard_value = aarch64_get_qualifier_standard_value (candidates[i]);
       if ((standard_value & mask) == (value & mask))
@@ -2549,7 +2549,7 @@ get_operand_possible_qualifiers (int idx,
 {
   int i;
   for (i = 0; i < AARCH64_MAX_QLF_SEQ_NUM; ++i)
-    if ((qualifiers[i] = list[i][idx]) == AARCH64_OPND_QLF_NIL)
+    if ((qualifiers[i] = list[i][idx]) == AARCH64_OPND_QLF_UNUSED)
       break;
 }
 
@@ -2604,7 +2604,7 @@ decode_sizeq (aarch64_inst *inst)
   if (debug_dump)
     {
       int i;
-      for (i = 0; candidates[i] != AARCH64_OPND_QLF_NIL
+      for (i = 0; candidates[i] != AARCH64_OPND_QLF_UNUSED
 	   && i < AARCH64_MAX_QLF_SEQ_NUM; ++i)
 	DEBUG_TRACE ("qualifier %d: %s", i,
 		     aarch64_get_qualifier_name(candidates[i]));
diff --git a/opcodes/aarch64-opc.c b/opcodes/aarch64-opc.c
index b21315333db..62bb11868fd 100644
--- a/opcodes/aarch64-opc.c
+++ b/opcodes/aarch64-opc.c
@@ -195,7 +195,7 @@ get_data_pattern (const aarch64_opnd_qualifier_seq_t qualifiers)
     {
       /* e.g. SADDLV <V><d>, <Vn>.<T>.  */
       if (vector_qualifier_p (qualifiers[1])
-	  && qualifiers[2] == AARCH64_OPND_QLF_NIL)
+	  && (qualifiers[2] == AARCH64_OPND_QLF_UNUSED))
 	return DP_VECTOR_ACROSS_LANES;
     }
 
@@ -737,6 +737,7 @@ struct operand_qualifier_data
 /* Indexed by the operand qualifier enumerators.  */
 static const struct operand_qualifier_data aarch64_opnd_qualifiers[] =
 {
+  {0, 0, 0, "UNUSED", OQK_NIL},
   {0, 0, 0, "NIL", OQK_NIL},
   {0, 0, 0, "UNKNOWN", OQK_NIL},


More information about the Binutils-cvs mailing list