On Wed, Dec 25, 2013 at 2:32 PM, Uros Bizjak <ubiz...@gmail.com> wrote: > On Wed, Dec 25, 2013 at 10:31 PM, H.J. Lu <hjl.to...@gmail.com> wrote: > >>> >>>>>>>> cpu_names in i386.c is only used by ix86_function_specific_print >>> >>>>>>>> which >>> >>>>>>>> accesses it with enum processor_type index. But cpu_names is >>> >>>>>>>> defined as >>> >>>>>>>> array with enum target_cpu_default index. This patch adds >>> >>>>>>>> processor >>> >>>>>>>> names to processor_target_table and uses processor_target_table >>> >>>>>>>> instead >>> >>>>>>>> of cpu_names. It removes cpu_names and target_cpu_default. >>> >>>>>>>> Tested on >>> >>>>>>>> Linux/x86-64. OK to install? >>> >>>>>>> >>> >>>>>>> Wait a moment, >>> >>>>>>> >>> >>>>>>> it looks to me that TARGET_CPU_DEFAULT has to be synchronized with >>> >>>>>>> const processor_alias_table, so we are able to define various ISA >>> >>>>>>> extensions by selecting TARGET_CPU_*. The TARGET_CPU_DEFAULT can >>> >>>>>>> then >>> >>>>>> >>> >>>>>> TARGET_CPU_DEFAULT sets the default -mtune=, not -march=. >>> >>>>>> >>> >>>>>>> be used to select extensions in the same way as PROCESSOR_* selects >>> >>>>>>> tuning for certain processor. >>> >>>>>> >>> >>>>>> It has been like this for a long time. For x86, TARGET_CPU_DEFAULT >>> >>>>>> isn't defined no matter which configure options are used. We can >>> >>>>>> change config.gcc to set TARGET_CPU_DEFAULT to proper PROCESSOR_XXX >>> >>>>>> or >>> >>>>>> set it to a string "xxx" for processor "xxx". >>> >>>>>> But GCC driver always passes -march=/-mtune= to toplev.c so that >>> >>>>>> TARGET_CPU_DEFAULT is normally used. >>> >>>> >>> >>>> I meant to say "TARGET_CPU_DEFAULT isn't normally used." >>> >>>> >>> >>>>> >>> >>>>> Let me rethink this a bit, please do not commit the patch. >>> >>>>> >>> >>> >>> >>> TARGET_CPU_DEFAULT is left over for 32-bit target before --with-arch= >>> >>> and --with-cpu= were added. Today, -mtune=xxx -march=xxx are >>> >>> always passed to cc1 by GCC driver. If cc1 is run by hand and >>> >>> -mtune=xxx -march=xxx aren't passed to cc1, we should do >>> >>> >>> >>> 1. For 64-bit, it should be the same as -mtune=generic -march=x86_64 >>> >>> are passed. >>> >>> 2. For 32-bit, it should be the same as -mtune=cpu -march=cpu are >>> >>> passed, where "cpu" is the target cpu used to configure GCC, >>> >>> like i386 in i386-linux, i486 in i486-linux, .... But there is no i786 >>> >>> cpu. i786 is treated as i686. If SUBTARGET32_DEFAULT_CPU >>> >>> is defined, it should be the same -mtune=SUBTARGET32_DEFAULT_CPU >>> >>> -march=SUBTARGET32_DEFAULT_CPU. >>> >>> >>> >>> Here is the patch to implement this. >>> >> >>> >> Let's do one step at a time. So, let's split the patch back to >>> >> target/59587 fix: > >> 2013-12-25 H.J. Lu <hongjiu...@intel.com> >> >> PR target/59587 >> * config/i386/i386.c (struct ptt): Add a field for processor >> name. >> (processor_target_table): Sync with processor_type. Add >> processor names. >> (cpu_names): Removed. >> (ix86_option_override_internal): Default x_ix86_tune_string >> to processor_target_table[TARGET_CPU_DEFAULT].name. >> (ix86_function_specific_print): Assert arch and tune < >> PROCESSOR_max. Use processor_target_table to print arch and >> tune names. >> * config/i386/i386.h (TARGET_CPU_DEFAULT): Default to >> PROCESSOR_GENERIC. >> (target_cpu_default): Removed. >> (processor_type): Reordered. > > OK for mainline and for 4.8 after a few days in mainline. > > Thanks, > Uros.
I am testing this patch. I will check it into 4.8 branch after finishing regression test. Thanks. -- H.J. --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6493bb2..f17bf56 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,24 @@ +2014-01-08 H.J. Lu <hongjiu...@intel.com> + + Backport from mainline + 2013-12-25 H.J. Lu <hongjiu...@intel.com> + + PR target/59587 + * config/i386/i386.c (struct ptt): Add a field for processor + name. + (processor_target_table): Sync with processor_type. Add + processor names. + (cpu_names): Removed. + (ix86_option_override_internal): Default x_ix86_tune_string + to processor_target_table[TARGET_CPU_DEFAULT].name. + (ix86_function_specific_print): Assert arch and tune < + PROCESSOR_max. Use processor_target_table to print arch and + tune names. + * config/i386/i386.h (TARGET_CPU_DEFAULT): Default to + PROCESSOR_GENERIC32. + (target_cpu_default): Removed. + (processor_type): Reordered. + 2014-01-08 Uros Bizjak <ubiz...@gmail.com> Backport from mainline diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index e03aa72..c06c220 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -2409,6 +2409,7 @@ static tree ix86_veclibabi_acml (enum built_in_function, tree, tree); /* Processor target table, indexed by processor number */ struct ptt { + const char *const name; /* processor name */ const struct processor_costs *cost; /* Processor costs */ const int align_loop; /* Default alignments. */ const int align_loop_max_skip; @@ -2417,66 +2418,31 @@ struct ptt const int align_func; }; +/* This table must be in sync with enum processor_type in i386.h. */ static const struct ptt processor_target_table[PROCESSOR_max] = { - {&i386_cost, 4, 3, 4, 3, 4}, - {&i486_cost, 16, 15, 16, 15, 16}, - {&pentium_cost, 16, 7, 16, 7, 16}, - {&pentiumpro_cost, 16, 15, 16, 10, 16}, - {&geode_cost, 0, 0, 0, 0, 0}, - {&k6_cost, 32, 7, 32, 7, 32}, - {&athlon_cost, 16, 7, 16, 7, 16}, - {&pentium4_cost, 0, 0, 0, 0, 0}, - {&k8_cost, 16, 7, 16, 7, 16}, - {&nocona_cost, 0, 0, 0, 0, 0}, - /* Core 2 */ - {&core_cost, 16, 10, 16, 10, 16}, - /* Core i7 */ - {&core_cost, 16, 10, 16, 10, 16}, - /* Core avx2 */ - {&core_cost, 16, 10, 16, 10, 16}, - {&generic32_cost, 16, 7, 16, 7, 16}, - {&generic64_cost, 16, 10, 16, 10, 16}, - {&amdfam10_cost, 32, 24, 32, 7, 32}, - {&bdver1_cost, 16, 10, 16, 7, 11}, - {&bdver2_cost, 16, 10, 16, 7, 11}, - {&bdver3_cost, 16, 10, 16, 7, 11}, - {&btver1_cost, 16, 10, 16, 7, 11}, - {&btver2_cost, 16, 10, 16, 7, 11}, - {&atom_cost, 16, 15, 16, 7, 16} -}; - -static const char *const cpu_names[TARGET_CPU_DEFAULT_max] = -{ - "generic", - "i386", - "i486", - "pentium", - "pentium-mmx", - "pentiumpro", - "pentium2", - "pentium3", - "pentium4", - "pentium-m", - "prescott", - "nocona", - "core2", - "corei7", - "core-avx2", - "atom", - "geode", - "k6", - "k6-2", - "k6-3", - "athlon", - "athlon-4", - "k8", - "amdfam10", - "bdver1", - "bdver2", - "bdver3", - "btver1", - "btver2" + {"generic", &generic32_cost, 16, 7, 16, 7, 16}, + {"generic", &generic64_cost, 16, 10, 16, 10, 16}, + {"i386", &i386_cost, 4, 3, 4, 3, 4}, + {"i486", &i486_cost, 16, 15, 16, 15, 16}, + {"pentium", &pentium_cost, 16, 7, 16, 7, 16}, + {"pentiumpro", &pentiumpro_cost, 16, 15, 16, 10, 16}, + {"pentium4", &pentium4_cost, 0, 0, 0, 0, 0}, + {"nocona", &nocona_cost, 0, 0, 0, 0, 0}, + {"core2", &core_cost, 16, 10, 16, 10, 16}, + {"corei7", &core_cost, 16, 10, 16, 10, 16}, + {"core-avx2", &core_cost, 16, 10, 16, 10, 16}, + {"atom", &atom_cost, 16, 15, 16, 7, 16}, + {"geode", &geode_cost, 0, 0, 0, 0, 0}, + {"k6", &k6_cost, 32, 7, 32, 7, 32}, + {"athlon", &athlon_cost, 16, 7, 16, 7, 16}, + {"k8", &k8_cost, 16, 7, 16, 7, 16}, + {"amdfam10", &amdfam10_cost, 32, 24, 32, 7, 32}, + {"bdver1", &bdver1_cost, 16, 10, 16, 7, 11}, + {"bdver2", &bdver2_cost, 16, 10, 16, 7, 11}, + {"bdver3", &bdver3_cost, 16, 10, 16, 7, 11}, + {"btver1", &btver1_cost, 16, 10, 16, 7, 11}, + {"btver2", &btver2_cost, 16, 10, 16, 7, 11} }; static bool @@ -3125,7 +3091,8 @@ ix86_option_override_internal (bool main_args_p) ix86_tune_string = ix86_arch_string; if (!ix86_tune_string) { - ix86_tune_string = cpu_names[TARGET_CPU_DEFAULT]; + ix86_tune_string + = processor_target_table[TARGET_CPU_DEFAULT].name; ix86_tune_defaulted = 1; } @@ -4078,19 +4045,15 @@ ix86_function_specific_print (FILE *file, int indent, = ix86_target_string (ptr->x_ix86_isa_flags, ptr->x_target_flags, NULL, NULL, ptr->x_ix86_fpmath, false); + gcc_assert (ptr->arch < PROCESSOR_max); fprintf (file, "%*sarch = %d (%s)\n", indent, "", - ptr->arch, - ((ptr->arch < TARGET_CPU_DEFAULT_max) - ? cpu_names[ptr->arch] - : "<unknown>")); + ptr->arch, processor_target_table[ptr->arch].name); + gcc_assert (ptr->tune < PROCESSOR_max); fprintf (file, "%*stune = %d (%s)\n", indent, "", - ptr->tune, - ((ptr->tune < TARGET_CPU_DEFAULT_max) - ? cpu_names[ptr->tune] - : "<unknown>")); + ptr->tune, processor_target_table[ptr->tune].name); fprintf (file, "%*sbranch_cost = %d\n", indent, "", ptr->branch_cost); diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index a69862c..335cf61 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -197,10 +197,10 @@ extern const struct processor_costs ix86_size_cost; /* Macros used in the machine description to test the flags. */ -/* configure can arrange to make this 2, to force a 486. */ +/* configure can arrange to change it. */ #ifndef TARGET_CPU_DEFAULT -#define TARGET_CPU_DEFAULT TARGET_CPU_DEFAULT_generic +#define TARGET_CPU_DEFAULT PROCESSOR_GENERIC32 #endif #ifndef TARGET_FPMATH_DEFAULT @@ -591,43 +591,6 @@ extern const char *host_detect_local_cpu (int argc, const char **argv); /* Target Pragmas. */ #define REGISTER_TARGET_PRAGMAS() ix86_register_pragmas () -enum target_cpu_default -{ - TARGET_CPU_DEFAULT_generic = 0, - - TARGET_CPU_DEFAULT_i386, - TARGET_CPU_DEFAULT_i486, - TARGET_CPU_DEFAULT_pentium, - TARGET_CPU_DEFAULT_pentium_mmx, - TARGET_CPU_DEFAULT_pentiumpro, - TARGET_CPU_DEFAULT_pentium2, - TARGET_CPU_DEFAULT_pentium3, - TARGET_CPU_DEFAULT_pentium4, - TARGET_CPU_DEFAULT_pentium_m, - TARGET_CPU_DEFAULT_prescott, - TARGET_CPU_DEFAULT_nocona, - TARGET_CPU_DEFAULT_core2, - TARGET_CPU_DEFAULT_corei7, - TARGET_CPU_DEFAULT_haswell, - TARGET_CPU_DEFAULT_atom, - - TARGET_CPU_DEFAULT_geode, - TARGET_CPU_DEFAULT_k6, - TARGET_CPU_DEFAULT_k6_2, - TARGET_CPU_DEFAULT_k6_3, - TARGET_CPU_DEFAULT_athlon, - TARGET_CPU_DEFAULT_athlon_sse, - TARGET_CPU_DEFAULT_k8, - TARGET_CPU_DEFAULT_amdfam10, - TARGET_CPU_DEFAULT_bdver1, - TARGET_CPU_DEFAULT_bdver2, - TARGET_CPU_DEFAULT_bdver3, - TARGET_CPU_DEFAULT_btver1, - TARGET_CPU_DEFAULT_btver2, - - TARGET_CPU_DEFAULT_max -}; - #ifndef CC1_SPEC #define CC1_SPEC "%(cc1_cpu) " #endif @@ -2089,32 +2052,33 @@ do { \ with x86-64 medium memory model */ #define DEFAULT_LARGE_SECTION_THRESHOLD 65536 -/* Which processor to tune code generation for. */ +/* Which processor to tune code generation for. These must be in sync + with processor_target_table in i386.c. */ enum processor_type { - PROCESSOR_I386 = 0, /* 80386 */ + PROCESSOR_GENERIC32 = 0, + PROCESSOR_GENERIC64, + PROCESSOR_I386, /* 80386 */ PROCESSOR_I486, /* 80486DX, 80486SX, 80486DX[24] */ PROCESSOR_PENTIUM, PROCESSOR_PENTIUMPRO, - PROCESSOR_GEODE, - PROCESSOR_K6, - PROCESSOR_ATHLON, PROCESSOR_PENTIUM4, - PROCESSOR_K8, PROCESSOR_NOCONA, PROCESSOR_CORE2, PROCESSOR_COREI7, PROCESSOR_HASWELL, - PROCESSOR_GENERIC32, - PROCESSOR_GENERIC64, + PROCESSOR_ATOM, + PROCESSOR_GEODE, + PROCESSOR_K6, + PROCESSOR_ATHLON, + PROCESSOR_K8, PROCESSOR_AMDFAM10, PROCESSOR_BDVER1, PROCESSOR_BDVER2, PROCESSOR_BDVER3, PROCESSOR_BTVER1, PROCESSOR_BTVER2, - PROCESSOR_ATOM, PROCESSOR_max };