summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support/TargetParser.cpp
diff options
context:
space:
mode:
authorAlexandros Lamprineas <alexandros.lamprineas@arm.com>2015-09-05 17:05:33 +0000
committerAlexandros Lamprineas <alexandros.lamprineas@arm.com>2015-09-05 17:05:33 +0000
commitea33e5e88e0e55c05a659d0b5f85327e204faa49 (patch)
tree655eabfc728bf96ecdad5e947d01ce72cd790748 /llvm/lib/Support/TargetParser.cpp
parente3d8c05c5fd26c1978fdd136a3622a31930fcdd1 (diff)
downloadbcm5719-llvm-ea33e5e88e0e55c05a659d0b5f85327e204faa49.tar.gz
bcm5719-llvm-ea33e5e88e0e55c05a659d0b5f85327e204faa49.zip
Added arch extensions and default target features in TargetParser.
Differential: http://reviews.llvm.org/D11590 llvm-svn: 246930
Diffstat (limited to 'llvm/lib/Support/TargetParser.cpp')
-rw-r--r--llvm/lib/Support/TargetParser.cpp35
1 files changed, 30 insertions, 5 deletions
diff --git a/llvm/lib/Support/TargetParser.cpp b/llvm/lib/Support/TargetParser.cpp
index 4f5d9acba51..b2bf980cf6d 100644
--- a/llvm/lib/Support/TargetParser.cpp
+++ b/llvm/lib/Support/TargetParser.cpp
@@ -59,6 +59,7 @@ struct {
const char *SubArchCStr;
size_t SubArchLength;
ARMBuildAttrs::CPUArch ArchAttr; // Arch ID in build attributes.
+ unsigned ArchBaseExtensions;
StringRef getName() const { return StringRef(NameCStr, NameLength); }
@@ -68,9 +69,9 @@ struct {
// Sub-Arch name.
StringRef getSubArch() const { return StringRef(SubArchCStr, SubArchLength); }
} ARCHNames[] = {
-#define ARM_ARCH(NAME, ID, CPU_ATTR, SUB_ARCH, ARCH_ATTR) \
+#define ARM_ARCH(NAME, ID, CPU_ATTR, SUB_ARCH, ARCH_ATTR, ARCH_BASE_EXT) \
{NAME, sizeof(NAME) - 1, ID, CPU_ATTR, sizeof(CPU_ATTR) - 1, SUB_ARCH, \
- sizeof(SUB_ARCH) - 1, ARCH_ATTR},
+ sizeof(SUB_ARCH) - 1, ARCH_ATTR, ARCH_BASE_EXT},
#include "llvm/Support/ARMTargetParser.def"
};
@@ -111,11 +112,12 @@ struct {
size_t NameLength;
ARM::ArchKind ArchID;
bool Default; // is $Name the default CPU for $ArchID ?
+ unsigned DefaultExtensions;
StringRef getName() const { return StringRef(NameCStr, NameLength); }
} CPUNames[] = {
-#define ARM_CPU_NAME(NAME, ID, DEFAULT_FPU, IS_DEFAULT) \
- { NAME, sizeof(NAME) - 1, ID, IS_DEFAULT },
+#define ARM_CPU_NAME(NAME, ID, DEFAULT_FPU, IS_DEFAULT, DEFAULT_EXT) \
+ { NAME, sizeof(NAME) - 1, ID, IS_DEFAULT, DEFAULT_EXT },
#include "llvm/Support/ARMTargetParser.def"
};
@@ -151,7 +153,7 @@ unsigned llvm::ARM::getFPURestriction(unsigned FPUKind) {
unsigned llvm::ARM::getDefaultFPU(StringRef CPU) {
return StringSwitch<unsigned>(CPU)
-#define ARM_CPU_NAME(NAME, ID, DEFAULT_FPU, IS_DEFAULT) \
+#define ARM_CPU_NAME(NAME, ID, DEFAULT_FPU, IS_DEFAULT, DEFAULT_EXT) \
.Case(NAME, DEFAULT_FPU)
#include "llvm/Support/ARMTargetParser.def"
.Default(ARM::FK_INVALID);
@@ -176,6 +178,20 @@ bool llvm::ARM::getHWDivFeatures(unsigned HWDivKind,
return true;
}
+bool llvm::ARM::getExtensionFeatures(unsigned Extensions,
+ std::vector<const char *> &Features) {
+
+ if (Extensions == ARM::AEK_INVALID)
+ return false;
+
+ if (Extensions & ARM::AEK_CRC)
+ Features.push_back("+crc");
+ else
+ Features.push_back("-crc");
+
+ return getHWDivFeatures(Extensions, Features);
+}
+
bool llvm::ARM::getFPUFeatures(unsigned FPUKind,
std::vector<const char *> &Features) {
@@ -242,6 +258,7 @@ bool llvm::ARM::getFPUFeatures(unsigned FPUKind,
// crypto includes neon, so we handle this similarly to FPU version.
switch (FPUNames[FPUKind].NeonSupport) {
case ARM::NS_Crypto:
+ Features.push_back("+neon");
Features.push_back("+crypto");
break;
case ARM::NS_Neon:
@@ -297,6 +314,14 @@ StringRef llvm::ARM::getHWDivName(unsigned HWDivKind) {
return StringRef();
}
+unsigned llvm::ARM::getDefaultExtensions(StringRef CPU) {
+ for (const auto C : CPUNames) {
+ if (CPU == C.getName())
+ return (ARCHNames[C.ArchID].ArchBaseExtensions | C.DefaultExtensions);
+ }
+ return ARM::AEK_INVALID;
+}
+
StringRef llvm::ARM::getDefaultCPU(StringRef Arch) {
unsigned AK = parseArch(Arch);
if (AK == ARM::AK_INVALID)
OpenPOWER on IntegriCloud