forked from OSchip/llvm-project
[ARMTargetParser] Move IAS arch ext parser. NFC
The plan was to move the whole table into the already existing ArchExtNames but some fields depend on a table-generated file, and we don't yet have this feature in the generic lib/Support side. Once the minimum target-specific table-generated files are available in a generic fashion to these libraries, we'll have to keep it in the ASM parser. llvm-svn: 238651
This commit is contained in:
parent
11e6f8fed1
commit
230d298320
|
@ -92,8 +92,15 @@ namespace ARM {
|
|||
AEK_FP,
|
||||
AEK_HWDIV,
|
||||
AEK_MP,
|
||||
AEK_SIMD,
|
||||
AEK_SEC,
|
||||
AEK_VIRT,
|
||||
// Unsupported extensions.
|
||||
AEK_OS,
|
||||
AEK_IWMMXT,
|
||||
AEK_IWMMXT2,
|
||||
AEK_MAVERICK,
|
||||
AEK_XSCALE,
|
||||
AEK_LAST
|
||||
};
|
||||
|
||||
|
|
|
@ -106,8 +106,14 @@ struct {
|
|||
{ "fp", ARM::AEK_FP },
|
||||
{ "idiv", ARM::AEK_HWDIV },
|
||||
{ "mp", ARM::AEK_MP },
|
||||
{ "simd", ARM::AEK_SIMD },
|
||||
{ "sec", ARM::AEK_SEC },
|
||||
{ "virt", ARM::AEK_VIRT }
|
||||
{ "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 CPU names and their arches.
|
||||
// The same CPU can have multiple arches and can be default on multiple arches.
|
||||
|
|
|
@ -9982,33 +9982,32 @@ extern "C" void LLVMInitializeARMAsmParser() {
|
|||
#define GET_MATCHER_IMPLEMENTATION
|
||||
#include "ARMGenAsmMatcher.inc"
|
||||
|
||||
// FIXME: This structure should be moved inside ARMTargetParser
|
||||
// when we start to table-generate them, and we can use the ARM
|
||||
// flags below, that were generated by table-gen.
|
||||
static const struct {
|
||||
const char *Name;
|
||||
const ARM::ArchExtKind Kind;
|
||||
const unsigned ArchCheck;
|
||||
const FeatureBitset Features;
|
||||
} Extensions[] = {
|
||||
{ "crc", Feature_HasV8, {ARM::FeatureCRC} },
|
||||
{ "crypto", Feature_HasV8,
|
||||
{ ARM::AEK_CRC, Feature_HasV8, {ARM::FeatureCRC} },
|
||||
{ ARM::AEK_CRYPTO, Feature_HasV8,
|
||||
{ARM::FeatureCrypto, ARM::FeatureNEON, ARM::FeatureFPARMv8} },
|
||||
{ "fp", Feature_HasV8, {ARM::FeatureFPARMv8} },
|
||||
{ "idiv", Feature_HasV7 | Feature_IsNotMClass,
|
||||
{ ARM::AEK_FP, Feature_HasV8, {ARM::FeatureFPARMv8} },
|
||||
{ ARM::AEK_HWDIV, Feature_HasV7 | Feature_IsNotMClass,
|
||||
{ARM::FeatureHWDiv, ARM::FeatureHWDivARM} },
|
||||
// FIXME: iWMMXT not supported
|
||||
{ "iwmmxt", Feature_None, {} },
|
||||
// FIXME: iWMMXT2 not supported
|
||||
{ "iwmmxt2", Feature_None, {} },
|
||||
// FIXME: Maverick not supported
|
||||
{ "maverick", Feature_None, {} },
|
||||
{ "mp", Feature_HasV7 | Feature_IsNotMClass, {ARM::FeatureMP} },
|
||||
// FIXME: ARMv6-m OS Extensions feature not checked
|
||||
{ "os", Feature_None, {} },
|
||||
{ ARM::AEK_MP, Feature_HasV7 | Feature_IsNotMClass, {ARM::FeatureMP} },
|
||||
{ ARM::AEK_SIMD, Feature_HasV8, {ARM::FeatureNEON, ARM::FeatureFPARMv8} },
|
||||
// FIXME: Also available in ARMv6-K
|
||||
{ "sec", Feature_HasV7, {ARM::FeatureTrustZone} },
|
||||
{ "simd", Feature_HasV8, {ARM::FeatureNEON, ARM::FeatureFPARMv8} },
|
||||
{ ARM::AEK_SEC, Feature_HasV7, {ARM::FeatureTrustZone} },
|
||||
// FIXME: Only available in A-class, isel not predicated
|
||||
{ "virt", Feature_HasV7, {ARM::FeatureVirtualization} },
|
||||
// FIXME: xscale not supported
|
||||
{ "xscale", Feature_None, {} },
|
||||
{ ARM::AEK_VIRT, Feature_HasV7, {ARM::FeatureVirtualization} },
|
||||
// FIXME: Unsupported extensions.
|
||||
{ ARM::AEK_OS, Feature_None, {} },
|
||||
{ ARM::AEK_IWMMXT, Feature_None, {} },
|
||||
{ ARM::AEK_IWMMXT2, Feature_None, {} },
|
||||
{ ARM::AEK_MAVERICK, Feature_None, {} },
|
||||
{ ARM::AEK_XSCALE, Feature_None, {} },
|
||||
};
|
||||
|
||||
/// parseDirectiveArchExtension
|
||||
|
@ -10031,9 +10030,12 @@ bool ARMAsmParser::parseDirectiveArchExtension(SMLoc L) {
|
|||
EnableFeature = false;
|
||||
Name = Name.substr(2);
|
||||
}
|
||||
unsigned FeatureKind = ARMTargetParser::parseArchExt(Name);
|
||||
if (FeatureKind == ARM::AEK_INVALID)
|
||||
Error(ExtLoc, "unknown architectural extension: " + Name);
|
||||
|
||||
for (const auto &Extension : Extensions) {
|
||||
if (Extension.Name != Name)
|
||||
if (Extension.Kind != FeatureKind)
|
||||
continue;
|
||||
|
||||
if (Extension.Features.none())
|
||||
|
|
Loading…
Reference in New Issue