@@ -382,29 +382,21 @@ int32 PCM::getMaxCustomCoreEvents()
382382 return core_gen_counter_num_max;
383383}
384384
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-
399385int PCM::getCPUFamilyModelFromCPUID ()
400386{
401387 static int result = -1 ;
402388 if (result < 0 )
403389 {
404390 PCM_CPUID_INFO cpuinfo;
405391 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+
408400 result = PCM_CPU_FAMILY_MODEL (cpu_family_, cpu_model_);
409401 }
410402 return result;
@@ -432,9 +424,11 @@ bool PCM::detectModel()
432424 max_cpuid = cpuinfo.array [0 ];
433425
434426 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 ;
438432 cpu_stepping = cpuinfo.array [0 ] & 0x0f ;
439433
440434 if (cpuinfo.reg .ecx & (1UL << 31UL )) {
0 commit comments