mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-23 06:09:50 -06:00
* Better fix for CPUID (and this time is the right time)
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7038 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
@ -133,13 +133,15 @@ void CPUInfo::Detect()
|
|||||||
strcpy(brand_string, cpu_string);
|
strcpy(brand_string, cpu_string);
|
||||||
|
|
||||||
// Detect family and other misc stuff.
|
// Detect family and other misc stuff.
|
||||||
HTT = false;
|
bool ht = false;
|
||||||
|
HTT = ht;
|
||||||
logical_cpu_count = 1;
|
logical_cpu_count = 1;
|
||||||
if (max_std_fn >= 1) {
|
if (max_std_fn >= 1) {
|
||||||
__cpuid(cpu_id, 0x00000001);
|
__cpuid(cpu_id, 0x00000001);
|
||||||
logical_cpu_count = (cpu_id[1] >> 16) & 0xFF;
|
logical_cpu_count = (cpu_id[1] >> 16) & 0xFF;
|
||||||
// HTT is valid for intel processors only.
|
ht = (cpu_id[3] >> 28) & 1;
|
||||||
HTT = ((cpu_id[3] >> 28) & 1) && vendor == VENDOR_INTEL;
|
// True HTT is valid for intel processors only.
|
||||||
|
HTT = (ht && vendor == VENDOR_INTEL);
|
||||||
if ((cpu_id[3] >> 25) & 1) bSSE = true;
|
if ((cpu_id[3] >> 25) & 1) bSSE = true;
|
||||||
if ((cpu_id[3] >> 26) & 1) bSSE2 = true;
|
if ((cpu_id[3] >> 26) & 1) bSSE2 = true;
|
||||||
if ((cpu_id[2]) & 1) bSSE3 = true;
|
if ((cpu_id[2]) & 1) bSSE3 = true;
|
||||||
@ -171,14 +173,16 @@ void CPUInfo::Detect()
|
|||||||
__cpuid(cpu_id, 0x80000008);
|
__cpuid(cpu_id, 0x80000008);
|
||||||
int apic_id_core_id_size = (cpu_id[2] >> 12) & 0xF;
|
int apic_id_core_id_size = (cpu_id[2] >> 12) & 0xF;
|
||||||
if (apic_id_core_id_size == 0) {
|
if (apic_id_core_id_size == 0) {
|
||||||
// New mechanism for modern CPUs.
|
|
||||||
num_cores = logical_cpu_count;
|
num_cores = logical_cpu_count;
|
||||||
if (HTT) {
|
if (ht) {
|
||||||
__cpuid(cpu_id, 0x00000004);
|
// New mechanism for modern Intel CPUs.
|
||||||
int cores_x_package = ((cpu_id[0] >> 26) & 0x3F) + 1;
|
if (HTT) {
|
||||||
cores_x_package = ((logical_cpu_count % cores_x_package) == 0) ? cores_x_package : 1;
|
__cpuid(cpu_id, 0x00000004);
|
||||||
num_cores = (cores_x_package > 1) ? cores_x_package : num_cores;
|
int cores_x_package = ((cpu_id[0] >> 26) & 0x3F) + 1;
|
||||||
logical_cpu_count /= cores_x_package;
|
cores_x_package = ((logical_cpu_count % cores_x_package) == 0) ? cores_x_package : 1;
|
||||||
|
num_cores = (cores_x_package > 1) ? cores_x_package : num_cores;
|
||||||
|
logical_cpu_count /= cores_x_package;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user