__cpuid、__cpuidex

[このドキュメントはプレビュー版であり、後のリリースで変更されることがあります。 Blank topics are included as placeholders.]

Microsoft 固有の仕様 →

x86 と x64 で使用できる cpuid 命令を生成します。  この命令がサポートされている機能と CPU の種類を " のプロセッサを呼び出します。

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

void __cpuidex(
   int CPUInfo[4],
   int InfoType,
   int ECXValue
);

パラメーター

  • [出力] CPUInfo
    サポートされている機能と CPU に関する収集された情報を含む 4 個の整数値の配列。

  • [入力] InfoType
    この命令のどの情報を取得するコードを示します。

  • [入力] ECXValue
    この組み込みの直前のレジスタ ECX の値は cpuid 命令を生成します。

必要条件

組み込み

アーキテクチャ

__cpuid

x86x64

__cpuidex

x86x64

ヘッダー ファイル <intrin.h>

解説

この命令では CPUInfocpuid 命令を呼び出した後でサポートされている機能と CPU 情報EAXEBX 場合 ECX および EDX のレジスタの値が格納され4 個の 32 ビット整数の配列を格納します (この順序で)。 詳細に InfoType のパラメーターとして渡される値によって異なる意味を持ちます。 InfoType のさまざまな値で返される情報はプロセッサに依存します。

__cpuidex の組み込みは cpuid 命令を生成する前に ECX レジスタの値を設定します。 これはプロセッサに関する追加情報を収集することができます。

InfoType の引数が 0 の場合は次の表に出力を示します。

返される情報

配列のインデックス

ビットの範囲

Description

0

0-31

有効な情報を返す InfoType の最大値。

1

0-31

識別文字列 (パート 1)

2

0-31

識別文字列 (パート 3)

3

0-31

識別文字列 (パート 2)

InfoType の引数が 1 の場合は次の表に出力を示します。

返される情報 CPU

配列のインデックス

ビットの範囲

Description

0

0-3

ステップの ID

0

4-7

モデル

0

8-11

[ファミリ]

0

12-13

Intel プロセッサの種類 ()

予約 (AMD)

0

14-15

予約されています。

0

16-19

拡張モデル

0

20-27

親戚

0

28-31

予約されています。

1

0-7

作成者のインデックス

1

8-15

クワドワードの CLFLUSH キャッシュの行のサイズ

1

16-23

論理プロセッサの数

1

24-31

最初の APIC ID

2

0

SSE3 新しい手順

2

1-2

予約されています。

2

3

MONITOR/MWAIT

2

4

完全修飾されたデバッグ ストア (Intel)

予約 (AMD)

2

5

仮想マシンの拡張子 (Intel)

予約 (AMD)

2

6

セーフ モードの拡張子 (Intel)

予約 (AMD)

2

7

Intel 拡張 SpeedStep テクノロジ (Intel)

予約 (AMD)

2

8

熱モニター (Intel)

予約 (AMD) 2

2

9

追加のストリーミング SIMD 拡張子 (3) SSSE3

2

10

L1 コンテキスト ID (Intel)

予約 (AMD)

2

11

予約されています。

2

12

ビット FMA の拡張子 (Intel)

予約 (AMD)

2

13

CMPXCHG16B サポート

2

14

xTPR のコントロールの更新

2

15

PERF とデバッグ機能の MSR

2

16-17

予約されています。

2

18

キャッシュの直接アクセス (DCA) をサポートする Intel ()

予約 (AMD)

2

19

SSE4.1 拡張子

2

20

SSE4.2 拡張子

2

21

x2APIC のサポート (Intel)

予約 (AMD)

2

22

MOVBE のサポート (Intel)

予約 (AMD)

2

23

POPCNT 命令のサポート

2

24

予約されています。

2

25

AES のサポート (Intel)

予約 (AMD)

2

26

XSAVE のサポート (Intel)

予約 (AMD)

2

27

OSXSAVE のサポート (Intel)

予約 (AMD)

2

28

ビット Intel Advanced Vector Extension (Intel)

予約 (AMD)

2

29-31

予約されています。

3

0-31

機能情報 (トピックの " " を参照してください)

次の表は InfoType の引数が 1. で記述されている場合はCPUInfo [3] の機能について価値EDX の値の意味を次に示します。

返される情報機能

Bit

ニーモニック

Description

0

FPU

x87 FPU のチップ

1

VME

仮想 8086 モードの強化

2

DE

拡張機能のデバッグ

3

PSE

ページ サイズの拡張子

4

TSC

タイム スタンプ オブジェクト

5

MSR

RDMSR と WRMSR のサポート

6

PAE

物理アドレス拡張

7

MCE

コンピューターに例外

8

CX8

命令 CMPXCHG8B

9

APIC

チップの APIC

10

適用なし

予約されています。

11

9 年 7 月

SYSENTER と SYSEXIT

12

MTRR

メモリの型の範囲の登録

13

PGE

PTE のグローバル ビット

14

MCA

検査コンピューター アーキテクチャ

15

CMOV

条件付き移動または命令を比較します

16

PAT

ページの属性テーブル

17

PSE-36

36 bit のページ サイズの拡張子

18

PSN

プロセッサのシリアル番号

19

CLFSH

命令 CFLUSH

20

適用なし

予約されています。

21

DS

デバッグできます。

22

ACPI

熱モニターや時計コントロール

23

MMX

MMX テクノロジ

24

FXSR

FXSAVE/FXRSTOR

25

SSE

SSE の拡張子

26

SSE2

SSE2 拡張子

27

SS

自己の捜索

28

HTT

マルチスレッド

29

TM

モニター熱

30

適用なし

予約されています。

31

PBE

中断モードではは

注意

AMD チップ セットではチップに複数のコアを備えることを示す機能情報のすべてのマルチバイト ビット AMD CPU コアの設定のビット 28。これはAMD がそのスレッドをサポートしていない場合でも同じです。

プロセッサはSSE3 と SSE4 有効なプロセッサなどサポートの追加 InfoType の値。 InfoType の引数が 2 の場合この命令にはエンコード形式の情報をキャッシュします。

次の表は4. に InfoType を設定するとこの命令の戻り値を示します。 これはキャッシュのレベルの 1 文字とキャッシュの情報関連しています。 この情報を取得するにはレジスタ ECX を設定する必要があります。 クエリにレベル キャッシュのインデックスに ECX を設定するに __cpuidex の組み込みを使用します。

確定的な情報のキャッシュ

配列のインデックス

ビットの範囲

Description

0

0-4

キャッシュの種類フィールド

0

5-7

レベル キャッシュ

0

8

キャッシュを自動的に初期化

0

9

完全にキャッシュから左

0

10-13

予約されています。

0

14-25

スレッドの最大数

0

26-31

プロセッサ コアの ID の最大数

1

0-11

システムの一貫性の行のサイズ

1

12-21

物理行のパーティション

1

22-31

結合規則の方法

2

0-31

セット番号

3

0-31

予約されています。

InfoType が 5 の場合モニターの機能に関するこれらのプロセッサの情報 (_mm_monitor を参照してください。

InfoType が 6 の場合プロセッサはデジタル気温電源管理に関する情報を返します。

InfoType がの場合これらのプロセッサのアーキテクチャ情報はパフォーマンス モニターによって取得。

いるプロセッサのサポートによって拡張された関数 CPUID します。 これがサポートされる情報を返すために0x80000000 から InfoType の値が使用される場合があります。 許可される最大有効な値を確認するには InfoType 0x80000000 にを設定します。 InfoType の最大値は CPUInfo[0] に書き込まれますサポートします。 次の表は関数拡張 CPUID 情報を使用して返される値を示します。

CPUID 拡張関数の情報

InfoType

配列のインデックス

ビットの範囲

情報

0x80000000

0

0-31

CPUID 拡張機能の詳細についてはInfoType の最大有効な値。

0x80000000

1-3

0-31

予約されています。

0x80000001

0

0-31

拡張プロセッサの定義および拡張機能のビット

0x80000001

1

0-31

予約されています。

0x80000001

2

0

64 ビット モードで使用できます LAHF/SAHF

0x80000001

2

1

を使用して複数のプロセッサ コアのレガシ モード () CmpLegacy (AMD)

予約 (Intel)

0x80000001

2

2

保護してください (AMD) を仮想 (SVM) マシン

予約 (Intel)

0x80000001

2

3

拡張 APIC の登録 (空白) ExtApicSpace (AMD)

予約 (Intel)

0x80000001

2

4

AltMovCr8 (AMD)

予約 (Intel)

0x80000001

2

5

LZCNT のサポート (AMD)

予約 (Intel)

0x80000001

2

6

SSE4A 命令のサポート (EXTRQINSERTQMOVNTSDMOVNTSS) (AMD)

予約 (Intel)

0x80000001

2

7

アライメントされて SSE のモードで使用できます (AMD)

予約 (Intel)

0x80000001

2

8

先取りと PREFETCHW のサポート (AMD)

予約 (Intel)

0x80000001

2

9-11

予約されています。

0x80000001

2

12

SKINIT と開発のサポート (AMD)

予約 (Intel)

0x80000001

2

13-31

予約されています。

0x80000001

3

0-10

予約されています。

0x80000001

3

11

64 ビット モードで使用できます SYSCALL/SYSRET

0x80000001

3

12-19

予約されています。

0x80000001

3

20

無効のビットが実行します。

0x80000001

3

21

予約されています。

0x80000001

3

22

MMX 命令 (AMD) の拡張子

予約 (Intel)

0x80000001

3

23-24

予約されています。

0x80000001

3

25

FFXSR (AMD)

予約 (Intel)

0x80000001

3

26

1GB ページのサポート (AMD)

予約 (Intel)

0x80000001

3

27

RDTSCP のサポート (AMD)

予約 (Intel)

0x80000001

3

28

予約されています。

0x80000001

3

29

64 ビットのテクノロジを使用できます。

0x80000001

3

30

3DnowExt (AMD)

予約 (Intel)

0x80000001

3

31

3Dnow! 順序付け (AMD)

予約 (Intel)

0x80000002

0-3

0-31

プロセッサの作成者の文字列

0x80000003

0-3

0-31

従ってプロセッサの作成者の文字列

0x80000004

0-3

0-31

従ってプロセッサの作成者の文字列

0x80000005

0-3

0-31

L1 キャッシュと TLB の識別子 (AMD)

予約 (Intel)

0x80000006

0-1

0-31

予約されています。

0x80000006

2

0-7

キャッシュ ラインのサイズ

0x80000006

2

8-11

予約されています。

0x80000006

2

12-15

L2 結合規則

0x80000006

2

16-31

1K 単位のキャッシュ サイズ

0x80000006

3

0-31

予約されています。

0x80000007

0-3

0-31

高度な電源管理情報 (AMD)

予約 (Intel)

0x80000008

0

0-7

物理アドレスのビット

0x80000008

0

8-15

仮想アドレスのビット

0x80000008

0

16-31

予約されています。

0x80000008

1-3

0-31

予約されています。

0x8000000A

0

0-7

SVM のリビジョン (AMD)

予約 (Intel)

0x8000000A

0

8-31

予約されています。

0x8000000A

1

0-31

- NASID アドレス空間識別子 (AMD) の数

予約 (Intel)

0x8000000A

2

0-31

予約されています。

0x8000000A

3

0

入れ子になったページング (AMD)

予約 (Intel)

0x8000000A

3

1

LBR の視覚化 (AMD)

予約 (Intel)

0x8000000A

3

2-31

予約されています。

0x80000019

0-3

0-31

TLB 1GB ページの識別子 (AMD)

予約 (Intel)

0x8000001A

0

0

FP128 最適化 (AMD)

予約 (Intel)

0x8000001A

0

1

MOVUMOVUPS の MOVL/MOVHMOVHLPS/MOVHPSMOVLPD/MOVHPD (AMD) に対して MOVUPD の最適化

予約 (Intel)

0x8000001A

0

2-31

予約されています。

0x8000001A

1-3

0-31

予約されています。

使用例

// cpuid.cpp 
// processor: x86, x64
// Use the __cpuid intrinsic to get information about a CPU

#include <stdio.h>
#include <string.h>
#include <intrin.h>

const char* szFeatures[] =
{
    "x87 FPU On Chip",
    "Virtual-8086 Mode Enhancement",
    "Debugging Extensions",
    "Page Size Extensions",
    "Time Stamp Counter",
    "RDMSR and WRMSR Support",
    "Physical Address Extensions",
    "Machine Check Exception",
    "CMPXCHG8B Instruction",
    "APIC On Chip",
    "Unknown1",
    "SYSENTER and SYSEXIT",
    "Memory Type Range Registers",
    "PTE Global Bit",
    "Machine Check Architecture",
    "Conditional Move/Compare Instruction",
    "Page Attribute Table",
    "36-bit Page Size Extension",
    "Processor Serial Number",
    "CFLUSH Extension",
    "Unknown2",
    "Debug Store",
    "Thermal Monitor and Clock Ctrl",
    "MMX Technology",
    "FXSAVE/FXRSTOR",
    "SSE Extensions",
    "SSE2 Extensions",
    "Self Snoop",
    "Multithreading Technology",
    "Thermal Monitor",
    "Unknown4",
    "Pending Break Enable"
};

int main(int argc, char* argv[])
{
    char CPUString[0x20];
    char CPUBrandString[0x40];
    int CPUInfo[4] = {-1};
    int nSteppingID = 0;
    int nModel = 0;
    int nFamily = 0;
    int nProcessorType = 0;
    int nExtendedmodel = 0;
    int nExtendedfamily = 0;
    int nBrandIndex = 0;
    int nCLFLUSHcachelinesize = 0;
    int nLogicalProcessors = 0;
    int nAPICPhysicalID = 0;
    int nFeatureInfo = 0;
    int nCacheLineSize = 0;
    int nL2Associativity = 0;
    int nCacheSizeK = 0;
    int nPhysicalAddress = 0;
    int nVirtualAddress = 0;
    int nRet = 0;

    int nCores = 0;
    int nCacheType = 0;
    int nCacheLevel = 0;
    int nMaxThread = 0;
    int nSysLineSize = 0;
    int nPhysicalLinePartitions = 0;
    int nWaysAssociativity = 0;
    int nNumberSets = 0;

    unsigned    nIds, nExIds, i;

    bool    bSSE3Instructions = false;
    bool    bMONITOR_MWAIT = false;
    bool    bCPLQualifiedDebugStore = false;
    bool    bVirtualMachineExtensions = false;
    bool    bEnhancedIntelSpeedStepTechnology = false;
    bool    bThermalMonitor2 = false;
    bool    bSupplementalSSE3 = false;
    bool    bL1ContextID = false;
    bool    bCMPXCHG16B = false;
    bool    bxTPRUpdateControl = false;
    bool    bPerfDebugCapabilityMSR = false;
    bool    bSSE41Extensions = false;
    bool    bSSE42Extensions = false;
    bool    bPOPCNT = false;

    bool    bMultithreading = false;

    bool    bLAHF_SAHFAvailable = false;
    bool    bCmpLegacy = false;
    bool    bSVM = false;
    bool    bExtApicSpace = false;
    bool    bAltMovCr8 = false;
    bool    bLZCNT = false;
    bool    bSSE4A = false;
    bool    bMisalignedSSE = false;
    bool    bPREFETCH = false;
    bool    bSKINITandDEV = false;
    bool    bSYSCALL_SYSRETAvailable = false;
    bool    bExecuteDisableBitAvailable = false;
    bool    bMMXExtensions = false;
    bool    bFFXSR = false;
    bool    b1GBSupport = false;
    bool    bRDTSCP = false;
    bool    b64Available = false;
    bool    b3DNowExt = false;
    bool    b3DNow = false;
    bool    bNestedPaging = false;
    bool    bLBRVisualization = false;
    bool    bFP128 = false;
    bool    bMOVOptimization = false;

    bool    bSelfInit = false;
    bool    bFullyAssociative = false;

    // __cpuid with an InfoType argument of 0 returns the number of
    // valid Ids in CPUInfo[0] and the CPU identification string in
    // the other three array elements. The CPU identification string is
    // not in linear order. The code below arranges the information 
    // in a human readable form.
    __cpuid(CPUInfo, 0);
    nIds = CPUInfo[0];
    memset(CPUString, 0, sizeof(CPUString));
    *((int*)CPUString) = CPUInfo[1];
    *((int*)(CPUString+4)) = CPUInfo[3];
    *((int*)(CPUString+8)) = CPUInfo[2];

    // Get the information associated with each valid Id
    for (i=0; i<=nIds; ++i)
    {
        __cpuid(CPUInfo, i);
        printf_s("\nFor InfoType %d\n", i); 
        printf_s("CPUInfo[0] = 0x%x\n", CPUInfo[0]);
        printf_s("CPUInfo[1] = 0x%x\n", CPUInfo[1]);
        printf_s("CPUInfo[2] = 0x%x\n", CPUInfo[2]);
        printf_s("CPUInfo[3] = 0x%x\n", CPUInfo[3]);

        // Interpret CPU feature information.
        if  (i == 1)
        {
            nSteppingID = CPUInfo[0] & 0xf;
            nModel = (CPUInfo[0] >> 4) & 0xf;
            nFamily = (CPUInfo[0] >> 8) & 0xf;
            nProcessorType = (CPUInfo[0] >> 12) & 0x3;
            nExtendedmodel = (CPUInfo[0] >> 16) & 0xf;
            nExtendedfamily = (CPUInfo[0] >> 20) & 0xff;
            nBrandIndex = CPUInfo[1] & 0xff;
            nCLFLUSHcachelinesize = ((CPUInfo[1] >> 8) & 0xff) * 8;
            nLogicalProcessors = ((CPUInfo[1] >> 16) & 0xff);
            nAPICPhysicalID = (CPUInfo[1] >> 24) & 0xff;
            bSSE3Instructions = (CPUInfo[2] & 0x1) || false;
            bMONITOR_MWAIT = (CPUInfo[2] & 0x8) || false;
            bCPLQualifiedDebugStore = (CPUInfo[2] & 0x10) || false;
            bVirtualMachineExtensions = (CPUInfo[2] & 0x20) || false;
            bEnhancedIntelSpeedStepTechnology = (CPUInfo[2] & 0x80) || false;
            bThermalMonitor2 = (CPUInfo[2] & 0x100) || false;
            bSupplementalSSE3 = (CPUInfo[2] & 0x200) || false;
            bL1ContextID = (CPUInfo[2] & 0x300) || false;
            bCMPXCHG16B= (CPUInfo[2] & 0x2000) || false;
            bxTPRUpdateControl = (CPUInfo[2] & 0x4000) || false;
            bPerfDebugCapabilityMSR = (CPUInfo[2] & 0x8000) || false;
            bSSE41Extensions = (CPUInfo[2] & 0x80000) || false;
            bSSE42Extensions = (CPUInfo[2] & 0x100000) || false;
            bPOPCNT= (CPUInfo[2] & 0x800000) || false;
            nFeatureInfo = CPUInfo[3];
            bMultithreading = (nFeatureInfo & (1 << 28)) || false;
        }
    }

    // Calling __cpuid with 0x80000000 as the InfoType argument
    // gets the number of valid extended IDs.
    __cpuid(CPUInfo, 0x80000000);
    nExIds = CPUInfo[0];
    memset(CPUBrandString, 0, sizeof(CPUBrandString));

    // Get the information associated with each extended ID.
    for (i=0x80000000; i<=nExIds; ++i)
    {
        __cpuid(CPUInfo, i);
        printf_s("\nFor InfoType %x\n", i); 
        printf_s("CPUInfo[0] = 0x%x\n", CPUInfo[0]);
        printf_s("CPUInfo[1] = 0x%x\n", CPUInfo[1]);
        printf_s("CPUInfo[2] = 0x%x\n", CPUInfo[2]);
        printf_s("CPUInfo[3] = 0x%x\n", CPUInfo[3]);

        if  (i == 0x80000001)
        {
            bLAHF_SAHFAvailable = (CPUInfo[2] & 0x1) || false;
            bCmpLegacy = (CPUInfo[2] & 0x2) || false;
            bSVM = (CPUInfo[2] & 0x4) || false;
            bExtApicSpace = (CPUInfo[2] & 0x8) || false;
            bAltMovCr8 = (CPUInfo[2] & 0x10) || false;
            bLZCNT = (CPUInfo[2] & 0x20) || false;
            bSSE4A = (CPUInfo[2] & 0x40) || false;
            bMisalignedSSE = (CPUInfo[2] & 0x80) || false;
            bPREFETCH = (CPUInfo[2] & 0x100) || false;
            bSKINITandDEV = (CPUInfo[2] & 0x1000) || false;
            bSYSCALL_SYSRETAvailable = (CPUInfo[3] & 0x800) || false;
            bExecuteDisableBitAvailable = (CPUInfo[3] & 0x10000) || false;
            bMMXExtensions = (CPUInfo[3] & 0x40000) || false;
            bFFXSR = (CPUInfo[3] & 0x200000) || false;
            b1GBSupport = (CPUInfo[3] & 0x400000) || false;
            bRDTSCP = (CPUInfo[3] & 0x8000000) || false;
            b64Available = (CPUInfo[3] & 0x20000000) || false;
            b3DNowExt = (CPUInfo[3] & 0x40000000) || false;
            b3DNow = (CPUInfo[3] & 0x80000000) || false;
        }

        // Interpret CPU brand string and cache information.
        if  (i == 0x80000002)
            memcpy(CPUBrandString, CPUInfo, sizeof(CPUInfo));
        else if  (i == 0x80000003)
            memcpy(CPUBrandString + 16, CPUInfo, sizeof(CPUInfo));
        else if  (i == 0x80000004)
            memcpy(CPUBrandString + 32, CPUInfo, sizeof(CPUInfo));
        else if  (i == 0x80000006)
        {
            nCacheLineSize = CPUInfo[2] & 0xff;
            nL2Associativity = (CPUInfo[2] >> 12) & 0xf;
            nCacheSizeK = (CPUInfo[2] >> 16) & 0xffff;
        }
        else if  (i == 0x80000008)
        {
           nPhysicalAddress = CPUInfo[0] & 0xff;
           nVirtualAddress = (CPUInfo[0] >> 8) & 0xff;
        }
        else if  (i == 0x8000000A)
        {
            bNestedPaging = (CPUInfo[3] & 0x1) || false;
            bLBRVisualization = (CPUInfo[3] & 0x2) || false;
        }
        else if  (i == 0x8000001A)
        {
            bFP128 = (CPUInfo[0] & 0x1) || false;
            bMOVOptimization = (CPUInfo[0] & 0x2) || false;
        }
    }

    // Display all the information in user-friendly format.

    printf_s("\n\nCPU String: %s\n", CPUString);

    if  (nIds >= 1)
    {
        if  (nSteppingID)
            printf_s("Stepping ID = %d\n", nSteppingID);
        if  (nModel)
            printf_s("Model = %d\n", nModel);
        if  (nFamily)
            printf_s("Family = %d\n", nFamily);
        if  (nProcessorType)
            printf_s("Processor Type = %d\n", nProcessorType);
        if  (nExtendedmodel)
            printf_s("Extended model = %d\n", nExtendedmodel);
        if  (nExtendedfamily)
            printf_s("Extended family = %d\n", nExtendedfamily);
        if  (nBrandIndex)
            printf_s("Brand Index = %d\n", nBrandIndex);
        if  (nCLFLUSHcachelinesize)
            printf_s("CLFLUSH cache line size = %d\n",
                     nCLFLUSHcachelinesize);
        if (bMultithreading && (nLogicalProcessors > 0))
           printf_s("Logical Processor Count = %d\n", nLogicalProcessors);
        if  (nAPICPhysicalID)
            printf_s("APIC Physical ID = %d\n", nAPICPhysicalID);

        if  (nFeatureInfo || bSSE3Instructions ||
             bMONITOR_MWAIT || bCPLQualifiedDebugStore ||
             bVirtualMachineExtensions || bEnhancedIntelSpeedStepTechnology ||
             bThermalMonitor2 || bSupplementalSSE3 || bL1ContextID || 
             bCMPXCHG16B || bxTPRUpdateControl || bPerfDebugCapabilityMSR || 
             bSSE41Extensions || bSSE42Extensions || bPOPCNT || 
             bLAHF_SAHFAvailable || bCmpLegacy || bSVM ||
             bExtApicSpace || bAltMovCr8 ||
             bLZCNT || bSSE4A || bMisalignedSSE ||
             bPREFETCH || bSKINITandDEV || bSYSCALL_SYSRETAvailable || 
             bExecuteDisableBitAvailable || bMMXExtensions || bFFXSR || b1GBSupport ||
             bRDTSCP || b64Available || b3DNowExt || b3DNow || bNestedPaging || 
             bLBRVisualization || bFP128 || bMOVOptimization )
        {
            printf_s("\nThe following features are supported:\n");

            if  (bSSE3Instructions)
                printf_s("\tSSE3\n");
            if  (bMONITOR_MWAIT)
                printf_s("\tMONITOR/MWAIT\n");
            if  (bCPLQualifiedDebugStore)
                printf_s("\tCPL Qualified Debug Store\n");
            if  (bVirtualMachineExtensions)
                printf_s("\tVirtual Machine Extensions\n");
            if  (bEnhancedIntelSpeedStepTechnology)
                printf_s("\tEnhanced Intel SpeedStep Technology\n");
            if  (bThermalMonitor2)
                printf_s("\tThermal Monitor 2\n");
            if  (bSupplementalSSE3)
                printf_s("\tSupplemental Streaming SIMD Extensions 3\n");
            if  (bL1ContextID)
                printf_s("\tL1 Context ID\n");
            if  (bCMPXCHG16B)
                printf_s("\tCMPXCHG16B Instruction\n");
            if  (bxTPRUpdateControl)
                printf_s("\txTPR Update Control\n");
            if  (bPerfDebugCapabilityMSR)
                printf_s("\tPerf\\Debug Capability MSR\n");
            if  (bSSE41Extensions)
                printf_s("\tSSE4.1 Extensions\n");
            if  (bSSE42Extensions)
                printf_s("\tSSE4.2 Extensions\n");
            if  (bPOPCNT)
                printf_s("\tPPOPCNT Instruction\n");

            i = 0;
            nIds = 1;
            while (i < (sizeof(szFeatures)/sizeof(const char*)))
            {
                if  (nFeatureInfo & nIds)
                {
                    printf_s("\t");
                    printf_s(szFeatures[i]);
                    printf_s("\n");
                }

                nIds <<= 1;
                ++i;
            }
            if (bLAHF_SAHFAvailable)
                printf_s("\tLAHF/SAHF in 64-bit mode\n");
            if (bCmpLegacy)
                printf_s("\tCore multi-processing legacy mode\n");
            if (bSVM)
                printf_s("\tSecure Virtual Machine\n");
            if (bExtApicSpace)
                printf_s("\tExtended APIC Register Space\n");
            if (bAltMovCr8)
                printf_s("\tAltMovCr8\n");
            if (bLZCNT)
                printf_s("\tLZCNT instruction\n");
            if (bSSE4A)
                printf_s("\tSSE4A (EXTRQ, INSERTQ, MOVNTSD, MOVNTSS)\n");
            if (bMisalignedSSE)
                printf_s("\tMisaligned SSE mode\n");
            if (bPREFETCH)
                printf_s("\tPREFETCH and PREFETCHW Instructions\n");
            if (bSKINITandDEV)
                printf_s("\tSKINIT and DEV support\n");
            if (bSYSCALL_SYSRETAvailable)
                printf_s("\tSYSCALL/SYSRET in 64-bit mode\n");
            if (bExecuteDisableBitAvailable)
                printf_s("\tExecute Disable Bit\n");
            if (bMMXExtensions)
                printf_s("\tExtensions to MMX Instructions\n");
            if (bFFXSR)
                printf_s("\tFFXSR\n");
            if (b1GBSupport)
                printf_s("\t1GB page support\n");
            if (bRDTSCP)
                printf_s("\tRDTSCP instruction\n");
            if (b64Available)
                printf_s("\t64 bit Technology\n");
            if (b3DNowExt)
                printf_s("\t3Dnow Ext\n");
            if (b3DNow)
                printf_s("\t3Dnow! instructions\n");
            if (bNestedPaging)
                printf_s("\tNested Paging\n");
            if (bLBRVisualization)
                printf_s("\tLBR Visualization\n");
            if (bFP128)
                printf_s("\tFP128 optimization\n");
            if (bMOVOptimization)
                printf_s("\tMOVU Optimization\n");
        }
    }

    if  (nExIds >= 0x80000004)
        printf_s("\nCPU Brand String: %s\n", CPUBrandString);

    if  (nExIds >= 0x80000006)
    {
        printf_s("Cache Line Size = %d\n", nCacheLineSize);
        printf_s("L2 Associativity = %d\n", nL2Associativity);
        printf_s("Cache Size = %dK\n", nCacheSizeK);
    }


    for (i=0;;i++)
    {
        __cpuidex(CPUInfo, 0x4, i);
        if(!(CPUInfo[0] & 0xf0)) break;

        if(i == 0)
        {
            nCores = CPUInfo[0] >> 26;
            printf_s("\n\nNumber of Cores = %d\n", nCores + 1);
        }

        nCacheType = (CPUInfo[0] & 0x1f);
        nCacheLevel = (CPUInfo[0] & 0xe0) >> 5;
        bSelfInit = (CPUInfo[0] & 0x100) >> 8;
        bFullyAssociative = (CPUInfo[0] & 0x200) >> 9;
        nMaxThread = (CPUInfo[0] & 0x03ffc000) >> 14;
        nSysLineSize = (CPUInfo[1] & 0x0fff);
        nPhysicalLinePartitions = (CPUInfo[1] & 0x03ff000) >> 12;
        nWaysAssociativity = (CPUInfo[1]) >> 22;
        nNumberSets = CPUInfo[2];

        printf_s("\n");

        printf_s("ECX Index %d\n", i);
        switch (nCacheType)
        {
            case 0:
                printf_s("   Type: Null\n");
                break;
            case 1:
                printf_s("   Type: Data Cache\n");
                break;
            case 2:
                printf_s("   Type: Instruction Cache\n");
                break;
            case 3:
                printf_s("   Type: Unified Cache\n");
                break;
            default:
                 printf_s("   Type: Unknown\n");
        }

        printf_s("   Level = %d\n", nCacheLevel + 1); 
        if (bSelfInit)
        {
            printf_s("   Self Initializing\n");
        }
        else
        {
            printf_s("   Not Self Initializing\n");
        }
        if (bFullyAssociative)
        {
            printf_s("   Is Fully Associatve\n");
        }
        else
        {
            printf_s("   Is Not Fully Associatve\n");
        }
        printf_s("   Max Threads = %d\n", 
            nMaxThread+1);
        printf_s("   System Line Size = %d\n", 
            nSysLineSize+1);
        printf_s("   Physical Line Partions = %d\n", 
            nPhysicalLinePartitions+1);
        printf_s("   Ways of Associativity = %d\n", 
            nWaysAssociativity+1);
        printf_s("   Number of Sets = %d\n", 
            nNumberSets+1);
    }

    return  nRet;
}
          
        

参照

Reference

コンパイラ組み込み関数。