【Optimizaition/x86】Intel CPU的CPUID指令获取的C实现

Date: 2018.7.22


1、参考:

https://www.cnblogs.com/DxSoft/articles/5053954.html
https://blog.csdn.net/listener51/article/details/80299003
https://blog.csdn.net/sxf_zero/article/details/590171
https://blog.csdn.net/jamesliulyc/article/details/2028958

2、什么是cpuid指令

CPUID指令是intel IA32架构下获得CPU信息的汇编指令,可以得到CPU类型,型号,制造商信息,商标信息,序列号,缓存,支持特性(MMX,SSE,AVX)等一系列CPU相关的东西。
指令功能:
按照最初输入 EAX 寄存器的值,将处理器标识与功能信息返回给 EAX、EBX、ECX 及 EDX 寄存器。

3、cpuid指令的使用

cpuid使用eax作为输入参数,eax,ebx,ecx,edx作为输出参数,举个例子:

__asm
 {
  mov eax, 0
  cpuid 
 }

cpuid指令返回的信息有两种,一种是基本信息,一种是扩展信息。
eax赋值为0,取得的是基本信息;eax赋值为1,取得的是扩展信息。

4、C实现获取cpuid
int get_cpu_flags(void)
{
 int flags = 0;
  if(cpuid_supported())
  {
     	int info0[4];
    	 int info1[4];
    	 int info7[4];
    	 int ext0[4];
    	 int ext1[4];
     	char *vendor;
     	cpuid_ext(info0,0,0);
     	vendor = (char*)(info0+1);
	printf("CPU Vendor:%c%c%c%c%c%c%c%c%c%c%c%c",vendor[0],vendor[1],vendor[2],vendor[3],
	vendor[4],vendor[5],vendor[6],vendor[7],vendor[8],vendor[9],vendor[10],vendor[11]);

	if(info0[0]>1)
	{
	cpuid_ext(info1,1,1);
	if(info1[3] &(1<<23))
		flags |= 0x0001;//MMX
	if(info1[3] &(1<<25))
		flags |=0x0004; //MMX_EXT
	if(info1[3] &(1<<25))
		flags |=0x0002; //SSE
	if(info1[3] &(1<<26))
		flags |=0x0008; //SSE2
	if(info1[2] &1)
		flags |=0x00100000; //SSE3
	if(info1[2] &(0x00000200))
		flags |=0x0080; //SSSE3
	if(info1[2] &(0x00080000))
		flags |=0x01000000; //SSE4
	if(info1[2] &(0x00100000))
		flags |=0x10000000; //SSE4.2
	}
  }
	return flags;

}