diff options
author | Alexandros Lamprineas <alexandros.lamprineas@arm.com> | 2015-09-05 17:05:33 +0000 |
---|---|---|
committer | Alexandros Lamprineas <alexandros.lamprineas@arm.com> | 2015-09-05 17:05:33 +0000 |
commit | ea33e5e88e0e55c05a659d0b5f85327e204faa49 (patch) | |
tree | 655eabfc728bf96ecdad5e947d01ce72cd790748 /llvm/lib/Support/TargetParser.cpp | |
parent | e3d8c05c5fd26c1978fdd136a3622a31930fcdd1 (diff) | |
download | bcm5719-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.cpp | 35 |
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) |