使用CPUID测试SSE2与尝试SSE2指令和SIGILL?

时间:2015-08-19 05:18:34

标签: assembly sse2 cpuid

我正在查看执行以下操作的某些库代码。 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 and IA-32 Architectures Software Developer Manual,第2卷,图3-8,第3-192页。所以我不确定TrySSE2部分......

我查看了其他类似问题,例如Determine processor support for SSE2?。他们都没有说测试EDX:26是不可靠的。

为什么代码会调用TrySSE2而不是CPUID/EDX:26?某些非英特尔处理器的测试是否不可靠?

1 个答案:

答案 0 :(得分:2)

当添加SSE指令时,他们引入了需要在上下文切换期间保存/恢复的新寄存器......由于当时的操作系统没有代码执行此操作,因此SSE指令被禁用默认值。

更新操作系统以支持保存/恢复这些新寄存器后,操作系统将启用SSE指令。现在所有操作系统都有SSE支持,但我怀疑这段代码正在检查:

  • CPU支持SSE2
  • 操作系统已启用SSE2

请点击此处了解更多信息:http://wiki.osdev.org/SSE#Checking_for_SSE

相关问题