AX_GCC_X86_CPUID(OP)
,
run x86 cpuid instruction OP using gcc inline assembler
Steven G. Johnson <stevenj@alum.mit.edu> and Matteo Frigo.
GPLWithACException
This program is free software; you can
redistribute it and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation. As a special exception, the respective
Autoconf Macro's copyright owner gives unlimited permission to copy, distribute and modify
the configure scripts that are the output of Autoconf when processing the Macro. You
need not follow the terms of the
GNU General Public License when using or distributing such scripts
cryp.to ac-archive's Miscellaneous (released)
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.
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])
])