Download M4 Source Macro Index Page

ax_gcc_x86_cpuid

Synopsis

AX_GCC_X86_CPUID(OP)

Description

On Pentium and later x86 processors, with gcc or a compiler that has a compatible syntax for inline assembly instructions, run a small program that executes the cpuid instruction with input OP. This can be used to detect the CPU type.

On output, the values of the eax, ebx, ecx, and edx registers are stored as hexadecimal strings as "eax:ebx:ecx:edx" in the cache variable ax_cv_gcc_x86_cpuid_OP.

If the cpuid instruction fails (because you are running a cross-compiler, or because you are not using gcc, or because you are on a processor that doesn't have this instruction), ax_cv_gcc_x86_cpuid_OP is set to the string "unknown".

This macro mainly exists to be used in AX_GCC_ARCHFLAG.

Author

Steven G. Johnson <stevenj@alum.mit.edu> and Matteo Frigo.

Last Modified

2005-05-30

M4 Source Code

AC_DEFUN([AX_GCC_X86_CPUID],
[AC_REQUIRE([AC_PROG_CC])
AC_LANG_PUSH([C])
AC_CACHE_CHECK(for x86 cpuid $1 output, ax_cv_gcc_x86_cpuid_$1,
 [AC_RUN_IFELSE([AC_LANG_PROGRAM([#include <stdio.h>], [
     int op = $1, eax, ebx, ecx, edx;
     FILE *f;
      __asm__("cpuid"
        : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
        : "a" (op));
     f = fopen("conftest_cpuid", "w"); if (!f) return 1;
     fprintf(f, "%x:%x:%x:%x\n", eax, ebx, ecx, edx);
     fclose(f);
     return 0;
])], 
     [ax_cv_gcc_x86_cpuid_$1=`cat conftest_cpuid`; rm -f conftest_cpuid],
     [ax_cv_gcc_x86_cpuid_$1=unknown; rm -f conftest_cpuid],
     [ax_cv_gcc_x86_cpuid_$1=unknown])])
AC_LANG_POP([C])
])