在x264中,x264_cpu_detect函数定义为:
uint32_t x264_cpu_detect( void )
{
uint32_t cpu = 0; // 定义CPU的型号,初始化为0
uint32_t eax, ebx, ecx, edx;
int b_amd;
if( !x264_cpu_cpuid_test() )
{
/* No cpuid */
return 0;
}
x264_cpu_cpuid( 0, &eax, &ebx, &ecx, &edx);
if( eax == 0 )
{
return 0;
}
b_amd = (ebx == 0x68747541) && (ecx == 0x444d4163) && (edx == 0x69746e65);
x264_cpu_cpuid( 1, &eax, &ebx, &ecx, &edx );
if( (edx&0x00800000) == 0 )
{
/* No MMX */
return 0;
}
cpu = X264_CPU_MMX;
if( (edx&0x02000000) )
{
/* SSE - identical to AMD MMX extensions */
cpu |= X264_CPU_MMXEXT|X264_CPU_SSE;
}
if( (edx&0x04000000) )
{
/* Is it OK ? */
cpu |= X264_CPU_SSE2;
}
x264_cpu_cpuid( 0x80000000, &eax, &ebx, &ecx, &edx );
if( eax < 0x80000001 )
{
/* no extended capabilities */
return cpu;
}
x264_cpu_cpuid( 0x80000001, &eax, &ebx, &ecx, &edx );
if( edx&0x80000000 )
{
cpu |= X264_CPU_3DNOW;
}
if( b_amd && (edx&0x00400000) )
{
/* AMD MMX extensions */
cpu |= X264_CPU_MMXEXT;
}
return cpu;
}
函数返回的是cpu的型号,本人在运行程序时,发现最后返回的cpu为15.
接着看一下两个特殊的函数x264_cpu_cpuid_test和x264_cpu_cpuid,在程序中没有发现这两个函数的定义啊,那怎么能调用呢?原来,这两个函数是用汇编形式定义的:
x264_cpu_cpuid_test:
pushfd
push ebx
push ebp
push esi
push edi
pushfd
pop eax
mov ebx, eax
xor eax, 0x200000
push eax
popfd
pushfd
pop eax
xor eax, ebx
pop edi
pop esi
pop ebp
pop ebx
popfd
ret
x264_cpu_cpuid:
push ebp
mov ebp, esp
push ebx
push esi
push edi
mov eax, [ebp + 8]
cpuid
mov esi, [ebp + 12]
mov [esi], eax
mov esi, [ebp + 16]
mov [esi], ebx
mov esi, [ebp + 20]
mov [esi], ecx
mov esi, [ebp + 24]
mov [esi], edx
pop edi
pop esi
pop ebx
pop ebp
ret
原来如此.