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;
}

CPUIDのビット 26 の呼び出しとテストEDXは、インテル® 64 および IA-32 アーキテクチャー ソフトウェア開発者マニュアル、第 2 巻、図 3-8、ページ 3-192 に従って正しいです。なので、その部分がよくわからないTrySSE2

私は、SSE2 のプロセッサ サポートを決定するなど、他の同様の質問を見てきました。. テストEDX:26が信頼できないと言う人はいません。

TrySSE2を使用するのではなく、コードが呼び出すのはなぜCPUID/EDX:26ですか? 一部のインテル以外のプロセッサーでは、このテストは信頼できませんか?

4

1 に答える 1