首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CPUID测试SSE2与尝试使用SSE2指令和SIGILL?

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

Stack Overflow用户
提问于 2015-08-19 05:18:34
回答 1查看 900关注 0票数 2

我正在查看一些执行以下操作的库代码。CpuId函数按预期操作。它加载EAX (函数)、ECX (子函数),然后调用CPUID

代码语言:javascript
复制
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中所做的工作

代码语言:javascript
复制
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?在一些非英特尔处理器上测试不可靠吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-20 17:07:08

当SSE指令被添加时,它们引入了新的寄存器,这些寄存器需要在上下文切换期间保存/恢复.因为当时的OSes没有这样做的代码,所以默认情况下将禁用SSE指令。

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

  • CPU支持SSE2。
  • 操作系统启用了SSE2

有关更多信息,请参见这里:SSE

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32087056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档