On Wed, Dec 25, 2013 at 10:02 PM, H.J. Lu <hjl.to...@gmail.com> wrote:
> On Wed, Dec 25, 2013 at 12:49 PM, Uros Bizjak <ubiz...@gmail.com> wrote:
>> On Tue, Dec 24, 2013 at 7:03 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:
>>
>> -#define SUBTARGET32_DEFAULT_CPU "i386"
>> +# ifdef TARGET_CPU_DEFAULT
>> +#  define SUBTARGET32_DEFAULT_CPU
>> processor_target_table[TARGET_CPU_DEFAULT].name
>> +# else
>> +#  define SUBTARGET32_DEFAULT_CPU "i386"
>> +# endif
>>
>> Not in this patch ...
>>
>> -      opts->x_ix86_tune_string = cpu_names[TARGET_CPU_DEFAULT];
>> +      opts->x_ix86_tune_string
>> +#ifdef TARGET_CPU_DEFAULT
>> +        = TARGET_64BIT_P (opts->x_ix86_isa_flags)
>> +          ? "generic" : processor_target_table[TARGET_CPU_DEFAULT].name;
>> +#else
>> +        = "generic";
>> +#endif
>>
>> Please split these to another patch.
>>
>> +  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);
>>
>> I think we should leave the original, with <unknown>, comparing with
>> PROCESSOR_max and looking into processor_target_table for the name. We
>> can remove the assert.
>>
>> +  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);
>
> ptr->tune and ptr->arch are set by
>
>   ptr->arch = ix86_arch;
>   ptr->tune = ix86_tune;
>
> Both ix86_arch and  ix86_tune are enum processor_type.  If  ix86_arch
> or  ix86_tune >= PROCESSOR_max, x86 backend won't work at all.

OK, let's leave assert then.

Uros.

Reply via email to