brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.1 KiB · 0f56cef Raw
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