@@ -443,17 +443,22 @@ CpuInfo CpuInfo::build()
443443
444444 CpuIsaInfo isainfo;
445445 std::vector<CpuModel> cpus_model (ncpus);
446- isainfo.neon = get_hw_capability (" hw.optional.neon" );
447- isainfo.fp16 = get_hw_capability (" hw.optional.neon_fp16" );
448- isainfo.dot = get_hw_capability (" hw.optional.arm.FEAT_DotProd" );
449- isainfo.bf16 = get_hw_capability (" hw.optional.arm.FEAT_BF16" );
450- isainfo.i8mm = get_hw_capability (" hw.optional.arm.FEAT_I8MM" );
451- isainfo.sme = get_hw_capability (" hw.optional.arm.FEAT_SME" );
452- isainfo.sme_f32f32 = get_hw_capability (" hw.optional.arm.SME_F32F32" );
453- isainfo.sme_b16f32 = get_hw_capability (" hw.optional.arm.SME_B16F32" );
454- isainfo.sme_f16f32 = get_hw_capability (" hw.optional.arm.SME_F16F32" );
455- isainfo.sme_i8i32 = get_hw_capability (" hw.optional.arm.SME_I8I32" );
456- isainfo.sme2 = get_hw_capability (" hw.optional.arm.FEAT_SME2" );
446+
447+ unsigned long hwcap = 0 , hwcap2 = 0 ;
448+ elf_aux_info (AT_HWCAP, &hwcap, sizeof (hwcap));
449+ elf_aux_info (AT_HWCAP2, &hwcap2, sizeof (hwcap2));
450+
451+ isainfo.neon = (hwcap & HWCAP_ASIMD) != 0 ;
452+ isainfo.fp16 = (hwcap & HWCAP_FPHP) != 0 ;
453+ isainfo.dot = (hwcap & HWCAP_ASIMDDP) != 0 ;
454+ isainfo.bf16 = (hwcap2 & HWCAP2_BF16) != 0 ;
455+ isainfo.i8mm = (hwcap2 & HWCAP2_I8MM) != 0 ;
456+ isainfo.sme = (hwcap2 & HWCAP2_SME) != 0 ;
457+ isainfo.sme2 = (hwcap2 & HWCAP2_SME2) != 0 ;
458+ isainfo.sme_f32f32 = (hwcap2 & HWCAP2_SME_F32F32) != 0 ;
459+ isainfo.sme_i8i32 = (hwcap2 & HWCAP2_SME_I8I32) != 0 ;
460+ isainfo.sme_f16f32 = (hwcap2 & HWCAP2_SME_F16F32) != 0 ;
461+ isainfo.sme_b16f32 = (hwcap2 & HWCAP2_SME_B16F32) != 0 ;
457462 CpuInfo info (isainfo, cpus_model);
458463 return info;
459464
0 commit comments