This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
On Tue, Nov 17, 2015 at 2:10 PM, Andrew Pinski <apinski@cavium.com> wrote: > > 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. Here is an updated version of this patch after the other patches have now gone in. OK? Bootstrapped and tested on aarch64-linux-gnu with no regressions and -mcpu=native still works. Thanks, Andrew Pinski > > 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 >
Attachment:
Fiximp_partno_depedency.diff.txt
Description: Text document
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |