brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.6 KiB · bb241f4 Raw
50 lines · plain
1#include <zircon/features.h>2#include <zircon/syscalls.h>3 4void __init_cpu_features_resolver() {5  if (__atomic_load_n(&__aarch64_cpu_features.features, __ATOMIC_RELAXED))6    return;7 8    // This ensures the vDSO is a direct link-time dependency of anything that9    // needs this initializer code.10#pragma comment(lib, "zircon")11  uint32_t features;12  zx_status_t status = _zx_system_get_features(ZX_FEATURE_KIND_CPU, &features);13  if (status != ZX_OK)14    return;15 16  unsigned long long feat = 0;17#define setCPUFeature(cpu_feature) feat |= 1ULL << cpu_feature18 19  if (features & ZX_ARM64_FEATURE_ISA_FP)20    setCPUFeature(FEAT_FP);21  if (features & ZX_ARM64_FEATURE_ISA_ASIMD)22    setCPUFeature(FEAT_SIMD);23  if (features & ZX_ARM64_FEATURE_ISA_PMULL)24    setCPUFeature(FEAT_PMULL);25  if (features & ZX_ARM64_FEATURE_ISA_SHA256)26    setCPUFeature(FEAT_SHA2);27  if (features & ZX_ARM64_FEATURE_ISA_CRC32)28    setCPUFeature(FEAT_CRC);29  if (features & ZX_ARM64_FEATURE_ISA_RDM)30    setCPUFeature(FEAT_RDM);31  if (features & ZX_ARM64_FEATURE_ISA_SHA3)32    setCPUFeature(FEAT_SHA3);33  if (features & ZX_ARM64_FEATURE_ISA_SM4)34    setCPUFeature(FEAT_SM4);35  if (features & ZX_ARM64_FEATURE_ISA_DP)36    setCPUFeature(FEAT_DOTPROD);37  if (features & ZX_ARM64_FEATURE_ISA_FHM)38    setCPUFeature(FEAT_FP16FML);39  if (features & ZX_ARM64_FEATURE_ISA_SHA512)40    setCPUFeature(FEAT_SHA3);41  if (features & ZX_ARM64_FEATURE_ISA_I8MM)42    setCPUFeature(FEAT_I8MM);43  if (features & ZX_ARM64_FEATURE_ISA_SVE)44    setCPUFeature(FEAT_SVE);45 46  setCPUFeature(FEAT_INIT);47 48  __atomic_store_n(&__aarch64_cpu_features.features, feat, __ATOMIC_RELAXED);49}50