On May 15, 2014, at 11:52 PM, Richard Biener <[email protected]> wrote:
> On May 16, 2014 4:47:11 AM CEST, Mike Stump <[email protected]> wrote:
>> This reorders the avx checks and gates on a target triplet check before
>> compiling any code.
>
> Can you explain why?
Sure, because check_avx_hw_available runs [istarget x86_64-*-*] || [istarget
i?86-*-*] before doing anything, like compiling:
typedef double __m512d __attribute__ ((__vector_size__ (64)));
__m512d _mm512_add (__m512d a)
{
return __builtin_ia32_addpd512_mask (a, a, a, 1, 4);
}
with -mavx512f, which my target doesn’t have, but even running a compilation of
that seems wrong. The other possibility would be to add in a:
# If this is not the right target then we can skip the test.
if { !([istarget x86_64-*-*] || [istarget i?86-*-*]) } {
expr 0
} else {
into the test for check_effective_target_avx512f.
proc check_effective_target_avx512f { } {
return [check_no_compiler_messages avx512f object {
typedef double __m512d __attribute__ ((__vector_size__ (64)));
__m512d _mm512_add (__m512d a)
{
return __builtin_ia32_addpd512_mask (a, a, a, 1, 4);
}
} "-O2 -mavx512f" ]
}
proc check_avx_hw_available { } {
return [check_cached_effective_target avx_hw_available {
# If this is not the right target then we can skip the test.
if { !([istarget x86_64-*-*] || [istarget i?86-*-*]) } {
expr 0
} else {
check_runtime_nocache avx_hw_available {
#include "cpuid.h"
int main ()
{
unsigned int eax, ebx, ecx, edx;
if (__get_cpuid (1, &eax, &ebx, &ecx, &edx))
return ((ecx & (bit_AVX | bit_OSXSAVE))
!= (bit_AVX | bit_OSXSAVE));
return 1;
}
} ""
}
}]
}
>> diff --git a/gcc/testsuite/lib/target-supports.exp
>> b/gcc/testsuite/lib/target-supports.exp
>> index 40b5414..103a28a 100644
>> --- a/gcc/testsuite/lib/target-supports.exp
>> +++ b/gcc/testsuite/lib/target-supports.exp
>> @@ -1353,8 +1353,8 @@ proc check_effective_target_sse2_runtime { } {
>> # Return 1 if the target supports running AVX executables, 0 otherwise.
>>
>> proc check_effective_target_avx_runtime { } {
>> - if { [check_effective_target_avx]
>> - && [check_avx_hw_available]
>> + if { [check_avx_hw_available]
>> + && [check_effective_target_avx]
>> && [check_avx_os_support_available] } {
>> return 1
>> }