[binutils-gdb] x86: unify CPU flag on/off processing

Jan Beulich jbeulich@sourceware.org
Thu Mar 17 10:06:03 GMT 2022


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

commit ad9de929c3ef0b3b6c32db05cf3dc33ff3904990
Author: Jan Beulich <jbeulich@suse.com>
Date:   Thu Mar 17 11:04:41 2022 +0100

    x86: unify CPU flag on/off processing
    
    There's no need for the arbitrary special "unknown" token: Simply
    recognize the leading ~ and process everything else the same, merely
    recording whether to set individual fields to 1 or 0.
    
    While there exclude CpuIAMCU from CPU_UNKNOWN_FLAGS - CPU_IAMCU_FLAGS
    override cpu_arch_flags anyway when -march=iamcu is passed, and there's
    no reason to have the stray flag set even if no insn actually is keyed
    to it.

Diff:
---
 opcodes/i386-gen.c  | 31 ++++++++++---------------------
 opcodes/i386-init.h |  2 +-
 2 files changed, 11 insertions(+), 22 deletions(-)

diff --git a/opcodes/i386-gen.c b/opcodes/i386-gen.c
index cdf06da48f8..ae650d89597 100644
--- a/opcodes/i386-gen.c
+++ b/opcodes/i386-gen.c
@@ -46,7 +46,7 @@ typedef struct initializer
 static initializer cpu_flag_init[] =
 {
   { "CPU_UNKNOWN_FLAGS",
-    "unknown" },
+    "~CpuIAMCU" },
   { "CPU_GENERIC32_FLAGS",
     "Cpu186|Cpu286|Cpu386" },
   { "CPU_GENERIC64_FLAGS",
@@ -1044,22 +1044,15 @@ process_i386_cpu_flag (FILE *table, char *flag, int macro,
 		       const char *comma, const char *indent,
 		       int lineno)
 {
-  char *str, *next, *last;
+  char *str, *next = flag, *last;
   unsigned int i;
+  int value = 1;
   bitfield flags [ARRAY_SIZE (cpu_flags)];
 
   /* Copy the default cpu flags.  */
   memcpy (flags, cpu_flags, sizeof (cpu_flags));
 
-  if (strcasecmp (flag, "unknown") == 0)
-    {
-      /* We turn on everything except for cpu64 in case of
-	 CPU_UNKNOWN_FLAGS.  */
-      for (i = 0; i < ARRAY_SIZE (flags); i++)
-	if (flags[i].position != Cpu64)
-	  flags[i].value = 1;
-    }
-  else if (flag[0] == '~')
+  if (flag[0] == '~')
     {
       last = flag + strlen (flag);
 
@@ -1081,22 +1074,18 @@ process_i386_cpu_flag (FILE *table, char *flag, int macro,
 	  flags[i].value = 1;
 
       /* Turn off selective bits.  */
-      for (; next && next < last; )
-	{
-	  str = next_field (next, '|', &next, last);
-	  if (str)
-	    set_bitfield (str, flags, 0, ARRAY_SIZE (flags), lineno);
-	}
+      value = 0;
     }
-  else if (strcmp (flag, "0"))
+
+  if (strcmp (flag, "0"))
     {
-      /* Turn on selective bits.  */
+      /* Turn on/off selective bits.  */
       last = flag + strlen (flag);
-      for (next = flag; next && next < last; )
+      for (; next && next < last; )
 	{
 	  str = next_field (next, '|', &next, last);
 	  if (str)
-	    set_bitfield (str, flags, 1, ARRAY_SIZE (flags), lineno);
+	    set_bitfield (str, flags, value, ARRAY_SIZE (flags), lineno);
 	}
     }
 
diff --git a/opcodes/i386-init.h b/opcodes/i386-init.h
index e587cd67e49..393fdcabe6f 100644
--- a/opcodes/i386-init.h
+++ b/opcodes/i386-init.h
@@ -21,7 +21,7 @@
 #define CPU_UNKNOWN_FLAGS \
   { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
-      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
+      1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \


More information about the Binutils-cvs mailing list