Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/external/gpl3/gcc/dist/gcc/config/aarch64 re-port host_detec...



details:   https://anonhg.NetBSD.org/src/rev/ae185393d73f
branches:  trunk
changeset: 448594:ae185393d73f
user:      mrg <mrg%NetBSD.org@localhost>
date:      Tue Feb 05 14:01:46 2019 +0000

description:
re-port host_detect_local_cpu() to netbsd.

diffstat:

 external/gpl3/gcc/dist/gcc/config/aarch64/driver-aarch64.c |  313 ++++--------
 1 files changed, 112 insertions(+), 201 deletions(-)

diffs (truncated from 350 to 300 lines):

diff -r c26a9a62e04a -r ae185393d73f external/gpl3/gcc/dist/gcc/config/aarch64/driver-aarch64.c
--- a/external/gpl3/gcc/dist/gcc/config/aarch64/driver-aarch64.c        Tue Feb 05 13:57:25 2019 +0000
+++ b/external/gpl3/gcc/dist/gcc/config/aarch64/driver-aarch64.c        Tue Feb 05 14:01:46 2019 +0000
@@ -166,222 +166,30 @@
 #include <sys/param.h>
 #include <sys/sysctl.h>
 #include <aarch64/armreg.h>
+#endif
 
 const char *
 host_detect_local_cpu (int argc, const char **argv)
 {
-  const char *arch_id = NULL;
   const char *res = NULL;
   static const int num_exts = ARRAY_SIZE (aarch64_extensions);
   char buf[128];
   bool arch = false;
   bool tune = false;
   bool cpu = false;
-  unsigned int i, curcpu;
-  unsigned int core_idx = 0;
-  const char* imps[2] = { NULL, NULL };
-  const char* cores[2] = { NULL, NULL };
+  unsigned int i = 0;
+  unsigned int cores[2] = { INVALID_CORE, INVALID_CORE };
   unsigned int n_cores = 0;
-  unsigned int n_imps = 0;
+  unsigned int variants[2] = { ALL_VARIANTS, ALL_VARIANTS };
+  unsigned int n_variants = 0;
+  unsigned char imp = INVALID_IMP;
   bool processed_exts = false;
   const char *ext_string = "";
   unsigned long extension_flags = 0;
   unsigned long default_flags = 0;
-  size_t len;
-  char impl_buf[8];
-  char part_buf[8];
-  int mib[2], ncpu;
-
-  gcc_assert (argc);
-
-  if (!argv[0])
-    goto not_found;
-
-  /* Are we processing -march, mtune or mcpu?  */
-  arch = strcmp (argv[0], "arch") == 0;
-  if (!arch)
-    tune = strcmp (argv[0], "tune") == 0;
-
-  if (!arch && !tune)
-    cpu = strcmp (argv[0], "cpu") == 0;
-
-  if (!arch && !tune && !cpu)
-    goto not_found;
-
-  mib[0] = CTL_HW;
-  mib[1] = HW_NCPU; 
-  len = sizeof(ncpu);
-  if (sysctl(mib, 2, &ncpu, &len, NULL, 0) == -1)
-    goto not_found;
-
-  for (curcpu = 0; curcpu < ncpu; curcpu++)
-    {
-      char path[128];
-      struct aarch64_sysctl_cpu_id id;
-
-      len = sizeof id;
-      snprintf(path, sizeof path, "machdep.cpu%d.cpu_id", curcpu);
-      if (sysctlbyname(path, &id, &len, NULL, 0) != 0)
-        goto not_found;
-
-      snprintf(impl_buf, sizeof impl_buf, "0x%02x",
-              (int)__SHIFTOUT(id.ac_midr, MIDR_EL1_IMPL));
-      snprintf(part_buf, sizeof part_buf, "0x%02x",
-              (int)__SHIFTOUT(id.ac_midr, MIDR_EL1_PARTNUM));
-
-      for (i = 0; aarch64_cpu_data[i].name != NULL; i++)
-        if (strstr (impl_buf, aarch64_cpu_data[i].implementer_id) != NULL
-            && !contains_string_p (imps, aarch64_cpu_data[i].implementer_id))
-          {
-            if (n_imps == 2)
-              goto not_found;
-
-            imps[n_imps++] = aarch64_cpu_data[i].implementer_id;
-
-            break;
-          }
-
-      for (i = 0; aarch64_cpu_data[i].name != NULL; i++)
-        if (strstr (part_buf, aarch64_cpu_data[i].part_no) != NULL
-            && !contains_string_p (cores, aarch64_cpu_data[i].part_no))
-          {
-            if (n_cores == 2)
-              goto not_found;
-
-            cores[n_cores++] = aarch64_cpu_data[i].part_no;
-            core_idx = i;
-            arch_id = aarch64_cpu_data[i].arch;
-            break;
-          }
-
-      if (!tune && !processed_exts)
-        {
-          for (i = 0; i < num_exts; i++)
-            {
-              bool enabled;
-
-              if (strcmp(aarch64_extensions[i].ext, "fp") == 0)
-                enabled = (__SHIFTOUT(id.ac_aa64pfr0, ID_AA64PFR0_EL1_FP)
-                          == ID_AA64PFR0_EL1_FP_IMPL);
-              else if (strcmp(aarch64_extensions[i].ext, "simd") == 0)
-                enabled = (__SHIFTOUT(id.ac_aa64pfr0, ID_AA64PFR0_EL1_ADVSIMD)
-                          == ID_AA64PFR0_EL1_ADV_SIMD_IMPL);
-              else if (strcmp(aarch64_extensions[i].ext, "crypto") == 0)
-                enabled = (__SHIFTOUT(id.ac_aa64isar0, ID_AA64ISAR0_EL1_AES)
-                          & ID_AA64ISAR0_EL1_AES_AES) != 0;
-              else if (strcmp(aarch64_extensions[i].ext, "crc") == 0)
-                enabled = (__SHIFTOUT(id.ac_aa64isar0, ID_AA64ISAR0_EL1_CRC32)
-                          == ID_AA64ISAR0_EL1_CRC32_CRC32X);
-              else if (strcmp(aarch64_extensions[i].ext, "lse") == 0)
-                enabled = false;
-              else
-               {
-                  warning(0, "Unknown extension '%s'", aarch64_extensions[i].ext);
-                 goto not_found;
-               }
+  FILE *f = NULL;
 
-              if (enabled)
-                extension_flags |= aarch64_extensions[i].flag;
-              else
-                extension_flags &= ~(aarch64_extensions[i].flag);
-            }
-
-          processed_exts = true;
-       }
-    }
-
-  /* Weird cpuinfo format that we don't know how to handle.  */
-  if (n_cores == 0 || n_cores > 2 || n_imps != 1)
-    goto not_found;
-
-  if (arch && !arch_id)
-    goto not_found;
-
-  if (arch)
-    {
-      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?  */
-      if (!arch_info)
-       goto not_found;
-
-      res = concat ("-march=", arch_info->name, NULL);
-      default_flags = arch_info->flags;
-    }
-  /* We have big.LITTLE.  */
-  else if (n_cores == 2)
-    {
-      for (i = 0; aarch64_cpu_data[i].name != NULL; i++)
-       {
-         if (strchr (aarch64_cpu_data[i].part_no, '.') != NULL
-             && strncmp (aarch64_cpu_data[i].implementer_id,
-                         imps[0],
-                         strlen (imps[0]) - 1) == 0
-             && valid_bL_string_p (cores, aarch64_cpu_data[i].part_no))
-           {
-             res = concat ("-m",
-                           cpu ? "cpu" : "tune", "=",
-                           aarch64_cpu_data[i].name,
-                           NULL);
-             default_flags = aarch64_cpu_data[i].flags;
-             break;
-           }
-       }
-      if (!res)
-       goto not_found;
-    }
-  /* The simple, non-big.LITTLE case.  */
-  else
-    {
-      if (strncmp (aarch64_cpu_data[core_idx].implementer_id, imps[0],
-                  strlen (imps[0]) - 1) != 0)
-       goto not_found;
-
-      res = concat ("-m", cpu ? "cpu" : "tune", "=",
-                   aarch64_cpu_data[core_idx].name, NULL);
-      default_flags = aarch64_cpu_data[core_idx].flags;
-    }
-
-  if (tune)
-    return res;
-
-  ext_string
-    = aarch64_get_extension_string_for_isa_flags (extension_flags,
-                                                 default_flags).c_str ();
-
-  res = concat (res, ext_string, NULL);
-
-  return res;
-
-not_found:
-  {
-   /* If detection fails we ignore the option.
-      Clean up and return empty string.  */
-
-    return "";
-  }
-}
-#else
-const char *
-host_detect_local_cpu (int argc, const char **argv)
-{
-  const char *res = NULL;
-  static const int num_exts = ARRAY_SIZE (aarch64_extensions);
-  char buf[128];
-  FILE *f = NULL;
-  bool arch = false;
-  bool tune = false;
-  bool cpu = false;
-  unsigned int i = 0;
-  unsigned char imp = INVALID_IMP;
-  unsigned int cores[2] = { INVALID_CORE, INVALID_CORE };
-  unsigned int n_cores = 0;
-  unsigned int variants[2] = { ALL_VARIANTS, ALL_VARIANTS };
-  unsigned int n_variants = 0;
-  bool processed_exts = false;
-  const char *ext_string = "";
-  unsigned long extension_flags = 0;
-  unsigned long default_flags = 0;
+#ifndef __NetBSD__
 
   gcc_assert (argc);
 
@@ -484,6 +292,109 @@
 
   fclose (f);
   f = NULL;
+#else
+  unsigned int curcpu;
+  size_t len;
+  char impl_buf[8];
+  int mib[2], ncpu;
+
+  gcc_assert (argc);
+
+  if (!argv[0])
+    goto not_found;
+
+  /* Are we processing -march, mtune or mcpu?  */
+  arch = strcmp (argv[0], "arch") == 0;
+  if (!arch)
+    tune = strcmp (argv[0], "tune") == 0;
+
+  if (!arch && !tune)
+    cpu = strcmp (argv[0], "cpu") == 0;
+
+  if (!arch && !tune && !cpu)
+    goto not_found;
+
+  mib[0] = CTL_HW;
+  mib[1] = HW_NCPU; 
+  len = sizeof(ncpu);
+  if (sysctl(mib, 2, &ncpu, &len, NULL, 0) == -1)
+    goto not_found;
+
+  for (curcpu = 0; curcpu < ncpu; curcpu++)
+    {
+      char path[128];
+      struct aarch64_sysctl_cpu_id id;
+
+      len = sizeof id;
+      snprintf(path, sizeof path, "machdep.cpu%d.cpu_id", curcpu);
+      if (sysctlbyname(path, &id, &len, NULL, 0) != 0)
+        goto not_found;
+
+      unsigned cimp = __SHIFTOUT(id.ac_midr, MIDR_EL1_IMPL);
+      if (cimp == INVALID_IMP)
+        goto not_found;
+
+      if (imp == INVALID_IMP)
+        imp = cimp;
+       /* FIXME: BIG.little implementers are always equal. */
+      else if (imp != cimp)
+        goto not_found;
+  
+      unsigned cvariant = __SHIFTOUT(id.ac_midr, MIDR_EL1_VARIANT);
+      if (!contains_core_p (variants, cvariant))
+        {
+          if (n_variants == 2)
+            goto not_found;
+  
+          variants[n_variants++] = cvariant;
+       }
+
+      unsigned ccore = __SHIFTOUT(id.ac_midr, MIDR_EL1_PARTNUM);
+      if (!contains_core_p (cores, ccore))
+       {
+         if (n_cores == 2)
+           goto not_found;



Home | Main Index | Thread Index | Old Index