我正在查看一些执行以下操作的库代码。该CpuId
功能按预期运行。它加载EAX
(函数)、ECX
(子函数)然后调用CPUID
.
struct CPUIDinfo
{
word32 EAX;
word32 EBX;
word32 ECX;
word32 EDX;
};
...
CPUIDinfo info;
CpuId(1 /*EAX=1*/, 0 /*ECX=0*, info);
if ((info.EDX & (1 << 26)) != 0)
s_hasSSE2 = TrySSE2();
然后,这就是代码的作用TrySSE2
:
bool TrySSE2()
{
/* SIG handlers in place */
// Sets XMM0 to 0
por xmm0, xmm0;
#if ... Microsoft and instrinsics available ...
// Exercises MOVD instruction
word32 x = _mm_cvtsi128_si32(xmm0);
return x == 0;
#endif
return true;
}
根据英特尔® 64 和 IA-32 架构软件开发人员手册,第 2 卷,图 3-8,第 3-192 页,调用CPUID
和测试第 26 位EDX
是正确的。所以我不确定这个部分......TrySSE2
我看过其他类似的问题,例如确定 SSE2 的处理器支持?. 他们都没有说测试EDX:26
是不可靠的。
为什么代码会调用TrySSE2
而不是使用CPUID/EDX:26
?测试在某些非英特尔处理器上是否不可靠?