2

我正在查看一些执行以下操作的库代码。该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?测试在某些非英特尔处理器上是否不可靠?

4

1 回答 1

2

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

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

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

有关更多信息,请参见此处:http ://wiki.osdev.org/SSE#Checking_for_SSE

于 2015-08-20T17:07:08.643 回答