以下を実行するライブラリコードを見ています。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
ですか? 一部のインテル以外のプロセッサーでは、このテストは信頼できませんか?