Module Name:    src
Committed By:   mrg
Date:           Tue Feb  5 14:01:46 UTC 2019

Modified Files:
        src/external/gpl3/gcc/dist/gcc/config/aarch64: driver-aarch64.c

Log Message:
re-port host_detect_local_cpu() to netbsd.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 \
    src/external/gpl3/gcc/dist/gcc/config/aarch64/driver-aarch64.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/gpl3/gcc/dist/gcc/config/aarch64/driver-aarch64.c
diff -u src/external/gpl3/gcc/dist/gcc/config/aarch64/driver-aarch64.c:1.3 src/external/gpl3/gcc/dist/gcc/config/aarch64/driver-aarch64.c:1.4
--- src/external/gpl3/gcc/dist/gcc/config/aarch64/driver-aarch64.c:1.3	Sat Jan 19 12:10:05 2019
+++ src/external/gpl3/gcc/dist/gcc/config/aarch64/driver-aarch64.c	Tue Feb  5 14:01:46 2019
@@ -166,222 +166,30 @@ contains_core_p (unsigned *arr, unsigned
 #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 n_cores = 0;
-  unsigned int n_imps = 0;
-  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;
-		}
-
-              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;
+  unsigned char imp = INVALID_IMP;
   bool processed_exts = false;
   const char *ext_string = "";
   unsigned long extension_flags = 0;
   unsigned long default_flags = 0;
+  FILE *f = NULL;
+
+#ifndef __NetBSD__
 
   gcc_assert (argc);
 
@@ -484,6 +292,109 @@ host_detect_local_cpu (int argc, const c
 
   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;
+  
+  	  cores[n_cores++] = ccore;
+  	}
+
+      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;
+		}
+
+              if (enabled)
+                extension_flags |= aarch64_extensions[i].flag;
+              else
+                extension_flags &= ~(aarch64_extensions[i].flag);
+            }
+
+          processed_exts = true;
+	}
+    }
+  /* End of NetBSD specific section.  */
+#endif
 
   /* Weird cpuinfo format that we don't know how to handle.  */
   if (n_cores == 0
@@ -568,4 +479,4 @@ not_found:
     return "";
   }
 }
-#endif
+

Reply via email to