http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56298
Bug #: 56298 Summary: wmmintrin.h aborts compilation on the machines without AES Classification: Unclassified Product: gcc Version: 4.7.2 Status: UNCONFIRMED Severity: major Priority: P3 Component: other AssignedTo: unassig...@gcc.gnu.org ReportedBy: piotr.wyder...@gmail.com I have a piece of C++ code which computes a hash function using the AES-NI extensions of the Sandy/IvyBridge x64 processors. It is automatically selected if the target platform supports the mentioned extensions via cpuid. To use e.g. _mm_aesenc_si128() one needs to include <wmmintrin.h>, which is also a full test case here. If the host does not implement AES-NI (detected via -march=native or it is not explicitly enabled by -maes), the compilation process fails abruptly due to the content of wmmintrin.h: #if !defined (__AES__) && !defined (__PCLMUL__) # error "AES/PCLMUL instructions not enabled" #else It is a very serious bug (so I decided to mark is as "major"), because the intrinsics available should not depend on command line settings -- it is the user who takes full responsibility for their correct use and availability checking, as it is in my case. Enabling -maes is not an option, because it would then allow the code generator to unconditionally emit the AES-NI instructions in places I don't control, which will result in SIGILL and a core dump. This bug probably applies to all recent GCC versions, including 4.7.2 and 4.6.3. On MSVC2010 the respective header contains no such compile-time checks, i.e. it is fully consistent with the intended behaviour described above: /* * wmmintrin.h * * Principal header file for Intel(R) AES and PCLMULQDQ intrinsics. */ #pragma once #ifndef __midl #ifndef _INCLUDED_WMM #define _INCLUDED_WMM #if defined(_M_CEE_PURE) #error ERROR: EMM intrinsics not supported in the pure mode! #else #include <nmmintrin.h> #if __cplusplus extern "C" { #endif /* * Performs 1 round of AES decryption of the first m128i using * the second m128i as a round key. */ extern __m128i _mm_aesdec_si128(__m128i v, __m128i rkey); etc.