// to determine number of processors.
void getCpuInfo0B()
{
- int level=0;
int threadsPerCore;
uint a, b, c, d;
- do {
+ // I'm not sure about this. The docs state that there
+ // are 2 hyperthreads per core if HT is factory enabled.
+ for (int level = 0; level < 2; level++)
+ {
version (GNU_OR_LDC) asm pure nothrow @nogc {
"cpuid" : "=a" (a), "=b" (b), "=c" (c), "=d" (d) : "a" (0x0B), "c" (level);
} else asm pure nothrow @nogc {
mov c, ECX;
mov d, EDX;
}
- if (b!=0) {
- // I'm not sure about this. The docs state that there
- // are 2 hyperthreads per core if HT is factory enabled.
- if (level==0)
+ if (b != 0)
+ {
+ if (level == 0)
threadsPerCore = b & 0xFFFF;
- else if (level==1) {
+ else if (level == 1)
+ {
cpuFeatures.maxThreads = b & 0xFFFF;
cpuFeatures.maxCores = cpuFeatures.maxThreads / threadsPerCore;
}
-
}
- ++level;
- } while (a!=0 || b!=0);
+ // Got "invalid domain" returned from cpuid
+ if (a == 0 && b == 0)
+ break;
+ }
}
void cpuidX86()