[PATCH] BZ #14059 - HAS_FMA4 check needs to also check for AVX

Andreas Jaeger aj@suse.com
Fri May 11 08:22:00 GMT 2012


On 05/11/2012 09:10 AM, Allan McRae wrote:
> On 11/05/12 16:48, Andreas Jaeger wrote:
>> On 05/11/2012 08:34 AM, Andreas Jaeger wrote:
>>> On 05/11/2012 12:18 AM, Carlos O'Donell wrote:
>>>> On Thu, May 10, 2012 at 6:08 PM, Carlos O'Donell
>>>> <carlos@systemhalted.org>    wrote:
>>>>> On Tue, May 8, 2012 at 4:23 AM, Andreas Jaeger<aj@suse.de>    wrote:
>>>>>>
>>>>>> There are two things broken in checking for HAS_FMA4/AVX on x86-64 in
>>>>>> the multiarch code:
>>>>>>
>>>>>> 1. We should disable FAM4 if AVX is not available (due to disabled
>>>>>>      OSXSAVE)
>>>>>>
>>>>>> 2. commit 56f6f6a2403cfa7267cad722597113be35ecf70d reverted some changes
>>>>>>      from commit 08cf777f9e7f6d826658a99c7d77a359f73a45bf but forgot to
>>>>>>      revert the change for AVX. We really have to disable AVX if it's
>>>>>>
>>>>>> The issue is easy reproduceable under Xen for the reporter.
>>>>>>
>>>>>> Also, the two commits introduced YMM_Usable and removed its usage but
>>>>>> did not remove the code from the headers, I'm cleaning this up as well.
>>>>>>
>>>>>> I'm appending a patch that I tested on Linux/x86-64 (without Xen).
>>>>>>
>>>>>> Ok to commit?
>>>>>
>>>>> No.
>>>>>
>>>>> I actually think the code Ulrich wrote originally was almost correct,
>>>>> but missing this:
>>>>
>>>> If I had to fix it it would look like this:
>>>
>>> Thanks, this looks great - but misses the check for FMA4.
>>>
>>> Here's a combined patch that compiled fine for me on
>>> Linux/x86-64. Jeff, could you test it under Xen, please?
>>>
>>> Andreas
>>>
>>> 2012-05-11  Andreas Jaeger<aj@suse.de>
>>> 	Carlos O'Donell<carlos_odonell@mentor.com>
>>>
>>> 	[BZ #14059]
>>> 	* sysdeps/x86_64/multiarch/init-arch.c (__init_cpu_features):
>>> 	Fix check for AVX, enable FMA4 only if it exists and if AVX is
>>> 	usable.
>>>
>>> 	* sysdeps/x86_64/multiarch/init-arch.h (bit_AVX_Usable): Renamed
>>> 	from bit_YMM_usable.
>>> 	(bit_FMA4_Usable): New macro.
>>> 	(bit_XMM_state): New macro.
>>> 	(bit_YMM_state): New macro.
>>> 	(index_AVX_Usable): Renamed from index_YMM_Usable.
>>> 	(index_FMA4_Usable): New macro.
>>> 	(HAS_YMM_USABLE): Delete.
>>> 	(HAS_AVX): Use HAS_ARCH_FEATURE.
>>> 	(HAS_FMA4): Likewise.
>>
>> That version above contained a typo. Here's an update
>>
>> Allan, does this work now?
>>
>
> No. I still get an illegal instruction in __strcasecmp_l_avx with this
> version.

Allan, thanks for testing!

Indeed, it fails:

The code tests the bits in cpuid and does not use the HAS_AVX flag:
#  ifdef HAVE_AVX_SUPPORT
         leaq    __strcasecmp_avx(%rip), %rax
         testl   $bit_AVX, __cpu_features+CPUID_OFFSET+index_AVX(%rip)
         jnz     2f
#  endif

Please test the following.

I'm now offline until Monday, so won't be able to continue this, if
anybody likes to finish and commit the patch, I would appreciate it,

Andreas

2012-05-11  Andreas Jaeger  <aj@suse.de>

	* sysdeps/x86_64/multiarch/strcmp.S: Use bit_AVX_Usable.


diff --git a/sysdeps/x86_64/multiarch/strcmp.S 
b/sysdeps/x86_64/multiarch/strcmp.S
index 2b9870b..eaf852b 100644
--- a/sysdeps/x86_64/multiarch/strcmp.S
+++ b/sysdeps/x86_64/multiarch/strcmp.S
@@ -1,5 +1,5 @@
  /* strcmp with SSE4.2
-   Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
     Contributed by Intel Corporation.
     This file is part of the GNU C Library.

@@ -106,7 +106,7 @@ ENTRY(__strcasecmp)
  1:
  #  ifdef HAVE_AVX_SUPPORT
  	leaq	__strcasecmp_avx(%rip), %rax
-	testl	$bit_AVX, __cpu_features+CPUID_OFFSET+index_AVX(%rip)
+	testl	$bit_AVX_Usable, 
__cpu_features+FEATURE_OFFSET+index_AVX_Usable(%rip)
  	jnz	2f
  #  endif
  	leaq	__strcasecmp_sse42(%rip), %rax
@@ -129,7 +129,7 @@ ENTRY(__strncasecmp)
  1:
  #  ifdef HAVE_AVX_SUPPORT
  	leaq	__strncasecmp_avx(%rip), %rax
-	testl	$bit_AVX, __cpu_features+CPUID_OFFSET+index_AVX(%rip)
+	testl	$bit_AVX_Usable, 
__cpu_features+FEATURE_OFFSET+index_AVX_Usable(%rip)
  	jnz	2f
  #  endif
  	leaq	__strncasecmp_sse42(%rip), %rax

-- 
  Andreas Jaeger aj@{suse.com,opensuse.org} Twitter/Identica: jaegerandi
   SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
    GF: Jeff Hawn,Jennifer Guild,Felix Imendörffer,HRB16746 (AG Nürnberg)
     GPG fingerprint = 93A3 365E CE47 B889 DF7F  FED1 389A 563C C272 A126



More information about the Libc-alpha mailing list