The way the current code was written assumes all cores have an unique part num which is not true. What they have is an unique pair of implementer and part num. This changes the code to look up that pair after the parsing of the two is done.
Someone should test this on a big.little target too just to make sure the parsing is done correctly as I don't have access to one off hand. OK? Bootstrapped and tested on aarch64-linux-gnu with no regressions. Thanks, Andrew Pinski * 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. --- gcc/config/aarch64/driver-aarch64.c | 46 ++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/gcc/config/aarch64/driver-aarch64.c b/gcc/config/aarch64/driver-aarch64.c index 92388a9..ea1e856 100644 --- a/gcc/config/aarch64/driver-aarch64.c +++ b/gcc/config/aarch64/driver-aarch64.c @@ -158,7 +158,7 @@ host_detect_local_cpu (int argc, const char **argv) bool tune = false; bool cpu = false; unsigned int i = 0; - unsigned int core_idx = 0; + int core_idx = -1; unsigned char imp = INVALID_IMP; unsigned int cores[2] = { INVALID_CORE, INVALID_CORE }; unsigned int n_cores = 0; @@ -206,18 +206,13 @@ host_detect_local_cpu (int argc, const char **argv) if (strstr (buf, "part") != NULL) { unsigned ccore = parse_field (buf); - for (i = 0; cpu_data[i].name != NULL; i++) - if (ccore == 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 = 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) @@ -253,11 +248,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; cpu_data[i].name != NULL; i++) + if (cpu_data[i].implementer_id == imp + && contains_core_p (cores, cpu_data[i].part_no)) + { + arch_id = cpu_data[i].arch; + break; + } + if (!arch_id) + goto not_found; + const char* arch_name = get_arch_name_from_id (arch_id); /* We got some arch indentifier that's not in aarch64-arches.def? */ @@ -284,8 +287,15 @@ host_detect_local_cpu (int argc, const char **argv) /* The simple, non-big.LITTLE case. */ else { - if (cpu_data[core_idx].implementer_id != imp) - goto not_found; + for (i = 0; cpu_data[i].name != NULL; i++) + if (cores[0] == cpu_data[i].part_no + && cpu_data[i].implementer_id == imp) + { + core_idx = i; + break; + } + if (core_idx == -1) + goto not_found; res = concat ("-m", cpu ? "cpu" : "tune", "=", cpu_data[core_idx].name, NULL); -- 1.9.1