- Added support for parsing HWDiv features using Target Parser.

- Architecture extensions are represented as a bitmap.

Phabricator: http://reviews.llvm.org/D11457

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@243335 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Alexandros Lamprineas
2015-07-27 22:26:59 +00:00
parent f78e199cb2
commit 10da90aaf3
4 changed files with 100 additions and 36 deletions
+76 -18
View File
@@ -113,22 +113,36 @@ struct {
// FIXME: TableGen this.
struct {
const char *Name;
ARM::ArchExtKind ID;
unsigned ID;
} ARCHExtNames[] = {
{ "invalid", ARM::AEK_INVALID },
{ "crc", ARM::AEK_CRC },
{ "crypto", ARM::AEK_CRYPTO },
{ "fp", ARM::AEK_FP },
{ "idiv", ARM::AEK_HWDIV },
{ "mp", ARM::AEK_MP },
{ "simd", ARM::AEK_SIMD },
{ "sec", ARM::AEK_SEC },
{ "virt", ARM::AEK_VIRT },
{ "os", ARM::AEK_OS },
{ "iwmmxt", ARM::AEK_IWMMXT },
{ "iwmmxt2", ARM::AEK_IWMMXT2 },
{ "maverick", ARM::AEK_MAVERICK },
{ "xscale", ARM::AEK_XSCALE }
{ "invalid", ARM::AEK_INVALID },
{ "none", ARM::AEK_NONE },
{ "crc", ARM::AEK_CRC },
{ "crypto", ARM::AEK_CRYPTO },
{ "fp", ARM::AEK_FP },
{ "idiv", (ARM::AEK_HWDIVARM | ARM::AEK_HWDIV) },
{ "mp", ARM::AEK_MP },
{ "simd", ARM::AEK_SIMD },
{ "sec", ARM::AEK_SEC },
{ "virt", ARM::AEK_VIRT },
{ "os", ARM::AEK_OS },
{ "iwmmxt", ARM::AEK_IWMMXT },
{ "iwmmxt2", ARM::AEK_IWMMXT2 },
{ "maverick", ARM::AEK_MAVERICK },
{ "xscale", ARM::AEK_XSCALE }
};
// List of HWDiv names (use getHWDivSynonym) and which architectural
// features they correspond to (use getHWDivFeatures).
// FIXME: TableGen this.
struct {
const char *Name;
unsigned ID;
} HWDivNames[] = {
{ "invalid", ARM::AEK_INVALID },
{ "none", ARM::AEK_NONE },
{ "thumb", ARM::AEK_HWDIV },
{ "arm", ARM::AEK_HWDIVARM },
{ "arm,thumb", (ARM::AEK_HWDIVARM | ARM::AEK_HWDIV) }
};
// List of CPU names and their arches.
// The same CPU can have multiple arches and can be default on multiple arches.
@@ -266,6 +280,25 @@ unsigned ARMTargetParser::getDefaultFPU(StringRef CPU) {
return ARM::FK_INVALID;
}
bool ARMTargetParser::getHWDivFeatures(unsigned HWDivKind,
std::vector<const char *> &Features) {
if (HWDivKind == ARM::AEK_INVALID)
return false;
if (HWDivKind & ARM::AEK_HWDIVARM)
Features.push_back("+hwdiv-arm");
else
Features.push_back("-hwdiv-arm");
if (HWDivKind & ARM::AEK_HWDIV)
Features.push_back("+hwdiv");
else
Features.push_back("-hwdiv");
return true;
}
bool ARMTargetParser::getFPUFeatures(unsigned FPUKind,
std::vector<const char *> &Features) {
@@ -372,9 +405,19 @@ unsigned ARMTargetParser::getArchAttr(unsigned ArchKind) {
}
const char *ARMTargetParser::getArchExtName(unsigned ArchExtKind) {
if (ArchExtKind >= ARM::AEK_LAST)
return nullptr;
return ARCHExtNames[ArchExtKind].Name;
for (const auto AE : ARCHExtNames) {
if (ArchExtKind == AE.ID)
return AE.Name;
}
return nullptr;
}
const char *ARMTargetParser::getHWDivName(unsigned HWDivKind) {
for (const auto D : HWDivNames) {
if (HWDivKind == D.ID)
return D.Name;
}
return nullptr;
}
const char *ARMTargetParser::getDefaultCPU(StringRef Arch) {
@@ -394,6 +437,12 @@ const char *ARMTargetParser::getDefaultCPU(StringRef Arch) {
// Parsers
// ======================================================= //
StringRef ARMTargetParser::getHWDivSynonym(StringRef HWDiv) {
return StringSwitch<StringRef>(HWDiv)
.Case("thumb,arm", "arm,thumb")
.Default(HWDiv);
}
StringRef ARMTargetParser::getFPUSynonym(StringRef FPU) {
return StringSwitch<StringRef>(FPU)
.Cases("fpa", "fpe2", "fpe3", "maverick", "invalid") // Unsupported
@@ -477,6 +526,15 @@ StringRef ARMTargetParser::getCanonicalArchName(StringRef Arch) {
return A;
}
unsigned ARMTargetParser::parseHWDiv(StringRef HWDiv) {
StringRef Syn = getHWDivSynonym(HWDiv);
for (const auto D : HWDivNames) {
if (Syn == D.Name)
return D.ID;
}
return ARM::AEK_INVALID;
}
unsigned ARMTargetParser::parseFPU(StringRef FPU) {
StringRef Syn = getFPUSynonym(FPU);
for (const auto F : FPUNames) {