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