xref: /llvm-project/llvm/unittests/TargetParser/TargetParserTest.cpp (revision 5ec7ecd2f2d213f1777af3ff3a2e7910d00ea774)
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> &params) {
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