x86: unindent most of set_cpu_arch()
authorJan Beulich <jbeulich@suse.com>
Fri, 1 Sep 2023 10:29:44 +0000 (12:29 +0200)
committerJan Beulich <jbeulich@suse.com>
Fri, 1 Sep 2023 10:29:44 +0000 (12:29 +0200)
Inverting the initial if()'s condition allows to move out the bulk of
the function by a level, improving readability at least a bit. While
doing that also pull the push/pop handling up first, such that "else if"
after "return" isn't needed anymore; the order in which special cases
are checked doesn't really matter.

gas/config/tc-i386.c

index 19a5f2d61e5c3f5bb307541ee65c046b23f8fe8c..00abfc78264ca79ed9d67ef340cb6a63cea3b002 100644 (file)
@@ -2793,29 +2793,134 @@ set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
     bool no_cond_jump_promotion;
   } arch_stack_entry;
   static const arch_stack_entry *arch_stack_top;
+  char *s;
+  int e;
+  const char *string;
+  unsigned int j = 0;
+  i386_cpu_flags flags;
 
   SKIP_WHITESPACE ();
 
-  if (!is_end_of_line[(unsigned char) *input_line_pointer])
+  if (is_end_of_line[(unsigned char) *input_line_pointer])
+    {
+      as_bad (_("missing cpu architecture"));
+      input_line_pointer++;
+      return;
+    }
+
+  e = get_symbol_name (&s);
+  string = s;
+
+  if (strcmp (string, "push") == 0)
+    {
+      arch_stack_entry *top = XNEW (arch_stack_entry);
+
+      top->name = cpu_arch_name;
+      if (cpu_sub_arch_name)
+       top->sub_name = xstrdup (cpu_sub_arch_name);
+      else
+       top->sub_name = NULL;
+      top->flags = cpu_arch_flags;
+      top->isa = cpu_arch_isa;
+      top->isa_flags = cpu_arch_isa_flags;
+      top->flag_code = flag_code;
+      top->stackop_size = stackop_size;
+      top->no_cond_jump_promotion = no_cond_jump_promotion;
+
+      top->prev = arch_stack_top;
+      arch_stack_top = top;
+
+      (void) restore_line_pointer (e);
+      demand_empty_rest_of_line ();
+      return;
+    }
+
+  if (strcmp (string, "pop") == 0)
     {
-      char *s;
-      int e = get_symbol_name (&s);
-      const char *string = s;
-      unsigned int j = 0;
-      i386_cpu_flags flags;
+      const arch_stack_entry *top = arch_stack_top;
 
-      if (strcmp (string, "default") == 0)
+      if (!top)
+       as_bad (_(".arch stack is empty"));
+      else if (top->flag_code != flag_code
+              || top->stackop_size != stackop_size)
+       {
+         static const unsigned int bits[] = {
+           [CODE_16BIT] = 16,
+           [CODE_32BIT] = 32,
+           [CODE_64BIT] = 64,
+         };
+
+         as_bad (_("this `.arch pop' requires `.code%u%s' to be in effect"),
+                 bits[top->flag_code],
+                 top->stackop_size == LONG_MNEM_SUFFIX ? "gcc" : "");
+       }
+      else
+       {
+         arch_stack_top = top->prev;
+
+         cpu_arch_name = top->name;
+         free (cpu_sub_arch_name);
+         cpu_sub_arch_name = top->sub_name;
+         cpu_arch_flags = top->flags;
+         cpu_arch_isa = top->isa;
+         cpu_arch_isa_flags = top->isa_flags;
+         no_cond_jump_promotion = top->no_cond_jump_promotion;
+
+         XDELETE (top);
+       }
+
+      (void) restore_line_pointer (e);
+      demand_empty_rest_of_line ();
+      return;
+    }
+
+  if (strcmp (string, "default") == 0)
+    {
+      if (strcmp (default_arch, "iamcu") == 0)
+       string = default_arch;
+      else
        {
-         if (strcmp (default_arch, "iamcu") == 0)
-           string = default_arch;
+         static const i386_cpu_flags cpu_unknown_flags = CPU_UNKNOWN_FLAGS;
+
+         cpu_arch_name = NULL;
+         free (cpu_sub_arch_name);
+         cpu_sub_arch_name = NULL;
+         cpu_arch_flags = cpu_unknown_flags;
+         if (flag_code == CODE_64BIT)
+           {
+             cpu_arch_flags.bitfield.cpu64 = 1;
+             cpu_arch_flags.bitfield.cpuno64 = 0;
+           }
          else
            {
-             static const i386_cpu_flags cpu_unknown_flags = CPU_UNKNOWN_FLAGS;
+             cpu_arch_flags.bitfield.cpu64 = 0;
+             cpu_arch_flags.bitfield.cpuno64 = 1;
+           }
+         cpu_arch_isa = PROCESSOR_UNKNOWN;
+         cpu_arch_isa_flags = cpu_arch[flag_code == CODE_64BIT].enable;
+         if (!cpu_arch_tune_set)
+           {
+             cpu_arch_tune = cpu_arch_isa;
+             cpu_arch_tune_flags = cpu_arch_isa_flags;
+           }
+
+         j = ARRAY_SIZE (cpu_arch) + 1;
+       }
+    }
+
+  for (; j < ARRAY_SIZE (cpu_arch); j++)
+    {
+      if (strcmp (string + (*string == '.'), cpu_arch[j].name) == 0
+         && (*string == '.') == (cpu_arch[j].type == PROCESSOR_NONE))
+       {
+         if (*string != '.')
+           {
+             check_cpu_arch_compatible (string, cpu_arch[j].enable);
 
-             cpu_arch_name = NULL;
+             cpu_arch_name = cpu_arch[j].name;
              free (cpu_sub_arch_name);
              cpu_sub_arch_name = NULL;
-             cpu_arch_flags = cpu_unknown_flags;
+             cpu_arch_flags = cpu_arch[j].enable;
              if (flag_code == CODE_64BIT)
                {
                  cpu_arch_flags.bitfield.cpu64 = 1;
@@ -2826,173 +2931,71 @@ set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
                  cpu_arch_flags.bitfield.cpu64 = 0;
                  cpu_arch_flags.bitfield.cpuno64 = 1;
                }
-             cpu_arch_isa = PROCESSOR_UNKNOWN;
-             cpu_arch_isa_flags = cpu_arch[flag_code == CODE_64BIT].enable;
+             cpu_arch_isa = cpu_arch[j].type;
+             cpu_arch_isa_flags = cpu_arch[j].enable;
              if (!cpu_arch_tune_set)
                {
                  cpu_arch_tune = cpu_arch_isa;
                  cpu_arch_tune_flags = cpu_arch_isa_flags;
                }
-
-             j = ARRAY_SIZE (cpu_arch) + 1;
+             pre_386_16bit_warned = false;
+             break;
            }
-       }
-      else if (strcmp (string, "push") == 0)
-       {
-         arch_stack_entry *top = XNEW (arch_stack_entry);
 
-         top->name = cpu_arch_name;
-         if (cpu_sub_arch_name)
-           top->sub_name = xstrdup (cpu_sub_arch_name);
-         else
-           top->sub_name = NULL;
-         top->flags = cpu_arch_flags;
-         top->isa = cpu_arch_isa;
-         top->isa_flags = cpu_arch_isa_flags;
-         top->flag_code = flag_code;
-         top->stackop_size = stackop_size;
-         top->no_cond_jump_promotion = no_cond_jump_promotion;
+         if (cpu_flags_all_zero (&cpu_arch[j].enable))
+           continue;
 
-         top->prev = arch_stack_top;
-         arch_stack_top = top;
+         flags = cpu_flags_or (cpu_arch_flags, cpu_arch[j].enable);
 
-         (void) restore_line_pointer (e);
-         demand_empty_rest_of_line ();
-         return;
-       }
-      else if (strcmp (string, "pop") == 0)
-       {
-         const arch_stack_entry *top = arch_stack_top;
-
-         if (!top)
-           as_bad (_(".arch stack is empty"));
-         else if (top->flag_code != flag_code
-                  || top->stackop_size != stackop_size)
+         if (!cpu_flags_equal (&flags, &cpu_arch_flags))
            {
-             static const unsigned int bits[] = {
-               [CODE_16BIT] = 16,
-               [CODE_32BIT] = 32,
-               [CODE_64BIT] = 64,
-             };
-
-             as_bad (_("this `.arch pop' requires `.code%u%s' to be in effect"),
-                     bits[top->flag_code],
-                     top->stackop_size == LONG_MNEM_SUFFIX ? "gcc" : "");
+             extend_cpu_sub_arch_name (string + 1);
+             cpu_arch_flags = flags;
+             cpu_arch_isa_flags = flags;
            }
          else
-           {
-             arch_stack_top = top->prev;
-
-             cpu_arch_name = top->name;
-             free (cpu_sub_arch_name);
-             cpu_sub_arch_name = top->sub_name;
-             cpu_arch_flags = top->flags;
-             cpu_arch_isa = top->isa;
-             cpu_arch_isa_flags = top->isa_flags;
-             no_cond_jump_promotion = top->no_cond_jump_promotion;
-
-             XDELETE (top);
-           }
+           cpu_arch_isa_flags
+             = cpu_flags_or (cpu_arch_isa_flags, cpu_arch[j].enable);
 
          (void) restore_line_pointer (e);
          demand_empty_rest_of_line ();
          return;
        }
+    }
 
-      for (; j < ARRAY_SIZE (cpu_arch); j++)
-       {
-         if (strcmp (string + (*string == '.'), cpu_arch[j].name) == 0
-            && (*string == '.') == (cpu_arch[j].type == PROCESSOR_NONE))
-           {
-             if (*string != '.')
-               {
-                 check_cpu_arch_compatible (string, cpu_arch[j].enable);
-
-                 cpu_arch_name = cpu_arch[j].name;
-                 free (cpu_sub_arch_name);
-                 cpu_sub_arch_name = NULL;
-                 cpu_arch_flags = cpu_arch[j].enable;
-                 if (flag_code == CODE_64BIT)
-                   {
-                     cpu_arch_flags.bitfield.cpu64 = 1;
-                     cpu_arch_flags.bitfield.cpuno64 = 0;
-                   }
-                 else
-                   {
-                     cpu_arch_flags.bitfield.cpu64 = 0;
-                     cpu_arch_flags.bitfield.cpuno64 = 1;
-                   }
-                 cpu_arch_isa = cpu_arch[j].type;
-                 cpu_arch_isa_flags = cpu_arch[j].enable;
-                 if (!cpu_arch_tune_set)
-                   {
-                     cpu_arch_tune = cpu_arch_isa;
-                     cpu_arch_tune_flags = cpu_arch_isa_flags;
-                   }
-                 pre_386_16bit_warned = false;
-                 break;
-               }
-
-             if (cpu_flags_all_zero (&cpu_arch[j].enable))
-               continue;
-
-             flags = cpu_flags_or (cpu_arch_flags,
-                                   cpu_arch[j].enable);
-
-             if (!cpu_flags_equal (&flags, &cpu_arch_flags))
-               {
-                 extend_cpu_sub_arch_name (string + 1);
-                 cpu_arch_flags = flags;
-                 cpu_arch_isa_flags = flags;
-               }
-             else
-               cpu_arch_isa_flags
-                 = cpu_flags_or (cpu_arch_isa_flags,
-                                 cpu_arch[j].enable);
-             (void) restore_line_pointer (e);
-             demand_empty_rest_of_line ();
-             return;
-           }
-       }
-
-      if (startswith (string, ".no") && j >= ARRAY_SIZE (cpu_arch))
-       {
-         /* Disable an ISA extension.  */
-         for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
-           if (cpu_arch[j].type == PROCESSOR_NONE
-               && strcmp (string + 3, cpu_arch[j].name) == 0)
+  if (startswith (string, ".no") && j >= ARRAY_SIZE (cpu_arch))
+    {
+      /* Disable an ISA extension.  */
+      for (j = 0; j < ARRAY_SIZE (cpu_arch); j++)
+       if (cpu_arch[j].type == PROCESSOR_NONE
+           && strcmp (string + 3, cpu_arch[j].name) == 0)
+         {
+           flags = cpu_flags_and_not (cpu_arch_flags, cpu_arch[j].disable);
+           if (!cpu_flags_equal (&flags, &cpu_arch_flags))
              {
-               flags = cpu_flags_and_not (cpu_arch_flags,
-                                          cpu_arch[j].disable);
-               if (!cpu_flags_equal (&flags, &cpu_arch_flags))
-                 {
-                   extend_cpu_sub_arch_name (string + 1);
-                   cpu_arch_flags = flags;
-                   cpu_arch_isa_flags = flags;
-                 }
-               (void) restore_line_pointer (e);
-               demand_empty_rest_of_line ();
-               return;
+               extend_cpu_sub_arch_name (string + 1);
+               cpu_arch_flags = flags;
+               cpu_arch_isa_flags = flags;
              }
-       }
-
-      if (j == ARRAY_SIZE (cpu_arch))
-       as_bad (_("no such architecture: `%s'"), string);
 
-      *input_line_pointer = e;
+           (void) restore_line_pointer (e);
+           demand_empty_rest_of_line ();
+           return;
+         }
     }
-  else
-    as_bad (_("missing cpu architecture"));
+
+  if (j == ARRAY_SIZE (cpu_arch))
+    as_bad (_("no such architecture: `%s'"), string);
+
+  *input_line_pointer = e;
 
   no_cond_jump_promotion = 0;
   if (*input_line_pointer == ','
       && !is_end_of_line[(unsigned char) input_line_pointer[1]])
     {
-      char *string;
-      char e;
-
       ++input_line_pointer;
-      e = get_symbol_name (&string);
+      e = get_symbol_name (&s);
+      string = s;
 
       if (strcmp (string, "nojumps") == 0)
        no_cond_jump_promotion = 1;