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 +