Index: unittests/Support/TargetParserTest.cpp =================================================================== --- unittests/Support/TargetParserTest.cpp +++ unittests/Support/TargetParserTest.cpp @@ -56,12 +56,6 @@ #include "llvm/Support/AArch64TargetParser.def" #undef AARCH64_CPU_NAME }; -CpuNames kARMCPUNames[] = { -#define ARM_CPU_NAME(NAME, ID, DEFAULT_FPU, IS_DEFAULT, DEFAULT_EXT) \ - {NAME, ARM::ID, ARM::DEFAULT_FPU, DEFAULT_EXT}, -#include "llvm/Support/ARMTargetParser.def" -#undef ARM_CPU_NAME -}; const char *ARMArch[] = { "armv2", "armv2a", "armv3", "armv3m", "armv4", @@ -88,12 +82,140 @@ }) != std::end(array); } -TEST(TargetParserTest, ARMArchName) { - for (ARM::ArchKind AK = static_cast(0); - AK <= ARM::ArchKind::AK_LAST; - AK = static_cast(static_cast(AK) + 1)) - EXPECT_TRUE(AK == ARM::AK_LAST ? ARM::getArchName(AK).empty() - : !ARM::getArchName(AK).empty()); +bool testARMCPU(StringRef cpu, StringRef ExpectedArch, StringRef ExpectedFPU, + StringRef ExpectedFlags) { + bool ret = false; + + unsigned ArchKind = ARM::parseCPUArch(cpu); + ret = ARM::getArchName(ArchKind).equals(ExpectedArch); + ret &= ARM::getFPUName(ARM::getDefaultFPU(cpu, ArchKind)).equals(ExpectedFPU); + + unsigned ExtKind = ARM::getDefaultExtensions(cpu, ArchKind); + if (ExtKind <= 1) + ret &= ARM::getArchExtName(ExtKind).equals(ExpectedFlags); + else { + unsigned BaseExt = ARM::AEK_CRC | ARM::AEK_CRYPTO | ARM::AEK_DSP | + ARM::AEK_HWDIVARM | ARM::AEK_HWDIV | ARM::AEK_MP | + ARM::AEK_SEC | ARM::AEK_VIRT | ARM::AEK_RAS; + std::string ExtName = ""; + + if (ExtKind & 0x1) + ExtKind ^= 0x1; // remove "none" + + for (unsigned i = 1; i <= BaseExt; i <<= 1) { + if (ExtKind & i) { + if (i & ARM::AEK_HWDIVARM || i & ARM::AEK_HWDIV) + ExtName = ExtName + (std::string)ARM::getHWDivName(ExtKind & i); + else + ExtName = ExtName + (std::string)ARM::getArchExtName(ExtKind & i); + + if (ExtKind -= i) + ExtName += ","; + } + } + ret &= (ExtName == (std::string)ExpectedFlags); + } + return ret; +} + +TEST(TargetParserTest, testARMCPU) { + EXPECT_TRUE(testARMCPU("invalid", "invalid", "invalid", "none")); + EXPECT_TRUE(testARMCPU("generic", "invalid", "none", "none")); + + EXPECT_TRUE(testARMCPU("arm2", "armv2", "none", "none")); + EXPECT_TRUE(testARMCPU("arm3", "armv2a", "none", "none")); + EXPECT_TRUE(testARMCPU("arm6", "armv3", "none", "none")); + EXPECT_TRUE(testARMCPU("arm7m", "armv3m", "none", "none")); + EXPECT_TRUE(testARMCPU("arm8", "armv4", "none", "none")); + EXPECT_TRUE(testARMCPU("arm810", "armv4", "none", "none")); + EXPECT_TRUE(testARMCPU("strongarm", "armv4", "none", "none")); + EXPECT_TRUE(testARMCPU("strongarm110", "armv4", "none", "none")); + EXPECT_TRUE(testARMCPU("strongarm1100", "armv4", "none", "none")); + EXPECT_TRUE(testARMCPU("strongarm1110", "armv4", "none", "none")); + EXPECT_TRUE(testARMCPU("arm7tdmi", "armv4t", "none", "none")); + EXPECT_TRUE(testARMCPU("arm7tdmi-s", "armv4t", "none", "none")); + EXPECT_TRUE(testARMCPU("arm710t", "armv4t", "none", "none")); + EXPECT_TRUE(testARMCPU("arm720t", "armv4t", "none", "none")); + EXPECT_TRUE(testARMCPU("arm9", "armv4t", "none", "none")); + EXPECT_TRUE(testARMCPU("arm9tdmi", "armv4t", "none", "none")); + EXPECT_TRUE(testARMCPU("arm920", "armv4t", "none", "none")); + EXPECT_TRUE(testARMCPU("arm920t", "armv4t", "none", "none")); + EXPECT_TRUE(testARMCPU("arm922t", "armv4t", "none", "none")); + EXPECT_TRUE(testARMCPU("arm9312", "armv4t", "none", "none")); + EXPECT_TRUE(testARMCPU("arm940t", "armv4t", "none", "none")); + EXPECT_TRUE(testARMCPU("ep9312", "armv4t", "none", "none")); + EXPECT_TRUE(testARMCPU("arm10tdmi", "armv5t", "none", "none")); + EXPECT_TRUE(testARMCPU("arm1020t", "armv5t", "none", "none")); + EXPECT_TRUE(testARMCPU("arm9e", "armv5te", "none", "dsp")); + EXPECT_TRUE(testARMCPU("arm946e-s", "armv5te", "none", "dsp")); + EXPECT_TRUE(testARMCPU("arm966e-s", "armv5te", "none", "dsp")); + EXPECT_TRUE(testARMCPU("arm968e-s", "armv5te", "none", "dsp")); + EXPECT_TRUE(testARMCPU("arm10e", "armv5te", "none", "dsp")); + EXPECT_TRUE(testARMCPU("arm1020e", "armv5te", "none", "dsp")); + EXPECT_TRUE(testARMCPU("arm1022e", "armv5te", "none", "dsp")); + EXPECT_TRUE(testARMCPU("arm926ej-s", "armv5tej", "none", "dsp")); + EXPECT_TRUE(testARMCPU("arm1136j-s", "armv6", "none", "dsp")); + EXPECT_TRUE(testARMCPU("arm1136jf-s", "armv6", "vfpv2", "dsp")); + EXPECT_TRUE(testARMCPU("arm1136jz-s", "armv6", "none", "dsp")); + EXPECT_TRUE(testARMCPU("arm1176j-s", "armv6k", "none", "dsp")); + EXPECT_TRUE(testARMCPU("arm1176jz-s", "armv6kz", "none", "sec,dsp")); + EXPECT_TRUE(testARMCPU("mpcore", "armv6k", "vfpv2", "dsp")); + EXPECT_TRUE(testARMCPU("mpcorenovfp", "armv6k", "none", "dsp")); + EXPECT_TRUE(testARMCPU("arm1176jzf-s", "armv6kz", "vfpv2", "sec,dsp")); + EXPECT_TRUE(testARMCPU("arm1156t2-s", "armv6t2", "none", "dsp")); + EXPECT_TRUE(testARMCPU("arm1156t2f-s", "armv6t2", "vfpv2", "dsp")); + EXPECT_TRUE(testARMCPU("cortex-m0", "armv6-m", "none", "none")); + EXPECT_TRUE(testARMCPU("cortex-m0plus", "armv6-m", "none", "none")); + EXPECT_TRUE(testARMCPU("cortex-m1", "armv6-m", "none", "none")); + EXPECT_TRUE(testARMCPU("sc000", "armv6-m", "none", "none")); + EXPECT_TRUE(testARMCPU("cortex-a5", "armv7-a", "neon-vfpv4", "mp,sec,dsp")); + EXPECT_TRUE(testARMCPU("cortex-a7", "armv7-a", "neon-vfpv4", + "thumb,arm,mp,sec,virt,dsp")); + EXPECT_TRUE(testARMCPU("cortex-a8", "armv7-a", "neon", "sec,dsp")); + EXPECT_TRUE(testARMCPU("cortex-a9", "armv7-a", "neon-fp16", "mp,sec,dsp")); + EXPECT_TRUE(testARMCPU("cortex-a12", "armv7-a", "neon-vfpv4", + "thumb,arm,mp,sec,virt,dsp")); + EXPECT_TRUE(testARMCPU("cortex-a15", "armv7-a", "neon-vfpv4", + "thumb,arm,mp,sec,virt,dsp")); + EXPECT_TRUE(testARMCPU("cortex-a17", "armv7-a", "neon-vfpv4", + "thumb,arm,mp,sec,virt,dsp")); + EXPECT_TRUE(testARMCPU("krait", "armv7-a", "neon-vfpv4", "thumb,arm,dsp")); + EXPECT_TRUE(testARMCPU("cortex-r4", "armv7-r", "none", "thumb,dsp")); + EXPECT_TRUE(testARMCPU("cortex-r4f", "armv7-r", "vfpv3-d16", "thumb,dsp")); + EXPECT_TRUE( + testARMCPU("cortex-r5", "armv7-r", "vfpv3-d16", "thumb,arm,mp,dsp")); + EXPECT_TRUE( + testARMCPU("cortex-r7", "armv7-r", "vfpv3-d16-fp16", "thumb,arm,mp,dsp")); + EXPECT_TRUE( + testARMCPU("cortex-r8", "armv7-r", "vfpv3-d16-fp16", "thumb,arm,mp,dsp")); + EXPECT_TRUE(testARMCPU("cortex-r52", "armv8-r", "neon-fp-armv8", + "crc,thumb,arm,mp,virt,dsp")); + EXPECT_TRUE(testARMCPU("sc300", "armv7-m", "none", "thumb")); + EXPECT_TRUE(testARMCPU("cortex-m3", "armv7-m", "none", "thumb")); + EXPECT_TRUE(testARMCPU("cortex-m4", "armv7e-m", "fpv4-sp-d16", "thumb,dsp")); + EXPECT_TRUE(testARMCPU("cortex-m7", "armv7e-m", "fpv5-d16", "thumb,dsp")); + + EXPECT_TRUE(testARMCPU("cortex-a32", "armv8-a", "crypto-neon-fp-armv8", + "crc,thumb,arm,mp,sec,virt,dsp")); + EXPECT_TRUE(testARMCPU("cortex-a35", "armv8-a", "crypto-neon-fp-armv8", + "crc,thumb,arm,mp,sec,virt,dsp")); + EXPECT_TRUE(testARMCPU("cortex-a53", "armv8-a", "crypto-neon-fp-armv8", + "crc,thumb,arm,mp,sec,virt,dsp")); + EXPECT_TRUE(testARMCPU("cortex-a57", "armv8-a", "crypto-neon-fp-armv8", + "crc,thumb,arm,mp,sec,virt,dsp")); + EXPECT_TRUE(testARMCPU("cortex-a72", "armv8-a", "crypto-neon-fp-armv8", + "crc,thumb,arm,mp,sec,virt,dsp")); + EXPECT_TRUE(testARMCPU("cortex-a73", "armv8-a", "crypto-neon-fp-armv8", + "crc,thumb,arm,mp,sec,virt,dsp")); + EXPECT_TRUE(testARMCPU("cyclone", "armv8-a", "crypto-neon-fp-armv8", + "crc,thumb,arm,mp,sec,virt,dsp")); + EXPECT_TRUE(testARMCPU("exynos-m1", "armv8-a", "crypto-neon-fp-armv8", + "crc,thumb,arm,mp,sec,virt,dsp")); + EXPECT_TRUE(testARMCPU("exynos-m2", "armv8-a", "crypto-neon-fp-armv8", + "crc,thumb,arm,mp,sec,virt,dsp")); + EXPECT_TRUE(testARMCPU("iwmmxt", "iwmmxt", "none", "none")); + EXPECT_TRUE(testARMCPU("xscale", "xscale", "none", "none")); + EXPECT_TRUE(testARMCPU("swift", "armv7s", "neon-vfpv4", "thumb,arm,dsp")); } TEST(TargetParserTest, ARMCPUAttr) { @@ -115,14 +237,6 @@ : !ARM::getSubArch(AK).empty()); } -TEST(TargetParserTest, ARMFPUName) { - for (ARM::FPUKind FK = static_cast(0); - FK <= ARM::FPUKind::FK_LAST; - FK = static_cast(static_cast(FK) + 1)) - EXPECT_TRUE(FK == ARM::FK_LAST ? ARM::getFPUName(FK).empty() - : !ARM::getFPUName(FK).empty()); -} - TEST(TargetParserTest, ARMFPUVersion) { for (ARM::FPUKind FK = static_cast(0); FK <= ARM::FPUKind::FK_LAST; @@ -153,31 +267,6 @@ EXPECT_LE(0U, ARM::getFPURestriction(FK)); } -TEST(TargetParserTest, ARMDefaultFPU) { - for (ARM::ArchKind AK = static_cast(0); - AK < ARM::ArchKind::AK_LAST; - AK = static_cast(static_cast(AK) + 1)) - EXPECT_EQ(kARMARCHNames[AK].DefaultFPU, - ARM::getDefaultFPU(StringRef("generic"), AK)); - - for (const auto &ARMCPUName : kARMCPUNames) - EXPECT_EQ(ARMCPUName.DefaultFPU, ARM::getDefaultFPU(ARMCPUName.Name, 0)); -} - -TEST(TargetParserTest, ARMDefaultExtensions) { - for (ARM::ArchKind AK = static_cast(0); - AK < ARM::ArchKind::AK_LAST; - AK = static_cast(static_cast(AK) + 1)) - EXPECT_EQ(kARMARCHNames[AK].ArchBaseExtensions, - ARM::getDefaultExtensions(StringRef("generic"), AK)); - - for (const auto &ARMCPUName : kARMCPUNames) { - unsigned DefaultExt = - kARMARCHNames[ARMCPUName.ID].ArchBaseExtensions | ARMCPUName.DefaultExt; - EXPECT_EQ(DefaultExt, ARM::getDefaultExtensions(ARMCPUName.Name, 0)); - } -} - TEST(TargetParserTest, ARMExtensionFeatures) { std::vector Features; unsigned Extensions = ARM::AEK_CRC | ARM::AEK_CRYPTO | ARM::AEK_DSP | @@ -298,36 +387,6 @@ EXPECT_NE(ARM::AEK_INVALID, ARM::parseArchExt(ArchExt[i])); } -TEST(TargetParserTest, ARMparseCPUArch) { - const char *CPU[] = { - "arm2", "arm3", "arm6", "arm7m", - "arm8", "arm810", "strongarm", "strongarm110", - "strongarm1100", "strongarm1110", "arm7tdmi", "arm7tdmi-s", - "arm710t", "arm720t", "arm9", "arm9tdmi", - "arm920", "arm920t", "arm922t", "arm9312", - "arm940t", "ep9312", "arm10tdmi", "arm1020t", - "arm9e", "arm946e-s", "arm966e-s", "arm968e-s", - "arm10e", "arm1020e", "arm1022e", "arm926ej-s", - "arm1136j-s", "arm1136jf-s", "arm1136jz-s", "arm1176j-s", - "arm1176jz-s", "mpcore", "mpcorenovfp", "arm1176jzf-s", - "arm1156t2-s", "arm1156t2f-s", "cortex-m0", "cortex-m0plus", - "cortex-m1", "sc000", "cortex-a5", "cortex-a7", - "cortex-a8", "cortex-a9", "cortex-a12", "cortex-a15", - "cortex-a17", "krait", "cortex-r4", "cortex-r4f", - "cortex-r5", "cortex-r7", "cortex-r8", "sc300", - "cortex-m3", "cortex-m4", "cortex-m7", "cortex-a32", - "cortex-a35", "cortex-a53", "cortex-a57", "cortex-a72", - "cortex-a73", "cyclone", "exynos-m1", "exynos-m2", - "iwmmxt", "xscale", "swift", "cortex-r52"}; - - for (const auto &ARMCPUName : kARMCPUNames) { - if (contains(CPU, ARMCPUName.Name)) - EXPECT_NE(ARM::AK_INVALID, ARM::parseCPUArch(ARMCPUName.Name)); - else - EXPECT_EQ(ARM::AK_INVALID, ARM::parseCPUArch(ARMCPUName.Name)); - } -} - TEST(TargetParserTest, ARMparseArchEndianAndISA) { const char *Arch[] = { "v2", "v2a", "v3", "v3m", "v4", "v4t", "v5", "v5t",