108 lines · plain
1#if __has_include(<sys/auxv.h>)2#include <sys/auxv.h>3#define HAVE_SYS_AUXV_H4#endif5 6static void __init_cpu_features_constructor(unsigned long hwcap,7 const __ifunc_arg_t *arg) {8 unsigned long long feat = 0;9#define setCPUFeature(F) feat |= 1ULL << F10 unsigned long hwcap2 = 0;11 if (hwcap & _IFUNC_ARG_HWCAP)12 hwcap2 = arg->_hwcap2;13 if (hwcap & HWCAP_CRC32)14 setCPUFeature(FEAT_CRC);15 if (hwcap & HWCAP_PMULL)16 setCPUFeature(FEAT_PMULL);17 if (hwcap & HWCAP_FLAGM)18 setCPUFeature(FEAT_FLAGM);19 if (hwcap2 & HWCAP2_FLAGM2)20 setCPUFeature(FEAT_FLAGM2);21 if (hwcap & HWCAP_SM4)22 setCPUFeature(FEAT_SM4);23 if (hwcap & HWCAP_ASIMDDP)24 setCPUFeature(FEAT_DOTPROD);25 if (hwcap & HWCAP_ASIMDFHM)26 setCPUFeature(FEAT_FP16FML);27 if (hwcap & HWCAP_FPHP)28 setCPUFeature(FEAT_FP16);29 if (hwcap & HWCAP_DIT)30 setCPUFeature(FEAT_DIT);31 if (hwcap & HWCAP_ASIMDRDM)32 setCPUFeature(FEAT_RDM);33 if (hwcap & HWCAP_SHA2)34 setCPUFeature(FEAT_SHA2);35 if (hwcap & HWCAP_JSCVT)36 setCPUFeature(FEAT_JSCVT);37 if (hwcap & HWCAP_FCMA)38 setCPUFeature(FEAT_FCMA);39 if (hwcap & HWCAP_SB)40 setCPUFeature(FEAT_SB);41 if (hwcap & HWCAP_SSBS)42 setCPUFeature(FEAT_SSBS2);43 if (hwcap2 & HWCAP2_MTE)44 setCPUFeature(FEAT_MEMTAG2);45 if (hwcap2 & HWCAP2_SVEPMULL)46 setCPUFeature(FEAT_SVE_PMULL128);47 if (hwcap2 & HWCAP2_SVEBITPERM)48 setCPUFeature(FEAT_SVE_BITPERM);49 if (hwcap2 & HWCAP2_SVESHA3)50 setCPUFeature(FEAT_SVE_SHA3);51 if (hwcap2 & HWCAP2_SVESM4)52 setCPUFeature(FEAT_SVE_SM4);53 if (hwcap2 & HWCAP2_DCPODP)54 setCPUFeature(FEAT_DPB2);55 if (hwcap & HWCAP_ATOMICS)56 setCPUFeature(FEAT_LSE);57 if (hwcap2 & HWCAP2_RNG)58 setCPUFeature(FEAT_RNG);59 if (hwcap2 & HWCAP2_I8MM)60 setCPUFeature(FEAT_I8MM);61 if (hwcap2 & HWCAP2_FRINT)62 setCPUFeature(FEAT_FRINTTS);63 if (hwcap2 & HWCAP2_SVEF32MM)64 setCPUFeature(FEAT_SVE_F32MM);65 if (hwcap2 & HWCAP2_SVEF64MM)66 setCPUFeature(FEAT_SVE_F64MM);67 if (hwcap2 & HWCAP2_BTI)68 setCPUFeature(FEAT_BTI);69 if (hwcap2 & HWCAP2_WFXT)70 setCPUFeature(FEAT_WFXT);71 if (hwcap2 & HWCAP2_SME)72 setCPUFeature(FEAT_SME);73 if (hwcap2 & HWCAP2_SME2)74 setCPUFeature(FEAT_SME2);75 if (hwcap2 & HWCAP2_SME_I16I64)76 setCPUFeature(FEAT_SME_I64);77 if (hwcap2 & HWCAP2_SME_F64F64)78 setCPUFeature(FEAT_SME_F64);79 if (hwcap2 & HWCAP2_MOPS)80 setCPUFeature(FEAT_MOPS);81 if (hwcap2 & HWCAP2_CSSC)82 setCPUFeature(FEAT_CSSC);83 if (hwcap & HWCAP_FP) {84 setCPUFeature(FEAT_FP);85 // FP and AdvSIMD fields have the same value86 setCPUFeature(FEAT_SIMD);87 }88 if (hwcap & HWCAP_DCPOP)89 setCPUFeature(FEAT_DPB);90 if (hwcap & HWCAP_LRCPC)91 setCPUFeature(FEAT_RCPC);92 if (hwcap & HWCAP_ILRCPC)93 setCPUFeature(FEAT_RCPC2);94 if (hwcap2 & HWCAP2_LRCPC3)95 setCPUFeature(FEAT_RCPC3);96 if (hwcap2 & HWCAP2_BF16)97 setCPUFeature(FEAT_BF16);98 if (hwcap & HWCAP_SVE)99 setCPUFeature(FEAT_SVE);100 if (hwcap2 & HWCAP2_SVE2)101 setCPUFeature(FEAT_SVE2);102 if (hwcap & HWCAP_SHA3)103 setCPUFeature(FEAT_SHA3);104 setCPUFeature(FEAT_INIT);105 106 __atomic_store_n(&__aarch64_cpu_features.features, feat, __ATOMIC_RELAXED);107}108