This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] x86: imply all No_*Suf when none is set in a template


Since no template would ever allow for none of them to be set, reduce
table size and improve readability and hence maintainability by implying
all of them to be set when a template specifies none.

opcodes/
2019-11-XX  Jan Beulich  <jbeulich@suse.com>

	* i386-gen.c (process_i386_opcode_modifier): Widen scope of
	bwlq_suf. New local variable other_suf. Emit warning when all
	No_*Suf are set. Set all No_*Suf when none are set.
	* i386-opc.tbl: Drop No_bSuf, No_wSuf, No_lSuf, No_sSuf,
	No_qSuf, and No_ldSuf when they're all specified at the same
	time.
---
Full patch (including entirely mechanical i386-opc.tbl changes)
attached in compressed form, for size reasons. There's no change
to any of the generated files.

--- a/opcodes/i386-gen.c
+++ b/opcodes/i386-gen.c
@@ -1089,6 +1089,7 @@ static void
 process_i386_opcode_modifier (FILE *table, char *mod, char **opnd, int lineno)
 {
   char *str, *next, *last;
+  unsigned int bwlq_suf = 0xf, other_suf = 3;
   bitfield modifiers [ARRAY_SIZE (opcode_modifiers)];
 
   active_isstring = 0;
@@ -1098,7 +1099,7 @@ process_i386_opcode_modifier (FILE *tabl
 
   if (strcmp (mod, "0"))
     {
-      unsigned int have_w = 0, bwlq_suf = 0xf;
+      unsigned int have_w = 0;
 
       last = mod + strlen (mod);
       for (next = mod; next && next < last; )
@@ -1125,6 +1126,10 @@ process_i386_opcode_modifier (FILE *tabl
 		bwlq_suf &= ~4;
 	      if (strcasecmp(str, "No_qSuf") == 0)
 		bwlq_suf &= ~8;
+	      if (strcasecmp(str, "No_sSuf") == 0)
+		other_suf &= ~1;
+	      if (strcasecmp(str, "No_ldSuf") == 0)
+		other_suf &= ~2;
 	    }
 	}
 
@@ -1137,7 +1142,26 @@ process_i386_opcode_modifier (FILE *tabl
 	fprintf (stderr,
 		 "%s: %d: W modifier without Word/Dword/Qword operand(s)\n",
 		 filename, lineno);
+      if (!bwlq_suf && !other_suf)
+	fprintf (stderr, "%s: %d: pointless specification of all No_*Suf\n",
+		 filename, lineno);
+    }
+
+  /* Absence of any No_*Suf specification at all is taken to mean all of
+     these attributes to be set, as no template possibly permits for all
+     of them.  */
+  if (opnd && bwlq_suf == 0xf && other_suf == 3)
+    {
+      unsigned int i;
+
+      static_assert (No_lSuf > No_bSuf && No_lSuf < No_ldSuf);
+      static_assert (No_qSuf > No_bSuf && No_qSuf < No_ldSuf);
+      static_assert (No_sSuf > No_bSuf && No_sSuf < No_ldSuf);
+      static_assert (No_wSuf > No_bSuf && No_wSuf < No_ldSuf);
+      for (i = No_bSuf; i <= No_ldSuf; ++i)
+	modifiers[i].value = 1;
     }
+
   output_opcode_modifier (table, modifiers, ARRAY_SIZE (modifiers));
 }
 

Attachment: binutils-master-x86-no-suffix.patch.bz2
Description: Binary data


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]