1f09cf34dSArchibald Elliott //===----------- TargetParser.cpp - Target Parser -------------------------===// 2f09cf34dSArchibald Elliott // 3f09cf34dSArchibald Elliott // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4f09cf34dSArchibald Elliott // See https://llvm.org/LICENSE.txt for license information. 5f09cf34dSArchibald Elliott // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6f09cf34dSArchibald Elliott // 7f09cf34dSArchibald Elliott //===----------------------------------------------------------------------===// 8f09cf34dSArchibald Elliott 9f09cf34dSArchibald Elliott #include "llvm/TargetParser/TargetParser.h" 10f09cf34dSArchibald Elliott #include "llvm/ADT/STLExtras.h" 11f09cf34dSArchibald Elliott #include "llvm/ADT/StringExtras.h" 1213e977d1Sostannard #include "llvm/ADT/StringMap.h" 13f09cf34dSArchibald Elliott #include "llvm/Support/ARMBuildAttributes.h" 1413e977d1Sostannard #include "llvm/Support/Debug.h" 15f09cf34dSArchibald Elliott #include "llvm/Support/FormatVariadic.h" 16f09cf34dSArchibald Elliott #include "llvm/TargetParser/AArch64TargetParser.h" 17f09cf34dSArchibald Elliott #include "llvm/TargetParser/ARMTargetParser.h" 18f09cf34dSArchibald Elliott #include "llvm/TargetParser/ARMTargetParserCommon.h" 19f09cf34dSArchibald Elliott #include "llvm/TargetParser/Triple.h" 20f09cf34dSArchibald Elliott #include "gmock/gmock.h" 21f09cf34dSArchibald Elliott #include "gtest/gtest.h" 229ea00fc7SLucas Prates #include <optional> 23491a1cd0ShassnaaHamdi #include <sstream> 24f09cf34dSArchibald Elliott #include <string> 25f09cf34dSArchibald Elliott 26f09cf34dSArchibald Elliott using namespace llvm; 27f09cf34dSArchibald Elliott 2813e977d1Sostannard using ::testing::Contains; 2913e977d1Sostannard using ::testing::StrEq; 3013e977d1Sostannard 31f09cf34dSArchibald Elliott namespace { 32f09cf34dSArchibald Elliott const char *ARMArch[] = { 33f09cf34dSArchibald Elliott "armv4", "armv4t", "armv5", "armv5t", "armv5e", 34f09cf34dSArchibald Elliott "armv5te", "armv5tej", "armv6", "armv6j", "armv6k", 35f09cf34dSArchibald Elliott "armv6hl", "armv6t2", "armv6kz", "armv6z", "armv6zk", 36f09cf34dSArchibald Elliott "armv6-m", "armv6m", "armv6sm", "armv6s-m", "armv7-a", 37f09cf34dSArchibald Elliott "armv7", "armv7a", "armv7ve", "armv7hl", "armv7l", 38f09cf34dSArchibald Elliott "armv7-r", "armv7r", "armv7-m", "armv7m", "armv7k", 39f09cf34dSArchibald Elliott "armv7s", "armv7e-m", "armv7em", "armv8-a", "armv8", 40f09cf34dSArchibald Elliott "armv8a", "armv8l", "armv8.1-a", "armv8.1a", "armv8.2-a", 41f09cf34dSArchibald Elliott "armv8.2a", "armv8.3-a", "armv8.3a", "armv8.4-a", "armv8.4a", 42f09cf34dSArchibald Elliott "armv8.5-a", "armv8.5a", "armv8.6-a", "armv8.6a", "armv8.7-a", 43f09cf34dSArchibald Elliott "armv8.7a", "armv8.8-a", "armv8.8a", "armv8.9-a", "armv8.9a", 44f09cf34dSArchibald Elliott "armv8-r", "armv8r", "armv8-m.base", "armv8m.base", "armv8-m.main", 45f09cf34dSArchibald Elliott "armv8m.main", "iwmmxt", "iwmmxt2", "xscale", "armv8.1-m.main", 46f09cf34dSArchibald Elliott "armv9-a", "armv9", "armv9a", "armv9.1-a", "armv9.1a", 47f09cf34dSArchibald Elliott "armv9.2-a", "armv9.2a", "armv9.3-a", "armv9.3a", "armv9.4-a", 48d0756caeSJonathan Thackray "armv9.4a", "armv9.5-a", "armv9.5a", "armv9.6a", "armv9.6-a", 49f09cf34dSArchibald Elliott }; 50f09cf34dSArchibald Elliott 51491a1cd0ShassnaaHamdi std::string FormatExtensionFlags(int64_t Flags) { 52f09cf34dSArchibald Elliott std::vector<StringRef> Features; 53f09cf34dSArchibald Elliott 54f09cf34dSArchibald Elliott if (Flags & ARM::AEK_NONE) 55f09cf34dSArchibald Elliott Features.push_back("none"); 56f09cf34dSArchibald Elliott ARM::getExtensionFeatures(Flags, Features); 57f09cf34dSArchibald Elliott 58f09cf34dSArchibald Elliott // The target parser also includes every extension you don't have. 59f09cf34dSArchibald Elliott // E.g. if AEK_CRC is not set then it adds "-crc". Not useful here. 60f09cf34dSArchibald Elliott Features.erase(std::remove_if(Features.begin(), Features.end(), 61f09cf34dSArchibald Elliott [](StringRef extension) { 625c9d82deSKazu Hirata return extension.starts_with("-"); 63f09cf34dSArchibald Elliott }), 64f09cf34dSArchibald Elliott Features.end()); 65f09cf34dSArchibald Elliott 66f09cf34dSArchibald Elliott return llvm::join(Features, ", "); 67f09cf34dSArchibald Elliott } 68f09cf34dSArchibald Elliott 69491a1cd0ShassnaaHamdi std::string SerializeExtensionFlags(AArch64::ExtensionBitset Flags) { 70491a1cd0ShassnaaHamdi std::string SerializedFlags; 71491a1cd0ShassnaaHamdi std::ostringstream ss; 72491a1cd0ShassnaaHamdi int HexValue = 0; 73491a1cd0ShassnaaHamdi for (unsigned int i = 0; i < AArch64::AEK_NUM_EXTENSIONS; i++) { 74491a1cd0ShassnaaHamdi HexValue <<= 1; 75491a1cd0ShassnaaHamdi HexValue |= (int)Flags[i]; 76491a1cd0ShassnaaHamdi if ((i + 1) % 4 == 0) { 77491a1cd0ShassnaaHamdi ss << std::hex << HexValue; 78491a1cd0ShassnaaHamdi HexValue = 0; 79491a1cd0ShassnaaHamdi } 80491a1cd0ShassnaaHamdi } 81491a1cd0ShassnaaHamdi // check if there are remainig unhandled bits 82491a1cd0ShassnaaHamdi if ((AArch64::AEK_NUM_EXTENSIONS % 4) != 0) 83491a1cd0ShassnaaHamdi ss << std::hex << HexValue; 84491a1cd0ShassnaaHamdi 85491a1cd0ShassnaaHamdi SerializedFlags = ss.str(); 86491a1cd0ShassnaaHamdi return SerializedFlags; 87491a1cd0ShassnaaHamdi } 88491a1cd0ShassnaaHamdi 89ee700decSDavid Green template <ARM::ISAKind ISAKind> struct AssertSameExtensionFlags { 90ee700decSDavid Green AssertSameExtensionFlags(StringRef CPUName) : CPUName(CPUName) {} 91ee700decSDavid Green 92ee700decSDavid Green testing::AssertionResult operator()(const char *m_expr, const char *n_expr, 93ee700decSDavid Green uint64_t ExpectedFlags, 94ee700decSDavid Green uint64_t GotFlags) { 95f09cf34dSArchibald Elliott if (ExpectedFlags == GotFlags) 96f09cf34dSArchibald Elliott return testing::AssertionSuccess(); 97f09cf34dSArchibald Elliott 98cb4cd3a8SJon Roelofs return testing::AssertionFailure() 99cb4cd3a8SJon Roelofs << llvm::formatv("CPU: {4}\n" 100f09cf34dSArchibald Elliott "Expected extension flags: {0} ({1:x})\n" 101cb4cd3a8SJon Roelofs " Got extension flags: {2} ({3:x})\n" 102cb4cd3a8SJon Roelofs " Diff: {5} ({6:x})\n", 103800de14fSDavid Green FormatExtensionFlags(ExpectedFlags), ExpectedFlags, 104cb4cd3a8SJon Roelofs FormatExtensionFlags(GotFlags), GotFlags, CPUName, 105cb4cd3a8SJon Roelofs FormatExtensionFlags(ExpectedFlags ^ GotFlags)); 106491a1cd0ShassnaaHamdi } 107ee700decSDavid Green private: 108ee700decSDavid Green StringRef CPUName; 109ee700decSDavid Green }; 110ee700decSDavid Green 111491a1cd0ShassnaaHamdi template <typename T> struct ARMCPUTestParams { 112f09cf34dSArchibald Elliott ARMCPUTestParams(StringRef CPUName, StringRef ExpectedArch, 113491a1cd0ShassnaaHamdi StringRef ExpectedFPU, T ExpectedFlags, StringRef CPUAttr) 114f09cf34dSArchibald Elliott : CPUName(CPUName), ExpectedArch(ExpectedArch), ExpectedFPU(ExpectedFPU), 115f09cf34dSArchibald Elliott ExpectedFlags(ExpectedFlags), CPUAttr(CPUAttr) {} 116f09cf34dSArchibald Elliott 117f09cf34dSArchibald Elliott friend std::ostream &operator<<(std::ostream &os, 118491a1cd0ShassnaaHamdi const ARMCPUTestParams<T> ¶ms) { 119491a1cd0ShassnaaHamdi os << "\"" << params.CPUName.str() << "\", \"" << params.ExpectedArch.str() 120491a1cd0ShassnaaHamdi << "\", \"" << params.ExpectedFPU.str() << "\", 0x"; 121491a1cd0ShassnaaHamdi if constexpr (std::is_same<T, uint64_t>::value) 122491a1cd0ShassnaaHamdi os << std::hex << params.ExpectedFlags; 123491a1cd0ShassnaaHamdi else 124491a1cd0ShassnaaHamdi os << SerializeExtensionFlags(params.ExpectedFlags); 125491a1cd0ShassnaaHamdi os << ", \"" << params.CPUAttr.str() << "\""; 126491a1cd0ShassnaaHamdi return os; 127f09cf34dSArchibald Elliott } 128f09cf34dSArchibald Elliott 129c7d181ccSJon Roelofs /// Print a gtest-compatible facsimile of the CPUName, to make the test's name 130c7d181ccSJon Roelofs /// human-readable. 131c7d181ccSJon Roelofs /// 132c7d181ccSJon Roelofs /// https://github.com/google/googletest/blob/main/docs/advanced.md#specifying-names-for-value-parameterized-test-parameters 133800de14fSDavid Green static std::string PrintToStringParamName( 134800de14fSDavid Green const testing::TestParamInfo<ARMCPUTestParams<T>> &Info) { 135c7d181ccSJon Roelofs std::string Name = Info.param.CPUName.str(); 136c7d181ccSJon Roelofs for (char &C : Name) 137c7d181ccSJon Roelofs if (!std::isalnum(C)) 138c7d181ccSJon Roelofs C = '_'; 139c7d181ccSJon Roelofs return Name; 140c7d181ccSJon Roelofs } 141c7d181ccSJon Roelofs 142f09cf34dSArchibald Elliott StringRef CPUName; 143f09cf34dSArchibald Elliott StringRef ExpectedArch; 144f09cf34dSArchibald Elliott StringRef ExpectedFPU; 145491a1cd0ShassnaaHamdi T ExpectedFlags; 146f09cf34dSArchibald Elliott StringRef CPUAttr; 147f09cf34dSArchibald Elliott }; 148f09cf34dSArchibald Elliott 149491a1cd0ShassnaaHamdi class ARMCPUTestFixture 150491a1cd0ShassnaaHamdi : public ::testing::TestWithParam<ARMCPUTestParams<uint64_t>> {}; 151f09cf34dSArchibald Elliott 152f09cf34dSArchibald Elliott TEST_P(ARMCPUTestFixture, ARMCPUTests) { 153f09cf34dSArchibald Elliott auto params = GetParam(); 154f09cf34dSArchibald Elliott 155f09cf34dSArchibald Elliott ARM::ArchKind AK = ARM::parseCPUArch(params.CPUName); 156f09cf34dSArchibald Elliott EXPECT_EQ(params.ExpectedArch, ARM::getArchName(AK)); 157f09cf34dSArchibald Elliott 15860bbf271SMichael Platings ARM::FPUKind FPUKind = ARM::getDefaultFPU(params.CPUName, AK); 159f09cf34dSArchibald Elliott EXPECT_EQ(params.ExpectedFPU, ARM::getFPUName(FPUKind)); 160f09cf34dSArchibald Elliott 161f09cf34dSArchibald Elliott uint64_t default_extensions = ARM::getDefaultExtensions(params.CPUName, AK); 162ee700decSDavid Green EXPECT_PRED_FORMAT2( 163ee700decSDavid Green AssertSameExtensionFlags<ARM::ISAKind::ARM>(params.CPUName), 164f09cf34dSArchibald Elliott params.ExpectedFlags, default_extensions); 165f09cf34dSArchibald Elliott 166f09cf34dSArchibald Elliott EXPECT_EQ(params.CPUAttr, ARM::getCPUAttr(AK)); 167f09cf34dSArchibald Elliott } 168f09cf34dSArchibald Elliott 169f09cf34dSArchibald Elliott // Note that we include ARM::AEK_NONE even when there are other extensions 170f09cf34dSArchibald Elliott // we expect. This is because the default extensions for a CPU are the sum 171f09cf34dSArchibald Elliott // of the default extensions for its architecture and for the CPU. 172f09cf34dSArchibald Elliott // So if a CPU has no extra extensions, it adds AEK_NONE. 173f09cf34dSArchibald Elliott INSTANTIATE_TEST_SUITE_P( 174f09cf34dSArchibald Elliott ARMCPUTestsPart1, ARMCPUTestFixture, 175f09cf34dSArchibald Elliott ::testing::Values( 176800de14fSDavid Green ARMCPUTestParams<uint64_t>("invalid", "invalid", "invalid", 177800de14fSDavid Green ARM::AEK_NONE, ""), 178800de14fSDavid Green ARMCPUTestParams<uint64_t>("generic", "invalid", "none", ARM::AEK_NONE, 179800de14fSDavid Green ""), 180f09cf34dSArchibald Elliott 181491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("arm8", "armv4", "none", ARM::AEK_NONE, "4"), 182800de14fSDavid Green ARMCPUTestParams<uint64_t>("arm810", "armv4", "none", ARM::AEK_NONE, 183800de14fSDavid Green "4"), 184800de14fSDavid Green ARMCPUTestParams<uint64_t>("strongarm", "armv4", "none", ARM::AEK_NONE, 185800de14fSDavid Green "4"), 186800de14fSDavid Green ARMCPUTestParams<uint64_t>("strongarm110", "armv4", "none", 187800de14fSDavid Green ARM::AEK_NONE, "4"), 188800de14fSDavid Green ARMCPUTestParams<uint64_t>("strongarm1100", "armv4", "none", 189800de14fSDavid Green ARM::AEK_NONE, "4"), 190800de14fSDavid Green ARMCPUTestParams<uint64_t>("strongarm1110", "armv4", "none", 191800de14fSDavid Green ARM::AEK_NONE, "4"), 192800de14fSDavid Green ARMCPUTestParams<uint64_t>("arm7tdmi", "armv4t", "none", ARM::AEK_NONE, 193800de14fSDavid Green "4T"), 194800de14fSDavid Green ARMCPUTestParams<uint64_t>("arm7tdmi-s", "armv4t", "none", 195800de14fSDavid Green ARM::AEK_NONE, "4T"), 196800de14fSDavid Green ARMCPUTestParams<uint64_t>("arm710t", "armv4t", "none", ARM::AEK_NONE, 197800de14fSDavid Green "4T"), 198800de14fSDavid Green ARMCPUTestParams<uint64_t>("arm720t", "armv4t", "none", ARM::AEK_NONE, 199800de14fSDavid Green "4T"), 200800de14fSDavid Green ARMCPUTestParams<uint64_t>("arm9", "armv4t", "none", ARM::AEK_NONE, 201800de14fSDavid Green "4T"), 202800de14fSDavid Green ARMCPUTestParams<uint64_t>("arm9tdmi", "armv4t", "none", ARM::AEK_NONE, 203800de14fSDavid Green "4T"), 204800de14fSDavid Green ARMCPUTestParams<uint64_t>("arm920", "armv4t", "none", ARM::AEK_NONE, 205800de14fSDavid Green "4T"), 206800de14fSDavid Green ARMCPUTestParams<uint64_t>("arm920t", "armv4t", "none", ARM::AEK_NONE, 207800de14fSDavid Green "4T"), 208800de14fSDavid Green ARMCPUTestParams<uint64_t>("arm922t", "armv4t", "none", ARM::AEK_NONE, 209800de14fSDavid Green "4T"), 210800de14fSDavid Green ARMCPUTestParams<uint64_t>("arm940t", "armv4t", "none", ARM::AEK_NONE, 211800de14fSDavid Green "4T"), 212800de14fSDavid Green ARMCPUTestParams<uint64_t>("ep9312", "armv4t", "none", ARM::AEK_NONE, 213800de14fSDavid Green "4T"), 214800de14fSDavid Green ARMCPUTestParams<uint64_t>("arm10tdmi", "armv5t", "none", ARM::AEK_NONE, 215800de14fSDavid Green "5T"), 216800de14fSDavid Green ARMCPUTestParams<uint64_t>("arm1020t", "armv5t", "none", ARM::AEK_NONE, 217800de14fSDavid Green "5T"), 218491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("arm9e", "armv5te", "none", 219f09cf34dSArchibald Elliott ARM::AEK_NONE | ARM::AEK_DSP, "5TE"), 220c1796be9SBenjamin Kramer ARMCPUTestParams<uint64_t>("arm946e-s", "armv5te", "none", 221f09cf34dSArchibald Elliott ARM::AEK_NONE | ARM::AEK_DSP, "5TE"), 222491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("arm966e-s", "armv5te", "none", 223f09cf34dSArchibald Elliott ARM::AEK_NONE | ARM::AEK_DSP, "5TE"), 224491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("arm968e-s", "armv5te", "none", 225f09cf34dSArchibald Elliott ARM::AEK_NONE | ARM::AEK_DSP, "5TE"), 226491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("arm10e", "armv5te", "none", 227f09cf34dSArchibald Elliott ARM::AEK_NONE | ARM::AEK_DSP, "5TE"), 228491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("arm1020e", "armv5te", "none", 229f09cf34dSArchibald Elliott ARM::AEK_NONE | ARM::AEK_DSP, "5TE"), 230491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("arm1022e", "armv5te", "none", 231f09cf34dSArchibald Elliott ARM::AEK_NONE | ARM::AEK_DSP, "5TE"), 232491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("arm926ej-s", "armv5tej", "none", 233f09cf34dSArchibald Elliott ARM::AEK_NONE | ARM::AEK_DSP, "5TEJ"), 234491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("arm1136j-s", "armv6", "none", 235f09cf34dSArchibald Elliott ARM::AEK_NONE | ARM::AEK_DSP, "6"), 236491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("arm1136jf-s", "armv6", "vfpv2", 237f09cf34dSArchibald Elliott ARM::AEK_NONE | ARM::AEK_DSP, "6"), 238491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("arm1176jz-s", "armv6kz", "none", 239800de14fSDavid Green ARM::AEK_NONE | ARM::AEK_SEC | ARM::AEK_DSP, 240800de14fSDavid Green "6KZ"), 241491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("mpcore", "armv6k", "vfpv2", 242f09cf34dSArchibald Elliott ARM::AEK_NONE | ARM::AEK_DSP, "6K"), 243491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("mpcorenovfp", "armv6k", "none", 244f09cf34dSArchibald Elliott ARM::AEK_NONE | ARM::AEK_DSP, "6K"), 245491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("arm1176jzf-s", "armv6kz", "vfpv2", 246800de14fSDavid Green ARM::AEK_NONE | ARM::AEK_SEC | ARM::AEK_DSP, 247800de14fSDavid Green "6KZ"), 248491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("arm1156t2-s", "armv6t2", "none", 249f09cf34dSArchibald Elliott ARM::AEK_NONE | ARM::AEK_DSP, "6T2"), 250491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("arm1156t2f-s", "armv6t2", "vfpv2", 251f09cf34dSArchibald Elliott ARM::AEK_NONE | ARM::AEK_DSP, "6T2"), 252800de14fSDavid Green ARMCPUTestParams<uint64_t>("cortex-m0", "armv6-m", "none", 253800de14fSDavid Green ARM::AEK_NONE, "6-M"), 254800de14fSDavid Green ARMCPUTestParams<uint64_t>("cortex-m0plus", "armv6-m", "none", 255800de14fSDavid Green ARM::AEK_NONE, "6-M"), 256800de14fSDavid Green ARMCPUTestParams<uint64_t>("cortex-m1", "armv6-m", "none", 257800de14fSDavid Green ARM::AEK_NONE, "6-M"), 258800de14fSDavid Green ARMCPUTestParams<uint64_t>("sc000", "armv6-m", "none", ARM::AEK_NONE, 259f09cf34dSArchibald Elliott "6-M"), 260491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("cortex-a5", "armv7-a", "neon-vfpv4", 261800de14fSDavid Green ARM::AEK_MP | ARM::AEK_SEC | ARM::AEK_DSP, 262800de14fSDavid Green "7-A"), 263491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("cortex-a7", "armv7-a", "neon-vfpv4", 264800de14fSDavid Green ARM::AEK_HWDIVTHUMB | ARM::AEK_HWDIVARM | 265800de14fSDavid Green ARM::AEK_MP | ARM::AEK_SEC | 266800de14fSDavid Green ARM::AEK_VIRT | ARM::AEK_DSP, 267f09cf34dSArchibald Elliott "7-A"), 268491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("cortex-a8", "armv7-a", "neon", 269c7d181ccSJon Roelofs ARM::AEK_SEC | ARM::AEK_DSP, "7-A")), 270c7d181ccSJon Roelofs ARMCPUTestParams<uint64_t>::PrintToStringParamName); 271f09cf34dSArchibald Elliott 272f09cf34dSArchibald Elliott // gtest in llvm has a limit of 50 test cases when using ::Values so we split 273f09cf34dSArchibald Elliott // them into 2 blocks 274f09cf34dSArchibald Elliott INSTANTIATE_TEST_SUITE_P( 275f09cf34dSArchibald Elliott ARMCPUTestsPart2, ARMCPUTestFixture, 276f09cf34dSArchibald Elliott ::testing::Values( 277491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("cortex-a9", "armv7-a", "neon-fp16", 278800de14fSDavid Green ARM::AEK_MP | ARM::AEK_SEC | ARM::AEK_DSP, 279800de14fSDavid Green "7-A"), 280491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("cortex-a12", "armv7-a", "neon-vfpv4", 281f09cf34dSArchibald Elliott ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | 282f09cf34dSArchibald Elliott ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | 283f09cf34dSArchibald Elliott ARM::AEK_DSP, 284f09cf34dSArchibald Elliott "7-A"), 285491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("cortex-a15", "armv7-a", "neon-vfpv4", 286f09cf34dSArchibald Elliott ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | 287f09cf34dSArchibald Elliott ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | 288f09cf34dSArchibald Elliott ARM::AEK_DSP, 289f09cf34dSArchibald Elliott "7-A"), 290491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("cortex-a17", "armv7-a", "neon-vfpv4", 291f09cf34dSArchibald Elliott ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | 292f09cf34dSArchibald Elliott ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | 293f09cf34dSArchibald Elliott ARM::AEK_DSP, 294f09cf34dSArchibald Elliott "7-A"), 295491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("krait", "armv7-a", "neon-vfpv4", 296800de14fSDavid Green ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | 297800de14fSDavid Green ARM::AEK_DSP, 298f09cf34dSArchibald Elliott "7-A"), 299491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("cortex-r4", "armv7-r", "none", 300800de14fSDavid Green ARM::AEK_NONE | ARM::AEK_HWDIVTHUMB | 301800de14fSDavid Green ARM::AEK_DSP, 302f09cf34dSArchibald Elliott "7-R"), 303491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("cortex-r4f", "armv7-r", "vfpv3-d16", 304800de14fSDavid Green ARM::AEK_NONE | ARM::AEK_HWDIVTHUMB | 305800de14fSDavid Green ARM::AEK_DSP, 306f09cf34dSArchibald Elliott "7-R"), 307491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("cortex-r5", "armv7-r", "vfpv3-d16", 308800de14fSDavid Green ARM::AEK_MP | ARM::AEK_HWDIVARM | 309800de14fSDavid Green ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, 310f09cf34dSArchibald Elliott "7-R"), 311491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("cortex-r7", "armv7-r", "vfpv3-d16-fp16", 312800de14fSDavid Green ARM::AEK_MP | ARM::AEK_HWDIVARM | 313800de14fSDavid Green ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, 314f09cf34dSArchibald Elliott "7-R"), 315491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("cortex-r8", "armv7-r", "vfpv3-d16-fp16", 316800de14fSDavid Green ARM::AEK_MP | ARM::AEK_HWDIVARM | 317800de14fSDavid Green ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, 318f09cf34dSArchibald Elliott "7-R"), 319491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("cortex-r52", "armv8-r", "neon-fp-armv8", 320f09cf34dSArchibald Elliott ARM::AEK_NONE | ARM::AEK_CRC | ARM::AEK_MP | 321f09cf34dSArchibald Elliott ARM::AEK_VIRT | ARM::AEK_HWDIVARM | 322f09cf34dSArchibald Elliott ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, 323f09cf34dSArchibald Elliott "8-R"), 324917afa88SJonathan Thackray ARMCPUTestParams<uint64_t>("cortex-r52plus", "armv8-r", "neon-fp-armv8", 325917afa88SJonathan Thackray ARM::AEK_NONE | ARM::AEK_CRC | ARM::AEK_MP | 326917afa88SJonathan Thackray ARM::AEK_VIRT | ARM::AEK_HWDIVARM | 327917afa88SJonathan Thackray ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, 328917afa88SJonathan Thackray "8-R"), 329491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("sc300", "armv7-m", "none", 330f09cf34dSArchibald Elliott ARM::AEK_NONE | ARM::AEK_HWDIVTHUMB, "7-M"), 331491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("cortex-m3", "armv7-m", "none", 332f09cf34dSArchibald Elliott ARM::AEK_NONE | ARM::AEK_HWDIVTHUMB, "7-M"), 333491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("cortex-m4", "armv7e-m", "fpv4-sp-d16", 334800de14fSDavid Green ARM::AEK_NONE | ARM::AEK_HWDIVTHUMB | 335800de14fSDavid Green ARM::AEK_DSP, 336f09cf34dSArchibald Elliott "7E-M"), 337491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("cortex-m7", "armv7e-m", "fpv5-d16", 338800de14fSDavid Green ARM::AEK_NONE | ARM::AEK_HWDIVTHUMB | 339800de14fSDavid Green ARM::AEK_DSP, 340f09cf34dSArchibald Elliott "7E-M"), 341800de14fSDavid Green ARMCPUTestParams<uint64_t>("cortex-a32", "armv8-a", 342800de14fSDavid Green "crypto-neon-fp-armv8", 343f09cf34dSArchibald Elliott ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP | 344f09cf34dSArchibald Elliott ARM::AEK_VIRT | ARM::AEK_HWDIVARM | 345f09cf34dSArchibald Elliott ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, 346f09cf34dSArchibald Elliott "8-A"), 347800de14fSDavid Green ARMCPUTestParams<uint64_t>("cortex-a35", "armv8-a", 348800de14fSDavid Green "crypto-neon-fp-armv8", 349f09cf34dSArchibald Elliott ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP | 350f09cf34dSArchibald Elliott ARM::AEK_VIRT | ARM::AEK_HWDIVARM | 351f09cf34dSArchibald Elliott ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, 352f09cf34dSArchibald Elliott "8-A"), 353800de14fSDavid Green ARMCPUTestParams<uint64_t>("cortex-a53", "armv8-a", 354800de14fSDavid Green "crypto-neon-fp-armv8", 355f09cf34dSArchibald Elliott ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP | 356f09cf34dSArchibald Elliott ARM::AEK_VIRT | ARM::AEK_HWDIVARM | 357f09cf34dSArchibald Elliott ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, 358f09cf34dSArchibald Elliott "8-A"), 359800de14fSDavid Green ARMCPUTestParams<uint64_t>( 360800de14fSDavid Green "cortex-a55", "armv8.2-a", "crypto-neon-fp-armv8", 361800de14fSDavid Green ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | 362800de14fSDavid Green ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | 363f09cf34dSArchibald Elliott ARM::AEK_FP16 | ARM::AEK_RAS | ARM::AEK_DOTPROD, 364f09cf34dSArchibald Elliott "8.2-A"), 365800de14fSDavid Green ARMCPUTestParams<uint64_t>("cortex-a57", "armv8-a", 366800de14fSDavid Green "crypto-neon-fp-armv8", 367f09cf34dSArchibald Elliott ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP | 368f09cf34dSArchibald Elliott ARM::AEK_VIRT | ARM::AEK_HWDIVARM | 369f09cf34dSArchibald Elliott ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, 370f09cf34dSArchibald Elliott "8-A"), 371800de14fSDavid Green ARMCPUTestParams<uint64_t>("cortex-a72", "armv8-a", 372800de14fSDavid Green "crypto-neon-fp-armv8", 373f09cf34dSArchibald Elliott ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP | 374f09cf34dSArchibald Elliott ARM::AEK_VIRT | ARM::AEK_HWDIVARM | 375f09cf34dSArchibald Elliott ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, 376f09cf34dSArchibald Elliott "8-A"), 377800de14fSDavid Green ARMCPUTestParams<uint64_t>("cortex-a73", "armv8-a", 378800de14fSDavid Green "crypto-neon-fp-armv8", 379f09cf34dSArchibald Elliott ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP | 380f09cf34dSArchibald Elliott ARM::AEK_VIRT | ARM::AEK_HWDIVARM | 381f09cf34dSArchibald Elliott ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, 382f09cf34dSArchibald Elliott "8-A"), 383800de14fSDavid Green ARMCPUTestParams<uint64_t>( 384800de14fSDavid Green "cortex-a75", "armv8.2-a", "crypto-neon-fp-armv8", 385800de14fSDavid Green ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | 386800de14fSDavid Green ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | 387f09cf34dSArchibald Elliott ARM::AEK_FP16 | ARM::AEK_RAS | ARM::AEK_DOTPROD, 388f09cf34dSArchibald Elliott "8.2-A"), 389800de14fSDavid Green ARMCPUTestParams<uint64_t>( 390800de14fSDavid Green "cortex-a76", "armv8.2-a", "crypto-neon-fp-armv8", 391800de14fSDavid Green ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | 392800de14fSDavid Green ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | 393f09cf34dSArchibald Elliott ARM::AEK_FP16 | ARM::AEK_RAS | ARM::AEK_DOTPROD, 394f09cf34dSArchibald Elliott "8.2-A"), 395800de14fSDavid Green ARMCPUTestParams<uint64_t>( 396800de14fSDavid Green "cortex-a76ae", "armv8.2-a", "crypto-neon-fp-armv8", 397800de14fSDavid Green ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | 398800de14fSDavid Green ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | 399f09cf34dSArchibald Elliott ARM::AEK_FP16 | ARM::AEK_RAS | ARM::AEK_DOTPROD, 400f09cf34dSArchibald Elliott "8.2-A"), 401800de14fSDavid Green ARMCPUTestParams<uint64_t>( 402800de14fSDavid Green "cortex-a78c", "armv8.2-a", "crypto-neon-fp-armv8", 403800de14fSDavid Green ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM | 404800de14fSDavid Green ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_CRC | 405800de14fSDavid Green ARM::AEK_RAS | ARM::AEK_FP16 | ARM::AEK_DOTPROD, 406f09cf34dSArchibald Elliott "8.2-A"), 4072d8e8dd2SOliver Stannard ARMCPUTestParams<uint64_t>("cortex-a510", "armv9-a", "neon-fp-armv8", 4082d8e8dd2SOliver Stannard ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | 4092d8e8dd2SOliver Stannard ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | 4102d8e8dd2SOliver Stannard ARM::AEK_DSP | ARM::AEK_CRC | 4112d8e8dd2SOliver Stannard ARM::AEK_RAS | ARM::AEK_DOTPROD | 4122d8e8dd2SOliver Stannard ARM::AEK_FP16FML | ARM::AEK_BF16 | 4132d8e8dd2SOliver Stannard ARM::AEK_I8MM | ARM::AEK_SB, 4142d8e8dd2SOliver Stannard "9-A"), 415491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("cortex-a710", "armv9-a", "neon-fp-armv8", 416f09cf34dSArchibald Elliott ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | 417f09cf34dSArchibald Elliott ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | 418800de14fSDavid Green ARM::AEK_DSP | ARM::AEK_CRC | 419800de14fSDavid Green ARM::AEK_RAS | ARM::AEK_DOTPROD | 420800de14fSDavid Green ARM::AEK_FP16FML | ARM::AEK_BF16 | 421800de14fSDavid Green ARM::AEK_I8MM | ARM::AEK_SB, 422f09cf34dSArchibald Elliott "9-A"), 423800de14fSDavid Green ARMCPUTestParams<uint64_t>( 424800de14fSDavid Green "cortex-a77", "armv8.2-a", "crypto-neon-fp-armv8", 425800de14fSDavid Green ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | 426800de14fSDavid Green ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | 427f09cf34dSArchibald Elliott ARM::AEK_FP16 | ARM::AEK_RAS | ARM::AEK_DOTPROD, 428f09cf34dSArchibald Elliott "8.2-A"), 429800de14fSDavid Green ARMCPUTestParams<uint64_t>( 430800de14fSDavid Green "cortex-a78", "armv8.2-a", "crypto-neon-fp-armv8", 431800de14fSDavid Green ARM::AEK_DOTPROD | ARM::AEK_FP16 | ARM::AEK_SEC | ARM::AEK_MP | 432800de14fSDavid Green ARM::AEK_VIRT | ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | 433800de14fSDavid Green ARM::AEK_DSP | ARM::AEK_CRC | ARM::AEK_RAS, 434800de14fSDavid Green "8.2-A"), 435800de14fSDavid Green ARMCPUTestParams<uint64_t>( 43681601391SJonathan Thackray "cortex-a78ae", "armv8.2-a", "crypto-neon-fp-armv8", 43781601391SJonathan Thackray ARM::AEK_RAS | ARM::AEK_DOTPROD | ARM::AEK_SEC | ARM::AEK_MP | 43881601391SJonathan Thackray ARM::AEK_VIRT | ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | 43981601391SJonathan Thackray ARM::AEK_DSP | ARM::AEK_CRC | ARM::AEK_RAS, 44081601391SJonathan Thackray "8.2-A"), 44181601391SJonathan Thackray ARMCPUTestParams<uint64_t>( 442800de14fSDavid Green "cortex-x1", "armv8.2-a", "crypto-neon-fp-armv8", 443800de14fSDavid Green ARM::AEK_RAS | ARM::AEK_FP16 | ARM::AEK_DOTPROD | ARM::AEK_SEC | 444f09cf34dSArchibald Elliott ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM | 445800de14fSDavid Green ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_CRC, 446f09cf34dSArchibald Elliott "8.2-A"), 447800de14fSDavid Green ARMCPUTestParams<uint64_t>( 448800de14fSDavid Green "cortex-x1c", "armv8.2-a", "crypto-neon-fp-armv8", 449800de14fSDavid Green ARM::AEK_RAS | ARM::AEK_FP16 | ARM::AEK_DOTPROD | ARM::AEK_SEC | 450800de14fSDavid Green ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM | 451800de14fSDavid Green ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_CRC, 452f09cf34dSArchibald Elliott "8.2-A"), 453800de14fSDavid Green ARMCPUTestParams<uint64_t>( 454800de14fSDavid Green "neoverse-n1", "armv8.2-a", "crypto-neon-fp-armv8", 455800de14fSDavid Green ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | 456800de14fSDavid Green ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | 457f09cf34dSArchibald Elliott ARM::AEK_FP16 | ARM::AEK_RAS | ARM::AEK_DOTPROD, 458f09cf34dSArchibald Elliott "8.2-A"), 459800de14fSDavid Green ARMCPUTestParams<uint64_t>( 460800de14fSDavid Green "neoverse-n2", "armv9-a", "neon-fp-armv8", 461800de14fSDavid Green ARM::AEK_CRC | ARM::AEK_HWDIVTHUMB | ARM::AEK_HWDIVARM | 462800de14fSDavid Green ARM::AEK_MP | ARM::AEK_SEC | ARM::AEK_VIRT | ARM::AEK_DSP | 463800de14fSDavid Green ARM::AEK_BF16 | ARM::AEK_DOTPROD | ARM::AEK_RAS | 464800de14fSDavid Green ARM::AEK_I8MM | ARM::AEK_FP16FML | ARM::AEK_SB, 465f576cbe4SJonathan Thackray "9-A"), 466800de14fSDavid Green ARMCPUTestParams<uint64_t>( 467800de14fSDavid Green "neoverse-v1", "armv8.4-a", "crypto-neon-fp-armv8", 468800de14fSDavid Green ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM | 469800de14fSDavid Green ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_CRC | 470800de14fSDavid Green ARM::AEK_RAS | ARM::AEK_FP16 | ARM::AEK_BF16 | ARM::AEK_DOTPROD, 471f09cf34dSArchibald Elliott "8.4-A"), 472491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("cyclone", "armv8-a", "crypto-neon-fp-armv8", 473f09cf34dSArchibald Elliott ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP | 474f09cf34dSArchibald Elliott ARM::AEK_VIRT | ARM::AEK_HWDIVARM | 475f09cf34dSArchibald Elliott ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, 476f09cf34dSArchibald Elliott "8-A"), 477800de14fSDavid Green ARMCPUTestParams<uint64_t>("exynos-m3", "armv8-a", 478800de14fSDavid Green "crypto-neon-fp-armv8", 479f09cf34dSArchibald Elliott ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP | 480f09cf34dSArchibald Elliott ARM::AEK_VIRT | ARM::AEK_HWDIVARM | 481f09cf34dSArchibald Elliott ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, 482f09cf34dSArchibald Elliott "8-A"), 483800de14fSDavid Green ARMCPUTestParams<uint64_t>( 484800de14fSDavid Green "exynos-m4", "armv8.2-a", "crypto-neon-fp-armv8", 485800de14fSDavid Green ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | 486800de14fSDavid Green ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | 487f09cf34dSArchibald Elliott ARM::AEK_DOTPROD | ARM::AEK_FP16 | ARM::AEK_RAS, 488f09cf34dSArchibald Elliott "8.2-A"), 489800de14fSDavid Green ARMCPUTestParams<uint64_t>( 490800de14fSDavid Green "exynos-m5", "armv8.2-a", "crypto-neon-fp-armv8", 491800de14fSDavid Green ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | 492800de14fSDavid Green ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | 493f09cf34dSArchibald Elliott ARM::AEK_DOTPROD | ARM::AEK_FP16 | ARM::AEK_RAS, 494f09cf34dSArchibald Elliott "8.2-A"), 495491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("cortex-m23", "armv8-m.base", "none", 496800de14fSDavid Green ARM::AEK_NONE | ARM::AEK_HWDIVTHUMB, 497800de14fSDavid Green "8-M.Baseline"), 498491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("cortex-m33", "armv8-m.main", "fpv5-sp-d16", 499800de14fSDavid Green ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, 500800de14fSDavid Green "8-M.Mainline"), 501aa2c0f35SAlbert Huang ARMCPUTestParams<uint64_t>("star-mc1", "armv8-m.main", "fpv5-sp-d16", 502aa2c0f35SAlbert Huang ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, 503aa2c0f35SAlbert Huang "8-M.Mainline"), 504491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("cortex-m35p", "armv8-m.main", "fpv5-sp-d16", 505800de14fSDavid Green ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, 506800de14fSDavid Green "8-M.Mainline"), 507800de14fSDavid Green ARMCPUTestParams<uint64_t>( 508800de14fSDavid Green "cortex-m55", "armv8.1-m.main", "fp-armv8-fullfp16-d16", 509800de14fSDavid Green ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_SIMD | ARM::AEK_FP | 510800de14fSDavid Green ARM::AEK_RAS | ARM::AEK_LOB | ARM::AEK_FP16, 511f09cf34dSArchibald Elliott "8.1-M.Mainline"), 512800de14fSDavid Green ARMCPUTestParams<uint64_t>( 513800de14fSDavid Green "cortex-m85", "armv8.1-m.main", "fp-armv8-fullfp16-d16", 514800de14fSDavid Green ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_SIMD | ARM::AEK_FP | 515800de14fSDavid Green ARM::AEK_RAS | ARM::AEK_LOB | ARM::AEK_FP16 | ARM::AEK_PACBTI, 516f09cf34dSArchibald Elliott "8.1-M.Mainline"), 517800de14fSDavid Green ARMCPUTestParams<uint64_t>( 518800de14fSDavid Green "cortex-m52", "armv8.1-m.main", "fp-armv8-fullfp16-d16", 519800de14fSDavid Green ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_SIMD | ARM::AEK_FP | 520800de14fSDavid Green ARM::AEK_RAS | ARM::AEK_LOB | ARM::AEK_FP16 | ARM::AEK_PACBTI, 5218758e648SJonathan Thackray "8.1-M.Mainline"), 522800de14fSDavid Green ARMCPUTestParams<uint64_t>("iwmmxt", "iwmmxt", "none", ARM::AEK_NONE, 523800de14fSDavid Green "iwmmxt"), 524800de14fSDavid Green ARMCPUTestParams<uint64_t>("xscale", "xscale", "none", ARM::AEK_NONE, 525800de14fSDavid Green "xscale"), 526491a1cd0ShassnaaHamdi ARMCPUTestParams<uint64_t>("swift", "armv7s", "neon-vfpv4", 527800de14fSDavid Green ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | 528800de14fSDavid Green ARM::AEK_DSP, 529c7d181ccSJon Roelofs "7-S")), 530c7d181ccSJon Roelofs ARMCPUTestParams<uint64_t>::PrintToStringParamName); 531f09cf34dSArchibald Elliott 5322d8e8dd2SOliver Stannard static constexpr unsigned NumARMCPUArchs = 94; 533f09cf34dSArchibald Elliott 534f09cf34dSArchibald Elliott TEST(TargetParserTest, testARMCPUArchList) { 535f09cf34dSArchibald Elliott SmallVector<StringRef, NumARMCPUArchs> List; 536f09cf34dSArchibald Elliott ARM::fillValidCPUArchList(List); 537f09cf34dSArchibald Elliott 538f09cf34dSArchibald Elliott // No list exists for these in this test suite, so ensure all are 539f09cf34dSArchibald Elliott // valid, and match the expected 'magic' count. 540f09cf34dSArchibald Elliott EXPECT_EQ(List.size(), NumARMCPUArchs); 541f09cf34dSArchibald Elliott for (StringRef CPU : List) { 542f09cf34dSArchibald Elliott EXPECT_NE(ARM::parseCPUArch(CPU), ARM::ArchKind::INVALID); 543f09cf34dSArchibald Elliott } 544f09cf34dSArchibald Elliott } 545f09cf34dSArchibald Elliott 546f09cf34dSArchibald Elliott TEST(TargetParserTest, testInvalidARMArch) { 547f09cf34dSArchibald Elliott auto InvalidArchStrings = {"armv", "armv99", "noarm"}; 548f09cf34dSArchibald Elliott for (const char *InvalidArch : InvalidArchStrings) 549f09cf34dSArchibald Elliott EXPECT_EQ(ARM::parseArch(InvalidArch), ARM::ArchKind::INVALID); 550f09cf34dSArchibald Elliott } 551f09cf34dSArchibald Elliott 552f09cf34dSArchibald Elliott bool testARMArch(StringRef Arch, StringRef DefaultCPU, StringRef SubArch, 553f09cf34dSArchibald Elliott unsigned ArchAttr) { 554f09cf34dSArchibald Elliott ARM::ArchKind AK = ARM::parseArch(Arch); 555f09cf34dSArchibald Elliott bool Result = (AK != ARM::ArchKind::INVALID); 556bb6df080SKazu Hirata Result &= ARM::getDefaultCPU(Arch) == DefaultCPU; 557bb6df080SKazu Hirata Result &= ARM::getSubArch(AK) == SubArch; 558f09cf34dSArchibald Elliott Result &= (ARM::getArchAttr(AK) == ArchAttr); 559f09cf34dSArchibald Elliott return Result; 560f09cf34dSArchibald Elliott } 561f09cf34dSArchibald Elliott 562f09cf34dSArchibald Elliott TEST(TargetParserTest, testARMArch) { 563f09cf34dSArchibald Elliott EXPECT_TRUE( 564800de14fSDavid Green testARMArch("armv4", "strongarm", "v4", ARMBuildAttrs::CPUArch::v4)); 565f09cf34dSArchibald Elliott EXPECT_TRUE( 566800de14fSDavid Green testARMArch("armv4t", "arm7tdmi", "v4t", ARMBuildAttrs::CPUArch::v4T)); 567f09cf34dSArchibald Elliott EXPECT_TRUE( 568800de14fSDavid Green testARMArch("armv5t", "arm10tdmi", "v5", ARMBuildAttrs::CPUArch::v5T)); 569f09cf34dSArchibald Elliott EXPECT_TRUE( 570800de14fSDavid Green testARMArch("armv5te", "arm1022e", "v5e", ARMBuildAttrs::CPUArch::v5TE)); 571800de14fSDavid Green EXPECT_TRUE(testARMArch("armv5tej", "arm926ej-s", "v5e", 572f09cf34dSArchibald Elliott ARMBuildAttrs::CPUArch::v5TEJ)); 573f09cf34dSArchibald Elliott EXPECT_TRUE( 574800de14fSDavid Green testARMArch("armv6", "arm1136jf-s", "v6", ARMBuildAttrs::CPUArch::v6)); 575f09cf34dSArchibald Elliott EXPECT_TRUE( 576800de14fSDavid Green testARMArch("armv6k", "mpcore", "v6k", ARMBuildAttrs::CPUArch::v6K)); 577800de14fSDavid Green EXPECT_TRUE(testARMArch("armv6t2", "arm1156t2-s", "v6t2", 578f09cf34dSArchibald Elliott ARMBuildAttrs::CPUArch::v6T2)); 579800de14fSDavid Green EXPECT_TRUE(testARMArch("armv6kz", "arm1176jzf-s", "v6kz", 580f09cf34dSArchibald Elliott ARMBuildAttrs::CPUArch::v6KZ)); 581f09cf34dSArchibald Elliott EXPECT_TRUE( 582800de14fSDavid Green testARMArch("armv6-m", "cortex-m0", "v6m", ARMBuildAttrs::CPUArch::v6_M)); 583f09cf34dSArchibald Elliott EXPECT_TRUE( 584800de14fSDavid Green testARMArch("armv7-a", "generic", "v7", ARMBuildAttrs::CPUArch::v7)); 585f09cf34dSArchibald Elliott EXPECT_TRUE( 586800de14fSDavid Green testARMArch("armv7ve", "generic", "v7ve", ARMBuildAttrs::CPUArch::v7)); 587f09cf34dSArchibald Elliott EXPECT_TRUE( 588800de14fSDavid Green testARMArch("armv7-r", "cortex-r4", "v7r", ARMBuildAttrs::CPUArch::v7)); 589f09cf34dSArchibald Elliott EXPECT_TRUE( 590800de14fSDavid Green testARMArch("armv7-m", "cortex-m3", "v7m", ARMBuildAttrs::CPUArch::v7)); 591800de14fSDavid Green EXPECT_TRUE(testARMArch("armv7e-m", "cortex-m4", "v7em", 592f09cf34dSArchibald Elliott ARMBuildAttrs::CPUArch::v7E_M)); 593f09cf34dSArchibald Elliott EXPECT_TRUE( 594800de14fSDavid Green testARMArch("armv8-a", "generic", "v8a", ARMBuildAttrs::CPUArch::v8_A)); 595800de14fSDavid Green EXPECT_TRUE(testARMArch("armv8.1-a", "generic", "v8.1a", 596f09cf34dSArchibald Elliott ARMBuildAttrs::CPUArch::v8_A)); 597800de14fSDavid Green EXPECT_TRUE(testARMArch("armv8.2-a", "generic", "v8.2a", 598f09cf34dSArchibald Elliott ARMBuildAttrs::CPUArch::v8_A)); 599800de14fSDavid Green EXPECT_TRUE(testARMArch("armv8.3-a", "generic", "v8.3a", 600f09cf34dSArchibald Elliott ARMBuildAttrs::CPUArch::v8_A)); 601800de14fSDavid Green EXPECT_TRUE(testARMArch("armv8.4-a", "generic", "v8.4a", 602f09cf34dSArchibald Elliott ARMBuildAttrs::CPUArch::v8_A)); 603800de14fSDavid Green EXPECT_TRUE(testARMArch("armv8.5-a", "generic", "v8.5a", 604f09cf34dSArchibald Elliott ARMBuildAttrs::CPUArch::v8_A)); 605800de14fSDavid Green EXPECT_TRUE(testARMArch("armv8.6-a", "generic", "v8.6a", 606f09cf34dSArchibald Elliott ARMBuildAttrs::CPUArch::v8_A)); 607800de14fSDavid Green EXPECT_TRUE(testARMArch("armv8.7-a", "generic", "v8.7a", 608f09cf34dSArchibald Elliott ARMBuildAttrs::CPUArch::v8_A)); 609f09cf34dSArchibald Elliott EXPECT_TRUE(testARMArch("armv8.8-a", "generic", "v8.8a", 610f09cf34dSArchibald Elliott ARMBuildAttrs::CPUArch::v8_A)); 611800de14fSDavid Green EXPECT_TRUE(testARMArch("armv8.9-a", "generic", "v8.9a", 612f09cf34dSArchibald Elliott ARMBuildAttrs::CPUArch::v8_A)); 613f09cf34dSArchibald Elliott EXPECT_TRUE( 614800de14fSDavid Green testARMArch("armv9-a", "generic", "v9a", ARMBuildAttrs::CPUArch::v9_A)); 615800de14fSDavid Green EXPECT_TRUE(testARMArch("armv9.1-a", "generic", "v9.1a", 616f09cf34dSArchibald Elliott ARMBuildAttrs::CPUArch::v9_A)); 617800de14fSDavid Green EXPECT_TRUE(testARMArch("armv9.2-a", "generic", "v9.2a", 618f09cf34dSArchibald Elliott ARMBuildAttrs::CPUArch::v9_A)); 619800de14fSDavid Green EXPECT_TRUE(testARMArch("armv9.3-a", "generic", "v9.3a", 620f09cf34dSArchibald Elliott ARMBuildAttrs::CPUArch::v9_A)); 621800de14fSDavid Green EXPECT_TRUE(testARMArch("armv9.4-a", "generic", "v9.4a", 622f09cf34dSArchibald Elliott ARMBuildAttrs::CPUArch::v9_A)); 623800de14fSDavid Green EXPECT_TRUE(testARMArch("armv9.5-a", "generic", "v9.5a", 624f09cf34dSArchibald Elliott ARMBuildAttrs::CPUArch::v9_A)); 625d0756caeSJonathan Thackray EXPECT_TRUE(testARMArch("armv9.6-a", "generic", "v9.6a", 626d0756caeSJonathan Thackray ARMBuildAttrs::CPUArch::v9_A)); 627651bdb96SChris Copeland EXPECT_TRUE( 628651bdb96SChris Copeland testARMArch("armv8-r", "generic", "v8r", ARMBuildAttrs::CPUArch::v8_R)); 629800de14fSDavid Green EXPECT_TRUE(testARMArch("armv8-m.base", "generic", "v8m.base", 630f09cf34dSArchibald Elliott ARMBuildAttrs::CPUArch::v8_M_Base)); 631800de14fSDavid Green EXPECT_TRUE(testARMArch("armv8-m.main", "generic", "v8m.main", 632f09cf34dSArchibald Elliott ARMBuildAttrs::CPUArch::v8_M_Main)); 633800de14fSDavid Green EXPECT_TRUE(testARMArch("armv8.1-m.main", "generic", "v8.1m.main", 634f09cf34dSArchibald Elliott ARMBuildAttrs::CPUArch::v8_1_M_Main)); 635f09cf34dSArchibald Elliott EXPECT_TRUE( 636800de14fSDavid Green testARMArch("iwmmxt", "iwmmxt", "", ARMBuildAttrs::CPUArch::v5TE)); 637f09cf34dSArchibald Elliott EXPECT_TRUE( 638800de14fSDavid Green testARMArch("iwmmxt2", "generic", "", ARMBuildAttrs::CPUArch::v5TE)); 639f09cf34dSArchibald Elliott EXPECT_TRUE( 640800de14fSDavid Green testARMArch("xscale", "xscale", "v5e", ARMBuildAttrs::CPUArch::v5TE)); 641f09cf34dSArchibald Elliott EXPECT_TRUE( 642800de14fSDavid Green testARMArch("armv7s", "swift", "v7s", ARMBuildAttrs::CPUArch::v7)); 643f09cf34dSArchibald Elliott EXPECT_TRUE( 644800de14fSDavid Green testARMArch("armv7k", "generic", "v7k", ARMBuildAttrs::CPUArch::v7)); 645f09cf34dSArchibald Elliott } 646f09cf34dSArchibald Elliott 647800de14fSDavid Green bool testARMExtension(StringRef CPUName, ARM::ArchKind ArchKind, 648800de14fSDavid Green StringRef ArchExt) { 649f09cf34dSArchibald Elliott return ARM::getDefaultExtensions(CPUName, ArchKind) & 650f09cf34dSArchibald Elliott ARM::parseArchExt(ArchExt); 651f09cf34dSArchibald Elliott } 652f09cf34dSArchibald Elliott 653f09cf34dSArchibald Elliott TEST(TargetParserTest, testARMExtension) { 654f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("strongarm", ARM::ArchKind::INVALID, "dsp")); 655f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("arm7tdmi", ARM::ArchKind::INVALID, "dsp")); 656800de14fSDavid Green EXPECT_FALSE(testARMExtension("arm10tdmi", ARM::ArchKind::INVALID, "simd")); 657f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("arm1022e", ARM::ArchKind::INVALID, "simd")); 658800de14fSDavid Green EXPECT_FALSE(testARMExtension("arm926ej-s", ARM::ArchKind::INVALID, "simd")); 659800de14fSDavid Green EXPECT_FALSE( 660800de14fSDavid Green testARMExtension("arm1136jf-s", ARM::ArchKind::INVALID, "crypto")); 661800de14fSDavid Green EXPECT_FALSE( 662800de14fSDavid Green testARMExtension("arm1156t2-s", ARM::ArchKind::INVALID, "crypto")); 663800de14fSDavid Green EXPECT_FALSE( 664800de14fSDavid Green testARMExtension("arm1176jzf-s", ARM::ArchKind::INVALID, "crypto")); 665800de14fSDavid Green EXPECT_FALSE(testARMExtension("cortex-m0", ARM::ArchKind::INVALID, "crypto")); 666800de14fSDavid Green EXPECT_FALSE(testARMExtension("cortex-a8", ARM::ArchKind::INVALID, "crypto")); 667800de14fSDavid Green EXPECT_FALSE(testARMExtension("cortex-r4", ARM::ArchKind::INVALID, "crypto")); 668800de14fSDavid Green EXPECT_FALSE(testARMExtension("cortex-m3", ARM::ArchKind::INVALID, "crypto")); 669800de14fSDavid Green EXPECT_FALSE(testARMExtension("cortex-a53", ARM::ArchKind::INVALID, "ras")); 670800de14fSDavid Green EXPECT_FALSE(testARMExtension("cortex-a53", ARM::ArchKind::INVALID, "fp16")); 671800de14fSDavid Green EXPECT_TRUE(testARMExtension("cortex-a55", ARM::ArchKind::INVALID, "fp16")); 672800de14fSDavid Green EXPECT_FALSE( 673800de14fSDavid Green testARMExtension("cortex-a55", ARM::ArchKind::INVALID, "fp16fml")); 674800de14fSDavid Green EXPECT_TRUE(testARMExtension("cortex-a75", ARM::ArchKind::INVALID, "fp16")); 675800de14fSDavid Green EXPECT_FALSE( 676800de14fSDavid Green testARMExtension("cortex-a75", ARM::ArchKind::INVALID, "fp16fml")); 677800de14fSDavid Green EXPECT_FALSE(testARMExtension("cortex-r52", ARM::ArchKind::INVALID, "ras")); 678917afa88SJonathan Thackray EXPECT_FALSE( 679917afa88SJonathan Thackray testARMExtension("cortex-r52plus", ARM::ArchKind::INVALID, "ras")); 680f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("iwmmxt", ARM::ArchKind::INVALID, "crc")); 681f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("xscale", ARM::ArchKind::INVALID, "crc")); 682f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("swift", ARM::ArchKind::INVALID, "crc")); 683f09cf34dSArchibald Elliott 684f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV4, "dsp")); 685f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV4T, "dsp")); 686f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV5T, "simd")); 687f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV5TE, "simd")); 688f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV5TEJ, "simd")); 689f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV6, "crypto")); 690f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV6K, "crypto")); 691800de14fSDavid Green EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV6T2, "crypto")); 692800de14fSDavid Green EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV6KZ, "crypto")); 693f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV6M, "crypto")); 694f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV7A, "crypto")); 695f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV7R, "crypto")); 696f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV7M, "crypto")); 697800de14fSDavid Green EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV7EM, "crypto")); 698f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8A, "ras")); 699f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_1A, "ras")); 700f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_2A, "profile")); 701f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_2A, "fp16")); 702f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_2A, "fp16fml")); 703f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_3A, "fp16")); 704f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_3A, "fp16fml")); 705f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_4A, "fp16")); 706f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_4A, "fp16fml")); 707f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8R, "ras")); 708800de14fSDavid Green EXPECT_FALSE( 709800de14fSDavid Green testARMExtension("generic", ARM::ArchKind::ARMV8MBaseline, "crc")); 710800de14fSDavid Green EXPECT_FALSE( 711800de14fSDavid Green testARMExtension("generic", ARM::ArchKind::ARMV8MMainline, "crc")); 712f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::IWMMXT, "crc")); 713f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::IWMMXT2, "crc")); 714f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::XSCALE, "crc")); 715f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV7S, "crypto")); 716f09cf34dSArchibald Elliott EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV7K, "crypto")); 717f09cf34dSArchibald Elliott } 718f09cf34dSArchibald Elliott 719f09cf34dSArchibald Elliott TEST(TargetParserTest, ARMFPUVersion) { 720f09cf34dSArchibald Elliott for (ARM::FPUKind FK = static_cast<ARM::FPUKind>(0); 721f09cf34dSArchibald Elliott FK <= ARM::FPUKind::FK_LAST; 722f09cf34dSArchibald Elliott FK = static_cast<ARM::FPUKind>(static_cast<unsigned>(FK) + 1)) 723f09cf34dSArchibald Elliott if (FK == ARM::FK_LAST || ARM::getFPUName(FK) == "invalid" || 724f09cf34dSArchibald Elliott ARM::getFPUName(FK) == "none" || ARM::getFPUName(FK) == "softvfp") 725f09cf34dSArchibald Elliott EXPECT_EQ(ARM::FPUVersion::NONE, ARM::getFPUVersion(FK)); 726f09cf34dSArchibald Elliott else 727f09cf34dSArchibald Elliott EXPECT_NE(ARM::FPUVersion::NONE, ARM::getFPUVersion(FK)); 728f09cf34dSArchibald Elliott } 729f09cf34dSArchibald Elliott 730f09cf34dSArchibald Elliott TEST(TargetParserTest, ARMFPUNeonSupportLevel) { 731f09cf34dSArchibald Elliott for (ARM::FPUKind FK = static_cast<ARM::FPUKind>(0); 732f09cf34dSArchibald Elliott FK <= ARM::FPUKind::FK_LAST; 733f09cf34dSArchibald Elliott FK = static_cast<ARM::FPUKind>(static_cast<unsigned>(FK) + 1)) 734f09cf34dSArchibald Elliott if (FK == ARM::FK_LAST || 735f09cf34dSArchibald Elliott ARM::getFPUName(FK).find("neon") == std::string::npos) 736800de14fSDavid Green EXPECT_EQ(ARM::NeonSupportLevel::None, ARM::getFPUNeonSupportLevel(FK)); 737f09cf34dSArchibald Elliott else 738800de14fSDavid Green EXPECT_NE(ARM::NeonSupportLevel::None, ARM::getFPUNeonSupportLevel(FK)); 739f09cf34dSArchibald Elliott } 740f09cf34dSArchibald Elliott 741f09cf34dSArchibald Elliott TEST(TargetParserTest, ARMFPURestriction) { 742f09cf34dSArchibald Elliott for (ARM::FPUKind FK = static_cast<ARM::FPUKind>(0); 743f09cf34dSArchibald Elliott FK <= ARM::FPUKind::FK_LAST; 744f09cf34dSArchibald Elliott FK = static_cast<ARM::FPUKind>(static_cast<unsigned>(FK) + 1)) { 745f09cf34dSArchibald Elliott if (FK == ARM::FK_LAST || 746f09cf34dSArchibald Elliott (ARM::getFPUName(FK).find("d16") == std::string::npos && 747f09cf34dSArchibald Elliott ARM::getFPUName(FK).find("vfpv3xd") == std::string::npos)) 748f09cf34dSArchibald Elliott EXPECT_EQ(ARM::FPURestriction::None, ARM::getFPURestriction(FK)); 749f09cf34dSArchibald Elliott else 750f09cf34dSArchibald Elliott EXPECT_NE(ARM::FPURestriction::None, ARM::getFPURestriction(FK)); 751f09cf34dSArchibald Elliott } 752f09cf34dSArchibald Elliott } 753f09cf34dSArchibald Elliott 754f09cf34dSArchibald Elliott TEST(TargetParserTest, ARMExtensionFeatures) { 755f09cf34dSArchibald Elliott std::map<uint64_t, std::vector<StringRef>> Extensions; 756f09cf34dSArchibald Elliott 757f09cf34dSArchibald Elliott for (auto &Ext : ARM::ARCHExtNames) { 758f09cf34dSArchibald Elliott if (!Ext.Feature.empty() && !Ext.NegFeature.empty()) 759f09cf34dSArchibald Elliott Extensions[Ext.ID] = {Ext.Feature, Ext.NegFeature}; 760f09cf34dSArchibald Elliott } 761f09cf34dSArchibald Elliott 762f09cf34dSArchibald Elliott Extensions[ARM::AEK_HWDIVARM] = {"+hwdiv-arm", "-hwdiv-arm"}; 763f09cf34dSArchibald Elliott Extensions[ARM::AEK_HWDIVTHUMB] = {"+hwdiv", "-hwdiv"}; 764f09cf34dSArchibald Elliott 765f09cf34dSArchibald Elliott std::vector<StringRef> Features; 766f09cf34dSArchibald Elliott 767f09cf34dSArchibald Elliott EXPECT_FALSE(ARM::getExtensionFeatures(ARM::AEK_INVALID, Features)); 768f09cf34dSArchibald Elliott 769f09cf34dSArchibald Elliott for (auto &E : Extensions) { 770f09cf34dSArchibald Elliott // test +extension 771f09cf34dSArchibald Elliott Features.clear(); 772f09cf34dSArchibald Elliott ARM::getExtensionFeatures(E.first, Features); 773f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, E.second.at(0))); 774f09cf34dSArchibald Elliott EXPECT_EQ(Extensions.size(), Features.size()); 775f09cf34dSArchibald Elliott 776f09cf34dSArchibald Elliott // test -extension 777f09cf34dSArchibald Elliott Features.clear(); 778f09cf34dSArchibald Elliott ARM::getExtensionFeatures(~E.first, Features); 779f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, E.second.at(1))); 780f09cf34dSArchibald Elliott EXPECT_EQ(Extensions.size(), Features.size()); 781f09cf34dSArchibald Elliott } 782f09cf34dSArchibald Elliott } 783f09cf34dSArchibald Elliott 784f09cf34dSArchibald Elliott TEST(TargetParserTest, ARMFPUFeatures) { 785f09cf34dSArchibald Elliott std::vector<StringRef> Features; 786f09cf34dSArchibald Elliott for (ARM::FPUKind FK = static_cast<ARM::FPUKind>(0); 787f09cf34dSArchibald Elliott FK <= ARM::FPUKind::FK_LAST; 788f09cf34dSArchibald Elliott FK = static_cast<ARM::FPUKind>(static_cast<unsigned>(FK) + 1)) { 789f09cf34dSArchibald Elliott if (FK == ARM::FK_INVALID || FK >= ARM::FK_LAST) 790f09cf34dSArchibald Elliott EXPECT_FALSE(ARM::getFPUFeatures(FK, Features)); 791f09cf34dSArchibald Elliott else 792f09cf34dSArchibald Elliott EXPECT_TRUE(ARM::getFPUFeatures(FK, Features)); 793f09cf34dSArchibald Elliott } 794f09cf34dSArchibald Elliott } 795f09cf34dSArchibald Elliott 796f09cf34dSArchibald Elliott TEST(TargetParserTest, ARMArchExtFeature) { 797f09cf34dSArchibald Elliott const char *ArchExt[][4] = {{"crc", "nocrc", "+crc", "-crc"}, 798f09cf34dSArchibald Elliott {"crypto", "nocrypto", "+crypto", "-crypto"}, 799f09cf34dSArchibald Elliott {"dsp", "nodsp", "+dsp", "-dsp"}, 800f09cf34dSArchibald Elliott {"fp", "nofp", nullptr, nullptr}, 801f09cf34dSArchibald Elliott {"idiv", "noidiv", nullptr, nullptr}, 802f09cf34dSArchibald Elliott {"mp", "nomp", nullptr, nullptr}, 803f09cf34dSArchibald Elliott {"simd", "nosimd", nullptr, nullptr}, 804f09cf34dSArchibald Elliott {"sec", "nosec", nullptr, nullptr}, 805f09cf34dSArchibald Elliott {"virt", "novirt", nullptr, nullptr}, 806f09cf34dSArchibald Elliott {"fp16", "nofp16", "+fullfp16", "-fullfp16"}, 807f09cf34dSArchibald Elliott {"fp16fml", "nofp16fml", "+fp16fml", "-fp16fml"}, 808f09cf34dSArchibald Elliott {"ras", "noras", "+ras", "-ras"}, 809f09cf34dSArchibald Elliott {"dotprod", "nodotprod", "+dotprod", "-dotprod"}, 810f09cf34dSArchibald Elliott {"os", "noos", nullptr, nullptr}, 811f09cf34dSArchibald Elliott {"iwmmxt", "noiwmmxt", nullptr, nullptr}, 812f09cf34dSArchibald Elliott {"iwmmxt2", "noiwmmxt2", nullptr, nullptr}, 813f09cf34dSArchibald Elliott {"maverick", "maverick", nullptr, nullptr}, 814f09cf34dSArchibald Elliott {"xscale", "noxscale", nullptr, nullptr}, 815f09cf34dSArchibald Elliott {"sb", "nosb", "+sb", "-sb"}, 816f09cf34dSArchibald Elliott {"i8mm", "noi8mm", "+i8mm", "-i8mm"}, 817f09cf34dSArchibald Elliott {"mve", "nomve", "+mve", "-mve"}, 818f09cf34dSArchibald Elliott {"mve.fp", "nomve.fp", "+mve.fp", "-mve.fp"}}; 819f09cf34dSArchibald Elliott 820f09cf34dSArchibald Elliott for (unsigned i = 0; i < std::size(ArchExt); i++) { 821f09cf34dSArchibald Elliott EXPECT_EQ(StringRef(ArchExt[i][2]), ARM::getArchExtFeature(ArchExt[i][0])); 822f09cf34dSArchibald Elliott EXPECT_EQ(StringRef(ArchExt[i][3]), ARM::getArchExtFeature(ArchExt[i][1])); 823f09cf34dSArchibald Elliott } 824f09cf34dSArchibald Elliott } 825f09cf34dSArchibald Elliott 826f09cf34dSArchibald Elliott static bool 827f09cf34dSArchibald Elliott testArchExtDependency(const char *ArchExt, 828f09cf34dSArchibald Elliott const std::initializer_list<const char *> &Expected) { 829f09cf34dSArchibald Elliott std::vector<StringRef> Features; 83060bbf271SMichael Platings ARM::FPUKind FPUKind; 831f09cf34dSArchibald Elliott 832f09cf34dSArchibald Elliott if (!ARM::appendArchExtFeatures("", ARM::ArchKind::ARMV8_1MMainline, ArchExt, 83360bbf271SMichael Platings Features, FPUKind)) 834f09cf34dSArchibald Elliott return false; 835f09cf34dSArchibald Elliott 836f09cf34dSArchibald Elliott return llvm::all_of(Expected, [&](StringRef Ext) { 837f09cf34dSArchibald Elliott return llvm::is_contained(Features, Ext); 838f09cf34dSArchibald Elliott }); 839f09cf34dSArchibald Elliott } 840f09cf34dSArchibald Elliott 841f09cf34dSArchibald Elliott TEST(TargetParserTest, ARMArchExtDependencies) { 842f09cf34dSArchibald Elliott EXPECT_TRUE(testArchExtDependency("mve", {"+mve", "+dsp"})); 843f09cf34dSArchibald Elliott EXPECT_TRUE(testArchExtDependency("mve.fp", {"+mve.fp", "+mve", "+dsp"})); 844f09cf34dSArchibald Elliott EXPECT_TRUE(testArchExtDependency("nodsp", {"-dsp", "-mve", "-mve.fp"})); 845f09cf34dSArchibald Elliott EXPECT_TRUE(testArchExtDependency("nomve", {"-mve", "-mve.fp"})); 846f09cf34dSArchibald Elliott } 847f09cf34dSArchibald Elliott 848f09cf34dSArchibald Elliott TEST(TargetParserTest, ARMparseHWDiv) { 849f09cf34dSArchibald Elliott const char *hwdiv[] = {"thumb", "arm", "arm,thumb", "thumb,arm"}; 850f09cf34dSArchibald Elliott 851f09cf34dSArchibald Elliott for (unsigned i = 0; i < std::size(hwdiv); i++) 852f09cf34dSArchibald Elliott EXPECT_NE(ARM::AEK_INVALID, ARM::parseHWDiv((StringRef)hwdiv[i])); 853f09cf34dSArchibald Elliott } 854f09cf34dSArchibald Elliott 855f09cf34dSArchibald Elliott TEST(TargetParserTest, ARMparseArchEndianAndISA) { 856f09cf34dSArchibald Elliott const char *Arch[] = { 857f09cf34dSArchibald Elliott "v2", "v2a", "v3", "v3m", "v4", "v4t", 858f09cf34dSArchibald Elliott "v5", "v5t", "v5e", "v5te", "v5tej", "v6", 859f09cf34dSArchibald Elliott "v6j", "v6k", "v6hl", "v6t2", "v6kz", "v6z", 860f09cf34dSArchibald Elliott "v6zk", "v6-m", "v6m", "v6sm", "v6s-m", "v7-a", 861f09cf34dSArchibald Elliott "v7", "v7a", "v7ve", "v7hl", "v7l", "v7-r", 862f09cf34dSArchibald Elliott "v7r", "v7-m", "v7m", "v7k", "v7s", "v7e-m", 863f09cf34dSArchibald Elliott "v7em", "v8-a", "v8", "v8a", "v8l", "v8.1-a", 864f09cf34dSArchibald Elliott "v8.1a", "v8.2-a", "v8.2a", "v8.3-a", "v8.3a", "v8.4-a", 865f09cf34dSArchibald Elliott "v8.4a", "v8.5-a", "v8.5a", "v8.6-a", "v8.6a", "v8.7-a", 866f09cf34dSArchibald Elliott "v8.7a", "v8.8-a", "v8.8a", "v8-r", "v8m.base", "v8m.main", 867f09cf34dSArchibald Elliott "v8.1m.main"}; 868f09cf34dSArchibald Elliott 869f09cf34dSArchibald Elliott for (unsigned i = 0; i < std::size(Arch); i++) { 870f09cf34dSArchibald Elliott std::string arm_1 = "armeb" + (std::string)(Arch[i]); 871f09cf34dSArchibald Elliott std::string arm_2 = "arm" + (std::string)(Arch[i]) + "eb"; 872f09cf34dSArchibald Elliott std::string arm_3 = "arm" + (std::string)(Arch[i]); 873f09cf34dSArchibald Elliott std::string thumb_1 = "thumbeb" + (std::string)(Arch[i]); 874f09cf34dSArchibald Elliott std::string thumb_2 = "thumb" + (std::string)(Arch[i]) + "eb"; 875f09cf34dSArchibald Elliott std::string thumb_3 = "thumb" + (std::string)(Arch[i]); 876f09cf34dSArchibald Elliott 877f09cf34dSArchibald Elliott EXPECT_EQ(ARM::EndianKind::BIG, ARM::parseArchEndian(arm_1)); 878f09cf34dSArchibald Elliott EXPECT_EQ(ARM::EndianKind::BIG, ARM::parseArchEndian(arm_2)); 879f09cf34dSArchibald Elliott EXPECT_EQ(ARM::EndianKind::LITTLE, ARM::parseArchEndian(arm_3)); 880f09cf34dSArchibald Elliott 881f09cf34dSArchibald Elliott EXPECT_EQ(ARM::ISAKind::ARM, ARM::parseArchISA(arm_1)); 882f09cf34dSArchibald Elliott EXPECT_EQ(ARM::ISAKind::ARM, ARM::parseArchISA(arm_2)); 883f09cf34dSArchibald Elliott EXPECT_EQ(ARM::ISAKind::ARM, ARM::parseArchISA(arm_3)); 884f09cf34dSArchibald Elliott if (i >= 4) { 885f09cf34dSArchibald Elliott EXPECT_EQ(ARM::EndianKind::BIG, ARM::parseArchEndian(thumb_1)); 886f09cf34dSArchibald Elliott EXPECT_EQ(ARM::EndianKind::BIG, ARM::parseArchEndian(thumb_2)); 887f09cf34dSArchibald Elliott EXPECT_EQ(ARM::EndianKind::LITTLE, ARM::parseArchEndian(thumb_3)); 888f09cf34dSArchibald Elliott 889f09cf34dSArchibald Elliott EXPECT_EQ(ARM::ISAKind::THUMB, ARM::parseArchISA(thumb_1)); 890f09cf34dSArchibald Elliott EXPECT_EQ(ARM::ISAKind::THUMB, ARM::parseArchISA(thumb_2)); 891f09cf34dSArchibald Elliott EXPECT_EQ(ARM::ISAKind::THUMB, ARM::parseArchISA(thumb_3)); 892f09cf34dSArchibald Elliott } 893f09cf34dSArchibald Elliott } 894f09cf34dSArchibald Elliott 895f09cf34dSArchibald Elliott EXPECT_EQ(ARM::EndianKind::LITTLE, ARM::parseArchEndian("aarch64")); 896f09cf34dSArchibald Elliott EXPECT_EQ(ARM::EndianKind::LITTLE, ARM::parseArchEndian("arm64_32")); 897f09cf34dSArchibald Elliott EXPECT_EQ(ARM::EndianKind::BIG, ARM::parseArchEndian("aarch64_be")); 898f09cf34dSArchibald Elliott 899f09cf34dSArchibald Elliott EXPECT_EQ(ARM::ISAKind::AARCH64, ARM::parseArchISA("aarch64")); 900f09cf34dSArchibald Elliott EXPECT_EQ(ARM::ISAKind::AARCH64, ARM::parseArchISA("aarch64_be")); 901f09cf34dSArchibald Elliott EXPECT_EQ(ARM::ISAKind::AARCH64, ARM::parseArchISA("arm64")); 902f09cf34dSArchibald Elliott EXPECT_EQ(ARM::ISAKind::AARCH64, ARM::parseArchISA("arm64_be")); 903f09cf34dSArchibald Elliott EXPECT_EQ(ARM::ISAKind::AARCH64, ARM::parseArchISA("arm64_32")); 904f09cf34dSArchibald Elliott EXPECT_EQ(ARM::ISAKind::AARCH64, ARM::parseArchISA("aarch64_32")); 905f09cf34dSArchibald Elliott } 906f09cf34dSArchibald Elliott 907f09cf34dSArchibald Elliott TEST(TargetParserTest, ARMparseArchProfile) { 908f09cf34dSArchibald Elliott for (unsigned i = 0; i < std::size(ARMArch); i++) { 909f09cf34dSArchibald Elliott switch (ARM::parseArch(ARMArch[i])) { 910f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV6M: 911f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV7M: 912f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV7EM: 913f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8MMainline: 914f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8MBaseline: 915f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8_1MMainline: 916f09cf34dSArchibald Elliott EXPECT_EQ(ARM::ProfileKind::M, ARM::parseArchProfile(ARMArch[i])); 917f09cf34dSArchibald Elliott break; 918f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV7R: 919f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8R: 920f09cf34dSArchibald Elliott EXPECT_EQ(ARM::ProfileKind::R, ARM::parseArchProfile(ARMArch[i])); 921f09cf34dSArchibald Elliott break; 922f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV7A: 923f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV7VE: 924f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV7K: 925f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8A: 926f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8_1A: 927f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8_2A: 928f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8_3A: 929f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8_4A: 930f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8_5A: 931f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8_6A: 932f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8_7A: 933f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8_8A: 934f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV8_9A: 935f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV9A: 936f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV9_1A: 937f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV9_2A: 938f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV9_3A: 939f09cf34dSArchibald Elliott case ARM::ArchKind::ARMV9_4A: 9406bbaad1eSLucas Duarte Prates case ARM::ArchKind::ARMV9_5A: 941d0756caeSJonathan Thackray case ARM::ArchKind::ARMV9_6A: 942f09cf34dSArchibald Elliott EXPECT_EQ(ARM::ProfileKind::A, ARM::parseArchProfile(ARMArch[i])); 943f09cf34dSArchibald Elliott break; 944f09cf34dSArchibald Elliott default: 945f09cf34dSArchibald Elliott EXPECT_EQ(ARM::ProfileKind::INVALID, ARM::parseArchProfile(ARMArch[i])); 946f09cf34dSArchibald Elliott break; 947f09cf34dSArchibald Elliott } 948f09cf34dSArchibald Elliott } 949f09cf34dSArchibald Elliott } 950f09cf34dSArchibald Elliott 951f09cf34dSArchibald Elliott TEST(TargetParserTest, ARMparseArchVersion) { 952f09cf34dSArchibald Elliott for (unsigned i = 0; i < std::size(ARMArch); i++) 953f09cf34dSArchibald Elliott if (((std::string)ARMArch[i]).substr(0, 4) == "armv") 954f09cf34dSArchibald Elliott EXPECT_EQ((ARMArch[i][4] - 48u), ARM::parseArchVersion(ARMArch[i])); 955f09cf34dSArchibald Elliott else 956f09cf34dSArchibald Elliott EXPECT_EQ(5u, ARM::parseArchVersion(ARMArch[i])); 957f09cf34dSArchibald Elliott } 958f09cf34dSArchibald Elliott 959f09cf34dSArchibald Elliott TEST(TargetParserTest, getARMCPUForArch) { 960f09cf34dSArchibald Elliott // Platform specific defaults. 961f09cf34dSArchibald Elliott { 962f09cf34dSArchibald Elliott llvm::Triple Triple("arm--nacl"); 963f09cf34dSArchibald Elliott EXPECT_EQ("cortex-a8", ARM::getARMCPUForArch(Triple)); 964f09cf34dSArchibald Elliott } 965f09cf34dSArchibald Elliott { 966f09cf34dSArchibald Elliott llvm::Triple Triple("arm--openbsd"); 967f09cf34dSArchibald Elliott EXPECT_EQ("cortex-a8", ARM::getARMCPUForArch(Triple)); 968f09cf34dSArchibald Elliott } 969f09cf34dSArchibald Elliott { 970f09cf34dSArchibald Elliott llvm::Triple Triple("armv6-unknown-freebsd"); 971f09cf34dSArchibald Elliott EXPECT_EQ("arm1176jzf-s", ARM::getARMCPUForArch(Triple)); 972f09cf34dSArchibald Elliott } 973f09cf34dSArchibald Elliott { 974f09cf34dSArchibald Elliott llvm::Triple Triple("thumbv6-unknown-freebsd"); 975f09cf34dSArchibald Elliott EXPECT_EQ("arm1176jzf-s", ARM::getARMCPUForArch(Triple)); 976f09cf34dSArchibald Elliott } 977f09cf34dSArchibald Elliott { 978f09cf34dSArchibald Elliott llvm::Triple Triple("armebv6-unknown-freebsd"); 979f09cf34dSArchibald Elliott EXPECT_EQ("arm1176jzf-s", ARM::getARMCPUForArch(Triple)); 980f09cf34dSArchibald Elliott } 981f09cf34dSArchibald Elliott { 982f09cf34dSArchibald Elliott llvm::Triple Triple("arm--win32"); 983f09cf34dSArchibald Elliott EXPECT_EQ("cortex-a9", ARM::getARMCPUForArch(Triple)); 984f09cf34dSArchibald Elliott EXPECT_EQ("generic", ARM::getARMCPUForArch(Triple, "armv8-a")); 985f09cf34dSArchibald Elliott } 986f09cf34dSArchibald Elliott // Some alternative architectures 987f09cf34dSArchibald Elliott { 988f09cf34dSArchibald Elliott llvm::Triple Triple("armv7k-apple-ios9"); 989f09cf34dSArchibald Elliott EXPECT_EQ("cortex-a7", ARM::getARMCPUForArch(Triple)); 990f09cf34dSArchibald Elliott } 991f09cf34dSArchibald Elliott { 992f09cf34dSArchibald Elliott llvm::Triple Triple("armv7k-apple-watchos3"); 993f09cf34dSArchibald Elliott EXPECT_EQ("cortex-a7", ARM::getARMCPUForArch(Triple)); 994f09cf34dSArchibald Elliott } 995f09cf34dSArchibald Elliott { 996f09cf34dSArchibald Elliott llvm::Triple Triple("armv7k-apple-tvos9"); 997f09cf34dSArchibald Elliott EXPECT_EQ("cortex-a7", ARM::getARMCPUForArch(Triple)); 998f09cf34dSArchibald Elliott } 999f09cf34dSArchibald Elliott // armeb is permitted, but armebeb is not 1000f09cf34dSArchibald Elliott { 1001f09cf34dSArchibald Elliott llvm::Triple Triple("armeb-none-eabi"); 1002f09cf34dSArchibald Elliott EXPECT_EQ("arm7tdmi", ARM::getARMCPUForArch(Triple)); 1003f09cf34dSArchibald Elliott } 1004f09cf34dSArchibald Elliott { 1005f09cf34dSArchibald Elliott llvm::Triple Triple("armebeb-none-eabi"); 1006f09cf34dSArchibald Elliott EXPECT_EQ("", ARM::getARMCPUForArch(Triple)); 1007f09cf34dSArchibald Elliott } 1008f09cf34dSArchibald Elliott { 1009f09cf34dSArchibald Elliott llvm::Triple Triple("armebv6eb-none-eabi"); 1010f09cf34dSArchibald Elliott EXPECT_EQ("", ARM::getARMCPUForArch(Triple)); 1011f09cf34dSArchibald Elliott } 1012f09cf34dSArchibald Elliott // xscaleeb is permitted, but armebxscale is not 1013f09cf34dSArchibald Elliott { 1014f09cf34dSArchibald Elliott llvm::Triple Triple("xscaleeb-none-eabi"); 1015f09cf34dSArchibald Elliott EXPECT_EQ("xscale", ARM::getARMCPUForArch(Triple)); 1016f09cf34dSArchibald Elliott } 1017f09cf34dSArchibald Elliott { 1018f09cf34dSArchibald Elliott llvm::Triple Triple("armebxscale-none-eabi"); 1019f09cf34dSArchibald Elliott EXPECT_EQ("", ARM::getARMCPUForArch(Triple)); 1020f09cf34dSArchibald Elliott } 1021f09cf34dSArchibald Elliott } 1022f09cf34dSArchibald Elliott 102399594ba3SDavid Spickett TEST(TargetParserTest, ARMPrintSupportedExtensions) { 1024800de14fSDavid Green std::string expected = 1025800de14fSDavid Green "All available -march extensions for ARM\n\n" 102673779bb2SBalint Cristian " Name Description\n" 102773779bb2SBalint Cristian " crc This is a long dummy description\n" 102873779bb2SBalint Cristian " crypto\n" 102973779bb2SBalint Cristian " sha2\n"; 103073779bb2SBalint Cristian 103173779bb2SBalint Cristian StringMap<StringRef> DummyMap; 103273779bb2SBalint Cristian DummyMap["crc"] = "This is a long dummy description"; 103399594ba3SDavid Spickett 103499594ba3SDavid Spickett outs().flush(); 103599594ba3SDavid Spickett testing::internal::CaptureStdout(); 103673779bb2SBalint Cristian ARM::PrintSupportedExtensions(DummyMap); 103799594ba3SDavid Spickett outs().flush(); 103899594ba3SDavid Spickett std::string captured = testing::internal::GetCapturedStdout(); 103999594ba3SDavid Spickett 104099594ba3SDavid Spickett // Check that the start of the output is as expected. 104199594ba3SDavid Spickett EXPECT_EQ(0ULL, captured.find(expected)); 104299594ba3SDavid Spickett 104399594ba3SDavid Spickett // Should not include "none" or "invalid". 104499594ba3SDavid Spickett EXPECT_EQ(std::string::npos, captured.find("none")); 104599594ba3SDavid Spickett EXPECT_EQ(std::string::npos, captured.find("invalid")); 104699594ba3SDavid Spickett // Should not include anything that lacks a feature name. Checking a few here 104799594ba3SDavid Spickett // but not all as if one is hidden correctly the rest should be. 104899594ba3SDavid Spickett EXPECT_EQ(std::string::npos, captured.find("simd")); 104999594ba3SDavid Spickett EXPECT_EQ(std::string::npos, captured.find("maverick")); 105099594ba3SDavid Spickett EXPECT_EQ(std::string::npos, captured.find("xscale")); 105199594ba3SDavid Spickett } 105299594ba3SDavid Spickett 10539667e604SJon Roelofs struct AArch64CPUTestParams 10549667e604SJon Roelofs : public ARMCPUTestParams<AArch64::ExtensionBitset> { 105534e15adbSTomas Matheson AArch64CPUTestParams(StringRef CPUName, StringRef ExpectedArch) 10569667e604SJon Roelofs : ARMCPUTestParams<AArch64::ExtensionBitset>(CPUName, ExpectedArch, 105734e15adbSTomas Matheson /*ignored*/ "", {}, 10589667e604SJon Roelofs /*ignored*/ "") {} 10599667e604SJon Roelofs /// Print a gtest-compatible facsimile of the CPUName, to make the test's name 10609667e604SJon Roelofs /// human-readable. 10619667e604SJon Roelofs /// 10629667e604SJon Roelofs /// https://github.com/google/googletest/blob/main/docs/advanced.md#specifying-names-for-value-parameterized-test-parameters 10639667e604SJon Roelofs static std::string PrintToStringParamName( 10649667e604SJon Roelofs const testing::TestParamInfo<AArch64CPUTestParams> &Info) { 10659667e604SJon Roelofs std::string Name = Info.param.CPUName.str(); 10669667e604SJon Roelofs for (char &C : Name) 10679667e604SJon Roelofs if (!std::isalnum(C)) 10689667e604SJon Roelofs C = '_'; 10699667e604SJon Roelofs return Name; 10709667e604SJon Roelofs } 1071800de14fSDavid Green }; 1072f09cf34dSArchibald Elliott 10739667e604SJon Roelofs class AArch64CPUTestFixture 10749667e604SJon Roelofs : public ::testing::TestWithParam<AArch64CPUTestParams> {}; 10759667e604SJon Roelofs 1076f09cf34dSArchibald Elliott TEST_P(AArch64CPUTestFixture, testAArch64CPU) { 1077c1796be9SBenjamin Kramer auto params = GetParam(); 1078f09cf34dSArchibald Elliott 10799ea00fc7SLucas Prates const std::optional<AArch64::CpuInfo> Cpu = AArch64::parseCpu(params.CPUName); 10809ea00fc7SLucas Prates EXPECT_TRUE(Cpu); 10819ea00fc7SLucas Prates EXPECT_EQ(params.ExpectedArch, Cpu->Arch.Name); 1082f09cf34dSArchibald Elliott } 1083f09cf34dSArchibald Elliott 1084f09cf34dSArchibald Elliott INSTANTIATE_TEST_SUITE_P( 1085f09cf34dSArchibald Elliott AArch64CPUTests, AArch64CPUTestFixture, 108634e15adbSTomas Matheson ::testing::Values(AArch64CPUTestParams("cortex-a34", "armv8-a"), 108734e15adbSTomas Matheson AArch64CPUTestParams("cortex-a35", "armv8-a"), 108834e15adbSTomas Matheson AArch64CPUTestParams("cortex-a53", "armv8-a"), 108934e15adbSTomas Matheson AArch64CPUTestParams("cortex-a55", "armv8.2-a"), 109034e15adbSTomas Matheson AArch64CPUTestParams("cortex-a510", "armv9-a"), 109134e15adbSTomas Matheson AArch64CPUTestParams("cortex-a520", "armv9.2-a"), 109234e15adbSTomas Matheson AArch64CPUTestParams("cortex-a520ae", "armv9.2-a"), 109334e15adbSTomas Matheson AArch64CPUTestParams("cortex-a57", "armv8-a"), 109434e15adbSTomas Matheson AArch64CPUTestParams("cortex-a65", "armv8.2-a"), 109534e15adbSTomas Matheson AArch64CPUTestParams("cortex-a65ae", "armv8.2-a"), 109634e15adbSTomas Matheson AArch64CPUTestParams("cortex-a72", "armv8-a"), 109734e15adbSTomas Matheson AArch64CPUTestParams("cortex-a73", "armv8-a"), 109834e15adbSTomas Matheson AArch64CPUTestParams("cortex-a75", "armv8.2-a"), 109934e15adbSTomas Matheson AArch64CPUTestParams("cortex-a76", "armv8.2-a"), 110034e15adbSTomas Matheson AArch64CPUTestParams("cortex-a76ae", "armv8.2-a"), 110134e15adbSTomas Matheson AArch64CPUTestParams("cortex-a77", "armv8.2-a"), 110234e15adbSTomas Matheson AArch64CPUTestParams("cortex-a78", "armv8.2-a"), 110334e15adbSTomas Matheson AArch64CPUTestParams("cortex-a78ae", "armv8.2-a"), 110434e15adbSTomas Matheson AArch64CPUTestParams("cortex-a78c", "armv8.2-a"), 110534e15adbSTomas Matheson AArch64CPUTestParams("cortex-a710", "armv9-a"), 110634e15adbSTomas Matheson AArch64CPUTestParams("cortex-a715", "armv9-a"), 110734e15adbSTomas Matheson AArch64CPUTestParams("cortex-a720", "armv9.2-a"), 110834e15adbSTomas Matheson AArch64CPUTestParams("cortex-a720ae", "armv9.2-a"), 110934e15adbSTomas Matheson AArch64CPUTestParams("cortex-a725", "armv9.2-a"), 111034e15adbSTomas Matheson AArch64CPUTestParams("neoverse-v1", "armv8.4-a"), 111134e15adbSTomas Matheson AArch64CPUTestParams("neoverse-v2", "armv9-a"), 111234e15adbSTomas Matheson AArch64CPUTestParams("neoverse-v3", "armv9.2-a"), 111334e15adbSTomas Matheson AArch64CPUTestParams("neoverse-v3ae", "armv9.2-a"), 111434e15adbSTomas Matheson AArch64CPUTestParams("cortex-r82", "armv8-r"), 111534e15adbSTomas Matheson AArch64CPUTestParams("cortex-r82ae", "armv8-r"), 111634e15adbSTomas Matheson AArch64CPUTestParams("cortex-x1", "armv8.2-a"), 111734e15adbSTomas Matheson AArch64CPUTestParams("cortex-x1c", "armv8.2-a"), 111834e15adbSTomas Matheson AArch64CPUTestParams("cortex-x2", "armv9-a"), 111934e15adbSTomas Matheson AArch64CPUTestParams("cortex-x3", "armv9-a"), 112034e15adbSTomas Matheson AArch64CPUTestParams("cortex-x4", "armv9.2-a"), 112134e15adbSTomas Matheson AArch64CPUTestParams("cortex-x925", "armv9.2-a"), 112234e15adbSTomas Matheson AArch64CPUTestParams("cyclone", "armv8-a"), 112334e15adbSTomas Matheson AArch64CPUTestParams("apple-a7", "armv8-a"), 112434e15adbSTomas Matheson AArch64CPUTestParams("apple-a8", "armv8-a"), 112534e15adbSTomas Matheson AArch64CPUTestParams("apple-a9", "armv8-a"), 112634e15adbSTomas Matheson AArch64CPUTestParams("apple-a10", "armv8-a"), 112734e15adbSTomas Matheson AArch64CPUTestParams("apple-a11", "armv8.2-a"), 112834e15adbSTomas Matheson AArch64CPUTestParams("apple-a12", "armv8.3-a"), 112934e15adbSTomas Matheson AArch64CPUTestParams("apple-s4", "armv8.3-a"), 113034e15adbSTomas Matheson AArch64CPUTestParams("apple-s5", "armv8.3-a"), 113134e15adbSTomas Matheson AArch64CPUTestParams("apple-a13", "armv8.4-a"), 113234e15adbSTomas Matheson AArch64CPUTestParams("apple-a14", "armv8.4-a"), 113334e15adbSTomas Matheson AArch64CPUTestParams("apple-m1", "armv8.4-a"), 113434e15adbSTomas Matheson AArch64CPUTestParams("apple-a15", "armv8.6-a"), 113534e15adbSTomas Matheson AArch64CPUTestParams("apple-m2", "armv8.6-a"), 113634e15adbSTomas Matheson AArch64CPUTestParams("apple-a16", "armv8.6-a"), 113734e15adbSTomas Matheson AArch64CPUTestParams("apple-m3", "armv8.6-a"), 113834e15adbSTomas Matheson AArch64CPUTestParams("apple-a17", "armv8.6-a"), 1139e5e38ddfSAhmed Bougacha AArch64CPUTestParams("apple-m4", "armv8.7-a"), 114034e15adbSTomas Matheson AArch64CPUTestParams("exynos-m3", "armv8-a"), 114134e15adbSTomas Matheson AArch64CPUTestParams("exynos-m4", "armv8.2-a"), 114234e15adbSTomas Matheson AArch64CPUTestParams("exynos-m5", "armv8.2-a"), 114334e15adbSTomas Matheson AArch64CPUTestParams("falkor", "armv8-a"), 114434e15adbSTomas Matheson AArch64CPUTestParams("kryo", "armv8-a"), 114534e15adbSTomas Matheson AArch64CPUTestParams("neoverse-e1", "armv8.2-a"), 114634e15adbSTomas Matheson AArch64CPUTestParams("neoverse-n1", "armv8.2-a"), 114734e15adbSTomas Matheson AArch64CPUTestParams("neoverse-n2", "armv9-a"), 114834e15adbSTomas Matheson AArch64CPUTestParams("neoverse-n3", "armv9.2-a"), 114934e15adbSTomas Matheson AArch64CPUTestParams("ampere1", "armv8.6-a"), 115034e15adbSTomas Matheson AArch64CPUTestParams("ampere1a", "armv8.6-a"), 115134e15adbSTomas Matheson AArch64CPUTestParams("ampere1b", "armv8.7-a"), 115234e15adbSTomas Matheson AArch64CPUTestParams("neoverse-512tvb", "armv8.4-a"), 115334e15adbSTomas Matheson AArch64CPUTestParams("thunderx2t99", "armv8.1-a"), 115434e15adbSTomas Matheson AArch64CPUTestParams("thunderx3t110", "armv8.3-a"), 115534e15adbSTomas Matheson AArch64CPUTestParams("thunderx", "armv8-a"), 115634e15adbSTomas Matheson AArch64CPUTestParams("thunderxt81", "armv8-a"), 115734e15adbSTomas Matheson AArch64CPUTestParams("thunderxt83", "armv8-a"), 115834e15adbSTomas Matheson AArch64CPUTestParams("thunderxt88", "armv8-a"), 115934e15adbSTomas Matheson AArch64CPUTestParams("tsv110", "armv8.2-a"), 116034e15adbSTomas Matheson AArch64CPUTestParams("a64fx", "armv8.2-a"), 1161a1197a2cSKinoshita Kotaro AArch64CPUTestParams("fujitsu-monaka", "armv9.3-a"), 116234e15adbSTomas Matheson AArch64CPUTestParams("carmel", "armv8.2-a"), 116334e15adbSTomas Matheson AArch64CPUTestParams("saphira", "armv8.4-a"), 116434e15adbSTomas Matheson AArch64CPUTestParams("oryon-1", "armv8.6-a")), 11659667e604SJon Roelofs AArch64CPUTestParams::PrintToStringParamName); 1166f09cf34dSArchibald Elliott 1167f09cf34dSArchibald Elliott // Note: number of CPUs includes aliases. 1168a1197a2cSKinoshita Kotaro static constexpr unsigned NumAArch64CPUArchs = 82; 1169f09cf34dSArchibald Elliott 1170f09cf34dSArchibald Elliott TEST(TargetParserTest, testAArch64CPUArchList) { 1171f09cf34dSArchibald Elliott SmallVector<StringRef, NumAArch64CPUArchs> List; 1172f09cf34dSArchibald Elliott AArch64::fillValidCPUArchList(List); 1173f09cf34dSArchibald Elliott 1174f09cf34dSArchibald Elliott // No list exists for these in this test suite, so ensure all are 1175f09cf34dSArchibald Elliott // valid, and match the expected 'magic' count. 1176f09cf34dSArchibald Elliott EXPECT_EQ(List.size(), NumAArch64CPUArchs); 1177f09cf34dSArchibald Elliott for (StringRef CPU : List) { 11789ea00fc7SLucas Prates EXPECT_TRUE(AArch64::parseCpu(CPU)); 1179f09cf34dSArchibald Elliott } 1180f09cf34dSArchibald Elliott } 1181f09cf34dSArchibald Elliott 118234e15adbSTomas Matheson bool testAArch64Arch(StringRef Arch) { 118313e977d1Sostannard const AArch64::ArchInfo *AI = AArch64::parseArch(Arch); 118413e977d1Sostannard return AI != nullptr; 1185f09cf34dSArchibald Elliott } 1186f09cf34dSArchibald Elliott 1187f09cf34dSArchibald Elliott TEST(TargetParserTest, testAArch64Arch) { 118834e15adbSTomas Matheson EXPECT_TRUE(testAArch64Arch("armv8-a")); 118934e15adbSTomas Matheson EXPECT_TRUE(testAArch64Arch("armv8.1-a")); 119034e15adbSTomas Matheson EXPECT_TRUE(testAArch64Arch("armv8.2-a")); 119134e15adbSTomas Matheson EXPECT_TRUE(testAArch64Arch("armv8.3-a")); 119234e15adbSTomas Matheson EXPECT_TRUE(testAArch64Arch("armv8.4-a")); 119334e15adbSTomas Matheson EXPECT_TRUE(testAArch64Arch("armv8.5-a")); 119434e15adbSTomas Matheson EXPECT_TRUE(testAArch64Arch("armv8.6-a")); 119534e15adbSTomas Matheson EXPECT_TRUE(testAArch64Arch("armv8.7-a")); 119634e15adbSTomas Matheson EXPECT_TRUE(testAArch64Arch("armv8.8-a")); 119734e15adbSTomas Matheson EXPECT_TRUE(testAArch64Arch("armv8.9-a")); 119834e15adbSTomas Matheson EXPECT_TRUE(testAArch64Arch("armv9-a")); 119934e15adbSTomas Matheson EXPECT_TRUE(testAArch64Arch("armv9.1-a")); 120034e15adbSTomas Matheson EXPECT_TRUE(testAArch64Arch("armv9.2-a")); 120134e15adbSTomas Matheson EXPECT_TRUE(testAArch64Arch("armv9.3-a")); 120234e15adbSTomas Matheson EXPECT_TRUE(testAArch64Arch("armv9.4-a")); 120334e15adbSTomas Matheson EXPECT_TRUE(testAArch64Arch("armv9.5-a")); 1204d0756caeSJonathan Thackray EXPECT_TRUE(testAArch64Arch("armv9.6-a")); 1205f09cf34dSArchibald Elliott } 1206f09cf34dSArchibald Elliott 12079ea00fc7SLucas Prates bool testAArch64Extension(StringRef CPUName, StringRef ArchExt) { 12089ea00fc7SLucas Prates std::optional<AArch64::ExtensionInfo> Extension = 12099ea00fc7SLucas Prates AArch64::parseArchExtension(ArchExt); 12109ea00fc7SLucas Prates if (!Extension) 12119ea00fc7SLucas Prates return false; 12129ea00fc7SLucas Prates std::optional<AArch64::CpuInfo> CpuInfo = AArch64::parseCpu(CPUName); 1213491a1cd0ShassnaaHamdi return CpuInfo->getImpliedExtensions().test(Extension->ID); 12149ea00fc7SLucas Prates } 12159ea00fc7SLucas Prates 12169ea00fc7SLucas Prates bool testAArch64Extension(const AArch64::ArchInfo &AI, StringRef ArchExt) { 12179ea00fc7SLucas Prates std::optional<AArch64::ExtensionInfo> Extension = 12189ea00fc7SLucas Prates AArch64::parseArchExtension(ArchExt); 12199ea00fc7SLucas Prates if (!Extension) 12209ea00fc7SLucas Prates return false; 1221491a1cd0ShassnaaHamdi return AI.DefaultExts.test(Extension->ID); 1222f09cf34dSArchibald Elliott } 1223f09cf34dSArchibald Elliott 1224f09cf34dSArchibald Elliott TEST(TargetParserTest, testAArch64Extension) { 12259ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension("cortex-a34", "ras")); 12269ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension("cortex-a35", "ras")); 12279ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension("cortex-a53", "ras")); 12289ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("cortex-a55", "ras")); 12299ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("cortex-a55", "fp16")); 12309ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension("cortex-a55", "fp16fml")); 12319ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("cortex-a55", "dotprod")); 12329ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension("cortex-a57", "ras")); 12339ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension("cortex-a72", "ras")); 12349ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension("cortex-a73", "ras")); 12359ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("cortex-a75", "ras")); 12369ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("cortex-a75", "fp16")); 12379ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension("cortex-a75", "fp16fml")); 12389ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("cortex-a75", "dotprod")); 12399ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("cortex-r82", "ras")); 12409ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("cortex-r82", "fp16")); 12419ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("cortex-r82", "fp16fml")); 12429ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("cortex-r82", "dotprod")); 12439ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("cortex-r82", "lse")); 12449ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension("cyclone", "ras")); 12459ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension("exynos-m3", "ras")); 12469ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("exynos-m4", "dotprod")); 12479ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("exynos-m4", "fp16")); 12489ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("exynos-m4", "lse")); 12499ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("exynos-m4", "ras")); 12509ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("exynos-m4", "rdm")); 12519ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("exynos-m5", "dotprod")); 12529ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("exynos-m5", "fp16")); 12539ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("exynos-m5", "lse")); 12549ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("exynos-m5", "ras")); 12559ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("exynos-m5", "rdm")); 12569ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("falkor", "rdm")); 12579ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension("kryo", "ras")); 12589ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("saphira", "crc")); 12599ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("saphira", "lse")); 12609ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("saphira", "rdm")); 12619ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("saphira", "ras")); 12629ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("saphira", "rcpc")); 12639ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("saphira", "profile")); 12649ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension("saphira", "fp16")); 12659ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension("thunderx2t99", "ras")); 12669ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension("thunderx", "lse")); 12679ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension("thunderxt81", "lse")); 12689ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension("thunderxt83", "lse")); 12699ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension("thunderxt88", "lse")); 12708f6c623eSDavid Green EXPECT_TRUE(testAArch64Extension("tsv110", "aes")); 12718f6c623eSDavid Green EXPECT_TRUE(testAArch64Extension("tsv110", "sha2")); 12729ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension("tsv110", "sha3")); 12739ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension("tsv110", "sm4")); 12749ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("tsv110", "ras")); 12759ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("tsv110", "profile")); 12769ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("tsv110", "fp16")); 12779ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("tsv110", "fp16fml")); 12789ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("tsv110", "dotprod")); 12792eb71e8bSQi Hu EXPECT_TRUE(testAArch64Extension("tsv110", "jscvt")); 12802eb71e8bSQi Hu EXPECT_TRUE(testAArch64Extension("tsv110", "fcma")); 12819ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("a64fx", "fp16")); 12829ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("a64fx", "sve")); 12839ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension("a64fx", "sve2")); 12848f6c623eSDavid Green EXPECT_TRUE(testAArch64Extension("carmel", "aes")); 12858f6c623eSDavid Green EXPECT_TRUE(testAArch64Extension("carmel", "sha2")); 12869ea00fc7SLucas Prates EXPECT_TRUE(testAArch64Extension("carmel", "fp16")); 1287f09cf34dSArchibald Elliott 12889ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension(AArch64::ARMV8A, "ras")); 12899ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension(AArch64::ARMV8_1A, "ras")); 12909ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension(AArch64::ARMV8_2A, "profile")); 12919ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension(AArch64::ARMV8_2A, "fp16")); 12929ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension(AArch64::ARMV8_2A, "fp16fml")); 12939ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension(AArch64::ARMV8_3A, "fp16")); 12949ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension(AArch64::ARMV8_3A, "fp16fml")); 12959ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension(AArch64::ARMV8_4A, "fp16")); 12969ea00fc7SLucas Prates EXPECT_FALSE(testAArch64Extension(AArch64::ARMV8_4A, "fp16fml")); 1297f09cf34dSArchibald Elliott } 1298f09cf34dSArchibald Elliott 1299f09cf34dSArchibald Elliott TEST(TargetParserTest, AArch64ExtensionFeatures) { 1300f09cf34dSArchibald Elliott std::vector<uint64_t> Extensions = { 1301f16b7c62ShassnaaHamdi AArch64::AEK_CRC, AArch64::AEK_LSE, 1302f16b7c62ShassnaaHamdi AArch64::AEK_RDM, AArch64::AEK_CRYPTO, 1303f16b7c62ShassnaaHamdi AArch64::AEK_SM4, AArch64::AEK_SHA3, 1304f16b7c62ShassnaaHamdi AArch64::AEK_SHA2, AArch64::AEK_AES, 1305f16b7c62ShassnaaHamdi AArch64::AEK_DOTPROD, AArch64::AEK_FP, 1306f16b7c62ShassnaaHamdi AArch64::AEK_SIMD, AArch64::AEK_FP16, 1307f16b7c62ShassnaaHamdi AArch64::AEK_FP16FML, AArch64::AEK_PROFILE, 1308f16b7c62ShassnaaHamdi AArch64::AEK_RAS, AArch64::AEK_SVE, 1309bbcd3527SSpencerAbson AArch64::AEK_SVE2, AArch64::AEK_SVE2AES, 1310f16b7c62ShassnaaHamdi AArch64::AEK_SVE2SM4, AArch64::AEK_SVE2SHA3, 1311f16b7c62ShassnaaHamdi AArch64::AEK_SVE2BITPERM, AArch64::AEK_RCPC, 1312f16b7c62ShassnaaHamdi AArch64::AEK_RAND, AArch64::AEK_MTE, 1313f16b7c62ShassnaaHamdi AArch64::AEK_SSBS, AArch64::AEK_SB, 1314f16b7c62ShassnaaHamdi AArch64::AEK_PREDRES, AArch64::AEK_BF16, 1315f16b7c62ShassnaaHamdi AArch64::AEK_I8MM, AArch64::AEK_F32MM, 1316f16b7c62ShassnaaHamdi AArch64::AEK_F64MM, AArch64::AEK_TME, 1317f16b7c62ShassnaaHamdi AArch64::AEK_LS64, AArch64::AEK_BRBE, 1318f16b7c62ShassnaaHamdi AArch64::AEK_PAUTH, AArch64::AEK_FLAGM, 1319f16b7c62ShassnaaHamdi AArch64::AEK_SME, AArch64::AEK_SMEF64F64, 1320f16b7c62ShassnaaHamdi AArch64::AEK_SMEI16I64, AArch64::AEK_SME2, 1321f16b7c62ShassnaaHamdi AArch64::AEK_HBC, AArch64::AEK_MOPS, 1322639a7400STomas Matheson AArch64::AEK_PERFMON, AArch64::AEK_SVE2P1, 13231b936e48SSpencerAbson AArch64::AEK_SME2P1, AArch64::AEK_SMEB16B16, 1324f16b7c62ShassnaaHamdi AArch64::AEK_SMEF16F16, AArch64::AEK_CSSC, 1325f16b7c62ShassnaaHamdi AArch64::AEK_RCPC3, AArch64::AEK_THE, 1326f16b7c62ShassnaaHamdi AArch64::AEK_D128, AArch64::AEK_LSE128, 1327639a7400STomas Matheson AArch64::AEK_SPECRES2, AArch64::AEK_RASV2, 1328f16b7c62ShassnaaHamdi AArch64::AEK_ITE, AArch64::AEK_GCS, 1329f16b7c62ShassnaaHamdi AArch64::AEK_FAMINMAX, AArch64::AEK_FP8FMA, 1330f16b7c62ShassnaaHamdi AArch64::AEK_SSVE_FP8FMA, AArch64::AEK_FP8DOT2, 1331f16b7c62ShassnaaHamdi AArch64::AEK_SSVE_FP8DOT2, AArch64::AEK_FP8DOT4, 1332835c885dSHassnaa Hamdi AArch64::AEK_SSVE_FP8DOT4, AArch64::AEK_LUT, 1333639a7400STomas Matheson AArch64::AEK_SME_LUTV2, AArch64::AEK_SMEF8F16, 1334d43fc5a6SLucas Duarte Prates AArch64::AEK_SMEF8F32, AArch64::AEK_SMEFA64, 13357bd17212STomas Matheson AArch64::AEK_CPA, AArch64::AEK_PAUTHLR, 13362eb71e8bSQi Hu AArch64::AEK_TLBIW, AArch64::AEK_JSCVT, 1337775d7cccSLukacma AArch64::AEK_FCMA, AArch64::AEK_FP8, 1338b584478eSLukacma AArch64::AEK_SVEB16B16, AArch64::AEK_SVE2P2, 1339b584478eSLukacma AArch64::AEK_SME2P2, AArch64::AEK_SVE_BFSCALE, 1340b584478eSLukacma AArch64::AEK_SVE_F16F32MM, AArch64::AEK_SVE_AES2, 1341b584478eSLukacma AArch64::AEK_SSVE_AES, AArch64::AEK_F8F32MM, 1342b584478eSLukacma AArch64::AEK_F8F16MM, AArch64::AEK_LSFE, 13436e535a9aSNashe Mncube AArch64::AEK_FPRCVT, AArch64::AEK_CMPBR, 13446e535a9aSNashe Mncube AArch64::AEK_LSUI, AArch64::AEK_OCCMO, 13458be860ddSJonathan Thackray AArch64::AEK_PCDPHINT, AArch64::AEK_POPS, 1346*5ec7ecd2SCarolineConcatto AArch64::AEK_SVEAES, AArch64::AEK_SME_MOP4, 1347*5ec7ecd2SCarolineConcatto AArch64::AEK_SME_TMOP, AArch64::AEK_SVEBITPERM, 134892564850SCarolineConcatto AArch64::AEK_SSVE_BITPERM, 134992564850SCarolineConcatto }; 1350f09cf34dSArchibald Elliott 1351f09cf34dSArchibald Elliott std::vector<StringRef> Features; 1352f09cf34dSArchibald Elliott 1353491a1cd0ShassnaaHamdi AArch64::ExtensionBitset ExtVal; 1354f09cf34dSArchibald Elliott for (auto Ext : Extensions) 1355491a1cd0ShassnaaHamdi ExtVal.set(Ext); 1356f09cf34dSArchibald Elliott 135781660bbcSTomas Matheson // Test an empty set of features. 135881660bbcSTomas Matheson EXPECT_TRUE(AArch64::getExtensionFeatures({}, Features)); 135981660bbcSTomas Matheson EXPECT_TRUE(Features.size() == 0); 1360f09cf34dSArchibald Elliott 1361f09cf34dSArchibald Elliott AArch64::getExtensionFeatures(ExtVal, Features); 1362f09cf34dSArchibald Elliott EXPECT_EQ(Extensions.size(), Features.size()); 1363f09cf34dSArchibald Elliott 1364f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+crc")); 1365f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+lse")); 1366f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+rdm")); 1367f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+crypto")); 1368f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+sm4")); 1369f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+sha3")); 1370f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+sha2")); 1371f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+aes")); 1372f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+dotprod")); 1373f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+fp-armv8")); 1374f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+neon")); 1375f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+fullfp16")); 1376f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+fp16fml")); 1377f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+spe")); 1378f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+ras")); 1379f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+sve")); 1380a0ed7d6cSSpencerAbson EXPECT_TRUE(llvm::is_contained(Features, "+sve-b16b16")); 1381b584478eSLukacma EXPECT_TRUE(llvm::is_contained(Features, "+sve-bfscale")); 1382b584478eSLukacma EXPECT_TRUE(llvm::is_contained(Features, "+sve-f16f32mm")); 1383f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+sve2")); 1384748b0285SSpencerAbson EXPECT_TRUE(llvm::is_contained(Features, "+sve-aes")); 1385f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+sve2-aes")); 1386f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+sve2-sm4")); 1387f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+sve2-sha3")); 138892564850SCarolineConcatto EXPECT_TRUE(llvm::is_contained(Features, "+sve-bitperm")); 1389f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+sve2-bitperm")); 139092564850SCarolineConcatto EXPECT_TRUE(llvm::is_contained(Features, "+ssve-bitperm")); 1391b584478eSLukacma EXPECT_TRUE(llvm::is_contained(Features, "+sve-aes2")); 1392b584478eSLukacma EXPECT_TRUE(llvm::is_contained(Features, "+ssve-aes")); 1393f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+sve2p1")); 1394b584478eSLukacma EXPECT_TRUE(llvm::is_contained(Features, "+sve2p2")); 1395f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+rcpc")); 1396f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+rand")); 1397f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+mte")); 1398f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+ssbs")); 1399f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+sb")); 1400f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+predres")); 1401f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+bf16")); 1402f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+i8mm")); 1403f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+f32mm")); 1404f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+f64mm")); 1405f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+tme")); 1406f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+ls64")); 1407f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+brbe")); 1408f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+pauth")); 1409f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+flagm")); 1410f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+sme")); 1411f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+sme-f64f64")); 1412f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+sme-i16i64")); 1413f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+sme-f16f16")); 1414f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+sme2")); 14151b936e48SSpencerAbson EXPECT_TRUE(llvm::is_contained(Features, "+sme-b16b16")); 1416f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+sme2p1")); 1417b584478eSLukacma EXPECT_TRUE(llvm::is_contained(Features, "+sme2p2")); 1418f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+hbc")); 1419f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+mops")); 1420f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+perfmon")); 1421f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+cssc")); 1422f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+rcpc3")); 1423f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+the")); 1424f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+d128")); 1425f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+lse128")); 1426f09cf34dSArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+specres2")); 14278246acebSLucas Prates EXPECT_TRUE(llvm::is_contained(Features, "+ite")); 1428cb7fb737SArchibald Elliott EXPECT_TRUE(llvm::is_contained(Features, "+gcs")); 142978941e1eShassnaaHamdi EXPECT_TRUE(llvm::is_contained(Features, "+fp8")); 1430b23426eeShassnaaHamdi EXPECT_TRUE(llvm::is_contained(Features, "+faminmax")); 14316477b41aShassnaaHamdi EXPECT_TRUE(llvm::is_contained(Features, "+fp8fma")); 14326477b41aShassnaaHamdi EXPECT_TRUE(llvm::is_contained(Features, "+ssve-fp8fma")); 1433f16b7c62ShassnaaHamdi EXPECT_TRUE(llvm::is_contained(Features, "+fp8dot2")); 1434f16b7c62ShassnaaHamdi EXPECT_TRUE(llvm::is_contained(Features, "+ssve-fp8dot2")); 1435f16b7c62ShassnaaHamdi EXPECT_TRUE(llvm::is_contained(Features, "+fp8dot4")); 1436f16b7c62ShassnaaHamdi EXPECT_TRUE(llvm::is_contained(Features, "+ssve-fp8dot4")); 1437b584478eSLukacma EXPECT_TRUE(llvm::is_contained(Features, "+f8f32mm")); 1438b584478eSLukacma EXPECT_TRUE(llvm::is_contained(Features, "+f8f16mm")); 1439835c885dSHassnaa Hamdi EXPECT_TRUE(llvm::is_contained(Features, "+lut")); 1440835c885dSHassnaa Hamdi EXPECT_TRUE(llvm::is_contained(Features, "+sme-lutv2")); 1441f6ca0ed0SHassnaa Hamdi EXPECT_TRUE(llvm::is_contained(Features, "+sme-f8f16")); 1442f6ca0ed0SHassnaa Hamdi EXPECT_TRUE(llvm::is_contained(Features, "+sme-f8f32")); 1443cdf6693fSMatthew Devereau EXPECT_TRUE(llvm::is_contained(Features, "+sme-fa64")); 1444d43fc5a6SLucas Duarte Prates EXPECT_TRUE(llvm::is_contained(Features, "+cpa")); 14457bd17212STomas Matheson EXPECT_TRUE(llvm::is_contained(Features, "+pauth-lr")); 1446e4f1c528SLucas Duarte Prates EXPECT_TRUE(llvm::is_contained(Features, "+tlbiw")); 14472eb71e8bSQi Hu EXPECT_TRUE(llvm::is_contained(Features, "+jsconv")); 14482eb71e8bSQi Hu EXPECT_TRUE(llvm::is_contained(Features, "+complxnum")); 1449b584478eSLukacma EXPECT_TRUE(llvm::is_contained(Features, "+lsfe")); 1450b584478eSLukacma EXPECT_TRUE(llvm::is_contained(Features, "+fprcvt")); 1451b584478eSLukacma EXPECT_TRUE(llvm::is_contained(Features, "+cmpbr")); 14526e535a9aSNashe Mncube EXPECT_TRUE(llvm::is_contained(Features, "+lsui")); 14536e535a9aSNashe Mncube EXPECT_TRUE(llvm::is_contained(Features, "+occmo")); 14546e535a9aSNashe Mncube EXPECT_TRUE(llvm::is_contained(Features, "+pcdphint")); 14558be860ddSJonathan Thackray EXPECT_TRUE(llvm::is_contained(Features, "+pops")); 1456*5ec7ecd2SCarolineConcatto EXPECT_TRUE(llvm::is_contained(Features, "+sme-mop4")); 1457*5ec7ecd2SCarolineConcatto EXPECT_TRUE(llvm::is_contained(Features, "+sme-tmop")); 1458f09cf34dSArchibald Elliott 1459f09cf34dSArchibald Elliott // Assuming we listed every extension above, this should produce the same 146081660bbcSTomas Matheson // result. 1461f09cf34dSArchibald Elliott std::vector<StringRef> AllFeatures; 1462491a1cd0ShassnaaHamdi EXPECT_TRUE(AArch64::getExtensionFeatures(ExtVal, AllFeatures)); 1463f09cf34dSArchibald Elliott EXPECT_THAT(Features, ::testing::ContainerEq(AllFeatures)); 1464f09cf34dSArchibald Elliott } 1465f09cf34dSArchibald Elliott 1466f09cf34dSArchibald Elliott TEST(TargetParserTest, AArch64ArchFeatures) { 1467f4225d32STomas Matheson EXPECT_EQ(AArch64::ARMV8A.ArchFeature, "+v8a"); 1468f4225d32STomas Matheson EXPECT_EQ(AArch64::ARMV8_1A.ArchFeature, "+v8.1a"); 1469f4225d32STomas Matheson EXPECT_EQ(AArch64::ARMV8_2A.ArchFeature, "+v8.2a"); 1470f4225d32STomas Matheson EXPECT_EQ(AArch64::ARMV8_3A.ArchFeature, "+v8.3a"); 1471f4225d32STomas Matheson EXPECT_EQ(AArch64::ARMV8_4A.ArchFeature, "+v8.4a"); 1472f4225d32STomas Matheson EXPECT_EQ(AArch64::ARMV8_5A.ArchFeature, "+v8.5a"); 1473f4225d32STomas Matheson EXPECT_EQ(AArch64::ARMV8_6A.ArchFeature, "+v8.6a"); 1474f4225d32STomas Matheson EXPECT_EQ(AArch64::ARMV8_7A.ArchFeature, "+v8.7a"); 1475f4225d32STomas Matheson EXPECT_EQ(AArch64::ARMV8_8A.ArchFeature, "+v8.8a"); 1476f4225d32STomas Matheson EXPECT_EQ(AArch64::ARMV8_9A.ArchFeature, "+v8.9a"); 1477f4225d32STomas Matheson EXPECT_EQ(AArch64::ARMV9A.ArchFeature, "+v9a"); 1478f4225d32STomas Matheson EXPECT_EQ(AArch64::ARMV9_1A.ArchFeature, "+v9.1a"); 1479f4225d32STomas Matheson EXPECT_EQ(AArch64::ARMV9_2A.ArchFeature, "+v9.2a"); 1480f4225d32STomas Matheson EXPECT_EQ(AArch64::ARMV9_3A.ArchFeature, "+v9.3a"); 1481f4225d32STomas Matheson EXPECT_EQ(AArch64::ARMV9_4A.ArchFeature, "+v9.4a"); 148259b23015SLucas Duarte Prates EXPECT_EQ(AArch64::ARMV9_5A.ArchFeature, "+v9.5a"); 1483d0756caeSJonathan Thackray EXPECT_EQ(AArch64::ARMV9_6A.ArchFeature, "+v9.6a"); 1484f4225d32STomas Matheson EXPECT_EQ(AArch64::ARMV8R.ArchFeature, "+v8r"); 1485f09cf34dSArchibald Elliott } 1486f09cf34dSArchibald Elliott 1487f4225d32STomas Matheson TEST(TargetParserTest, AArch64ArchPartialOrder) { 1488f4225d32STomas Matheson for (const auto *A : AArch64::ArchInfos) { 1489f4225d32STomas Matheson EXPECT_EQ(*A, *A); 1490f4225d32STomas Matheson 1491f4225d32STomas Matheson // v8r has no relation to other valid architectures 1492f4225d32STomas Matheson if (*A != AArch64::ARMV8R) { 1493f4225d32STomas Matheson EXPECT_FALSE(A->implies(AArch64::ARMV8R)); 1494f4225d32STomas Matheson EXPECT_FALSE(AArch64::ARMV8R.implies(*A)); 1495f4225d32STomas Matheson } 1496f4225d32STomas Matheson } 1497f4225d32STomas Matheson 1498f4225d32STomas Matheson for (const auto *A : { 1499f4225d32STomas Matheson &AArch64::ARMV8_1A, 1500f4225d32STomas Matheson &AArch64::ARMV8_2A, 1501f4225d32STomas Matheson &AArch64::ARMV8_3A, 1502f4225d32STomas Matheson &AArch64::ARMV8_4A, 1503f4225d32STomas Matheson &AArch64::ARMV8_5A, 1504f4225d32STomas Matheson &AArch64::ARMV8_6A, 1505f4225d32STomas Matheson &AArch64::ARMV8_7A, 1506f4225d32STomas Matheson &AArch64::ARMV8_8A, 1507f4225d32STomas Matheson &AArch64::ARMV8_9A, 1508f4225d32STomas Matheson }) 1509f4225d32STomas Matheson EXPECT_TRUE(A->implies(AArch64::ARMV8A)); 1510f4225d32STomas Matheson 151159b23015SLucas Duarte Prates for (const auto *A : 151259b23015SLucas Duarte Prates {&AArch64::ARMV9_1A, &AArch64::ARMV9_2A, &AArch64::ARMV9_3A, 1513d0756caeSJonathan Thackray &AArch64::ARMV9_4A, &AArch64::ARMV9_5A, &AArch64::ARMV9_6A}) 1514f4225d32STomas Matheson EXPECT_TRUE(A->implies(AArch64::ARMV9A)); 1515f4225d32STomas Matheson 1516f4225d32STomas Matheson EXPECT_TRUE(AArch64::ARMV8_1A.implies(AArch64::ARMV8A)); 1517f4225d32STomas Matheson EXPECT_TRUE(AArch64::ARMV8_2A.implies(AArch64::ARMV8_1A)); 1518f4225d32STomas Matheson EXPECT_TRUE(AArch64::ARMV8_3A.implies(AArch64::ARMV8_2A)); 1519f4225d32STomas Matheson EXPECT_TRUE(AArch64::ARMV8_4A.implies(AArch64::ARMV8_3A)); 1520f4225d32STomas Matheson EXPECT_TRUE(AArch64::ARMV8_5A.implies(AArch64::ARMV8_4A)); 1521f4225d32STomas Matheson EXPECT_TRUE(AArch64::ARMV8_6A.implies(AArch64::ARMV8_5A)); 1522f4225d32STomas Matheson EXPECT_TRUE(AArch64::ARMV8_7A.implies(AArch64::ARMV8_6A)); 1523f4225d32STomas Matheson EXPECT_TRUE(AArch64::ARMV8_8A.implies(AArch64::ARMV8_7A)); 1524f4225d32STomas Matheson EXPECT_TRUE(AArch64::ARMV8_9A.implies(AArch64::ARMV8_8A)); 1525f4225d32STomas Matheson 1526f4225d32STomas Matheson EXPECT_TRUE(AArch64::ARMV9_1A.implies(AArch64::ARMV9A)); 1527f4225d32STomas Matheson EXPECT_TRUE(AArch64::ARMV9_2A.implies(AArch64::ARMV9_1A)); 1528f4225d32STomas Matheson EXPECT_TRUE(AArch64::ARMV9_3A.implies(AArch64::ARMV9_2A)); 1529f4225d32STomas Matheson EXPECT_TRUE(AArch64::ARMV9_4A.implies(AArch64::ARMV9_3A)); 153059b23015SLucas Duarte Prates EXPECT_TRUE(AArch64::ARMV9_5A.implies(AArch64::ARMV9_4A)); 1531d0756caeSJonathan Thackray EXPECT_TRUE(AArch64::ARMV9_6A.implies(AArch64::ARMV9_5A)); 1532f4225d32STomas Matheson 1533f4225d32STomas Matheson EXPECT_TRUE(AArch64::ARMV9A.implies(AArch64::ARMV8_5A)); 1534f4225d32STomas Matheson EXPECT_TRUE(AArch64::ARMV9_1A.implies(AArch64::ARMV8_6A)); 1535f4225d32STomas Matheson EXPECT_TRUE(AArch64::ARMV9_2A.implies(AArch64::ARMV8_7A)); 1536f4225d32STomas Matheson EXPECT_TRUE(AArch64::ARMV9_3A.implies(AArch64::ARMV8_8A)); 1537f4225d32STomas Matheson EXPECT_TRUE(AArch64::ARMV9_4A.implies(AArch64::ARMV8_9A)); 1538f09cf34dSArchibald Elliott } 1539f09cf34dSArchibald Elliott 1540f09cf34dSArchibald Elliott TEST(TargetParserTest, AArch64ArchExtFeature) { 1541f09cf34dSArchibald Elliott const char *ArchExt[][4] = { 1542f09cf34dSArchibald Elliott {"crc", "nocrc", "+crc", "-crc"}, 1543f09cf34dSArchibald Elliott {"crypto", "nocrypto", "+crypto", "-crypto"}, 1544f09cf34dSArchibald Elliott {"flagm", "noflagm", "+flagm", "-flagm"}, 1545f09cf34dSArchibald Elliott {"fp", "nofp", "+fp-armv8", "-fp-armv8"}, 1546f09cf34dSArchibald Elliott {"simd", "nosimd", "+neon", "-neon"}, 1547f09cf34dSArchibald Elliott {"fp16", "nofp16", "+fullfp16", "-fullfp16"}, 1548f09cf34dSArchibald Elliott {"fp16fml", "nofp16fml", "+fp16fml", "-fp16fml"}, 1549f09cf34dSArchibald Elliott {"profile", "noprofile", "+spe", "-spe"}, 1550f09cf34dSArchibald Elliott {"ras", "noras", "+ras", "-ras"}, 1551f09cf34dSArchibald Elliott {"lse", "nolse", "+lse", "-lse"}, 1552f09cf34dSArchibald Elliott {"rdm", "nordm", "+rdm", "-rdm"}, 1553f09cf34dSArchibald Elliott {"sve", "nosve", "+sve", "-sve"}, 1554a0ed7d6cSSpencerAbson {"sve-b16b16", "nosve-b16b16", "+sve-b16b16", "-sve-b16b16"}, 1555b584478eSLukacma {"sve-bfscale", "nosve-bfscale", "+sve-bfscale", "-sve-bfscale"}, 1556b584478eSLukacma {"sve-f16f32mm", "nosve-f16f32mm", "+sve-f16f32mm", "-sve-f16f32mm"}, 1557f09cf34dSArchibald Elliott {"sve2", "nosve2", "+sve2", "-sve2"}, 1558748b0285SSpencerAbson {"sve-aes", "nosve-aes", "+sve-aes", "-sve-aes"}, 1559f09cf34dSArchibald Elliott {"sve2-aes", "nosve2-aes", "+sve2-aes", "-sve2-aes"}, 1560f09cf34dSArchibald Elliott {"sve2-sm4", "nosve2-sm4", "+sve2-sm4", "-sve2-sm4"}, 1561f09cf34dSArchibald Elliott {"sve2-sha3", "nosve2-sha3", "+sve2-sha3", "-sve2-sha3"}, 1562f09cf34dSArchibald Elliott {"sve2p1", "nosve2p1", "+sve2p1", "-sve2p1"}, 1563b584478eSLukacma {"sve2p2", "nosve2p2", "+sve2p2", "-sve2p2"}, 156492564850SCarolineConcatto {"sve-bitperm", "nosve-bitperm", "+sve-bitperm", "-sve-bitperm"}, 156592564850SCarolineConcatto {"ssve-bitperm", "nossve-bitperm", "+ssve-bitperm", "-ssve-bitperm"}, 1566f09cf34dSArchibald Elliott {"sve2-bitperm", "nosve2-bitperm", "+sve2-bitperm", "-sve2-bitperm"}, 1567b584478eSLukacma {"sve-aes2", "nosve-aes2", "+sve-aes2", "-sve-aes2"}, 1568b584478eSLukacma {"ssve-aes", "nossve-aes", "+ssve-aes", "-ssve-aes"}, 1569f09cf34dSArchibald Elliott {"dotprod", "nodotprod", "+dotprod", "-dotprod"}, 1570f09cf34dSArchibald Elliott {"rcpc", "norcpc", "+rcpc", "-rcpc"}, 1571f09cf34dSArchibald Elliott {"rng", "norng", "+rand", "-rand"}, 1572f09cf34dSArchibald Elliott {"memtag", "nomemtag", "+mte", "-mte"}, 1573f09cf34dSArchibald Elliott {"tme", "notme", "+tme", "-tme"}, 1574f09cf34dSArchibald Elliott {"pauth", "nopauth", "+pauth", "-pauth"}, 1575f09cf34dSArchibald Elliott {"ssbs", "nossbs", "+ssbs", "-ssbs"}, 1576f09cf34dSArchibald Elliott {"sb", "nosb", "+sb", "-sb"}, 1577f09cf34dSArchibald Elliott {"predres", "nopredres", "+predres", "-predres"}, 1578f09cf34dSArchibald Elliott {"i8mm", "noi8mm", "+i8mm", "-i8mm"}, 1579f09cf34dSArchibald Elliott {"f32mm", "nof32mm", "+f32mm", "-f32mm"}, 1580f09cf34dSArchibald Elliott {"f64mm", "nof64mm", "+f64mm", "-f64mm"}, 1581b584478eSLukacma {"f8f32mm", "nof8f32mm", "+f8f32mm", "-f8f32mm"}, 1582b584478eSLukacma {"f8f16mm", "nof8f16mm", "+f8f16mm", "-f8f16mm"}, 1583f09cf34dSArchibald Elliott {"sme", "nosme", "+sme", "-sme"}, 1584cdf6693fSMatthew Devereau {"sme-fa64", "nosme-fa64", "+sme-fa64", "-sme-fa64"}, 1585f09cf34dSArchibald Elliott {"sme-f64f64", "nosme-f64f64", "+sme-f64f64", "-sme-f64f64"}, 1586f09cf34dSArchibald Elliott {"sme-i16i64", "nosme-i16i64", "+sme-i16i64", "-sme-i16i64"}, 1587f09cf34dSArchibald Elliott {"sme-f16f16", "nosme-f16f16", "+sme-f16f16", "-sme-f16f16"}, 1588f09cf34dSArchibald Elliott {"sme2", "nosme2", "+sme2", "-sme2"}, 15891b936e48SSpencerAbson {"sme-b16b16", "nosme-b16b16", "+sme-b16b16", "-sme-b16b16"}, 1590f09cf34dSArchibald Elliott {"sme2p1", "nosme2p1", "+sme2p1", "-sme2p1"}, 1591b584478eSLukacma {"sme2p2", "nosme2p2", "+sme2p2", "-sme2p2"}, 1592f09cf34dSArchibald Elliott {"hbc", "nohbc", "+hbc", "-hbc"}, 1593f09cf34dSArchibald Elliott {"mops", "nomops", "+mops", "-mops"}, 1594f09cf34dSArchibald Elliott {"pmuv3", "nopmuv3", "+perfmon", "-perfmon"}, 1595f09cf34dSArchibald Elliott {"predres2", "nopredres2", "+specres2", "-specres2"}, 1596f09cf34dSArchibald Elliott {"rasv2", "norasv2", "+rasv2", "-rasv2"}, 1597cb7fb737SArchibald Elliott {"gcs", "nogcs", "+gcs", "-gcs"}, 159878941e1eShassnaaHamdi {"fp8", "nofp8", "+fp8", "-fp8"}, 1599b23426eeShassnaaHamdi {"faminmax", "nofaminmax", "+faminmax", "-faminmax"}, 16006477b41aShassnaaHamdi {"fp8fma", "nofp8fma", "+fp8fma", "-fp8fma"}, 16016477b41aShassnaaHamdi {"ssve-fp8fma", "nossve-fp8fma", "+ssve-fp8fma", "-ssve-fp8fma"}, 1602f16b7c62ShassnaaHamdi {"fp8dot2", "nofp8dot2", "+fp8dot2", "-fp8dot2"}, 1603f16b7c62ShassnaaHamdi {"ssve-fp8dot2", "nossve-fp8dot2", "+ssve-fp8dot2", "-ssve-fp8dot2"}, 1604f16b7c62ShassnaaHamdi {"fp8dot4", "nofp8dot4", "+fp8dot4", "-fp8dot4"}, 1605f16b7c62ShassnaaHamdi {"ssve-fp8dot4", "nossve-fp8dot4", "+ssve-fp8dot4", "-ssve-fp8dot4"}, 1606835c885dSHassnaa Hamdi {"lut", "nolut", "+lut", "-lut"}, 1607835c885dSHassnaa Hamdi {"sme-lutv2", "nosme-lutv2", "+sme-lutv2", "-sme-lutv2"}, 1608f6ca0ed0SHassnaa Hamdi {"sme-f8f16", "nosme-f8f16", "+sme-f8f16", "-sme-f8f16"}, 1609f6ca0ed0SHassnaa Hamdi {"sme-f8f32", "nosme-f8f32", "+sme-f8f32", "-sme-f8f32"}, 1610b584478eSLukacma {"lsfe", "nolsfe", "+lsfe", "-lsfe"}, 1611b584478eSLukacma {"fprcvt", "nofprcvt", "+fprcvt", "-fprcvt"}, 16126e535a9aSNashe Mncube {"cmpbr", "nocmpbr", "+cmpbr", "-cmpbr"}, 16136e535a9aSNashe Mncube {"lsui", "nolsui", "+lsui", "-lsui"}, 16146e535a9aSNashe Mncube {"occmo", "nooccmo", "+occmo", "-occmo"}, 16156e535a9aSNashe Mncube {"pcdphint", "nopcdphint", "+pcdphint", "-pcdphint"}, 16168be860ddSJonathan Thackray {"pops", "nopops", "+pops", "-pops"}, 1617*5ec7ecd2SCarolineConcatto {"sme-mop4", "nosme-mop4", "+sme-mop4", "-sme-mop4"}, 1618*5ec7ecd2SCarolineConcatto {"sme-tmop", "nosme-tmop", "+sme-tmop", "-sme-tmop"}, 16196e535a9aSNashe Mncube }; 1620f09cf34dSArchibald Elliott 1621f09cf34dSArchibald Elliott for (unsigned i = 0; i < std::size(ArchExt); i++) { 1622f09cf34dSArchibald Elliott EXPECT_EQ(StringRef(ArchExt[i][2]), 1623f09cf34dSArchibald Elliott AArch64::getArchExtFeature(ArchExt[i][0])); 1624f09cf34dSArchibald Elliott EXPECT_EQ(StringRef(ArchExt[i][3]), 1625f09cf34dSArchibald Elliott AArch64::getArchExtFeature(ArchExt[i][1])); 1626f09cf34dSArchibald Elliott } 1627f09cf34dSArchibald Elliott } 1628f09cf34dSArchibald Elliott 162990db4193SDavid Spickett TEST(TargetParserTest, AArch64PrintSupportedExtensions) { 1630362142c4STomas Matheson std::string expected = "All available -march extensions for AArch64\n\n" 1631362142c4STomas Matheson " Name Architecture Feature(s) " 1632362142c4STomas Matheson " Description\n"; 163390db4193SDavid Spickett 163490db4193SDavid Spickett outs().flush(); 163590db4193SDavid Spickett testing::internal::CaptureStdout(); 1636bb83a3dfSLucas Duarte Prates AArch64::PrintSupportedExtensions(); 163790db4193SDavid Spickett outs().flush(); 163890db4193SDavid Spickett std::string captured = testing::internal::GetCapturedStdout(); 163990db4193SDavid Spickett 164090db4193SDavid Spickett // Check that the start of the output is as expected. 164190db4193SDavid Spickett EXPECT_EQ(0ULL, captured.find(expected)); 164290db4193SDavid Spickett 164390db4193SDavid Spickett // Should not include "none". 164490db4193SDavid Spickett EXPECT_EQ(std::string::npos, captured.find("none")); 164590db4193SDavid Spickett // Should not include anything that lacks a feature name. Checking a few here 164690db4193SDavid Spickett // but not all as if one is hidden correctly the rest should be. 164790db4193SDavid Spickett EXPECT_EQ(std::string::npos, captured.find("memtag3")); 164890db4193SDavid Spickett EXPECT_EQ(std::string::npos, captured.find("sha1")); 164990db4193SDavid Spickett EXPECT_EQ(std::string::npos, captured.find("ssbs2")); 165090db4193SDavid Spickett } 165190db4193SDavid Spickett 165213e977d1Sostannard struct AArch64ExtensionDependenciesBaseArchTestParams { 165313e977d1Sostannard const llvm::AArch64::ArchInfo &Arch; 165413e977d1Sostannard std::vector<StringRef> Modifiers; 165513e977d1Sostannard std::vector<StringRef> ExpectedPos; 165613e977d1Sostannard std::vector<StringRef> ExpectedNeg; 165713e977d1Sostannard }; 165813e977d1Sostannard 165913e977d1Sostannard class AArch64ExtensionDependenciesBaseArchTestFixture 166013e977d1Sostannard : public ::testing::TestWithParam< 166113e977d1Sostannard AArch64ExtensionDependenciesBaseArchTestParams> {}; 166213e977d1Sostannard 166313e977d1Sostannard struct AArch64ExtensionDependenciesBaseCPUTestParams { 166413e977d1Sostannard StringRef CPUName; 166513e977d1Sostannard std::vector<StringRef> Modifiers; 166613e977d1Sostannard std::vector<StringRef> ExpectedPos; 166713e977d1Sostannard std::vector<StringRef> ExpectedNeg; 166813e977d1Sostannard }; 166913e977d1Sostannard 167013e977d1Sostannard class AArch64ExtensionDependenciesBaseCPUTestFixture 167113e977d1Sostannard : public ::testing::TestWithParam< 167213e977d1Sostannard AArch64ExtensionDependenciesBaseCPUTestParams> {}; 167313e977d1Sostannard 167413e977d1Sostannard TEST_P(AArch64ExtensionDependenciesBaseArchTestFixture, 167513e977d1Sostannard AArch64ExtensionDependenciesBaseArch) { 167613e977d1Sostannard auto Params = GetParam(); 167713e977d1Sostannard 167813e977d1Sostannard llvm::AArch64::ExtensionSet Extensions; 167913e977d1Sostannard Extensions.addArchDefaults(Params.Arch); 168013e977d1Sostannard for (auto M : Params.Modifiers) { 168113e977d1Sostannard bool success = Extensions.parseModifier(M); 168213e977d1Sostannard EXPECT_TRUE(success); 168313e977d1Sostannard } 168413e977d1Sostannard std::vector<StringRef> Features; 168513e977d1Sostannard Extensions.toLLVMFeatureList(Features); 168613e977d1Sostannard 168713e977d1Sostannard for (auto E : Params.ExpectedPos) { 168813e977d1Sostannard std::string PosString = "+"; 168913e977d1Sostannard PosString += E; 169013e977d1Sostannard std::string NegString = "-"; 169113e977d1Sostannard NegString += E; 169213e977d1Sostannard ASSERT_THAT(Features, Contains(StrEq(PosString))); 169313e977d1Sostannard ASSERT_THAT(Features, Not(Contains(StrEq(NegString)))); 169413e977d1Sostannard } 169513e977d1Sostannard 169613e977d1Sostannard for (auto E : Params.ExpectedNeg) { 169713e977d1Sostannard std::string PosString = "+"; 169813e977d1Sostannard PosString += E; 169913e977d1Sostannard ASSERT_THAT(Features, Not(Contains(StrEq(PosString)))); 170013e977d1Sostannard // Features default to off, so the negative string is not expected in many 170113e977d1Sostannard // cases. 170213e977d1Sostannard } 170313e977d1Sostannard } 170413e977d1Sostannard 170513e977d1Sostannard TEST_P(AArch64ExtensionDependenciesBaseCPUTestFixture, 170613e977d1Sostannard AArch64ExtensionDependenciesBaseCPU) { 170713e977d1Sostannard auto Params = GetParam(); 170813e977d1Sostannard 170913e977d1Sostannard llvm::AArch64::ExtensionSet Extensions; 171013e977d1Sostannard const std::optional<llvm::AArch64::CpuInfo> CPU = 171113e977d1Sostannard llvm::AArch64::parseCpu(Params.CPUName); 171213e977d1Sostannard EXPECT_TRUE(CPU); 171313e977d1Sostannard Extensions.addCPUDefaults(*CPU); 171413e977d1Sostannard for (auto M : Params.Modifiers) { 171513e977d1Sostannard bool success = Extensions.parseModifier(M); 171613e977d1Sostannard EXPECT_TRUE(success); 171713e977d1Sostannard } 171813e977d1Sostannard std::vector<StringRef> Features; 171913e977d1Sostannard Extensions.toLLVMFeatureList(Features); 172013e977d1Sostannard 172113e977d1Sostannard for (auto E : Params.ExpectedPos) { 172213e977d1Sostannard std::string PosString = "+"; 172313e977d1Sostannard PosString += E; 172413e977d1Sostannard std::string NegString = "-"; 172513e977d1Sostannard NegString += E; 172613e977d1Sostannard ASSERT_THAT(Features, Contains(StrEq(PosString))); 172713e977d1Sostannard ASSERT_THAT(Features, Not(Contains(StrEq(NegString)))); 172813e977d1Sostannard } 172913e977d1Sostannard 173013e977d1Sostannard for (auto E : Params.ExpectedNeg) { 173113e977d1Sostannard std::string PosString = "+"; 173213e977d1Sostannard PosString += E; 173313e977d1Sostannard ASSERT_THAT(Features, Not(Contains(StrEq(PosString)))); 173413e977d1Sostannard // Features default to off, so the negative string is not expected in many 173513e977d1Sostannard // cases. 173613e977d1Sostannard } 173713e977d1Sostannard } 173813e977d1Sostannard 173913e977d1Sostannard AArch64ExtensionDependenciesBaseArchTestParams 174013e977d1Sostannard AArch64ExtensionDependenciesArchData[] = { 174113e977d1Sostannard // Base architecture features 174213e977d1Sostannard {AArch64::ARMV8A, {}, {"v8a", "fp-armv8", "neon"}, {}}, 174313e977d1Sostannard {AArch64::ARMV8_1A, 174413e977d1Sostannard {}, 174513e977d1Sostannard {"v8.1a", "crc", "fp-armv8", "lse", "rdm", "neon"}, 174613e977d1Sostannard {}}, 1747037a9a75SJon Roelofs {AArch64::ARMV9_5A, {}, {"v9.5a", "mops", "cpa"}, {}}, 174813e977d1Sostannard 174913e977d1Sostannard // Positive modifiers 175013e977d1Sostannard {AArch64::ARMV8A, {"fp16"}, {"fullfp16"}, {}}, 175113e977d1Sostannard {AArch64::ARMV8A, {"dotprod"}, {"dotprod"}, {}}, 175213e977d1Sostannard 175313e977d1Sostannard // Negative modifiers 175413e977d1Sostannard {AArch64::ARMV8A, {"nofp"}, {"v8a"}, {"fp-armv8", "neon"}}, 175513e977d1Sostannard 175613e977d1Sostannard // Mixed modifiers 175713e977d1Sostannard {AArch64::ARMV8A, 175813e977d1Sostannard {"fp16", "nofp16"}, 175913e977d1Sostannard {"v8a", "fp-armv8", "neon"}, 176013e977d1Sostannard {"fullfp16"}}, 176113e977d1Sostannard {AArch64::ARMV8A, 176213e977d1Sostannard {"fp16", "nofp"}, 176313e977d1Sostannard {"v8a"}, 176413e977d1Sostannard {"fp-armv8", "neon", "fullfp16"}}, 176513e977d1Sostannard 176613e977d1Sostannard // Long dependency chains: sve2-bitperm -> sve2 -> sve -> fp16 -> fp 176713e977d1Sostannard {AArch64::ARMV8A, 176892564850SCarolineConcatto {"nofp", "sve2", "sve-bitperm"}, 176992564850SCarolineConcatto {"fp-armv8", "fullfp16", "sve", "sve2", "sve-bitperm"}, 177013e977d1Sostannard {}}, 177113e977d1Sostannard {AArch64::ARMV8A, 177292564850SCarolineConcatto {"sve2", "sve-bitperm", "nofp16"}, 177313e977d1Sostannard {"fp-armv8"}, 177492564850SCarolineConcatto {"full-fp16", "sve", "sve2", "sve-bitperm"}}, 177513e977d1Sostannard 177613e977d1Sostannard // Meaning of +crypto varies with base architecture. 177713e977d1Sostannard {AArch64::ARMV8A, {"crypto"}, {"aes", "sha2"}, {}}, 177813e977d1Sostannard {AArch64::ARMV8_4A, {"crypto"}, {"aes", "sha2", "sha3", "sm4"}, {}}, 177913e977d1Sostannard {AArch64::ARMV9A, {"crypto"}, {"aes", "sha2", "sha3", "sm4"}, {}}, 178013e977d1Sostannard 178113e977d1Sostannard // -crypto always disables all crypto features, even if it wouldn't 178213e977d1Sostannard // enable them. 178313e977d1Sostannard {AArch64::ARMV8A, 178413e977d1Sostannard {"aes", "sha2", "sha3", "sm4", "nocrypto"}, 178513e977d1Sostannard {}, 178613e977d1Sostannard {"aes", "sha2", "sha3", "sm4"}}, 178713e977d1Sostannard {AArch64::ARMV8_4A, 178813e977d1Sostannard {"aes", "sha2", "sha3", "sm4", "nocrypto"}, 178913e977d1Sostannard {}, 179013e977d1Sostannard {"aes", "sha2", "sha3", "sm4"}}, 179113e977d1Sostannard 179213e977d1Sostannard // +fp16 implies +fp16fml for v8.4A+, but not v9.0-A+ 179313e977d1Sostannard {AArch64::ARMV8_3A, {"fp16"}, {"fullfp16"}, {"fp16fml"}}, 179413e977d1Sostannard {AArch64::ARMV9A, {"fp16"}, {"fullfp16"}, {"fp16fml"}}, 179513e977d1Sostannard {AArch64::ARMV8_4A, {"fp16"}, {"fullfp16", "fp16fml"}, {}}, 179613e977d1Sostannard 179713e977d1Sostannard // fp -> fp16 179813e977d1Sostannard {AArch64::ARMV8A, {"nofp", "fp16"}, {"fp-armv8", "fullfp16"}, {}}, 179913e977d1Sostannard {AArch64::ARMV8A, {"fp16", "nofp"}, {}, {"fp-armv8", "fullfp16"}}, 180013e977d1Sostannard 180113e977d1Sostannard // fp -> simd 180213e977d1Sostannard {AArch64::ARMV8A, {"nofp", "simd"}, {"fp-armv8", "neon"}, {}}, 180313e977d1Sostannard {AArch64::ARMV8A, {"simd", "nofp"}, {}, {"fp-armv8", "neon"}}, 180413e977d1Sostannard 180513e977d1Sostannard // fp -> jscvt 180613e977d1Sostannard {AArch64::ARMV8A, {"nofp", "jscvt"}, {"fp-armv8", "jsconv"}, {}}, 180713e977d1Sostannard {AArch64::ARMV8A, {"jscvt", "nofp"}, {}, {"fp-armv8", "jsconv"}}, 180813e977d1Sostannard 18099575ab28SLukacma // fp -> lsfe 18109575ab28SLukacma {AArch64::ARMV9_6A, {"nofp", "lsfe"}, {"fp-armv8", "lsfe"}, {}}, 18119575ab28SLukacma {AArch64::ARMV9_6A, {"lsfe", "nofp"}, {}, {"fp-armv8", "lsfe"}}, 18129575ab28SLukacma 18139575ab28SLukacma // fp -> fprcvt 18149575ab28SLukacma {AArch64::ARMV9_6A, {"nofp", "fprcvt"}, {"fp-armv8", "fprcvt"}, {}}, 18159575ab28SLukacma {AArch64::ARMV9_6A, {"fprcvt", "nofp"}, {}, {"fp-armv8", "fprcvt"}}, 18169575ab28SLukacma 18177ed451a3SLukacma // simd -> {aes, sha2, sha3, sm4, f8f16mm, f8f32mm, fp8dot4, fp8dot2} 181813e977d1Sostannard {AArch64::ARMV8A, {"nosimd", "aes"}, {"neon", "aes"}, {}}, 181913e977d1Sostannard {AArch64::ARMV8A, {"aes", "nosimd"}, {}, {"neon", "aes"}}, 182013e977d1Sostannard {AArch64::ARMV8A, {"nosimd", "sha2"}, {"neon", "sha2"}, {}}, 182113e977d1Sostannard {AArch64::ARMV8A, {"sha2", "nosimd"}, {}, {"neon", "sha2"}}, 182213e977d1Sostannard {AArch64::ARMV8A, {"nosimd", "sha3"}, {"neon", "sha3"}, {}}, 182313e977d1Sostannard {AArch64::ARMV8A, {"sha3", "nosimd"}, {}, {"neon", "sha3"}}, 182413e977d1Sostannard {AArch64::ARMV8A, {"nosimd", "sm4"}, {"neon", "sm4"}, {}}, 182513e977d1Sostannard {AArch64::ARMV8A, {"sm4", "nosimd"}, {}, {"neon", "sm4"}}, 18269575ab28SLukacma {AArch64::ARMV9_6A, {"nosimd", "f8f16mm"}, {"neon", "f8f16mm"}, {}}, 18279575ab28SLukacma {AArch64::ARMV9_6A, {"f8f16mm", "nosimd"}, {}, {"neon", "f8f16mm"}}, 18289575ab28SLukacma {AArch64::ARMV9_6A, {"nosimd", "f8f32mm"}, {"neon", "f8f32mm"}, {}}, 18299575ab28SLukacma {AArch64::ARMV9_6A, {"f8f32mm", "nosimd"}, {}, {"neon", "f8f32mm"}}, 18307ed451a3SLukacma {AArch64::ARMV9_6A, {"nosimd", "fp8dot4"}, {"neon", "fp8dot4"}, {}}, 18317ed451a3SLukacma {AArch64::ARMV9_6A, {"fp8dot4", "nosimd"}, {}, {"neon", "fp8dot4"}}, 18327ed451a3SLukacma {AArch64::ARMV9_6A, {"nosimd", "fp8dot2"}, {"neon", "fp8dot2"}, {}}, 18337ed451a3SLukacma {AArch64::ARMV9_6A, {"fp8dot2", "nosimd"}, {}, {"neon", "fp8dot2"}}, 183413e977d1Sostannard 183513e977d1Sostannard // simd -> {rdm, dotprod, fcma} 183613e977d1Sostannard {AArch64::ARMV8A, {"nosimd", "rdm"}, {"neon", "rdm"}, {}}, 183713e977d1Sostannard {AArch64::ARMV8A, {"rdm", "nosimd"}, {}, {"neon", "rdm"}}, 183813e977d1Sostannard {AArch64::ARMV8A, {"nosimd", "dotprod"}, {"neon", "dotprod"}, {}}, 183913e977d1Sostannard {AArch64::ARMV8A, {"dotprod", "nosimd"}, {}, {"neon", "dotprod"}}, 184013e977d1Sostannard {AArch64::ARMV8A, {"nosimd", "fcma"}, {"neon", "complxnum"}, {}}, 184113e977d1Sostannard {AArch64::ARMV8A, {"fcma", "nosimd"}, {}, {"neon", "complxnum"}}, 184213e977d1Sostannard 184313e977d1Sostannard // fp16 -> {fp16fml, sve} 184413e977d1Sostannard {AArch64::ARMV8A, {"nofp16", "fp16fml"}, {"fullfp16", "fp16fml"}, {}}, 184513e977d1Sostannard {AArch64::ARMV8A, {"fp16fml", "nofp16"}, {}, {"fullfp16", "fp16fml"}}, 184613e977d1Sostannard {AArch64::ARMV8A, {"nofp16", "sve"}, {"fullfp16", "sve"}, {}}, 184713e977d1Sostannard {AArch64::ARMV8A, {"sve", "nofp16"}, {}, {"fullfp16", "sve"}}, 184813e977d1Sostannard 18491b936e48SSpencerAbson // bf16 -> {sme} 185013e977d1Sostannard {AArch64::ARMV8A, {"nobf16", "sme"}, {"bf16", "sme"}, {}}, 185113e977d1Sostannard {AArch64::ARMV8A, {"sme", "nobf16"}, {}, {"bf16", "sme"}}, 185213e977d1Sostannard 18539575ab28SLukacma // sve -> {sve2, f32mm, f64mm, sve-f16f32mm} 185413e977d1Sostannard {AArch64::ARMV8A, {"nosve", "sve2"}, {"sve", "sve2"}, {}}, 185513e977d1Sostannard {AArch64::ARMV8A, {"sve2", "nosve"}, {}, {"sve", "sve2"}}, 185613e977d1Sostannard {AArch64::ARMV8A, {"nosve", "f32mm"}, {"sve", "f32mm"}, {}}, 185713e977d1Sostannard {AArch64::ARMV8A, {"f32mm", "nosve"}, {}, {"sve", "f32mm"}}, 185813e977d1Sostannard {AArch64::ARMV8A, {"nosve", "f64mm"}, {"sve", "f64mm"}, {}}, 185913e977d1Sostannard {AArch64::ARMV8A, {"f64mm", "nosve"}, {}, {"sve", "f64mm"}}, 18609575ab28SLukacma {AArch64::ARMV9_6A, 18619575ab28SLukacma {"nosve", "sve-f16f32mm"}, 18629575ab28SLukacma {"sve", "sve-f16f32mm"}, 18639575ab28SLukacma {}}, 18649575ab28SLukacma {AArch64::ARMV9_6A, 18659575ab28SLukacma {"sve-f16f32mm", "nosve"}, 18669575ab28SLukacma {}, 18679575ab28SLukacma {"sve", "sve-f16f32mm"}}, 186813e977d1Sostannard 1869748b0285SSpencerAbson // aes -> {sve-aes} 1870748b0285SSpencerAbson {AArch64::ARMV8A, {"noaes", "sve-aes"}, {"aes", "sve-aes"}, {}}, 1871748b0285SSpencerAbson {AArch64::ARMV8A, {"sve-aes", "noaes"}, {}, {"aes", "sve-aes"}}, 1872748b0285SSpencerAbson 1873748b0285SSpencerAbson // sve2 -> {sve2p1, sve2-bitperm, sve2-sha3, sve2-sm4, sve2-aes} 187413e977d1Sostannard {AArch64::ARMV8A, {"nosve2", "sve2p1"}, {"sve2", "sve2p1"}, {}}, 187513e977d1Sostannard {AArch64::ARMV8A, {"sve2p1", "nosve2"}, {}, {"sve2", "sve2p1"}}, 187613e977d1Sostannard {AArch64::ARMV8A, 187713e977d1Sostannard {"nosve2", "sve2-bitperm"}, 187892564850SCarolineConcatto {"sve2", "sve-bitperm"}, 187913e977d1Sostannard {}}, 188013e977d1Sostannard {AArch64::ARMV8A, 188113e977d1Sostannard {"sve2-bitperm", "nosve2"}, 188292564850SCarolineConcatto {"sve"}, 188392564850SCarolineConcatto {"sve-bitperm", "sve2", "sve2-bitperm"}}, 188492564850SCarolineConcatto {AArch64::ARMV8A, 188592564850SCarolineConcatto {"ssve-bitperm", "nosve-bitperm"}, 188692564850SCarolineConcatto {"sme"}, 188792564850SCarolineConcatto {"ssve-bitperm", "sve-bitperm"}}, 188892564850SCarolineConcatto {AArch64::ARMV8A, 188992564850SCarolineConcatto {"nosve-bitperm", "ssve-bitperm"}, 189092564850SCarolineConcatto {"sve-bitperm", "sve-bitperm"}, 189192564850SCarolineConcatto {""}}, 189213e977d1Sostannard {AArch64::ARMV8A, {"nosve2", "sve2-sha3"}, {"sve2", "sve2-sha3"}, {}}, 189313e977d1Sostannard {AArch64::ARMV8A, {"sve2-sha3", "nosve2"}, {}, {"sve2", "sve2-sha3"}}, 189413e977d1Sostannard {AArch64::ARMV8A, {"nosve2", "sve2-sm4"}, {"sve2", "sve2-sm4"}, {}}, 189513e977d1Sostannard {AArch64::ARMV8A, {"sve2-sm4", "nosve2"}, {}, {"sve2", "sve2-sm4"}}, 1896748b0285SSpencerAbson {AArch64::ARMV8A, {"nosve2", "sve2-aes"}, {"sve2", "sve2-aes"}, {}}, 1897748b0285SSpencerAbson {AArch64::ARMV8A, {"sve2-aes", "nosve2"}, {}, {"sve2", "sve2-aes"}}, 189813e977d1Sostannard 18991b936e48SSpencerAbson // sve-b16b16 -> {sme-b16b16} 1900b584478eSLukacma {AArch64::ARMV9_4A, 19011b936e48SSpencerAbson {"nosve-b16b16", "sme-b16b16"}, 19021b936e48SSpencerAbson {"sve-b16b16", "sme-b16b16"}, 19031b936e48SSpencerAbson {}}, 1904b584478eSLukacma {AArch64::ARMV9_4A, 19051b936e48SSpencerAbson {"sme-b16b16", "nosve-b16b16"}, 19061b936e48SSpencerAbson {}, 19071b936e48SSpencerAbson {"sve-b16b16", "sme-b16b16"}}, 19081b936e48SSpencerAbson 1909b584478eSLukacma // sve2p1 -> {sve2p2} 1910b584478eSLukacma {AArch64::ARMV9_6A, {"nosve2p1", "sve2p2"}, {"sve2p1", "sve2p2"}, {}}, 1911b584478eSLukacma {AArch64::ARMV9_6A, {"sve2p2", "nosve2p1"}, {}, {"sve2p1", "sve2p2"}}, 1912b584478eSLukacma 191313e977d1Sostannard // sme -> {sme2, sme-f16f16, sme-f64f64, sme-i16i64, sme-fa64} 191413e977d1Sostannard {AArch64::ARMV8A, {"nosme", "sme2"}, {"sme", "sme2"}, {}}, 191513e977d1Sostannard {AArch64::ARMV8A, {"sme2", "nosme"}, {}, {"sme", "sme2"}}, 191613e977d1Sostannard {AArch64::ARMV8A, {"nosme", "sme-f16f16"}, {"sme", "sme-f16f16"}, {}}, 191713e977d1Sostannard {AArch64::ARMV8A, {"sme-f16f16", "nosme"}, {}, {"sme", "sme-f16f16"}}, 191813e977d1Sostannard {AArch64::ARMV8A, {"nosme", "sme-f64f64"}, {"sme", "sme-f64f64"}, {}}, 191913e977d1Sostannard {AArch64::ARMV8A, {"sme-f64f64", "nosme"}, {}, {"sme", "sme-f64f64"}}, 192013e977d1Sostannard {AArch64::ARMV8A, {"nosme", "sme-i16i64"}, {"sme", "sme-i16i64"}, {}}, 192113e977d1Sostannard {AArch64::ARMV8A, {"sme-i16i64", "nosme"}, {}, {"sme", "sme-i16i64"}}, 192213e977d1Sostannard {AArch64::ARMV8A, {"nosme", "sme-fa64"}, {"sme", "sme-fa64"}, {}}, 192313e977d1Sostannard {AArch64::ARMV8A, {"sme-fa64", "nosme"}, {}, {"sme", "sme-fa64"}}, 192413e977d1Sostannard 192513e977d1Sostannard // sme2 -> {sme2p1, ssve-fp8fma, ssve-fp8dot2, ssve-fp8dot4, sme-f8f16, 19269575ab28SLukacma // sme-f8f32, sme-b16b16, ssve-aes} 192713e977d1Sostannard {AArch64::ARMV8A, {"nosme2", "sme2p1"}, {"sme2", "sme2p1"}, {}}, 192813e977d1Sostannard {AArch64::ARMV8A, {"sme2p1", "nosme2"}, {}, {"sme2", "sme2p1"}}, 192913e977d1Sostannard {AArch64::ARMV8A, 193013e977d1Sostannard {"nosme2", "ssve-fp8fma"}, 193113e977d1Sostannard {"sme2", "ssve-fp8fma"}, 193213e977d1Sostannard {}}, 193313e977d1Sostannard {AArch64::ARMV8A, 193413e977d1Sostannard {"ssve-fp8fma", "nosme2"}, 193513e977d1Sostannard {}, 193613e977d1Sostannard {"sme2", "ssve-fp8fma"}}, 193713e977d1Sostannard {AArch64::ARMV8A, 193813e977d1Sostannard {"nosme2", "ssve-fp8dot2"}, 193913e977d1Sostannard {"sme2", "ssve-fp8dot2"}, 194013e977d1Sostannard {}}, 194113e977d1Sostannard {AArch64::ARMV8A, 194213e977d1Sostannard {"ssve-fp8dot2", "nosme2"}, 194313e977d1Sostannard {}, 194413e977d1Sostannard {"sme2", "ssve-fp8dot2"}}, 194513e977d1Sostannard {AArch64::ARMV8A, 194613e977d1Sostannard {"nosme2", "ssve-fp8dot4"}, 194713e977d1Sostannard {"sme2", "ssve-fp8dot4"}, 194813e977d1Sostannard {}}, 194913e977d1Sostannard {AArch64::ARMV8A, 195013e977d1Sostannard {"ssve-fp8dot4", "nosme2"}, 195113e977d1Sostannard {}, 195213e977d1Sostannard {"sme2", "ssve-fp8dot4"}}, 195313e977d1Sostannard {AArch64::ARMV8A, {"nosme2", "sme-f8f16"}, {"sme2", "sme-f8f16"}, {}}, 195413e977d1Sostannard {AArch64::ARMV8A, {"sme-f8f16", "nosme2"}, {}, {"sme2", "sme-f8f16"}}, 195513e977d1Sostannard {AArch64::ARMV8A, {"nosme2", "sme-f8f32"}, {"sme2", "sme-f8f32"}, {}}, 195613e977d1Sostannard {AArch64::ARMV8A, {"sme-f8f32", "nosme2"}, {}, {"sme2", "sme-f8f32"}}, 19571b936e48SSpencerAbson {AArch64::ARMV8A, {"nosme2", "sme-b16b16"}, {"sme2", "sme-b16b16"}, {}}, 19581b936e48SSpencerAbson {AArch64::ARMV8A, {"sme-b16b16", "nosme2"}, {}, {"sme2", "sme-b16b16"}}, 19599575ab28SLukacma {AArch64::ARMV9_6A, {"nosme2", "ssve-aes"}, {"sme2", "ssve-aes"}, {}}, 19609575ab28SLukacma {AArch64::ARMV9_6A, {"ssve-aes", "nosme2"}, {}, {"ssve-aes", "sme2"}}, 196113e977d1Sostannard 1962b584478eSLukacma // sme2p1 -> {sme2p2} 1963b584478eSLukacma {AArch64::ARMV9_6A, {"nosme2p1", "sme2p2"}, {"sme2p2", "sme2p1"}, {}}, 1964b584478eSLukacma {AArch64::ARMV9_6A, {"sme2p2", "nosme2p1"}, {}, {"sme2p1", "sme2p2"}}, 1965b584478eSLukacma 19667ed451a3SLukacma // fp8 -> {sme-f8f16, sme-f8f32, f8f16mm, f8f32mm, fp8dot4, fp8dot2, 19677ed451a3SLukacma // ssve-fp8dot4, ssve-fp8dot2} 196813e977d1Sostannard {AArch64::ARMV8A, {"nofp8", "sme-f8f16"}, {"fp8", "sme-f8f16"}, {}}, 196913e977d1Sostannard {AArch64::ARMV8A, {"sme-f8f16", "nofp8"}, {}, {"fp8", "sme-f8f16"}}, 197013e977d1Sostannard {AArch64::ARMV8A, {"nofp8", "sme-f8f32"}, {"fp8", "sme-f8f32"}, {}}, 197113e977d1Sostannard {AArch64::ARMV8A, {"sme-f8f32", "nofp8"}, {}, {"fp8", "sme-f8f32"}}, 19729575ab28SLukacma {AArch64::ARMV9_6A, {"nofp8", "f8f16mm"}, {"fp8", "f8f16mm"}, {}}, 19739575ab28SLukacma {AArch64::ARMV9_6A, {"f8f16mm", "nofp8"}, {}, {"fp8", "f8f16mm"}}, 19749575ab28SLukacma {AArch64::ARMV9_6A, {"nofp8", "f8f32mm"}, {"fp8", "f8f32mm"}, {}}, 19759575ab28SLukacma {AArch64::ARMV9_6A, {"f8f32mm", "nofp8"}, {}, {"fp8", "f8f32mm"}}, 19767ed451a3SLukacma {AArch64::ARMV9_6A, {"nofp8", "fp8dot4"}, {"fp8", "fp8dot4"}, {}}, 19777ed451a3SLukacma {AArch64::ARMV9_6A, {"fp8dot4", "nofp8"}, {}, {"fp8", "fp8dot4"}}, 19787ed451a3SLukacma {AArch64::ARMV9_6A, {"nofp8", "fp8dot2"}, {"fp8", "fp8dot2"}, {}}, 19797ed451a3SLukacma {AArch64::ARMV9_6A, {"fp8dot2", "nofp8"}, {}, {"fp8", "fp8dot2"}}, 19807ed451a3SLukacma {AArch64::ARMV9_6A, 19817ed451a3SLukacma {"nofp8", "ssve-fp8dot4"}, 19827ed451a3SLukacma {"fp8", "ssve-fp8dot4"}, 19837ed451a3SLukacma {}}, 19847ed451a3SLukacma {AArch64::ARMV9_6A, 19857ed451a3SLukacma {"ssve-fp8dot4", "nofp8"}, 19867ed451a3SLukacma {}, 19877ed451a3SLukacma {"fp8", "ssve-fp8dot4"}}, 19887ed451a3SLukacma {AArch64::ARMV9_6A, 19897ed451a3SLukacma {"nofp8", "ssve-fp8dot2"}, 19907ed451a3SLukacma {"fp8", "ssve-fp8dot2"}, 19917ed451a3SLukacma {}}, 19927ed451a3SLukacma {AArch64::ARMV9_6A, 19937ed451a3SLukacma {"ssve-fp8dot2", "nofp8"}, 19947ed451a3SLukacma {}, 19957ed451a3SLukacma {"fp8", "ssve-fp8dot2"}}, 199613e977d1Sostannard 199713e977d1Sostannard // lse -> lse128 199813e977d1Sostannard {AArch64::ARMV8A, {"nolse", "lse128"}, {"lse", "lse128"}, {}}, 199913e977d1Sostannard {AArch64::ARMV8A, {"lse128", "nolse"}, {}, {"lse", "lse128"}}, 200013e977d1Sostannard 200113e977d1Sostannard // predres -> predres2 200213e977d1Sostannard {AArch64::ARMV8A, 200313e977d1Sostannard {"nopredres", "predres2"}, 200413e977d1Sostannard {"predres", "specres2"}, 200513e977d1Sostannard {}}, 200613e977d1Sostannard {AArch64::ARMV8A, 200713e977d1Sostannard {"predres2", "nopredres"}, 200813e977d1Sostannard {}, 200913e977d1Sostannard {"predres", "specres2"}}, 201013e977d1Sostannard 201113e977d1Sostannard // ras -> ras2 201213e977d1Sostannard {AArch64::ARMV8A, {"noras", "rasv2"}, {"ras", "rasv2"}, {}}, 201313e977d1Sostannard {AArch64::ARMV8A, {"rasv2", "noras"}, {}, {"ras", "rasv2"}}, 201413e977d1Sostannard 201513e977d1Sostannard // rcpc -> rcpc3 201613e977d1Sostannard {AArch64::ARMV8A, {"norcpc", "rcpc3"}, {"rcpc", "rcpc3"}, {}}, 201713e977d1Sostannard {AArch64::ARMV8A, {"rcpc3", "norcpc"}, {}, {"rcpc", "rcpc3"}}, 20189575ab28SLukacma 2019748b0285SSpencerAbson // sve-aes -> {ssve-aes, sve2-aes} 20209575ab28SLukacma {AArch64::ARMV9_6A, 2021748b0285SSpencerAbson {"nosve-aes", "ssve-aes"}, 2022748b0285SSpencerAbson {"sve-aes", "ssve-aes"}, 20239575ab28SLukacma {}}, 20249575ab28SLukacma {AArch64::ARMV9_6A, 2025748b0285SSpencerAbson {"ssve-aes", "nosve-aes"}, 20269575ab28SLukacma {}, 2027748b0285SSpencerAbson {"ssve-aes", "sve-aes"}}, 2028748b0285SSpencerAbson {AArch64::ARMV9_6A, 2029748b0285SSpencerAbson {"nosve-aes", "sve2-aes"}, 2030748b0285SSpencerAbson {"sve2-aes", "sve-aes"}, 2031748b0285SSpencerAbson {}}, 2032748b0285SSpencerAbson {AArch64::ARMV9_6A, 2033748b0285SSpencerAbson {"sve2-aes", "nosve-aes"}, 2034748b0285SSpencerAbson {}, 2035748b0285SSpencerAbson {"sve2-aes", "sve-aes"}}, 2036748b0285SSpencerAbson 2037748b0285SSpencerAbson // -sve2-aes should disable sve-aes (only) 2038748b0285SSpencerAbson {AArch64::ARMV9_6A, 2039748b0285SSpencerAbson {"sve2", "sve-aes", "nosve2-aes"}, 2040748b0285SSpencerAbson {"sve2"}, 2041*5ec7ecd2SCarolineConcatto {"sve2-aes", "sve-aes"}}, 2042*5ec7ecd2SCarolineConcatto 2043*5ec7ecd2SCarolineConcatto // sme-tmop -> sme 2044*5ec7ecd2SCarolineConcatto {AArch64::ARMV8A, {"nosme2", "sme-tmop"}, {"sme2", "sme-tmop"}, {}}, 2045*5ec7ecd2SCarolineConcatto {AArch64::ARMV8A, {"sme-tmop", "nosme2"}, {}, {"sme2", "sme-tmop"}}, 2046*5ec7ecd2SCarolineConcatto 2047*5ec7ecd2SCarolineConcatto // sme-mop4 -> sme 2048*5ec7ecd2SCarolineConcatto {AArch64::ARMV8A, {"nosme", "sme-mop4"}, {"sme", "sme-mop4"}, {}}, 2049*5ec7ecd2SCarolineConcatto {AArch64::ARMV8A, {"sme-mop4", "nosme"}, {}, {"sme", "sme-mop4"}}}; 205013e977d1Sostannard 205113e977d1Sostannard INSTANTIATE_TEST_SUITE_P( 205213e977d1Sostannard AArch64ExtensionDependenciesBaseArch, 205313e977d1Sostannard AArch64ExtensionDependenciesBaseArchTestFixture, 205413e977d1Sostannard ::testing::ValuesIn(AArch64ExtensionDependenciesArchData)); 205513e977d1Sostannard 205613e977d1Sostannard AArch64ExtensionDependenciesBaseCPUTestParams 205713e977d1Sostannard AArch64ExtensionDependenciesCPUData[] = { 205813e977d1Sostannard // Base CPU features 205913e977d1Sostannard {"cortex-a57", 206013e977d1Sostannard {}, 206113e977d1Sostannard {"v8a", "aes", "crc", "fp-armv8", "sha2", "neon"}, 206213e977d1Sostannard {}}, 206313e977d1Sostannard {"cortex-r82", 206413e977d1Sostannard {}, 206513e977d1Sostannard {"v8r", "crc", "dotprod", "fp-armv8", "fullfp16", "fp16fml", "lse", 206613e977d1Sostannard "ras", "rcpc", "rdm", "sb", "neon", "ssbs"}, 206713e977d1Sostannard {}}, 206813e977d1Sostannard {"cortex-a520", 206913e977d1Sostannard {}, 2070defc4859SJack Styles {"v9.2a", "bf16", "crc", "dotprod", "flagm", "fp-armv8", 2071defc4859SJack Styles "fullfp16", "fp16fml", "i8mm", "lse", "mte", "pauth", 2072defc4859SJack Styles "perfmon", "predres", "ras", "rcpc", "rdm", "sb", 207392564850SCarolineConcatto "neon", "ssbs", "sve", "sve-bitperm", "sve2"}, 207413e977d1Sostannard {}}, 207513e977d1Sostannard 207613e977d1Sostannard // Negative modifiers 207713e977d1Sostannard {"cortex-r82", 207813e977d1Sostannard {"nofp"}, 207913e977d1Sostannard {"v8r", "crc", "lse", "ras", "rcpc", "sb", "ssbs"}, 208013e977d1Sostannard {"fp-armv8", "neon", "fullfp16", "fp16fml", "dotprod", "rdm"}}, 208113e977d1Sostannard }; 208213e977d1Sostannard 208313e977d1Sostannard INSTANTIATE_TEST_SUITE_P( 208413e977d1Sostannard AArch64ExtensionDependenciesBaseCPU, 208513e977d1Sostannard AArch64ExtensionDependenciesBaseCPUTestFixture, 208613e977d1Sostannard ::testing::ValuesIn(AArch64ExtensionDependenciesCPUData)); 208713e977d1Sostannard 2088f09cf34dSArchibald Elliott } // namespace 2089