5858#include < asm/hwcap.h> /* Get HWCAP bits from asm/hwcap.h */
5959#include < sys/auxv.h>
6060#elif (defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__APPLE__)) && defined(__aarch64__)
61+ #include < sys/auxv.h>
6162#include < sys/sysctl.h>
6263#include < sys/types.h>
64+ #include < unistd.h>
6365#endif /* defined(__APPLE__) && defined(__aarch64__)) */
6466#endif /* !defined(BARE_METAL) && !defined(__APPLE__) && !defined(__OpenBSD__) && !defined(__FreeBSD__) && !defined(__QNX__) && (defined(__arm__) || defined(__aarch64__)) */
6567
@@ -435,8 +437,33 @@ CpuInfo CpuInfo::build()
435437 std::vector<CpuModel> cpus_model (1 , midr_to_model (midr));
436438 CpuInfo info (isa, cpus_model);
437439 return info;
438- #elif defined(__aarch64__) && (defined(__OpenBSD__) || defined(__FreeBSD__) || \
439- defined (__APPLE__)) /* #elif(BARE_METAL) && defined(__aarch64__) */
440+
441+ #elif defined(__aarch64__) && (defined(__OpenBSD__) || defined(__FreeBSD__))
442+ /* #elif(BARE_METAL) && defined(__aarch64__) */
443+ int ncpus = sysconf (_SC_NPROCESSORS_ONLN);
444+
445+ unsigned long hwcap = 0 , hwcap2 = 0 ;
446+ elf_aux_info (AT_HWCAP, &hwcap, sizeof (hwcap));
447+ elf_aux_info (AT_HWCAP2, &hwcap2, sizeof (hwcap2));
448+
449+ CpuIsaInfo isainfo;
450+ std::vector<CpuModel> cpus_model (ncpus);
451+
452+ isainfo.neon = (hwcap & HWCAP_ASIMD) != 0 ;
453+ isainfo.fp16 = (hwcap & HWCAP_FPHP) != 0 ;
454+ isainfo.dot = (hwcap & HWCAP_ASIMDDP) != 0 ;
455+ isainfo.bf16 = (hwcap2 & HWCAP2_BF16) != 0 ;
456+ isainfo.i8mm = (hwcap2 & HWCAP2_I8MM) != 0 ;
457+ isainfo.sme = (hwcap2 & HWCAP2_SME) != 0 ;
458+ isainfo.sme2 = (hwcap2 & HWCAP2_SME2) != 0 ;
459+ isainfo.sme_f32f32 = (hwcap2 & HWCAP2_SME_F32F32) != 0 ;
460+ isainfo.sme_i8i32 = (hwcap2 & HWCAP2_SME_I8I32) != 0 ;
461+ isainfo.sme_f16f32 = (hwcap2 & HWCAP2_SME_F16F32) != 0 ;
462+ isainfo.sme_b16f32 = (hwcap2 & HWCAP2_SME_B16F32) != 0 ;
463+ CpuInfo info (isainfo, cpus_model);
464+ return info;
465+
466+ #elif defined(__aarch64__) && defined(__APPLE__)
440467 int ncpus = get_hw_capability (" hw.perflevel0.logicalcpu" );
441468 CpuIsaInfo isainfo;
442469 std::vector<CpuModel> cpus_model (ncpus);
@@ -453,7 +480,7 @@ CpuInfo CpuInfo::build()
453480 isainfo.sme2 = get_hw_capability (" hw.optional.arm.FEAT_SME2" );
454481 CpuInfo info (isainfo, cpus_model);
455482 return info;
456- #elif defined(__aarch64__) && defined(_WIN64) /* #elif defined(__aarch64__) && defined(__APPLE__) */
483+ #elif defined(__aarch64__) && defined(_WIN64) /* #elif defined(__aarch64__) && defined(__APPLE__) */
457484 CpuIsaInfo isainfo;
458485
459486 isainfo.neon = IsProcessorFeaturePresent (PF_ARM_NEON_INSTRUCTIONS_AVAILABLE);
@@ -485,7 +512,7 @@ CpuInfo CpuInfo::build()
485512 std::vector<CpuModel> cpus_model (ncpus);
486513 CpuInfo info (isainfo, cpus_model);
487514 return info;
488- #else /* #elif defined(__aarch64__) && defined(_WIN64) */
515+ #else /* #elif defined(__aarch64__) && defined(_WIN64) */
489516 CpuInfo info (CpuIsaInfo (), {CpuModel::GENERIC});
490517 return info;
491518#endif /* !defined(BARE_METAL) && !defined(__APPLE__) && !defined(__OpenBSD__) && (defined(__arm__) || defined(__aarch64__)) */
0 commit comments