CPUID命令のIntrinsic関数を使用して、SSEに対応しているか調べるコード

Posted on Sat 06 November 2010 in Windows

↓のコードをIntrinsic関数を使用して書き換えてみます。

CPUID命令を使用して、SSEに対応しているか調べるコード

__cpuid()

CPUID命令のIntrinsic関数は、

void __cpuid(
int CPUInfo[4],
int InfoType
);

です。
InfoTypeで数値を指定して、対応した情報がCPUInfoに入ります。
今回はSSEの対応情報を調べるので、InfoTypeには 1を入れます。

先頭をbit0として、次のように対応情報が格納され、
対応している場合はbitが1になっています。

  • CPUInfo[3] bit23 MMX
  • CPUInfo[3] bit25 SSE
  • CPUInfo[3] bit26 SSE2
  • CPUInfo[2] bit0 SSE3
  • CPUInfo[2] bit19 SSE4.1
  • CPUInfo[2] bit20 SSE4.2 :::

コード

#include <intrin.h>
#include <stdio.h>
int main(void)
{
    int CPUInfo[4];
    int InfoType = 1;
    __cpuid(CPUInfo, InfoType);
    if (CPUInfo[3] & 0x00800000) {
        printf("support MMX\n");
    }
    if (CPUInfo[3] & 0x02000000) {
        printf("support SSE\n");
    }
    if (CPUInfo[3] & 0x04000000) {
        printf("support SSE2\n");
    }
    if (CPUInfo[2] & 0x00000001) {
        printf("support SSE3\n");
    }
    if (CPUInfo[2] & 0x00080000) {
        printf("support SSE4.1\n");
    }
    if (CPUInfo[2] & 0x00100000) {
        printf("support SSE4.2\n");
    }
    return 0;
}

実行結果

Core i7 870での実行結果

support MMX
support SSE
support SSE2
support SSE3
support SSE4.1
support SSE4.2

Core2 Duo E8400での実行結果

support MMX
support SSE
support SSE2
support SSE3
support SSE4.1

参考URL

http://msdn.microsoft.com/en-us/library/hskdteyh%28v=VS.90%29.aspx