forked from OSchip/llvm-project
Make host ARM CPU feature detection independent of the vendor
For ARM on linux we use /proc/cpuinfo to detect the host CPU's features. Linux derives these values without ever looking at the vendor of the specific CPU implementation. Hence, it adds little value, if we parse the output of /proc/cpuinfo only for certain vendors. This patch enables us to derive the correct feature flags e.g. for Qualcomm CPUs. llvm-svn: 183790
This commit is contained in:
parent
dd76f067f7
commit
bd9e549e21
|
@ -570,41 +570,31 @@ bool sys::getHostCPUFeatures(StringMap<bool> &Features) {
|
|||
SmallVector<StringRef, 32> Lines;
|
||||
Str.split(Lines, "\n");
|
||||
|
||||
// Look for the CPU implementer line.
|
||||
StringRef Implementer;
|
||||
SmallVector<StringRef, 32> CPUFeatures;
|
||||
|
||||
// Look for the CPU features.
|
||||
for (unsigned I = 0, E = Lines.size(); I != E; ++I)
|
||||
if (Lines[I].startswith("CPU implementer"))
|
||||
Implementer = Lines[I].substr(15).ltrim("\t :");
|
||||
|
||||
if (Implementer == "0x41") { // ARM Ltd.
|
||||
SmallVector<StringRef, 32> CPUFeatures;
|
||||
|
||||
// Look for the CPU features.
|
||||
for (unsigned I = 0, E = Lines.size(); I != E; ++I)
|
||||
if (Lines[I].startswith("Features")) {
|
||||
Lines[I].split(CPUFeatures, " ");
|
||||
break;
|
||||
}
|
||||
|
||||
for (unsigned I = 0, E = CPUFeatures.size(); I != E; ++I) {
|
||||
StringRef LLVMFeatureStr = StringSwitch<StringRef>(CPUFeatures[I])
|
||||
.Case("half", "fp16")
|
||||
.Case("neon", "neon")
|
||||
.Case("vfpv3", "vfp3")
|
||||
.Case("vfpv3d16", "d16")
|
||||
.Case("vfpv4", "vfp4")
|
||||
.Case("idiva", "hwdiv-arm")
|
||||
.Case("idivt", "hwdiv")
|
||||
.Default("");
|
||||
|
||||
if (LLVMFeatureStr != "")
|
||||
Features.GetOrCreateValue(LLVMFeatureStr).setValue(true);
|
||||
if (Lines[I].startswith("Features")) {
|
||||
Lines[I].split(CPUFeatures, " ");
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
for (unsigned I = 0, E = CPUFeatures.size(); I != E; ++I) {
|
||||
StringRef LLVMFeatureStr = StringSwitch<StringRef>(CPUFeatures[I])
|
||||
.Case("half", "fp16")
|
||||
.Case("neon", "neon")
|
||||
.Case("vfpv3", "vfp3")
|
||||
.Case("vfpv3d16", "d16")
|
||||
.Case("vfpv4", "vfp4")
|
||||
.Case("idiva", "hwdiv-arm")
|
||||
.Case("idivt", "hwdiv")
|
||||
.Default("");
|
||||
|
||||
if (LLVMFeatureStr != "")
|
||||
Features.GetOrCreateValue(LLVMFeatureStr).setValue(true);
|
||||
}
|
||||
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
bool sys::getHostCPUFeatures(StringMap<bool> &Features){
|
||||
|
|
Loading…
Reference in New Issue