+2016-10-31 Andrew Pinski <apinski@cavium.com>
+
+ * 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.
+
2016-10-31 Jan Kratochvil <jan.kratochvil@redhat.com>
Jakub Jelinek <jakub@redhat.com>
bool tune = false;
bool cpu = false;
unsigned int i = 0;
- unsigned int core_idx = 0;
unsigned char imp = INVALID_IMP;
unsigned int cores[2] = { INVALID_CORE, INVALID_CORE };
unsigned int n_cores = 0;
if (strstr (buf, "part") != NULL)
{
unsigned ccore = parse_field (buf);
- for (i = 0; aarch64_cpu_data[i].name != NULL; i++)
- if (ccore == aarch64_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 = aarch64_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)
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; aarch64_cpu_data[i].name != NULL; i++)
+ if (aarch64_cpu_data[i].implementer_id == imp
+ && contains_core_p (cores, aarch64_cpu_data[i].part_no))
+ {
+ arch_id = aarch64_cpu_data[i].arch;
+ break;
+ }
+ if (!arch_id)
+ goto not_found;
+
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? */
/* The simple, non-big.LITTLE case. */
else
{
- if (aarch64_cpu_data[core_idx].implementer_id != imp)
+ int core_idx = -1;
+ for (i = 0; aarch64_cpu_data[i].name != NULL; i++)
+ if (cores[0] == aarch64_cpu_data[i].part_no
+ && aarch64_cpu_data[i].implementer_id == imp)
+ {
+ core_idx = i;
+ break;
+ }
+ if (core_idx == -1)
goto not_found;
res = concat ("-m", cpu ? "cpu" : "tune", "=",