@@ -382,29 +382,21 @@ int32 PCM::getMaxCustomCoreEvents()
382
382
return core_gen_counter_num_max;
383
383
}
384
384
385
- /*
386
- int PCM::getCPUModelFromCPUID()
387
- {
388
- static int result = -1;
389
- if (result < 0)
390
- {
391
- PCM_CPUID_INFO cpuinfo;
392
- pcm_cpuid(1, cpuinfo);
393
- result = (((cpuinfo.array[0]) & 0xf0) >> 4) | ((cpuinfo.array[0] & 0xf0000) >> 12);
394
- }
395
- return result;
396
- }
397
- */
398
-
399
385
int PCM::getCPUFamilyModelFromCPUID ()
400
386
{
401
387
static int result = -1 ;
402
388
if (result < 0 )
403
389
{
404
390
PCM_CPUID_INFO cpuinfo;
405
391
pcm_cpuid (1 , cpuinfo);
406
- const auto cpu_family_ = (((cpuinfo.array [0 ]) >> 8 ) & 0xf ) | ((cpuinfo.array [0 ] & 0xf00000 ) >> 16 );
407
- const auto cpu_model_ = (((cpuinfo.array [0 ]) & 0xf0 ) >> 4 ) | ((cpuinfo.array [0 ] & 0xf0000 ) >> 12 );
392
+ // follow https://www.felixcloutier.com/x86/cpuid#fig-3-6
393
+ unsigned int Family_ID = (cpuinfo.array [0 ] >> 8 ) & 0xF ;
394
+ unsigned int Extended_Family_ID = (cpuinfo.array [0 ] >> 20 ) & 0xFF ;
395
+ unsigned int Model_ID = (cpuinfo.array [0 ] >> 4 ) & 0xF ;
396
+ unsigned int Extended_Model_ID = (cpuinfo.array [0 ] >> 16 ) & 0xF ;
397
+ const auto cpu_family_ = (Family_ID != 0x0F ) ? Family_ID : (Extended_Family_ID + Family_ID);
398
+ const auto cpu_model_ = (Family_ID == 0x06 || Family_ID == 0x0F ) ? (Model_ID + (Extended_Model_ID << 4 )) : Model_ID;
399
+
408
400
result = PCM_CPU_FAMILY_MODEL (cpu_family_, cpu_model_);
409
401
}
410
402
return result;
@@ -432,9 +424,11 @@ bool PCM::detectModel()
432
424
max_cpuid = cpuinfo.array [0 ];
433
425
434
426
pcm_cpuid (1 , cpuinfo);
435
- cpu_family = (((cpuinfo.array [0 ]) >> 8 ) & 0xf ) | ((cpuinfo.array [0 ] & 0xf00000 ) >> 16 );
436
- cpu_model_private = (((cpuinfo.array [0 ]) & 0xf0 ) >> 4 ) | ((cpuinfo.array [0 ] & 0xf0000 ) >> 12 );
437
- cpu_family_model = PCM_CPU_FAMILY_MODEL (cpu_family, cpu_model_private);
427
+
428
+ DBG (2 , " cpuinfo.array[0]: 0x" , std::hex , cpuinfo.array [0 ] , std::dec);
429
+ cpu_family_model = getCPUFamilyModelFromCPUID ();
430
+ cpu_family = (cpu_family_model >> 8 ) & 0xff ;
431
+ cpu_model_private = cpu_family_model & 0xff ;
438
432
cpu_stepping = cpuinfo.array [0 ] & 0x0f ;
439
433
440
434
if (cpuinfo.reg .ecx & (1UL << 31UL )) {
0 commit comments