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