http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56068



--- Comment #13 from Uros Bizjak <ubizjak at gmail dot com> 2013-01-21 19:31:47 
UTC ---

(In reply to comment #12)

> (In reply to comment #11)

> > I will try 4.6 to prove that. Off to build 4.6...

> 

> Thanks for checking.  See http://gcc.gnu.org/wiki/InstallingGCC for the

> foolproof way to do build it.

> 

> You could also try this with any GCC version on the KVM guest:

> 

> #include <stdio.h>

> #include "cpuid.h"

> 

> int main()

> {

>       unsigned bit_osxsave = bit_AVX >> 1;

> 

>       unsigned int eax, ebx, ecx, edx;

> 

>       __cpuid (1, eax, ebx, ecx, edx);

> 

>       printf("bit_OSXSAVE (%u) = %u\n", bit_osxsave, ecx & bit_osxsave);

>       printf("bit_AVX (%u) = %u\n", bit_AVX, ecx & bit_AVX);

> }

> 

> If that prints 0 for OSXSAVE and non-zero for AVX then it's the same problem I

> had.

> 

> Maybe GCC could work around it by checking both flags in the AVX detection

> logic.



Recent 4.6+ does. Please see driver-i386.c around line 470:



--snip--

  /* Get XCR_XFEATURE_ENABLED_MASK register with xgetbv.  */

#define XCR_XFEATURE_ENABLED_MASK    0x0

#define XSTATE_FP            0x1

#define XSTATE_SSE            0x2

#define XSTATE_YMM            0x4

  if (has_osxsave)

    asm (".byte 0x0f; .byte 0x01; .byte 0xd0"

     : "=a" (eax), "=d" (edx)

     : "c" (XCR_XFEATURE_ENABLED_MASK));



  /* Check if SSE and YMM states are supported.  */

  if (!has_osxsave

      || (eax & (XSTATE_SSE | XSTATE_YMM)) != (XSTATE_SSE | XSTATE_YMM))

    {

      has_avx = 0;

      has_fma = 0;

      has_fma4 = 0;

      has_xop = 0;

    }

--snip--

Reply via email to