/*
* $Id$
*
* (C) 2006-2010 see AUTHORS
*
* This file is part of mplayerc.
*
* Mplayerc is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* Mplayerc is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
#include "stdafx.h"
#include "intrin_fixed.h"
#include "CpuId.h"
#define CPUID_MMX (1<<23)
#define CPUID_SSE (1<<25)
#define CPUID_SSE2 (1<<26)
#define CPUID_SSE3 (1<<0)
// Intel specifics
#define CPUID_SSSE3 (1<<9)
// AMD specifics
#define CPUID_3DNOW (1<<31)
#define CPUID_3DNOWEXT (1<<30)
#define CPUID_MMXEXT (1<<22)
CCpuId::CCpuId(void)
{
unsigned nHighestFeature;
unsigned nHighestFeatureEx;
int nBuff[4];
char szMan[13];
char szFeatures[256];
// Get CPU manufacturer and highest CPUID
__cpuid(nBuff, 0);
nHighestFeature = (unsigned)nBuff[0];
*(int*)&szMan[0] = nBuff[1];
*(int*)&szMan[4] = nBuff[3];
*(int*)&szMan[8] = nBuff[2];
szMan[12] = 0;
if(strcmp(szMan, "AuthenticAMD") == 0)
m_nType = PROCESSOR_AMD;
else if(strcmp(szMan, "GenuineIntel") == 0)
m_nType = PROCESSOR_INTEL;
else
m_nType = PROCESSOR_UNKNOWN;
// Get highest extended feature
__cpuid(nBuff, 0x80000000);
nHighestFeatureEx = (unsigned)nBuff[0];
// Get processor brand name
/*
if(nHighestFeatureEx >= 0x80000004)
{
char szCPUName[49];
szCPUName[0] = 0;
__cpuid((int*)&szCPUName[0], 0x80000002);
__cpuid((int*)&szCPUName[16], 0x80000003);
__cpuid((int*)&szCPUName[32], 0x80000004);
szCPUName[48] = 0;
for(int i=(int)strlen(szCPUName)-1; i>=0; --i)
{
if(szCPUName[i] == ' ')
szCPUName[i] = '\0';
else
break;
}
ELog::Get().SystemFormat(L"PERF : CPU: %S (%S)\n", szCPUName, szMan);
}
else
ELog::Get().SystemFormat(L"PERF : CPU: %S\n", szMan);
*/
// Get CPU features
m_nCPUFeatures = 0;
szFeatures[0] = 0;
if(nHighestFeature >= 1)
{
__cpuid(nBuff, 1);
if(nBuff[3] & 1<<23) m_nCPUFeatures|=MPC_MM_MMX;
if(nBuff[3] & 1<<25) m_nCPUFeatures|=MPC_MM_SSE;
if(nBuff[3] & 1<<26) m_nCPUFeatures|=MPC_MM_SSE2;
if(nBuff[2] & 1<<0) m_nCPUFeatures|=MPC_MM_SSE3;
// Intel specific:
if(m_nType == PROCESSOR_INTEL)
{
if(nBuff[2] & 1<<9) m_nCPUFeatures|=MPC_MM_SSSE3;
// if(nBuff[2] & 1<<7) strcat(szFeatures, "EST ");
}
//if(nBuff[3] & 1<<28)
// strcat(szFeatures, "HTT ");
}
// AMD specific:
if(m_nType == PROCESSOR_AMD)
{
// Get extended features
__cpuid(nBuff, 0x80000000);
if(nHighestFeatureEx >= 0x80000001)
{
__cpuid(nBuff, 0x80000001);
if(nBuff[3] & 1<<31) m_nCPUFeatures|=MPC_MM_3DNOW;
// if(nBuff[3] & 1<<30) strcat(szFeatures, "Ex3DNow! ");
if(nBuff[3] & 1<<22) m_nCPUFeatures|=MPC_MM_MMXEXT;
}
// Get level 1 cache size
//if(nHighestFeatureEx >= 0x80000005)
//{
// __cpuid(nBuff, 0x80000005);
// ELog::Get().SystemFormat(L"PERF : L1 cache size: %dK\n", ((unsigned)nBuff[2])>>24);
//}
}
/*
// Get cache size
if(nHighestFeatureEx >= 0x80000006)
{
__cpuid(nBuff, 0x80000006);
ELog::Get().SystemFormat(L"PERF : L2 cache size: %dK\n", ((unsigned)nBuff[2])>>16);
}
// Log features
ELog::Get().SystemFormat(L"PERF : CPU Features: %S\n", szFeatures);
// Get misc system info
SYSTEM_INFO theInfo;
GetSystemInfo(&theInfo);
// Log number of CPUs and speeds
ELog::Get().SystemFormat(L"PERF : Number of CPUs: %d\n", theInfo.dwNumberOfProcessors);
for(DWORD i=0; i= 0x80000001)
{
if (m_CPUAMDInfo[3] & CPUID_MMXEXT) m_nDSPFlags|=MPC_MM_MMXEXT;
if (m_CPUAMDInfo[3] & CPUID_3DNOW) m_nDSPFlags|=MPC_MM_3DNOW;
}
break;
case PROCESSOR_INTEL :
if(m_CPUInfo[2] & CPUID_SSSE3) m_nDSPFlags|=MPC_MM_SSSE3;
break;
}
*/
}
int CCpuId::GetProcessorNumber()
{
SYSTEM_INFO SystemInfo;
GetSystemInfo(&SystemInfo);
return SystemInfo.dwNumberOfProcessors;
}