| #include "cpuid.h" |
| |
| extern void exit (int) __attribute__((noreturn)); |
| |
| /* Determine what instruction set we've been compiled for, |
| and detect that we're running with it. */ |
| static void __attribute__((constructor)) |
| check_isa (void) |
| { |
| int a, b, c, d; |
| int c1, d1, c1e, d1e; |
| |
| c1 = d1 = c1e = d1e = 0; |
| |
| #ifdef __MMX__ |
| d1 |= bit_MMX; |
| #endif |
| #ifdef __3dNOW__ |
| d1e |= bit_3DNOW; |
| #endif |
| #ifdef __3dNOW_A__ |
| d1e |= bit_3DNOWP; |
| #endif |
| #ifdef __SSE__ |
| d1 |= bit_SSE; |
| #endif |
| #ifdef __SSE2__ |
| d1 |= bit_SSE2; |
| #endif |
| #ifdef __SSE3__ |
| c1 |= bit_SSE3; |
| #endif |
| #ifdef __SSSE3__ |
| c1 |= bit_SSSE3; |
| #endif |
| #ifdef __SSE4_1__ |
| c1 |= bit_SSE4_1; |
| #endif |
| #ifdef __SSE4_2__ |
| c1 |= bit_SSE4_2; |
| #endif |
| #ifdef __AES__ |
| c1 |= bit_AES; |
| #endif |
| #ifdef __PCLMUL__ |
| c1 |= bit_PCLMUL; |
| #endif |
| #ifdef __AVX__ |
| c1 |= bit_AVX; |
| #endif |
| #ifdef __FMA__ |
| c1 |= bit_FMA; |
| #endif |
| #ifdef __SSE4A__ |
| c1e |= bit_SSE4a; |
| #endif |
| #ifdef __FMA4__ |
| c1e |= bit_FMA4; |
| #endif |
| #ifdef __XOP__ |
| c1e |= bit_XOP; |
| #endif |
| #ifdef __LWP__ |
| c1e |= bit_LWP; |
| #endif |
| |
| if (c1 | d1) |
| { |
| if (!__get_cpuid (1, &a, &b, &c, &d)) |
| goto fail; |
| if ((c & c1) != c1 || (d & d1) != d1) |
| goto fail; |
| } |
| if (c1e | d1e) |
| { |
| if (!__get_cpuid (0x80000001, &a, &b, &c, &d)) |
| goto fail; |
| if ((c & c1e) != c1e || (d & d1e) != d1e) |
| goto fail; |
| } |
| return; |
| |
| fail: |
| exit (0); |
| } |