mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183790 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -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){
|
||||
|
Reference in New Issue
Block a user