driver-aarch64.c (host_detect_local_cpu): Rewrite handling of part num to handle...
authorAndrew Pinski <apinski@cavium.com>
Mon, 31 Oct 2016 22:20:52 +0000 (22:20 +0000)
committerAndrew Pinski <pinskia@gcc.gnu.org>
Mon, 31 Oct 2016 22:20:52 +0000 (15:20 -0700)
2016-10-31  Andrew Pinski  <apinski@cavium.com>

        * config/aarch64/driver-aarch64.c (host_detect_local_cpu):
        Rewrite handling of part num to handle the case where
        multiple implementers share the same part num.

From-SVN: r241726

gcc/ChangeLog
gcc/config/aarch64/driver-aarch64.c

index b862943..d67a20f 100644 (file)
@@ -1,3 +1,9 @@
+2016-10-31  Andrew Pinski  <apinski@cavium.com>
+
+       * config/aarch64/driver-aarch64.c (host_detect_local_cpu):
+       Rewrite handling of part num to handle the case where
+       multiple implementers share the same part num.
+
 2016-10-31  Jan Kratochvil  <jan.kratochvil@redhat.com>
            Jakub Jelinek  <jakub@redhat.com>
 
index 658a4cd..c21942c 100644 (file)
@@ -169,7 +169,6 @@ host_detect_local_cpu (int argc, const char **argv)
   bool tune = false;
   bool cpu = false;
   unsigned int i = 0;
-  unsigned int core_idx = 0;
   unsigned char imp = INVALID_IMP;
   unsigned int cores[2] = { INVALID_CORE, INVALID_CORE };
   unsigned int n_cores = 0;
@@ -219,18 +218,13 @@ host_detect_local_cpu (int argc, const char **argv)
       if (strstr (buf, "part") != NULL)
        {
          unsigned ccore = parse_field (buf);
-         for (i = 0; aarch64_cpu_data[i].name != NULL; i++)
-           if (ccore == aarch64_cpu_data[i].part_no
-               && !contains_core_p (cores, ccore))
-             {
-               if (n_cores == 2)
-                 goto not_found;
-
-               cores[n_cores++] = ccore;
-               core_idx = i;
-               arch_id = aarch64_cpu_data[i].arch;
-               break;
-             }
+         if (!contains_core_p (cores, ccore))
+           {
+             if (n_cores == 2)
+               goto not_found;
+
+             cores[n_cores++] = ccore;
+           }
          continue;
        }
       if (!tune && !processed_exts && strstr (buf, "Features") != NULL)
@@ -276,11 +270,19 @@ host_detect_local_cpu (int argc, const char **argv)
   if (n_cores == 0 || n_cores > 2 || imp == INVALID_IMP)
     goto not_found;
 
-  if (arch && !arch_id)
-    goto not_found;
-
   if (arch)
     {
+      /* Search for one of the cores in the list. */
+      for (i = 0; aarch64_cpu_data[i].name != NULL; i++)
+       if (aarch64_cpu_data[i].implementer_id == imp
+           && contains_core_p (cores, aarch64_cpu_data[i].part_no))
+         {
+           arch_id = aarch64_cpu_data[i].arch;
+           break;
+         }
+      if (!arch_id)
+       goto not_found;
+
       struct aarch64_arch_driver_info* arch_info = get_arch_from_id (arch_id);
 
       /* We got some arch indentifier that's not in aarch64-arches.def?  */
@@ -312,7 +314,15 @@ host_detect_local_cpu (int argc, const char **argv)
   /* The simple, non-big.LITTLE case.  */
   else
     {
-      if (aarch64_cpu_data[core_idx].implementer_id != imp)
+      int core_idx = -1;
+      for (i = 0; aarch64_cpu_data[i].name != NULL; i++)
+       if (cores[0] == aarch64_cpu_data[i].part_no
+           && aarch64_cpu_data[i].implementer_id == imp)
+         {
+           core_idx = i;
+           break;
+         }
+      if (core_idx == -1)
        goto not_found;
 
       res = concat ("-m", cpu ? "cpu" : "tune", "=",