https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77756

            Bug ID: 77756
           Summary: cpuid
           Product: gcc
           Version: 6.2.0
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: inline-asm
          Assignee: unassigned at gcc dot gnu.org
          Reporter: yzhang1985 at gmail dot com
  Target Milestone: ---

Created attachment 39696
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=39696&action=edit
should print 99 when run on an AVX2 capable processor

I've found a bug in __get_cpuid() in the compiler internal header, cpuid.h.

I wish to detect if the CPU supports AVX2, but when I call __get_cpuid(7, ...),
EBX is all zeros. The problem is for level 7, ECX must be set to 0 before
calling cpuid.

As a work around, I've added "xor %%ecx, %%ecx" to __cpuid() and that took care
of the problem:

#define __cpuid(level, a, b, c, d) \
              __asm__("xor %%ecx, %%ecx\n" \
                      "cpuid\n" \
                      : "=a"(a), "=b"(b), "=c"(c), "=d"(d) \
                      : "0"(level))

It looks like Intel only started requiring this for level 7. Who knows if
they'll require setting ECX to other values for future levels, but for know, it
seems always setting ECX to 0 is OK.

One mystery is why GCC's builtin AVX2 auto detection for function
multiversioning, which uses __get_cpuid() works (see multiversioning.cpp).
However, I can't use multiversioning because ifunc hasn't been ported to
Windows, so I have to do manual detection.

I don't think attaching a preprocessed C file is necessary to reproduce this.
Here's the output of gcc -v:

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/6/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 6.2.0-4'
--with-bugurl=file:///usr/share/doc/gcc-6/README.Bugs
--enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr
--program-suffix=-6 --program-prefix=x86_64-linux-gnu- --enable-shared
--enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext
--enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/
--enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes
--with-default-libstdcxx-abi=new --enable-gnu-unique-object
--disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib
--disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo
--with-java-home=/usr/lib/jvm/java-1.5.0-gcj-6-amd64/jre --enable-java-home
--with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-6-amd64
--with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-6-amd64
--with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar
--enable-objc-gc --enable-multiarch --with-arch-32=i686 --with-abi=m64
--with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic
--enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu
--target=x86_64-linux-gnu
Thread model: posix
gcc version 6.2.0 20160914 (Debian 6.2.0-4)

Reply via email to