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