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)