我正在查看一些执行以下操作的库代码。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;
}调用CPUID和测试EDX的第26位是正确的,按Intel 64和IA-32架构软件开发人员手册,第2卷,图3-8,第3-192页。所以我不确定TrySSE2部分.
我看过其他类似的问题,比如确定SSE2的处理器支持吗?。没有人说测试EDX:26是不可靠的。
为什么代码会调用TrySSE2而不是使用CPUID/EDX:26?在一些非英特尔处理器上测试不可靠吗?
发布于 2015-08-20 17:07:08
当SSE指令被添加时,它们引入了新的寄存器,这些寄存器需要在上下文切换期间保存/恢复.因为当时的OSes没有这样做的代码,所以默认情况下将禁用SSE指令。
一旦更新了OSes以支持保存/恢复这些新寄存器,操作系统就会启用SSE指令。现在所有的OSes都支持SSE,但我怀疑这段代码正在检查:
有关更多信息,请参见这里:SSE
https://stackoverflow.com/questions/32087056
复制相似问题