diff options
author | Bradley Smith <bradley.smith@arm.com> | 2014-05-22 11:44:34 +0000 |
---|---|---|
committer | Bradley Smith <bradley.smith@arm.com> | 2014-05-22 11:44:34 +0000 |
commit | 00011c71f92328253102032abdb3acbd97fc9d4b (patch) | |
tree | 75fda66b2d7dd929f616873c8f4a2485ac1b8365 /lib | |
parent | e3ece90f24497f63cd058f497dae61c4daa27452 (diff) | |
download | llvm-00011c71f92328253102032abdb3acbd97fc9d4b.tar.gz llvm-00011c71f92328253102032abdb3acbd97fc9d4b.tar.bz2 llvm-00011c71f92328253102032abdb3acbd97fc9d4b.tar.xz |
Extend sys::getHostCPUFeatures to work on AArch64 platforms
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@209420 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Support/Host.cpp | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/lib/Support/Host.cpp b/lib/Support/Host.cpp index e0e85630be..7e86e2ffcf 100644 --- a/lib/Support/Host.cpp +++ b/lib/Support/Host.cpp @@ -686,7 +686,7 @@ StringRef sys::getHostCPUName() { } #endif -#if defined(__linux__) && defined(__arm__) +#if defined(__linux__) && (defined(__arm__) || defined(__aarch64__)) bool sys::getHostCPUFeatures(StringMap<bool> &Features) { std::string Err; DataStreamer *DS = getDataFileStreamer("/proc/cpuinfo", &Err); @@ -715,8 +715,24 @@ bool sys::getHostCPUFeatures(StringMap<bool> &Features) { break; } +#if defined(__aarch64__) + // Keep track of which crypto features we have seen + enum { + HWCAP_AES = 0x1, + HWCAP_PMULL = 0x2, + HWCAP_SHA1 = 0x4, + HWCAP_SHA2 = 0x8 + }; + uint32_t crypto = 0; +#endif + for (unsigned I = 0, E = CPUFeatures.size(); I != E; ++I) { StringRef LLVMFeatureStr = StringSwitch<StringRef>(CPUFeatures[I]) +#if defined(__aarch64__) + .Case("asimd", "neon") + .Case("fp", "fp-armv8") + .Case("crc32", "crc") +#else .Case("half", "fp16") .Case("neon", "neon") .Case("vfpv3", "vfp3") @@ -724,12 +740,32 @@ bool sys::getHostCPUFeatures(StringMap<bool> &Features) { .Case("vfpv4", "vfp4") .Case("idiva", "hwdiv-arm") .Case("idivt", "hwdiv") +#endif .Default(""); +#if defined(__aarch64__) + // We need to check crypto seperately since we need all of the crypto + // extensions to enable the subtarget feature + if (CPUFeatures[I] == "aes") + crypto |= HWCAP_AES; + else if (CPUFeatures[I] == "pmull") + crypto |= HWCAP_PMULL; + else if (CPUFeatures[I] == "sha1") + crypto |= HWCAP_SHA1; + else if (CPUFeatures[I] == "sha2") + crypto |= HWCAP_SHA2; +#endif + if (LLVMFeatureStr != "") Features.GetOrCreateValue(LLVMFeatureStr).setValue(true); } +#if defined(__aarch64__) + // If we have all crypto bits we can add the feature + if (crypto == (HWCAP_AES | HWCAP_PMULL | HWCAP_SHA1 | HWCAP_SHA2)) + Features.GetOrCreateValue("crypto").setValue(true); +#endif + return true; } #else |