xref: /llvm-project/llvm/unittests/TargetParser/TargetParserTest.cpp (revision 6b9753a0ecf7fdea203c6faf23c3ad4bf432273c)
1 //===----------- TargetParser.cpp - Target Parser -------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "llvm/TargetParser/TargetParser.h"
10 #include "llvm/ADT/STLExtras.h"
11 #include "llvm/ADT/StringExtras.h"
12 #include "llvm/ADT/StringMap.h"
13 #include "llvm/Support/ARMBuildAttributes.h"
14 #include "llvm/Support/Debug.h"
15 #include "llvm/Support/FormatVariadic.h"
16 #include "llvm/TargetParser/AArch64TargetParser.h"
17 #include "llvm/TargetParser/ARMTargetParser.h"
18 #include "llvm/TargetParser/ARMTargetParserCommon.h"
19 #include "llvm/TargetParser/Triple.h"
20 #include "gmock/gmock.h"
21 #include "gtest/gtest.h"
22 #include <optional>
23 #include <sstream>
24 #include <string>
25 
26 using namespace llvm;
27 
28 using ::testing::Contains;
29 using ::testing::StrEq;
30 
31 namespace {
32 const char *ARMArch[] = {
33     "armv4",       "armv4t",    "armv5",        "armv5t",      "armv5e",
34     "armv5te",     "armv5tej",  "armv6",        "armv6j",      "armv6k",
35     "armv6hl",     "armv6t2",   "armv6kz",      "armv6z",      "armv6zk",
36     "armv6-m",     "armv6m",    "armv6sm",      "armv6s-m",    "armv7-a",
37     "armv7",       "armv7a",    "armv7ve",      "armv7hl",     "armv7l",
38     "armv7-r",     "armv7r",    "armv7-m",      "armv7m",      "armv7k",
39     "armv7s",      "armv7e-m",  "armv7em",      "armv8-a",     "armv8",
40     "armv8a",      "armv8l",    "armv8.1-a",    "armv8.1a",    "armv8.2-a",
41     "armv8.2a",    "armv8.3-a", "armv8.3a",     "armv8.4-a",   "armv8.4a",
42     "armv8.5-a",   "armv8.5a",  "armv8.6-a",    "armv8.6a",    "armv8.7-a",
43     "armv8.7a",    "armv8.8-a", "armv8.8a",     "armv8.9-a",   "armv8.9a",
44     "armv8-r",     "armv8r",    "armv8-m.base", "armv8m.base", "armv8-m.main",
45     "armv8m.main", "iwmmxt",    "iwmmxt2",      "xscale",      "armv8.1-m.main",
46     "armv9-a",     "armv9",     "armv9a",       "armv9.1-a",   "armv9.1a",
47     "armv9.2-a",   "armv9.2a",  "armv9.3-a",    "armv9.3a",    "armv9.4-a",
48     "armv9.4a",    "armv9.5-a", "armv9.5a",
49 };
50 
51 std::string FormatExtensionFlags(int64_t Flags) {
52   std::vector<StringRef> Features;
53 
54   if (Flags & ARM::AEK_NONE)
55     Features.push_back("none");
56   ARM::getExtensionFeatures(Flags, Features);
57 
58   // The target parser also includes every extension you don't have.
59   // E.g. if AEK_CRC is not set then it adds "-crc". Not useful here.
60   Features.erase(std::remove_if(Features.begin(), Features.end(),
61                                 [](StringRef extension) {
62                                   return extension.starts_with("-");
63                                 }),
64                  Features.end());
65 
66   return llvm::join(Features, ", ");
67 }
68 
69 std::string FormatExtensionFlags(AArch64::ExtensionBitset Flags) {
70   std::vector<StringRef> Features;
71 
72   // AEK_NONE is not meant to be shown to the user so the target parser
73   // does not recognise it. It is relevant here though.
74   if (Flags.test(AArch64::AEK_NONE))
75     Features.push_back("none");
76   AArch64::getExtensionFeatures(Flags, Features);
77 
78   // The target parser also includes every extension you don't have.
79   // E.g. if AEK_CRC is not set then it adds "-crc". Not useful here.
80   Features.erase(std::remove_if(Features.begin(), Features.end(),
81                                 [](StringRef extension) {
82                                   return extension.starts_with("-");
83                                 }),
84                  Features.end());
85 
86   return llvm::join(Features, ", ");
87 }
88 
89 std::string SerializeExtensionFlags(AArch64::ExtensionBitset Flags) {
90   std::string SerializedFlags;
91   std::ostringstream ss;
92   int HexValue = 0;
93   for (unsigned int i = 0; i < AArch64::AEK_NUM_EXTENSIONS; i++) {
94     HexValue <<= 1;
95     HexValue |= (int)Flags[i];
96     if ((i + 1) % 4 == 0) {
97       ss << std::hex << HexValue;
98       HexValue = 0;
99     }
100   }
101   // check if there are remainig unhandled bits
102   if ((AArch64::AEK_NUM_EXTENSIONS % 4) != 0)
103     ss << std::hex << HexValue;
104 
105   SerializedFlags = ss.str();
106   return SerializedFlags;
107 }
108 
109 template <ARM::ISAKind ISAKind> struct AssertSameExtensionFlags {
110   AssertSameExtensionFlags(StringRef CPUName) : CPUName(CPUName) {}
111 
112   testing::AssertionResult operator()(const char *m_expr, const char *n_expr,
113                                       uint64_t ExpectedFlags,
114                                       uint64_t GotFlags) {
115     if (ExpectedFlags == GotFlags)
116       return testing::AssertionSuccess();
117 
118     return testing::AssertionFailure() << llvm::formatv(
119                "CPU: {4}\n"
120                "Expected extension flags: {0} ({1:x})\n"
121                "     Got extension flags: {2} ({3:x})\n",
122                FormatExtensionFlags(ExpectedFlags), ExpectedFlags,
123                FormatExtensionFlags(GotFlags), ExpectedFlags, CPUName);
124   }
125 
126   testing::AssertionResult operator()(const char *m_expr, const char *n_expr,
127                                       AArch64::ExtensionBitset ExpectedFlags,
128                                       AArch64::ExtensionBitset GotFlags) {
129     if (ExpectedFlags == GotFlags)
130       return testing::AssertionSuccess();
131 
132     return testing::AssertionFailure()
133            << llvm::formatv("CPU: {4}\n"
134                             "Expected extension flags: {0} ({1})\n"
135                             "     Got extension flags: {2} ({3})\n",
136                             FormatExtensionFlags(ExpectedFlags),
137                             SerializeExtensionFlags(ExpectedFlags),
138                             FormatExtensionFlags(GotFlags),
139                             SerializeExtensionFlags(ExpectedFlags), CPUName);
140   }
141 
142 private:
143   StringRef CPUName;
144 };
145 
146 template <typename T> struct ARMCPUTestParams {
147   ARMCPUTestParams(StringRef CPUName, StringRef ExpectedArch,
148                    StringRef ExpectedFPU, T ExpectedFlags, StringRef CPUAttr)
149       : CPUName(CPUName), ExpectedArch(ExpectedArch), ExpectedFPU(ExpectedFPU),
150         ExpectedFlags(ExpectedFlags), CPUAttr(CPUAttr) {}
151 
152   friend std::ostream &operator<<(std::ostream &os,
153                                   const ARMCPUTestParams<T> &params) {
154     os << "\"" << params.CPUName.str() << "\", \"" << params.ExpectedArch.str()
155        << "\", \"" << params.ExpectedFPU.str() << "\", 0x";
156     if constexpr (std::is_same<T, uint64_t>::value)
157       os << std::hex << params.ExpectedFlags;
158     else
159       os << SerializeExtensionFlags(params.ExpectedFlags);
160     os << ", \"" << params.CPUAttr.str() << "\"";
161     return os;
162   }
163 
164   /// Print a gtest-compatible facsimile of the CPUName, to make the test's name
165   /// human-readable.
166   ///
167   /// https://github.com/google/googletest/blob/main/docs/advanced.md#specifying-names-for-value-parameterized-test-parameters
168   static std::string PrintToStringParamName(
169       const testing::TestParamInfo<ARMCPUTestParams<T>> &Info) {
170     std::string Name = Info.param.CPUName.str();
171     for (char &C : Name)
172       if (!std::isalnum(C))
173         C = '_';
174     return Name;
175   }
176 
177   StringRef CPUName;
178   StringRef ExpectedArch;
179   StringRef ExpectedFPU;
180   T ExpectedFlags;
181   StringRef CPUAttr;
182 };
183 
184 class ARMCPUTestFixture
185     : public ::testing::TestWithParam<ARMCPUTestParams<uint64_t>> {};
186 
187 TEST_P(ARMCPUTestFixture, ARMCPUTests) {
188   auto params = GetParam();
189 
190   ARM::ArchKind AK = ARM::parseCPUArch(params.CPUName);
191   EXPECT_EQ(params.ExpectedArch, ARM::getArchName(AK));
192 
193   ARM::FPUKind FPUKind = ARM::getDefaultFPU(params.CPUName, AK);
194   EXPECT_EQ(params.ExpectedFPU, ARM::getFPUName(FPUKind));
195 
196   uint64_t default_extensions = ARM::getDefaultExtensions(params.CPUName, AK);
197   EXPECT_PRED_FORMAT2(
198       AssertSameExtensionFlags<ARM::ISAKind::ARM>(params.CPUName),
199       params.ExpectedFlags, default_extensions);
200 
201   EXPECT_EQ(params.CPUAttr, ARM::getCPUAttr(AK));
202 }
203 
204 // Note that we include ARM::AEK_NONE even when there are other extensions
205 // we expect. This is because the default extensions for a CPU are the sum
206 // of the default extensions for its architecture and for the CPU.
207 // So if a CPU has no extra extensions, it adds AEK_NONE.
208 INSTANTIATE_TEST_SUITE_P(
209     ARMCPUTestsPart1, ARMCPUTestFixture,
210     ::testing::Values(
211         ARMCPUTestParams<uint64_t>("invalid", "invalid", "invalid",
212                                    ARM::AEK_NONE, ""),
213         ARMCPUTestParams<uint64_t>("generic", "invalid", "none", ARM::AEK_NONE,
214                                    ""),
215 
216         ARMCPUTestParams<uint64_t>("arm8", "armv4", "none", ARM::AEK_NONE, "4"),
217         ARMCPUTestParams<uint64_t>("arm810", "armv4", "none", ARM::AEK_NONE,
218                                    "4"),
219         ARMCPUTestParams<uint64_t>("strongarm", "armv4", "none", ARM::AEK_NONE,
220                                    "4"),
221         ARMCPUTestParams<uint64_t>("strongarm110", "armv4", "none",
222                                    ARM::AEK_NONE, "4"),
223         ARMCPUTestParams<uint64_t>("strongarm1100", "armv4", "none",
224                                    ARM::AEK_NONE, "4"),
225         ARMCPUTestParams<uint64_t>("strongarm1110", "armv4", "none",
226                                    ARM::AEK_NONE, "4"),
227         ARMCPUTestParams<uint64_t>("arm7tdmi", "armv4t", "none", ARM::AEK_NONE,
228                                    "4T"),
229         ARMCPUTestParams<uint64_t>("arm7tdmi-s", "armv4t", "none",
230                                    ARM::AEK_NONE, "4T"),
231         ARMCPUTestParams<uint64_t>("arm710t", "armv4t", "none", ARM::AEK_NONE,
232                                    "4T"),
233         ARMCPUTestParams<uint64_t>("arm720t", "armv4t", "none", ARM::AEK_NONE,
234                                    "4T"),
235         ARMCPUTestParams<uint64_t>("arm9", "armv4t", "none", ARM::AEK_NONE,
236                                    "4T"),
237         ARMCPUTestParams<uint64_t>("arm9tdmi", "armv4t", "none", ARM::AEK_NONE,
238                                    "4T"),
239         ARMCPUTestParams<uint64_t>("arm920", "armv4t", "none", ARM::AEK_NONE,
240                                    "4T"),
241         ARMCPUTestParams<uint64_t>("arm920t", "armv4t", "none", ARM::AEK_NONE,
242                                    "4T"),
243         ARMCPUTestParams<uint64_t>("arm922t", "armv4t", "none", ARM::AEK_NONE,
244                                    "4T"),
245         ARMCPUTestParams<uint64_t>("arm940t", "armv4t", "none", ARM::AEK_NONE,
246                                    "4T"),
247         ARMCPUTestParams<uint64_t>("ep9312", "armv4t", "none", ARM::AEK_NONE,
248                                    "4T"),
249         ARMCPUTestParams<uint64_t>("arm10tdmi", "armv5t", "none", ARM::AEK_NONE,
250                                    "5T"),
251         ARMCPUTestParams<uint64_t>("arm1020t", "armv5t", "none", ARM::AEK_NONE,
252                                    "5T"),
253         ARMCPUTestParams<uint64_t>("arm9e", "armv5te", "none",
254                                    ARM::AEK_NONE | ARM::AEK_DSP, "5TE"),
255         ARMCPUTestParams<uint64_t>("arm946e-s", "armv5te", "none",
256                                    ARM::AEK_NONE | ARM::AEK_DSP, "5TE"),
257         ARMCPUTestParams<uint64_t>("arm966e-s", "armv5te", "none",
258                                    ARM::AEK_NONE | ARM::AEK_DSP, "5TE"),
259         ARMCPUTestParams<uint64_t>("arm968e-s", "armv5te", "none",
260                                    ARM::AEK_NONE | ARM::AEK_DSP, "5TE"),
261         ARMCPUTestParams<uint64_t>("arm10e", "armv5te", "none",
262                                    ARM::AEK_NONE | ARM::AEK_DSP, "5TE"),
263         ARMCPUTestParams<uint64_t>("arm1020e", "armv5te", "none",
264                                    ARM::AEK_NONE | ARM::AEK_DSP, "5TE"),
265         ARMCPUTestParams<uint64_t>("arm1022e", "armv5te", "none",
266                                    ARM::AEK_NONE | ARM::AEK_DSP, "5TE"),
267         ARMCPUTestParams<uint64_t>("arm926ej-s", "armv5tej", "none",
268                                    ARM::AEK_NONE | ARM::AEK_DSP, "5TEJ"),
269         ARMCPUTestParams<uint64_t>("arm1136j-s", "armv6", "none",
270                                    ARM::AEK_NONE | ARM::AEK_DSP, "6"),
271         ARMCPUTestParams<uint64_t>("arm1136jf-s", "armv6", "vfpv2",
272                                    ARM::AEK_NONE | ARM::AEK_DSP, "6"),
273         ARMCPUTestParams<uint64_t>("arm1176jz-s", "armv6kz", "none",
274                                    ARM::AEK_NONE | ARM::AEK_SEC | ARM::AEK_DSP,
275                                    "6KZ"),
276         ARMCPUTestParams<uint64_t>("mpcore", "armv6k", "vfpv2",
277                                    ARM::AEK_NONE | ARM::AEK_DSP, "6K"),
278         ARMCPUTestParams<uint64_t>("mpcorenovfp", "armv6k", "none",
279                                    ARM::AEK_NONE | ARM::AEK_DSP, "6K"),
280         ARMCPUTestParams<uint64_t>("arm1176jzf-s", "armv6kz", "vfpv2",
281                                    ARM::AEK_NONE | ARM::AEK_SEC | ARM::AEK_DSP,
282                                    "6KZ"),
283         ARMCPUTestParams<uint64_t>("arm1156t2-s", "armv6t2", "none",
284                                    ARM::AEK_NONE | ARM::AEK_DSP, "6T2"),
285         ARMCPUTestParams<uint64_t>("arm1156t2f-s", "armv6t2", "vfpv2",
286                                    ARM::AEK_NONE | ARM::AEK_DSP, "6T2"),
287         ARMCPUTestParams<uint64_t>("cortex-m0", "armv6-m", "none",
288                                    ARM::AEK_NONE, "6-M"),
289         ARMCPUTestParams<uint64_t>("cortex-m0plus", "armv6-m", "none",
290                                    ARM::AEK_NONE, "6-M"),
291         ARMCPUTestParams<uint64_t>("cortex-m1", "armv6-m", "none",
292                                    ARM::AEK_NONE, "6-M"),
293         ARMCPUTestParams<uint64_t>("sc000", "armv6-m", "none", ARM::AEK_NONE,
294                                    "6-M"),
295         ARMCPUTestParams<uint64_t>("cortex-a5", "armv7-a", "neon-vfpv4",
296                                    ARM::AEK_MP | ARM::AEK_SEC | ARM::AEK_DSP,
297                                    "7-A"),
298         ARMCPUTestParams<uint64_t>("cortex-a7", "armv7-a", "neon-vfpv4",
299                                    ARM::AEK_HWDIVTHUMB | ARM::AEK_HWDIVARM |
300                                        ARM::AEK_MP | ARM::AEK_SEC |
301                                        ARM::AEK_VIRT | ARM::AEK_DSP,
302                                    "7-A"),
303         ARMCPUTestParams<uint64_t>("cortex-a8", "armv7-a", "neon",
304                                    ARM::AEK_SEC | ARM::AEK_DSP, "7-A")),
305     ARMCPUTestParams<uint64_t>::PrintToStringParamName);
306 
307 // gtest in llvm has a limit of 50 test cases when using ::Values so we split
308 // them into 2 blocks
309 INSTANTIATE_TEST_SUITE_P(
310     ARMCPUTestsPart2, ARMCPUTestFixture,
311     ::testing::Values(
312         ARMCPUTestParams<uint64_t>("cortex-a9", "armv7-a", "neon-fp16",
313                                    ARM::AEK_MP | ARM::AEK_SEC | ARM::AEK_DSP,
314                                    "7-A"),
315         ARMCPUTestParams<uint64_t>("cortex-a12", "armv7-a", "neon-vfpv4",
316                                    ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
317                                        ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
318                                        ARM::AEK_DSP,
319                                    "7-A"),
320         ARMCPUTestParams<uint64_t>("cortex-a15", "armv7-a", "neon-vfpv4",
321                                    ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
322                                        ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
323                                        ARM::AEK_DSP,
324                                    "7-A"),
325         ARMCPUTestParams<uint64_t>("cortex-a17", "armv7-a", "neon-vfpv4",
326                                    ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
327                                        ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
328                                        ARM::AEK_DSP,
329                                    "7-A"),
330         ARMCPUTestParams<uint64_t>("krait", "armv7-a", "neon-vfpv4",
331                                    ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
332                                        ARM::AEK_DSP,
333                                    "7-A"),
334         ARMCPUTestParams<uint64_t>("cortex-r4", "armv7-r", "none",
335                                    ARM::AEK_NONE | ARM::AEK_HWDIVTHUMB |
336                                        ARM::AEK_DSP,
337                                    "7-R"),
338         ARMCPUTestParams<uint64_t>("cortex-r4f", "armv7-r", "vfpv3-d16",
339                                    ARM::AEK_NONE | ARM::AEK_HWDIVTHUMB |
340                                        ARM::AEK_DSP,
341                                    "7-R"),
342         ARMCPUTestParams<uint64_t>("cortex-r5", "armv7-r", "vfpv3-d16",
343                                    ARM::AEK_MP | ARM::AEK_HWDIVARM |
344                                        ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
345                                    "7-R"),
346         ARMCPUTestParams<uint64_t>("cortex-r7", "armv7-r", "vfpv3-d16-fp16",
347                                    ARM::AEK_MP | ARM::AEK_HWDIVARM |
348                                        ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
349                                    "7-R"),
350         ARMCPUTestParams<uint64_t>("cortex-r8", "armv7-r", "vfpv3-d16-fp16",
351                                    ARM::AEK_MP | ARM::AEK_HWDIVARM |
352                                        ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
353                                    "7-R"),
354         ARMCPUTestParams<uint64_t>("cortex-r52", "armv8-r", "neon-fp-armv8",
355                                    ARM::AEK_NONE | ARM::AEK_CRC | ARM::AEK_MP |
356                                        ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
357                                        ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
358                                    "8-R"),
359         ARMCPUTestParams<uint64_t>("sc300", "armv7-m", "none",
360                                    ARM::AEK_NONE | ARM::AEK_HWDIVTHUMB, "7-M"),
361         ARMCPUTestParams<uint64_t>("cortex-m3", "armv7-m", "none",
362                                    ARM::AEK_NONE | ARM::AEK_HWDIVTHUMB, "7-M"),
363         ARMCPUTestParams<uint64_t>("cortex-m4", "armv7e-m", "fpv4-sp-d16",
364                                    ARM::AEK_NONE | ARM::AEK_HWDIVTHUMB |
365                                        ARM::AEK_DSP,
366                                    "7E-M"),
367         ARMCPUTestParams<uint64_t>("cortex-m7", "armv7e-m", "fpv5-d16",
368                                    ARM::AEK_NONE | ARM::AEK_HWDIVTHUMB |
369                                        ARM::AEK_DSP,
370                                    "7E-M"),
371         ARMCPUTestParams<uint64_t>("cortex-a32", "armv8-a",
372                                    "crypto-neon-fp-armv8",
373                                    ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
374                                        ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
375                                        ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
376                                    "8-A"),
377         ARMCPUTestParams<uint64_t>("cortex-a35", "armv8-a",
378                                    "crypto-neon-fp-armv8",
379                                    ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
380                                        ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
381                                        ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
382                                    "8-A"),
383         ARMCPUTestParams<uint64_t>("cortex-a53", "armv8-a",
384                                    "crypto-neon-fp-armv8",
385                                    ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
386                                        ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
387                                        ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
388                                    "8-A"),
389         ARMCPUTestParams<uint64_t>(
390             "cortex-a55", "armv8.2-a", "crypto-neon-fp-armv8",
391             ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
392                 ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP |
393                 ARM::AEK_FP16 | ARM::AEK_RAS | ARM::AEK_DOTPROD,
394             "8.2-A"),
395         ARMCPUTestParams<uint64_t>("cortex-a57", "armv8-a",
396                                    "crypto-neon-fp-armv8",
397                                    ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
398                                        ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
399                                        ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
400                                    "8-A"),
401         ARMCPUTestParams<uint64_t>("cortex-a72", "armv8-a",
402                                    "crypto-neon-fp-armv8",
403                                    ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
404                                        ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
405                                        ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
406                                    "8-A"),
407         ARMCPUTestParams<uint64_t>("cortex-a73", "armv8-a",
408                                    "crypto-neon-fp-armv8",
409                                    ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
410                                        ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
411                                        ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
412                                    "8-A"),
413         ARMCPUTestParams<uint64_t>(
414             "cortex-a75", "armv8.2-a", "crypto-neon-fp-armv8",
415             ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
416                 ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP |
417                 ARM::AEK_FP16 | ARM::AEK_RAS | ARM::AEK_DOTPROD,
418             "8.2-A"),
419         ARMCPUTestParams<uint64_t>(
420             "cortex-a76", "armv8.2-a", "crypto-neon-fp-armv8",
421             ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
422                 ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP |
423                 ARM::AEK_FP16 | ARM::AEK_RAS | ARM::AEK_DOTPROD,
424             "8.2-A"),
425         ARMCPUTestParams<uint64_t>(
426             "cortex-a76ae", "armv8.2-a", "crypto-neon-fp-armv8",
427             ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
428                 ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP |
429                 ARM::AEK_FP16 | ARM::AEK_RAS | ARM::AEK_DOTPROD,
430             "8.2-A"),
431         ARMCPUTestParams<uint64_t>(
432             "cortex-a78c", "armv8.2-a", "crypto-neon-fp-armv8",
433             ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
434                 ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_CRC |
435                 ARM::AEK_RAS | ARM::AEK_FP16 | ARM::AEK_DOTPROD,
436             "8.2-A"),
437         ARMCPUTestParams<uint64_t>("cortex-a710", "armv9-a", "neon-fp-armv8",
438                                    ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
439                                        ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
440                                        ARM::AEK_DSP | ARM::AEK_CRC |
441                                        ARM::AEK_RAS | ARM::AEK_DOTPROD |
442                                        ARM::AEK_FP16FML | ARM::AEK_BF16 |
443                                        ARM::AEK_I8MM | ARM::AEK_SB,
444                                    "9-A"),
445         ARMCPUTestParams<uint64_t>(
446             "cortex-a77", "armv8.2-a", "crypto-neon-fp-armv8",
447             ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
448                 ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP |
449                 ARM::AEK_FP16 | ARM::AEK_RAS | ARM::AEK_DOTPROD,
450             "8.2-A"),
451         ARMCPUTestParams<uint64_t>(
452             "cortex-a78", "armv8.2-a", "crypto-neon-fp-armv8",
453             ARM::AEK_DOTPROD | ARM::AEK_FP16 | ARM::AEK_SEC | ARM::AEK_MP |
454                 ARM::AEK_VIRT | ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
455                 ARM::AEK_DSP | ARM::AEK_CRC | ARM::AEK_RAS,
456             "8.2-A"),
457         ARMCPUTestParams<uint64_t>(
458             "cortex-a78ae", "armv8.2-a", "crypto-neon-fp-armv8",
459             ARM::AEK_RAS | ARM::AEK_DOTPROD | ARM::AEK_SEC | ARM::AEK_MP |
460                 ARM::AEK_VIRT | ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
461                 ARM::AEK_DSP | ARM::AEK_CRC | ARM::AEK_RAS,
462             "8.2-A"),
463         ARMCPUTestParams<uint64_t>(
464             "cortex-x1", "armv8.2-a", "crypto-neon-fp-armv8",
465             ARM::AEK_RAS | ARM::AEK_FP16 | ARM::AEK_DOTPROD | ARM::AEK_SEC |
466                 ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
467                 ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_CRC,
468             "8.2-A"),
469         ARMCPUTestParams<uint64_t>(
470             "cortex-x1c", "armv8.2-a", "crypto-neon-fp-armv8",
471             ARM::AEK_RAS | ARM::AEK_FP16 | ARM::AEK_DOTPROD | ARM::AEK_SEC |
472                 ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
473                 ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_CRC,
474             "8.2-A"),
475         ARMCPUTestParams<uint64_t>(
476             "neoverse-n1", "armv8.2-a", "crypto-neon-fp-armv8",
477             ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
478                 ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP |
479                 ARM::AEK_FP16 | ARM::AEK_RAS | ARM::AEK_DOTPROD,
480             "8.2-A"),
481         ARMCPUTestParams<uint64_t>(
482             "neoverse-n2", "armv9-a", "neon-fp-armv8",
483             ARM::AEK_CRC | ARM::AEK_HWDIVTHUMB | ARM::AEK_HWDIVARM |
484                 ARM::AEK_MP | ARM::AEK_SEC | ARM::AEK_VIRT | ARM::AEK_DSP |
485                 ARM::AEK_BF16 | ARM::AEK_DOTPROD | ARM::AEK_RAS |
486                 ARM::AEK_I8MM | ARM::AEK_FP16FML | ARM::AEK_SB,
487             "9-A"),
488         ARMCPUTestParams<uint64_t>(
489             "neoverse-v1", "armv8.4-a", "crypto-neon-fp-armv8",
490             ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
491                 ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_CRC |
492                 ARM::AEK_RAS | ARM::AEK_FP16 | ARM::AEK_BF16 | ARM::AEK_DOTPROD,
493             "8.4-A"),
494         ARMCPUTestParams<uint64_t>("cyclone", "armv8-a", "crypto-neon-fp-armv8",
495                                    ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
496                                        ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
497                                        ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
498                                    "8-A"),
499         ARMCPUTestParams<uint64_t>("exynos-m3", "armv8-a",
500                                    "crypto-neon-fp-armv8",
501                                    ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
502                                        ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
503                                        ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
504                                    "8-A"),
505         ARMCPUTestParams<uint64_t>(
506             "exynos-m4", "armv8.2-a", "crypto-neon-fp-armv8",
507             ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
508                 ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP |
509                 ARM::AEK_DOTPROD | ARM::AEK_FP16 | ARM::AEK_RAS,
510             "8.2-A"),
511         ARMCPUTestParams<uint64_t>(
512             "exynos-m5", "armv8.2-a", "crypto-neon-fp-armv8",
513             ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
514                 ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP |
515                 ARM::AEK_DOTPROD | ARM::AEK_FP16 | ARM::AEK_RAS,
516             "8.2-A"),
517         ARMCPUTestParams<uint64_t>("cortex-m23", "armv8-m.base", "none",
518                                    ARM::AEK_NONE | ARM::AEK_HWDIVTHUMB,
519                                    "8-M.Baseline"),
520         ARMCPUTestParams<uint64_t>("cortex-m33", "armv8-m.main", "fpv5-sp-d16",
521                                    ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
522                                    "8-M.Mainline"),
523         ARMCPUTestParams<uint64_t>("cortex-m35p", "armv8-m.main", "fpv5-sp-d16",
524                                    ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
525                                    "8-M.Mainline"),
526         ARMCPUTestParams<uint64_t>(
527             "cortex-m55", "armv8.1-m.main", "fp-armv8-fullfp16-d16",
528             ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_SIMD | ARM::AEK_FP |
529                 ARM::AEK_RAS | ARM::AEK_LOB | ARM::AEK_FP16,
530             "8.1-M.Mainline"),
531         ARMCPUTestParams<uint64_t>(
532             "cortex-m85", "armv8.1-m.main", "fp-armv8-fullfp16-d16",
533             ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_SIMD | ARM::AEK_FP |
534                 ARM::AEK_RAS | ARM::AEK_LOB | ARM::AEK_FP16 | ARM::AEK_PACBTI,
535             "8.1-M.Mainline"),
536         ARMCPUTestParams<uint64_t>(
537             "cortex-m52", "armv8.1-m.main", "fp-armv8-fullfp16-d16",
538             ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_SIMD | ARM::AEK_FP |
539                 ARM::AEK_RAS | ARM::AEK_LOB | ARM::AEK_FP16 | ARM::AEK_PACBTI,
540             "8.1-M.Mainline"),
541         ARMCPUTestParams<uint64_t>("iwmmxt", "iwmmxt", "none", ARM::AEK_NONE,
542                                    "iwmmxt"),
543         ARMCPUTestParams<uint64_t>("xscale", "xscale", "none", ARM::AEK_NONE,
544                                    "xscale"),
545         ARMCPUTestParams<uint64_t>("swift", "armv7s", "neon-vfpv4",
546                                    ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
547                                        ARM::AEK_DSP,
548                                    "7-S")),
549     ARMCPUTestParams<uint64_t>::PrintToStringParamName);
550 
551 static constexpr unsigned NumARMCPUArchs = 91;
552 
553 TEST(TargetParserTest, testARMCPUArchList) {
554   SmallVector<StringRef, NumARMCPUArchs> List;
555   ARM::fillValidCPUArchList(List);
556 
557   // No list exists for these in this test suite, so ensure all are
558   // valid, and match the expected 'magic' count.
559   EXPECT_EQ(List.size(), NumARMCPUArchs);
560   for (StringRef CPU : List) {
561     EXPECT_NE(ARM::parseCPUArch(CPU), ARM::ArchKind::INVALID);
562   }
563 }
564 
565 TEST(TargetParserTest, testInvalidARMArch) {
566   auto InvalidArchStrings = {"armv", "armv99", "noarm"};
567   for (const char *InvalidArch : InvalidArchStrings)
568     EXPECT_EQ(ARM::parseArch(InvalidArch), ARM::ArchKind::INVALID);
569 }
570 
571 bool testARMArch(StringRef Arch, StringRef DefaultCPU, StringRef SubArch,
572                  unsigned ArchAttr) {
573   ARM::ArchKind AK = ARM::parseArch(Arch);
574   bool Result = (AK != ARM::ArchKind::INVALID);
575   Result &= ARM::getDefaultCPU(Arch) == DefaultCPU;
576   Result &= ARM::getSubArch(AK) == SubArch;
577   Result &= (ARM::getArchAttr(AK) == ArchAttr);
578   return Result;
579 }
580 
581 TEST(TargetParserTest, testARMArch) {
582   EXPECT_TRUE(
583       testARMArch("armv4", "strongarm", "v4", ARMBuildAttrs::CPUArch::v4));
584   EXPECT_TRUE(
585       testARMArch("armv4t", "arm7tdmi", "v4t", ARMBuildAttrs::CPUArch::v4T));
586   EXPECT_TRUE(
587       testARMArch("armv5t", "arm10tdmi", "v5", ARMBuildAttrs::CPUArch::v5T));
588   EXPECT_TRUE(
589       testARMArch("armv5te", "arm1022e", "v5e", ARMBuildAttrs::CPUArch::v5TE));
590   EXPECT_TRUE(testARMArch("armv5tej", "arm926ej-s", "v5e",
591                           ARMBuildAttrs::CPUArch::v5TEJ));
592   EXPECT_TRUE(
593       testARMArch("armv6", "arm1136jf-s", "v6", ARMBuildAttrs::CPUArch::v6));
594   EXPECT_TRUE(
595       testARMArch("armv6k", "mpcore", "v6k", ARMBuildAttrs::CPUArch::v6K));
596   EXPECT_TRUE(testARMArch("armv6t2", "arm1156t2-s", "v6t2",
597                           ARMBuildAttrs::CPUArch::v6T2));
598   EXPECT_TRUE(testARMArch("armv6kz", "arm1176jzf-s", "v6kz",
599                           ARMBuildAttrs::CPUArch::v6KZ));
600   EXPECT_TRUE(
601       testARMArch("armv6-m", "cortex-m0", "v6m", ARMBuildAttrs::CPUArch::v6_M));
602   EXPECT_TRUE(
603       testARMArch("armv7-a", "generic", "v7", ARMBuildAttrs::CPUArch::v7));
604   EXPECT_TRUE(
605       testARMArch("armv7ve", "generic", "v7ve", ARMBuildAttrs::CPUArch::v7));
606   EXPECT_TRUE(
607       testARMArch("armv7-r", "cortex-r4", "v7r", ARMBuildAttrs::CPUArch::v7));
608   EXPECT_TRUE(
609       testARMArch("armv7-m", "cortex-m3", "v7m", ARMBuildAttrs::CPUArch::v7));
610   EXPECT_TRUE(testARMArch("armv7e-m", "cortex-m4", "v7em",
611                           ARMBuildAttrs::CPUArch::v7E_M));
612   EXPECT_TRUE(
613       testARMArch("armv8-a", "generic", "v8a", ARMBuildAttrs::CPUArch::v8_A));
614   EXPECT_TRUE(testARMArch("armv8.1-a", "generic", "v8.1a",
615                           ARMBuildAttrs::CPUArch::v8_A));
616   EXPECT_TRUE(testARMArch("armv8.2-a", "generic", "v8.2a",
617                           ARMBuildAttrs::CPUArch::v8_A));
618   EXPECT_TRUE(testARMArch("armv8.3-a", "generic", "v8.3a",
619                           ARMBuildAttrs::CPUArch::v8_A));
620   EXPECT_TRUE(testARMArch("armv8.4-a", "generic", "v8.4a",
621                           ARMBuildAttrs::CPUArch::v8_A));
622   EXPECT_TRUE(testARMArch("armv8.5-a", "generic", "v8.5a",
623                           ARMBuildAttrs::CPUArch::v8_A));
624   EXPECT_TRUE(testARMArch("armv8.6-a", "generic", "v8.6a",
625                           ARMBuildAttrs::CPUArch::v8_A));
626   EXPECT_TRUE(testARMArch("armv8.7-a", "generic", "v8.7a",
627                           ARMBuildAttrs::CPUArch::v8_A));
628   EXPECT_TRUE(testARMArch("armv8.8-a", "generic", "v8.8a",
629                           ARMBuildAttrs::CPUArch::v8_A));
630   EXPECT_TRUE(testARMArch("armv8.9-a", "generic", "v8.9a",
631                           ARMBuildAttrs::CPUArch::v8_A));
632   EXPECT_TRUE(
633       testARMArch("armv9-a", "generic", "v9a", ARMBuildAttrs::CPUArch::v9_A));
634   EXPECT_TRUE(testARMArch("armv9.1-a", "generic", "v9.1a",
635                           ARMBuildAttrs::CPUArch::v9_A));
636   EXPECT_TRUE(testARMArch("armv9.2-a", "generic", "v9.2a",
637                           ARMBuildAttrs::CPUArch::v9_A));
638   EXPECT_TRUE(testARMArch("armv9.3-a", "generic", "v9.3a",
639                           ARMBuildAttrs::CPUArch::v9_A));
640   EXPECT_TRUE(testARMArch("armv9.4-a", "generic", "v9.4a",
641                           ARMBuildAttrs::CPUArch::v9_A));
642   EXPECT_TRUE(testARMArch("armv9.5-a", "generic", "v9.5a",
643                           ARMBuildAttrs::CPUArch::v9_A));
644   EXPECT_TRUE(
645       testARMArch("armv8-r", "generic", "v8r", ARMBuildAttrs::CPUArch::v8_R));
646   EXPECT_TRUE(testARMArch("armv8-m.base", "generic", "v8m.base",
647                           ARMBuildAttrs::CPUArch::v8_M_Base));
648   EXPECT_TRUE(testARMArch("armv8-m.main", "generic", "v8m.main",
649                           ARMBuildAttrs::CPUArch::v8_M_Main));
650   EXPECT_TRUE(testARMArch("armv8.1-m.main", "generic", "v8.1m.main",
651                           ARMBuildAttrs::CPUArch::v8_1_M_Main));
652   EXPECT_TRUE(
653       testARMArch("iwmmxt", "iwmmxt", "", ARMBuildAttrs::CPUArch::v5TE));
654   EXPECT_TRUE(
655       testARMArch("iwmmxt2", "generic", "", ARMBuildAttrs::CPUArch::v5TE));
656   EXPECT_TRUE(
657       testARMArch("xscale", "xscale", "v5e", ARMBuildAttrs::CPUArch::v5TE));
658   EXPECT_TRUE(
659       testARMArch("armv7s", "swift", "v7s", ARMBuildAttrs::CPUArch::v7));
660   EXPECT_TRUE(
661       testARMArch("armv7k", "generic", "v7k", ARMBuildAttrs::CPUArch::v7));
662 }
663 
664 bool testARMExtension(StringRef CPUName, ARM::ArchKind ArchKind,
665                       StringRef ArchExt) {
666   return ARM::getDefaultExtensions(CPUName, ArchKind) &
667          ARM::parseArchExt(ArchExt);
668 }
669 
670 TEST(TargetParserTest, testARMExtension) {
671   EXPECT_FALSE(testARMExtension("strongarm", ARM::ArchKind::INVALID, "dsp"));
672   EXPECT_FALSE(testARMExtension("arm7tdmi", ARM::ArchKind::INVALID, "dsp"));
673   EXPECT_FALSE(testARMExtension("arm10tdmi", ARM::ArchKind::INVALID, "simd"));
674   EXPECT_FALSE(testARMExtension("arm1022e", ARM::ArchKind::INVALID, "simd"));
675   EXPECT_FALSE(testARMExtension("arm926ej-s", ARM::ArchKind::INVALID, "simd"));
676   EXPECT_FALSE(
677       testARMExtension("arm1136jf-s", ARM::ArchKind::INVALID, "crypto"));
678   EXPECT_FALSE(
679       testARMExtension("arm1156t2-s", ARM::ArchKind::INVALID, "crypto"));
680   EXPECT_FALSE(
681       testARMExtension("arm1176jzf-s", ARM::ArchKind::INVALID, "crypto"));
682   EXPECT_FALSE(testARMExtension("cortex-m0", ARM::ArchKind::INVALID, "crypto"));
683   EXPECT_FALSE(testARMExtension("cortex-a8", ARM::ArchKind::INVALID, "crypto"));
684   EXPECT_FALSE(testARMExtension("cortex-r4", ARM::ArchKind::INVALID, "crypto"));
685   EXPECT_FALSE(testARMExtension("cortex-m3", ARM::ArchKind::INVALID, "crypto"));
686   EXPECT_FALSE(testARMExtension("cortex-a53", ARM::ArchKind::INVALID, "ras"));
687   EXPECT_FALSE(testARMExtension("cortex-a53", ARM::ArchKind::INVALID, "fp16"));
688   EXPECT_TRUE(testARMExtension("cortex-a55", ARM::ArchKind::INVALID, "fp16"));
689   EXPECT_FALSE(
690       testARMExtension("cortex-a55", ARM::ArchKind::INVALID, "fp16fml"));
691   EXPECT_TRUE(testARMExtension("cortex-a75", ARM::ArchKind::INVALID, "fp16"));
692   EXPECT_FALSE(
693       testARMExtension("cortex-a75", ARM::ArchKind::INVALID, "fp16fml"));
694   EXPECT_FALSE(testARMExtension("cortex-r52", ARM::ArchKind::INVALID, "ras"));
695   EXPECT_FALSE(testARMExtension("iwmmxt", ARM::ArchKind::INVALID, "crc"));
696   EXPECT_FALSE(testARMExtension("xscale", ARM::ArchKind::INVALID, "crc"));
697   EXPECT_FALSE(testARMExtension("swift", ARM::ArchKind::INVALID, "crc"));
698 
699   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV4, "dsp"));
700   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV4T, "dsp"));
701   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV5T, "simd"));
702   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV5TE, "simd"));
703   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV5TEJ, "simd"));
704   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV6, "crypto"));
705   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV6K, "crypto"));
706   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV6T2, "crypto"));
707   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV6KZ, "crypto"));
708   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV6M, "crypto"));
709   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV7A, "crypto"));
710   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV7R, "crypto"));
711   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV7M, "crypto"));
712   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV7EM, "crypto"));
713   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8A, "ras"));
714   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_1A, "ras"));
715   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_2A, "profile"));
716   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_2A, "fp16"));
717   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_2A, "fp16fml"));
718   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_3A, "fp16"));
719   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_3A, "fp16fml"));
720   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_4A, "fp16"));
721   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_4A, "fp16fml"));
722   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8R, "ras"));
723   EXPECT_FALSE(
724       testARMExtension("generic", ARM::ArchKind::ARMV8MBaseline, "crc"));
725   EXPECT_FALSE(
726       testARMExtension("generic", ARM::ArchKind::ARMV8MMainline, "crc"));
727   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::IWMMXT, "crc"));
728   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::IWMMXT2, "crc"));
729   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::XSCALE, "crc"));
730   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV7S, "crypto"));
731   EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV7K, "crypto"));
732 }
733 
734 TEST(TargetParserTest, ARMFPUVersion) {
735   for (ARM::FPUKind FK = static_cast<ARM::FPUKind>(0);
736        FK <= ARM::FPUKind::FK_LAST;
737        FK = static_cast<ARM::FPUKind>(static_cast<unsigned>(FK) + 1))
738     if (FK == ARM::FK_LAST || ARM::getFPUName(FK) == "invalid" ||
739         ARM::getFPUName(FK) == "none" || ARM::getFPUName(FK) == "softvfp")
740       EXPECT_EQ(ARM::FPUVersion::NONE, ARM::getFPUVersion(FK));
741     else
742       EXPECT_NE(ARM::FPUVersion::NONE, ARM::getFPUVersion(FK));
743 }
744 
745 TEST(TargetParserTest, ARMFPUNeonSupportLevel) {
746   for (ARM::FPUKind FK = static_cast<ARM::FPUKind>(0);
747        FK <= ARM::FPUKind::FK_LAST;
748        FK = static_cast<ARM::FPUKind>(static_cast<unsigned>(FK) + 1))
749     if (FK == ARM::FK_LAST ||
750         ARM::getFPUName(FK).find("neon") == std::string::npos)
751       EXPECT_EQ(ARM::NeonSupportLevel::None, ARM::getFPUNeonSupportLevel(FK));
752     else
753       EXPECT_NE(ARM::NeonSupportLevel::None, ARM::getFPUNeonSupportLevel(FK));
754 }
755 
756 TEST(TargetParserTest, ARMFPURestriction) {
757   for (ARM::FPUKind FK = static_cast<ARM::FPUKind>(0);
758        FK <= ARM::FPUKind::FK_LAST;
759        FK = static_cast<ARM::FPUKind>(static_cast<unsigned>(FK) + 1)) {
760     if (FK == ARM::FK_LAST ||
761         (ARM::getFPUName(FK).find("d16") == std::string::npos &&
762          ARM::getFPUName(FK).find("vfpv3xd") == std::string::npos))
763       EXPECT_EQ(ARM::FPURestriction::None, ARM::getFPURestriction(FK));
764     else
765       EXPECT_NE(ARM::FPURestriction::None, ARM::getFPURestriction(FK));
766   }
767 }
768 
769 TEST(TargetParserTest, ARMExtensionFeatures) {
770   std::map<uint64_t, std::vector<StringRef>> Extensions;
771 
772   for (auto &Ext : ARM::ARCHExtNames) {
773     if (!Ext.Feature.empty() && !Ext.NegFeature.empty())
774       Extensions[Ext.ID] = {Ext.Feature, Ext.NegFeature};
775   }
776 
777   Extensions[ARM::AEK_HWDIVARM] = {"+hwdiv-arm", "-hwdiv-arm"};
778   Extensions[ARM::AEK_HWDIVTHUMB] = {"+hwdiv", "-hwdiv"};
779 
780   std::vector<StringRef> Features;
781 
782   EXPECT_FALSE(ARM::getExtensionFeatures(ARM::AEK_INVALID, Features));
783 
784   for (auto &E : Extensions) {
785     // test +extension
786     Features.clear();
787     ARM::getExtensionFeatures(E.first, Features);
788     EXPECT_TRUE(llvm::is_contained(Features, E.second.at(0)));
789     EXPECT_EQ(Extensions.size(), Features.size());
790 
791     // test -extension
792     Features.clear();
793     ARM::getExtensionFeatures(~E.first, Features);
794     EXPECT_TRUE(llvm::is_contained(Features, E.second.at(1)));
795     EXPECT_EQ(Extensions.size(), Features.size());
796   }
797 }
798 
799 TEST(TargetParserTest, ARMFPUFeatures) {
800   std::vector<StringRef> Features;
801   for (ARM::FPUKind FK = static_cast<ARM::FPUKind>(0);
802        FK <= ARM::FPUKind::FK_LAST;
803        FK = static_cast<ARM::FPUKind>(static_cast<unsigned>(FK) + 1)) {
804     if (FK == ARM::FK_INVALID || FK >= ARM::FK_LAST)
805       EXPECT_FALSE(ARM::getFPUFeatures(FK, Features));
806     else
807       EXPECT_TRUE(ARM::getFPUFeatures(FK, Features));
808   }
809 }
810 
811 TEST(TargetParserTest, ARMArchExtFeature) {
812   const char *ArchExt[][4] = {{"crc", "nocrc", "+crc", "-crc"},
813                               {"crypto", "nocrypto", "+crypto", "-crypto"},
814                               {"dsp", "nodsp", "+dsp", "-dsp"},
815                               {"fp", "nofp", nullptr, nullptr},
816                               {"idiv", "noidiv", nullptr, nullptr},
817                               {"mp", "nomp", nullptr, nullptr},
818                               {"simd", "nosimd", nullptr, nullptr},
819                               {"sec", "nosec", nullptr, nullptr},
820                               {"virt", "novirt", nullptr, nullptr},
821                               {"fp16", "nofp16", "+fullfp16", "-fullfp16"},
822                               {"fp16fml", "nofp16fml", "+fp16fml", "-fp16fml"},
823                               {"ras", "noras", "+ras", "-ras"},
824                               {"dotprod", "nodotprod", "+dotprod", "-dotprod"},
825                               {"os", "noos", nullptr, nullptr},
826                               {"iwmmxt", "noiwmmxt", nullptr, nullptr},
827                               {"iwmmxt2", "noiwmmxt2", nullptr, nullptr},
828                               {"maverick", "maverick", nullptr, nullptr},
829                               {"xscale", "noxscale", nullptr, nullptr},
830                               {"sb", "nosb", "+sb", "-sb"},
831                               {"i8mm", "noi8mm", "+i8mm", "-i8mm"},
832                               {"mve", "nomve", "+mve", "-mve"},
833                               {"mve.fp", "nomve.fp", "+mve.fp", "-mve.fp"}};
834 
835   for (unsigned i = 0; i < std::size(ArchExt); i++) {
836     EXPECT_EQ(StringRef(ArchExt[i][2]), ARM::getArchExtFeature(ArchExt[i][0]));
837     EXPECT_EQ(StringRef(ArchExt[i][3]), ARM::getArchExtFeature(ArchExt[i][1]));
838   }
839 }
840 
841 static bool
842 testArchExtDependency(const char *ArchExt,
843                       const std::initializer_list<const char *> &Expected) {
844   std::vector<StringRef> Features;
845   ARM::FPUKind FPUKind;
846 
847   if (!ARM::appendArchExtFeatures("", ARM::ArchKind::ARMV8_1MMainline, ArchExt,
848                                   Features, FPUKind))
849     return false;
850 
851   return llvm::all_of(Expected, [&](StringRef Ext) {
852     return llvm::is_contained(Features, Ext);
853   });
854 }
855 
856 TEST(TargetParserTest, ARMArchExtDependencies) {
857   EXPECT_TRUE(testArchExtDependency("mve", {"+mve", "+dsp"}));
858   EXPECT_TRUE(testArchExtDependency("mve.fp", {"+mve.fp", "+mve", "+dsp"}));
859   EXPECT_TRUE(testArchExtDependency("nodsp", {"-dsp", "-mve", "-mve.fp"}));
860   EXPECT_TRUE(testArchExtDependency("nomve", {"-mve", "-mve.fp"}));
861 }
862 
863 TEST(TargetParserTest, ARMparseHWDiv) {
864   const char *hwdiv[] = {"thumb", "arm", "arm,thumb", "thumb,arm"};
865 
866   for (unsigned i = 0; i < std::size(hwdiv); i++)
867     EXPECT_NE(ARM::AEK_INVALID, ARM::parseHWDiv((StringRef)hwdiv[i]));
868 }
869 
870 TEST(TargetParserTest, ARMparseArchEndianAndISA) {
871   const char *Arch[] = {
872       "v2",        "v2a",    "v3",    "v3m",    "v4",       "v4t",
873       "v5",        "v5t",    "v5e",   "v5te",   "v5tej",    "v6",
874       "v6j",       "v6k",    "v6hl",  "v6t2",   "v6kz",     "v6z",
875       "v6zk",      "v6-m",   "v6m",   "v6sm",   "v6s-m",    "v7-a",
876       "v7",        "v7a",    "v7ve",  "v7hl",   "v7l",      "v7-r",
877       "v7r",       "v7-m",   "v7m",   "v7k",    "v7s",      "v7e-m",
878       "v7em",      "v8-a",   "v8",    "v8a",    "v8l",      "v8.1-a",
879       "v8.1a",     "v8.2-a", "v8.2a", "v8.3-a", "v8.3a",    "v8.4-a",
880       "v8.4a",     "v8.5-a", "v8.5a", "v8.6-a", "v8.6a",    "v8.7-a",
881       "v8.7a",     "v8.8-a", "v8.8a", "v8-r",   "v8m.base", "v8m.main",
882       "v8.1m.main"};
883 
884   for (unsigned i = 0; i < std::size(Arch); i++) {
885     std::string arm_1 = "armeb" + (std::string)(Arch[i]);
886     std::string arm_2 = "arm" + (std::string)(Arch[i]) + "eb";
887     std::string arm_3 = "arm" + (std::string)(Arch[i]);
888     std::string thumb_1 = "thumbeb" + (std::string)(Arch[i]);
889     std::string thumb_2 = "thumb" + (std::string)(Arch[i]) + "eb";
890     std::string thumb_3 = "thumb" + (std::string)(Arch[i]);
891 
892     EXPECT_EQ(ARM::EndianKind::BIG, ARM::parseArchEndian(arm_1));
893     EXPECT_EQ(ARM::EndianKind::BIG, ARM::parseArchEndian(arm_2));
894     EXPECT_EQ(ARM::EndianKind::LITTLE, ARM::parseArchEndian(arm_3));
895 
896     EXPECT_EQ(ARM::ISAKind::ARM, ARM::parseArchISA(arm_1));
897     EXPECT_EQ(ARM::ISAKind::ARM, ARM::parseArchISA(arm_2));
898     EXPECT_EQ(ARM::ISAKind::ARM, ARM::parseArchISA(arm_3));
899     if (i >= 4) {
900       EXPECT_EQ(ARM::EndianKind::BIG, ARM::parseArchEndian(thumb_1));
901       EXPECT_EQ(ARM::EndianKind::BIG, ARM::parseArchEndian(thumb_2));
902       EXPECT_EQ(ARM::EndianKind::LITTLE, ARM::parseArchEndian(thumb_3));
903 
904       EXPECT_EQ(ARM::ISAKind::THUMB, ARM::parseArchISA(thumb_1));
905       EXPECT_EQ(ARM::ISAKind::THUMB, ARM::parseArchISA(thumb_2));
906       EXPECT_EQ(ARM::ISAKind::THUMB, ARM::parseArchISA(thumb_3));
907     }
908   }
909 
910   EXPECT_EQ(ARM::EndianKind::LITTLE, ARM::parseArchEndian("aarch64"));
911   EXPECT_EQ(ARM::EndianKind::LITTLE, ARM::parseArchEndian("arm64_32"));
912   EXPECT_EQ(ARM::EndianKind::BIG, ARM::parseArchEndian("aarch64_be"));
913 
914   EXPECT_EQ(ARM::ISAKind::AARCH64, ARM::parseArchISA("aarch64"));
915   EXPECT_EQ(ARM::ISAKind::AARCH64, ARM::parseArchISA("aarch64_be"));
916   EXPECT_EQ(ARM::ISAKind::AARCH64, ARM::parseArchISA("arm64"));
917   EXPECT_EQ(ARM::ISAKind::AARCH64, ARM::parseArchISA("arm64_be"));
918   EXPECT_EQ(ARM::ISAKind::AARCH64, ARM::parseArchISA("arm64_32"));
919   EXPECT_EQ(ARM::ISAKind::AARCH64, ARM::parseArchISA("aarch64_32"));
920 }
921 
922 TEST(TargetParserTest, ARMparseArchProfile) {
923   for (unsigned i = 0; i < std::size(ARMArch); i++) {
924     switch (ARM::parseArch(ARMArch[i])) {
925     case ARM::ArchKind::ARMV6M:
926     case ARM::ArchKind::ARMV7M:
927     case ARM::ArchKind::ARMV7EM:
928     case ARM::ArchKind::ARMV8MMainline:
929     case ARM::ArchKind::ARMV8MBaseline:
930     case ARM::ArchKind::ARMV8_1MMainline:
931       EXPECT_EQ(ARM::ProfileKind::M, ARM::parseArchProfile(ARMArch[i]));
932       break;
933     case ARM::ArchKind::ARMV7R:
934     case ARM::ArchKind::ARMV8R:
935       EXPECT_EQ(ARM::ProfileKind::R, ARM::parseArchProfile(ARMArch[i]));
936       break;
937     case ARM::ArchKind::ARMV7A:
938     case ARM::ArchKind::ARMV7VE:
939     case ARM::ArchKind::ARMV7K:
940     case ARM::ArchKind::ARMV8A:
941     case ARM::ArchKind::ARMV8_1A:
942     case ARM::ArchKind::ARMV8_2A:
943     case ARM::ArchKind::ARMV8_3A:
944     case ARM::ArchKind::ARMV8_4A:
945     case ARM::ArchKind::ARMV8_5A:
946     case ARM::ArchKind::ARMV8_6A:
947     case ARM::ArchKind::ARMV8_7A:
948     case ARM::ArchKind::ARMV8_8A:
949     case ARM::ArchKind::ARMV8_9A:
950     case ARM::ArchKind::ARMV9A:
951     case ARM::ArchKind::ARMV9_1A:
952     case ARM::ArchKind::ARMV9_2A:
953     case ARM::ArchKind::ARMV9_3A:
954     case ARM::ArchKind::ARMV9_4A:
955     case ARM::ArchKind::ARMV9_5A:
956       EXPECT_EQ(ARM::ProfileKind::A, ARM::parseArchProfile(ARMArch[i]));
957       break;
958     default:
959       EXPECT_EQ(ARM::ProfileKind::INVALID, ARM::parseArchProfile(ARMArch[i]));
960       break;
961     }
962   }
963 }
964 
965 TEST(TargetParserTest, ARMparseArchVersion) {
966   for (unsigned i = 0; i < std::size(ARMArch); i++)
967     if (((std::string)ARMArch[i]).substr(0, 4) == "armv")
968       EXPECT_EQ((ARMArch[i][4] - 48u), ARM::parseArchVersion(ARMArch[i]));
969     else
970       EXPECT_EQ(5u, ARM::parseArchVersion(ARMArch[i]));
971 }
972 
973 TEST(TargetParserTest, getARMCPUForArch) {
974   // Platform specific defaults.
975   {
976     llvm::Triple Triple("arm--nacl");
977     EXPECT_EQ("cortex-a8", ARM::getARMCPUForArch(Triple));
978   }
979   {
980     llvm::Triple Triple("arm--openbsd");
981     EXPECT_EQ("cortex-a8", ARM::getARMCPUForArch(Triple));
982   }
983   {
984     llvm::Triple Triple("armv6-unknown-freebsd");
985     EXPECT_EQ("arm1176jzf-s", ARM::getARMCPUForArch(Triple));
986   }
987   {
988     llvm::Triple Triple("thumbv6-unknown-freebsd");
989     EXPECT_EQ("arm1176jzf-s", ARM::getARMCPUForArch(Triple));
990   }
991   {
992     llvm::Triple Triple("armebv6-unknown-freebsd");
993     EXPECT_EQ("arm1176jzf-s", ARM::getARMCPUForArch(Triple));
994   }
995   {
996     llvm::Triple Triple("arm--win32");
997     EXPECT_EQ("cortex-a9", ARM::getARMCPUForArch(Triple));
998     EXPECT_EQ("generic", ARM::getARMCPUForArch(Triple, "armv8-a"));
999   }
1000   // Some alternative architectures
1001   {
1002     llvm::Triple Triple("armv7k-apple-ios9");
1003     EXPECT_EQ("cortex-a7", ARM::getARMCPUForArch(Triple));
1004   }
1005   {
1006     llvm::Triple Triple("armv7k-apple-watchos3");
1007     EXPECT_EQ("cortex-a7", ARM::getARMCPUForArch(Triple));
1008   }
1009   {
1010     llvm::Triple Triple("armv7k-apple-tvos9");
1011     EXPECT_EQ("cortex-a7", ARM::getARMCPUForArch(Triple));
1012   }
1013   // armeb is permitted, but armebeb is not
1014   {
1015     llvm::Triple Triple("armeb-none-eabi");
1016     EXPECT_EQ("arm7tdmi", ARM::getARMCPUForArch(Triple));
1017   }
1018   {
1019     llvm::Triple Triple("armebeb-none-eabi");
1020     EXPECT_EQ("", ARM::getARMCPUForArch(Triple));
1021   }
1022   {
1023     llvm::Triple Triple("armebv6eb-none-eabi");
1024     EXPECT_EQ("", ARM::getARMCPUForArch(Triple));
1025   }
1026   // xscaleeb is permitted, but armebxscale is not
1027   {
1028     llvm::Triple Triple("xscaleeb-none-eabi");
1029     EXPECT_EQ("xscale", ARM::getARMCPUForArch(Triple));
1030   }
1031   {
1032     llvm::Triple Triple("armebxscale-none-eabi");
1033     EXPECT_EQ("", ARM::getARMCPUForArch(Triple));
1034   }
1035 }
1036 
1037 TEST(TargetParserTest, ARMPrintSupportedExtensions) {
1038   std::string expected =
1039       "All available -march extensions for ARM\n\n"
1040       "    Name                Description\n"
1041       "    crc                 This is a long dummy description\n"
1042       "    crypto\n"
1043       "    sha2\n";
1044 
1045   StringMap<StringRef> DummyMap;
1046   DummyMap["crc"] = "This is a long dummy description";
1047 
1048   outs().flush();
1049   testing::internal::CaptureStdout();
1050   ARM::PrintSupportedExtensions(DummyMap);
1051   outs().flush();
1052   std::string captured = testing::internal::GetCapturedStdout();
1053 
1054   // Check that the start of the output is as expected.
1055   EXPECT_EQ(0ULL, captured.find(expected));
1056 
1057   // Should not include "none" or "invalid".
1058   EXPECT_EQ(std::string::npos, captured.find("none"));
1059   EXPECT_EQ(std::string::npos, captured.find("invalid"));
1060   // Should not include anything that lacks a feature name. Checking a few here
1061   // but not all as if one is hidden correctly the rest should be.
1062   EXPECT_EQ(std::string::npos, captured.find("simd"));
1063   EXPECT_EQ(std::string::npos, captured.find("maverick"));
1064   EXPECT_EQ(std::string::npos, captured.find("xscale"));
1065 }
1066 
1067 class AArch64CPUTestFixture : public ::testing::TestWithParam<
1068                                   ARMCPUTestParams<AArch64::ExtensionBitset>> {
1069 };
1070 
1071 TEST_P(AArch64CPUTestFixture, testAArch64CPU) {
1072   auto params = GetParam();
1073 
1074   const std::optional<AArch64::CpuInfo> Cpu = AArch64::parseCpu(params.CPUName);
1075   EXPECT_TRUE(Cpu);
1076   EXPECT_EQ(params.ExpectedArch, Cpu->Arch.Name);
1077 
1078   EXPECT_PRED_FORMAT2(
1079       AssertSameExtensionFlags<ARM::ISAKind::AARCH64>(params.CPUName),
1080       params.ExpectedFlags, Cpu->getImpliedExtensions());
1081 }
1082 
1083 INSTANTIATE_TEST_SUITE_P(
1084     AArch64CPUTests, AArch64CPUTestFixture,
1085     ::testing::Values(
1086         ARMCPUTestParams<AArch64::ExtensionBitset>(
1087             "cortex-a34", "armv8-a", "crypto-neon-fp-armv8",
1088             AArch64::ExtensionBitset({AArch64::AEK_CRC, AArch64::AEK_AES,
1089                                       AArch64::AEK_SHA2, AArch64::AEK_FP,
1090                                       AArch64::AEK_SIMD}),
1091             "8-A"),
1092         ARMCPUTestParams<AArch64::ExtensionBitset>(
1093             "cortex-a35", "armv8-a", "crypto-neon-fp-armv8",
1094             AArch64::ExtensionBitset({AArch64::AEK_CRC, AArch64::AEK_AES,
1095                                       AArch64::AEK_SHA2, AArch64::AEK_FP,
1096                                       AArch64::AEK_SIMD}),
1097             "8-A"),
1098         ARMCPUTestParams<AArch64::ExtensionBitset>(
1099             "cortex-a53", "armv8-a", "crypto-neon-fp-armv8",
1100             AArch64::ExtensionBitset({AArch64::AEK_CRC, AArch64::AEK_AES,
1101                                       AArch64::AEK_SHA2, AArch64::AEK_FP,
1102                                       AArch64::AEK_SIMD}),
1103             "8-A"),
1104         ARMCPUTestParams<AArch64::ExtensionBitset>(
1105             "cortex-a55", "armv8.2-a", "crypto-neon-fp-armv8",
1106             AArch64::ExtensionBitset(
1107                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1108                  AArch64::AEK_FP, AArch64::AEK_SIMD, AArch64::AEK_RAS,
1109                  AArch64::AEK_LSE, AArch64::AEK_RDM, AArch64::AEK_FP16,
1110                  AArch64::AEK_DOTPROD, AArch64::AEK_RCPC}),
1111             "8.2-A"),
1112         ARMCPUTestParams<AArch64::ExtensionBitset>(
1113             "cortex-a510", "armv9-a", "neon-fp-armv8",
1114             AArch64::ExtensionBitset(
1115                 {AArch64::AEK_CRC,         AArch64::AEK_FP,
1116                  AArch64::AEK_SIMD,        AArch64::AEK_RAS,
1117                  AArch64::AEK_LSE,         AArch64::AEK_RDM,
1118                  AArch64::AEK_RCPC,        AArch64::AEK_DOTPROD,
1119                  AArch64::AEK_BF16,        AArch64::AEK_I8MM,
1120                  AArch64::AEK_SVE,         AArch64::AEK_SVE2,
1121                  AArch64::AEK_SVE2BITPERM, AArch64::AEK_PAUTH,
1122                  AArch64::AEK_MTE,         AArch64::AEK_SSBS,
1123                  AArch64::AEK_FP16,        AArch64::AEK_FP16FML,
1124                  AArch64::AEK_SB,          AArch64::AEK_JSCVT,
1125                  AArch64::AEK_FCMA}),
1126             "9-A"),
1127         ARMCPUTestParams<AArch64::ExtensionBitset>(
1128             "cortex-a520", "armv9.2-a", "crypto-neon-fp-armv8",
1129             AArch64::ExtensionBitset(
1130                 {AArch64::AEK_BF16,        AArch64::AEK_I8MM,
1131                  AArch64::AEK_SVE,         AArch64::AEK_SVE2,
1132                  AArch64::AEK_FP16,        AArch64::AEK_DOTPROD,
1133                  AArch64::AEK_LSE,         AArch64::AEK_RDM,
1134                  AArch64::AEK_SIMD,        AArch64::AEK_RCPC,
1135                  AArch64::AEK_RAS,         AArch64::AEK_CRC,
1136                  AArch64::AEK_FP,          AArch64::AEK_SB,
1137                  AArch64::AEK_SSBS,        AArch64::AEK_MTE,
1138                  AArch64::AEK_FP16FML,     AArch64::AEK_PAUTH,
1139                  AArch64::AEK_SVE2BITPERM, AArch64::AEK_FLAGM,
1140                  AArch64::AEK_PERFMON,     AArch64::AEK_PREDRES,
1141                  AArch64::AEK_JSCVT,       AArch64::AEK_FCMA}),
1142             "9.2-A"),
1143         ARMCPUTestParams<AArch64::ExtensionBitset>(
1144             "cortex-a520ae", "armv9.2-a", "crypto-neon-fp-armv8",
1145             AArch64::ExtensionBitset(
1146                 {AArch64::AEK_BF16,        AArch64::AEK_I8MM,
1147                  AArch64::AEK_SVE,         AArch64::AEK_SVE2,
1148                  AArch64::AEK_FP16,        AArch64::AEK_DOTPROD,
1149                  AArch64::AEK_LSE,         AArch64::AEK_RDM,
1150                  AArch64::AEK_SIMD,        AArch64::AEK_RCPC,
1151                  AArch64::AEK_RAS,         AArch64::AEK_CRC,
1152                  AArch64::AEK_FP,          AArch64::AEK_SB,
1153                  AArch64::AEK_SSBS,        AArch64::AEK_MTE,
1154                  AArch64::AEK_FP16FML,     AArch64::AEK_PAUTH,
1155                  AArch64::AEK_SVE2BITPERM, AArch64::AEK_FLAGM,
1156                  AArch64::AEK_PERFMON,     AArch64::AEK_PREDRES,
1157                  AArch64::AEK_JSCVT,       AArch64::AEK_FCMA}),
1158             "9.2-A"),
1159         ARMCPUTestParams<AArch64::ExtensionBitset>(
1160             "cortex-a57", "armv8-a", "crypto-neon-fp-armv8",
1161             AArch64::ExtensionBitset({AArch64::AEK_CRC, AArch64::AEK_AES,
1162                                       AArch64::AEK_SHA2, AArch64::AEK_FP,
1163                                       AArch64::AEK_SIMD}),
1164             "8-A"),
1165         ARMCPUTestParams<AArch64::ExtensionBitset>(
1166             "cortex-a65", "armv8.2-a", "crypto-neon-fp-armv8",
1167             AArch64::ExtensionBitset(
1168                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1169                  AArch64::AEK_DOTPROD, AArch64::AEK_FP, AArch64::AEK_FP16,
1170                  AArch64::AEK_LSE, AArch64::AEK_RAS, AArch64::AEK_RCPC,
1171                  AArch64::AEK_RDM, AArch64::AEK_SIMD, AArch64::AEK_SSBS}),
1172             "8.2-A"),
1173         ARMCPUTestParams<AArch64::ExtensionBitset>(
1174             "cortex-a65ae", "armv8.2-a", "crypto-neon-fp-armv8",
1175             AArch64::ExtensionBitset(
1176                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1177                  AArch64::AEK_DOTPROD, AArch64::AEK_FP, AArch64::AEK_FP16,
1178                  AArch64::AEK_LSE, AArch64::AEK_RAS, AArch64::AEK_RCPC,
1179                  AArch64::AEK_RDM, AArch64::AEK_SIMD, AArch64::AEK_SSBS}),
1180             "8.2-A"),
1181         ARMCPUTestParams<AArch64::ExtensionBitset>(
1182             "cortex-a72", "armv8-a", "crypto-neon-fp-armv8",
1183             AArch64::ExtensionBitset({AArch64::AEK_CRC, AArch64::AEK_AES,
1184                                       AArch64::AEK_SHA2, AArch64::AEK_FP,
1185                                       AArch64::AEK_SIMD}),
1186             "8-A"),
1187         ARMCPUTestParams<AArch64::ExtensionBitset>(
1188             "cortex-a73", "armv8-a", "crypto-neon-fp-armv8",
1189             AArch64::ExtensionBitset({AArch64::AEK_CRC, AArch64::AEK_AES,
1190                                       AArch64::AEK_SHA2, AArch64::AEK_FP,
1191                                       AArch64::AEK_SIMD}),
1192             "8-A"),
1193         ARMCPUTestParams<AArch64::ExtensionBitset>(
1194             "cortex-a75", "armv8.2-a", "crypto-neon-fp-armv8",
1195             AArch64::ExtensionBitset(
1196                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1197                  AArch64::AEK_FP, AArch64::AEK_SIMD, AArch64::AEK_RAS,
1198                  AArch64::AEK_LSE, AArch64::AEK_RDM, AArch64::AEK_FP16,
1199                  AArch64::AEK_DOTPROD, AArch64::AEK_RCPC}),
1200             "8.2-A"),
1201         ARMCPUTestParams<AArch64::ExtensionBitset>(
1202             "cortex-a76", "armv8.2-a", "crypto-neon-fp-armv8",
1203             AArch64::ExtensionBitset(
1204                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1205                  AArch64::AEK_FP, AArch64::AEK_RDM, AArch64::AEK_SIMD,
1206                  AArch64::AEK_RAS, AArch64::AEK_LSE, AArch64::AEK_FP16,
1207                  AArch64::AEK_DOTPROD, AArch64::AEK_RCPC, AArch64::AEK_SSBS}),
1208             "8.2-A"),
1209         ARMCPUTestParams<AArch64::ExtensionBitset>(
1210             "cortex-a76ae", "armv8.2-a", "crypto-neon-fp-armv8",
1211             AArch64::ExtensionBitset(
1212                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1213                  AArch64::AEK_FP, AArch64::AEK_RDM, AArch64::AEK_SIMD,
1214                  AArch64::AEK_RAS, AArch64::AEK_LSE, AArch64::AEK_FP16,
1215                  AArch64::AEK_DOTPROD, AArch64::AEK_RCPC, AArch64::AEK_SSBS}),
1216             "8.2-A"),
1217         ARMCPUTestParams<AArch64::ExtensionBitset>(
1218             "cortex-a77", "armv8.2-a", "crypto-neon-fp-armv8",
1219             AArch64::ExtensionBitset(
1220                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1221                  AArch64::AEK_FP, AArch64::AEK_RDM, AArch64::AEK_SIMD,
1222                  AArch64::AEK_RAS, AArch64::AEK_LSE, AArch64::AEK_FP16,
1223                  AArch64::AEK_DOTPROD, AArch64::AEK_RCPC, AArch64::AEK_SSBS}),
1224             "8.2-A"),
1225         ARMCPUTestParams<AArch64::ExtensionBitset>(
1226             "cortex-a78", "armv8.2-a", "crypto-neon-fp-armv8",
1227             AArch64::ExtensionBitset(
1228                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1229                  AArch64::AEK_FP, AArch64::AEK_RDM, AArch64::AEK_SIMD,
1230                  AArch64::AEK_RAS, AArch64::AEK_LSE, AArch64::AEK_FP16,
1231                  AArch64::AEK_DOTPROD, AArch64::AEK_RCPC, AArch64::AEK_SSBS,
1232                  AArch64::AEK_PROFILE}),
1233             "8.2-A"),
1234         ARMCPUTestParams<AArch64::ExtensionBitset>(
1235             "cortex-a78ae", "armv8.2-a", "crypto-neon-fp-armv8",
1236             AArch64::ExtensionBitset(
1237                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1238                  AArch64::AEK_FP, AArch64::AEK_RDM, AArch64::AEK_SIMD,
1239                  AArch64::AEK_RAS, AArch64::AEK_LSE, AArch64::AEK_FP16,
1240                  AArch64::AEK_DOTPROD, AArch64::AEK_RCPC, AArch64::AEK_SSBS,
1241                  AArch64::AEK_PROFILE}),
1242             "8.2-A"),
1243         ARMCPUTestParams<AArch64::ExtensionBitset>(
1244             "cortex-a78c", "armv8.2-a", "crypto-neon-fp-armv8",
1245             AArch64::ExtensionBitset(
1246                 {AArch64::AEK_RAS, AArch64::AEK_CRC, AArch64::AEK_AES,
1247                  AArch64::AEK_SHA2, AArch64::AEK_FP, AArch64::AEK_SIMD,
1248                  AArch64::AEK_RAS, AArch64::AEK_LSE, AArch64::AEK_RDM,
1249                  AArch64::AEK_FP16, AArch64::AEK_DOTPROD, AArch64::AEK_RCPC,
1250                  AArch64::AEK_SSBS, AArch64::AEK_PROFILE, AArch64::AEK_FLAGM,
1251                  AArch64::AEK_PAUTH}),
1252             "8.2-A"),
1253         ARMCPUTestParams<AArch64::ExtensionBitset>(
1254             "cortex-a710", "armv9-a", "neon-fp-armv8",
1255             AArch64::ExtensionBitset(
1256                 {AArch64::AEK_CRC,     AArch64::AEK_FP,
1257                  AArch64::AEK_SIMD,    AArch64::AEK_RAS,
1258                  AArch64::AEK_LSE,     AArch64::AEK_RDM,
1259                  AArch64::AEK_RCPC,    AArch64::AEK_DOTPROD,
1260                  AArch64::AEK_MTE,     AArch64::AEK_FP16,
1261                  AArch64::AEK_FP16FML, AArch64::AEK_SVE,
1262                  AArch64::AEK_SVE2,    AArch64::AEK_SVE2BITPERM,
1263                  AArch64::AEK_PAUTH,   AArch64::AEK_FLAGM,
1264                  AArch64::AEK_SB,      AArch64::AEK_I8MM,
1265                  AArch64::AEK_BF16,    AArch64::AEK_JSCVT,
1266                  AArch64::AEK_FCMA}),
1267             "9-A"),
1268         ARMCPUTestParams<AArch64::ExtensionBitset>(
1269             "cortex-a715", "armv9-a", "neon-fp-armv8",
1270             AArch64::ExtensionBitset(
1271                 {AArch64::AEK_CRC,     AArch64::AEK_FP,
1272                  AArch64::AEK_BF16,    AArch64::AEK_SIMD,
1273                  AArch64::AEK_RAS,     AArch64::AEK_LSE,
1274                  AArch64::AEK_RDM,     AArch64::AEK_RCPC,
1275                  AArch64::AEK_DOTPROD, AArch64::AEK_MTE,
1276                  AArch64::AEK_PAUTH,   AArch64::AEK_SVE,
1277                  AArch64::AEK_SVE2,    AArch64::AEK_SVE2BITPERM,
1278                  AArch64::AEK_SSBS,    AArch64::AEK_SB,
1279                  AArch64::AEK_I8MM,    AArch64::AEK_PERFMON,
1280                  AArch64::AEK_PREDRES, AArch64::AEK_PROFILE,
1281                  AArch64::AEK_FP16FML, AArch64::AEK_FP16,
1282                  AArch64::AEK_FLAGM,   AArch64::AEK_JSCVT,
1283                  AArch64::AEK_FCMA}),
1284             "9-A"),
1285         ARMCPUTestParams<AArch64::ExtensionBitset>(
1286             "cortex-a720", "armv9.2-a", "crypto-neon-fp-armv8",
1287             AArch64::ExtensionBitset(
1288                 {AArch64::AEK_BF16,        AArch64::AEK_I8MM,
1289                  AArch64::AEK_SVE,         AArch64::AEK_SVE2,
1290                  AArch64::AEK_FP16,        AArch64::AEK_DOTPROD,
1291                  AArch64::AEK_LSE,         AArch64::AEK_RDM,
1292                  AArch64::AEK_SIMD,        AArch64::AEK_RCPC,
1293                  AArch64::AEK_RAS,         AArch64::AEK_CRC,
1294                  AArch64::AEK_FP,          AArch64::AEK_SB,
1295                  AArch64::AEK_SSBS,        AArch64::AEK_MTE,
1296                  AArch64::AEK_FP16FML,     AArch64::AEK_PAUTH,
1297                  AArch64::AEK_SVE2BITPERM, AArch64::AEK_FLAGM,
1298                  AArch64::AEK_PERFMON,     AArch64::AEK_PREDRES,
1299                  AArch64::AEK_PROFILE,     AArch64::AEK_JSCVT,
1300                  AArch64::AEK_FCMA}),
1301             "9.2-A"),
1302         ARMCPUTestParams<AArch64::ExtensionBitset>(
1303             "cortex-a720ae", "armv9.2-a", "crypto-neon-fp-armv8",
1304             AArch64::ExtensionBitset(
1305                 {AArch64::AEK_BF16,        AArch64::AEK_I8MM,
1306                  AArch64::AEK_SVE,         AArch64::AEK_SVE2,
1307                  AArch64::AEK_FP16,        AArch64::AEK_DOTPROD,
1308                  AArch64::AEK_LSE,         AArch64::AEK_RDM,
1309                  AArch64::AEK_SIMD,        AArch64::AEK_RCPC,
1310                  AArch64::AEK_RAS,         AArch64::AEK_CRC,
1311                  AArch64::AEK_FP,          AArch64::AEK_SB,
1312                  AArch64::AEK_SSBS,        AArch64::AEK_MTE,
1313                  AArch64::AEK_FP16FML,     AArch64::AEK_PAUTH,
1314                  AArch64::AEK_SVE2BITPERM, AArch64::AEK_FLAGM,
1315                  AArch64::AEK_PERFMON,     AArch64::AEK_PREDRES,
1316                  AArch64::AEK_PROFILE,     AArch64::AEK_JSCVT,
1317                  AArch64::AEK_FCMA}),
1318             "9.2-A"),
1319         ARMCPUTestParams<AArch64::ExtensionBitset>(
1320             "neoverse-v1", "armv8.4-a", "crypto-neon-fp-armv8",
1321             AArch64::ExtensionBitset(
1322                 {AArch64::AEK_RAS,     AArch64::AEK_SVE,   AArch64::AEK_SSBS,
1323                  AArch64::AEK_RCPC,    AArch64::AEK_CRC,   AArch64::AEK_FP,
1324                  AArch64::AEK_SIMD,    AArch64::AEK_RAS,   AArch64::AEK_LSE,
1325                  AArch64::AEK_RDM,     AArch64::AEK_RCPC,  AArch64::AEK_DOTPROD,
1326                  AArch64::AEK_AES,     AArch64::AEK_SHA2,  AArch64::AEK_SHA3,
1327                  AArch64::AEK_SM4,     AArch64::AEK_FP16,  AArch64::AEK_BF16,
1328                  AArch64::AEK_PROFILE, AArch64::AEK_RAND,  AArch64::AEK_FP16FML,
1329                  AArch64::AEK_I8MM,    AArch64::AEK_JSCVT, AArch64::AEK_FCMA,
1330                  AArch64::AEK_PAUTH}),
1331             "8.4-A"),
1332         ARMCPUTestParams<AArch64::ExtensionBitset>(
1333             "neoverse-v2", "armv9-a", "neon-fp-armv8",
1334             AArch64::ExtensionBitset(
1335                 {AArch64::AEK_RAS,         AArch64::AEK_SVE,
1336                  AArch64::AEK_SSBS,        AArch64::AEK_RCPC,
1337                  AArch64::AEK_CRC,         AArch64::AEK_FP,
1338                  AArch64::AEK_SIMD,        AArch64::AEK_MTE,
1339                  AArch64::AEK_LSE,         AArch64::AEK_RDM,
1340                  AArch64::AEK_RCPC,        AArch64::AEK_DOTPROD,
1341                  AArch64::AEK_FP16,        AArch64::AEK_BF16,
1342                  AArch64::AEK_SVE2,        AArch64::AEK_PROFILE,
1343                  AArch64::AEK_FP16FML,     AArch64::AEK_I8MM,
1344                  AArch64::AEK_SVE2BITPERM, AArch64::AEK_RAND,
1345                  AArch64::AEK_JSCVT,       AArch64::AEK_FCMA,
1346                  AArch64::AEK_PAUTH}),
1347             "9-A"),
1348         ARMCPUTestParams<AArch64::ExtensionBitset>(
1349             "neoverse-v3", "armv9.2-a", "neon-fp-armv8",
1350             AArch64::ExtensionBitset(
1351                 {AArch64::AEK_BF16,        AArch64::AEK_I8MM,
1352                  AArch64::AEK_SVE,         AArch64::AEK_SVE2,
1353                  AArch64::AEK_FP16,        AArch64::AEK_DOTPROD,
1354                  AArch64::AEK_LSE,         AArch64::AEK_RDM,
1355                  AArch64::AEK_SIMD,        AArch64::AEK_RCPC,
1356                  AArch64::AEK_RAS,         AArch64::AEK_CRC,
1357                  AArch64::AEK_FP,          AArch64::AEK_PROFILE,
1358                  AArch64::AEK_MTE,         AArch64::AEK_SSBS,
1359                  AArch64::AEK_SB,          AArch64::AEK_PREDRES,
1360                  AArch64::AEK_LS64,        AArch64::AEK_BRBE,
1361                  AArch64::AEK_PAUTH,       AArch64::AEK_FLAGM,
1362                  AArch64::AEK_PERFMON,     AArch64::AEK_RAND,
1363                  AArch64::AEK_SVE2BITPERM, AArch64::AEK_FP16FML,
1364                  AArch64::AEK_PROFILE,     AArch64::AEK_JSCVT,
1365                  AArch64::AEK_FCMA}),
1366             "9.2-A"),
1367         ARMCPUTestParams<AArch64::ExtensionBitset>(
1368             "neoverse-v3ae", "armv9.2-a", "neon-fp-armv8",
1369             AArch64::ExtensionBitset(
1370                 {AArch64::AEK_BF16,        AArch64::AEK_I8MM,
1371                  AArch64::AEK_SVE,         AArch64::AEK_SVE2,
1372                  AArch64::AEK_FP16,        AArch64::AEK_DOTPROD,
1373                  AArch64::AEK_LSE,         AArch64::AEK_RDM,
1374                  AArch64::AEK_SIMD,        AArch64::AEK_RCPC,
1375                  AArch64::AEK_RAS,         AArch64::AEK_CRC,
1376                  AArch64::AEK_FP,          AArch64::AEK_PROFILE,
1377                  AArch64::AEK_MTE,         AArch64::AEK_SSBS,
1378                  AArch64::AEK_SB,          AArch64::AEK_PREDRES,
1379                  AArch64::AEK_LS64,        AArch64::AEK_BRBE,
1380                  AArch64::AEK_PAUTH,       AArch64::AEK_FLAGM,
1381                  AArch64::AEK_PERFMON,     AArch64::AEK_RAND,
1382                  AArch64::AEK_SVE2BITPERM, AArch64::AEK_FP16FML,
1383                  AArch64::AEK_PROFILE,     AArch64::AEK_JSCVT,
1384                  AArch64::AEK_FCMA}),
1385             "9.2-A"),
1386         ARMCPUTestParams<AArch64::ExtensionBitset>(
1387             "cortex-r82", "armv8-r", "crypto-neon-fp-armv8",
1388             AArch64::ExtensionBitset(
1389                 {AArch64::AEK_CRC, AArch64::AEK_RDM, AArch64::AEK_SSBS,
1390                  AArch64::AEK_DOTPROD, AArch64::AEK_FP, AArch64::AEK_SIMD,
1391                  AArch64::AEK_FP16, AArch64::AEK_FP16FML, AArch64::AEK_RAS,
1392                  AArch64::AEK_RCPC, AArch64::AEK_LSE, AArch64::AEK_SB,
1393                  AArch64::AEK_JSCVT, AArch64::AEK_FCMA, AArch64::AEK_PAUTH,
1394                  AArch64::AEK_FLAGM, AArch64::AEK_PERFMON,
1395                  AArch64::AEK_PREDRES}),
1396             "8-R"),
1397         ARMCPUTestParams<AArch64::ExtensionBitset>(
1398             "cortex-r82ae", "armv8-r", "crypto-neon-fp-armv8",
1399             AArch64::ExtensionBitset(
1400                 {AArch64::AEK_CRC, AArch64::AEK_RDM, AArch64::AEK_SSBS,
1401                  AArch64::AEK_DOTPROD, AArch64::AEK_FP, AArch64::AEK_SIMD,
1402                  AArch64::AEK_FP16, AArch64::AEK_FP16FML, AArch64::AEK_RAS,
1403                  AArch64::AEK_RCPC, AArch64::AEK_LSE, AArch64::AEK_SB,
1404                  AArch64::AEK_JSCVT, AArch64::AEK_FCMA, AArch64::AEK_PAUTH,
1405                  AArch64::AEK_FLAGM, AArch64::AEK_PERFMON,
1406                  AArch64::AEK_PREDRES}),
1407             "8-R"),
1408         ARMCPUTestParams<AArch64::ExtensionBitset>(
1409             "cortex-x1", "armv8.2-a", "crypto-neon-fp-armv8",
1410             AArch64::ExtensionBitset(
1411                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1412                  AArch64::AEK_FP, AArch64::AEK_RDM, AArch64::AEK_SIMD,
1413                  AArch64::AEK_RAS, AArch64::AEK_LSE, AArch64::AEK_FP16,
1414                  AArch64::AEK_DOTPROD, AArch64::AEK_RCPC, AArch64::AEK_SSBS,
1415                  AArch64::AEK_PROFILE}),
1416             "8.2-A"),
1417         ARMCPUTestParams<AArch64::ExtensionBitset>(
1418             "cortex-x1c", "armv8.2-a", "crypto-neon-fp-armv8",
1419             AArch64::ExtensionBitset(
1420                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1421                  AArch64::AEK_FP, AArch64::AEK_RDM, AArch64::AEK_SIMD,
1422                  AArch64::AEK_RAS, AArch64::AEK_LSE, AArch64::AEK_FP16,
1423                  AArch64::AEK_DOTPROD, AArch64::AEK_RCPC, AArch64::AEK_SSBS,
1424                  AArch64::AEK_PAUTH, AArch64::AEK_PROFILE, AArch64::AEK_FLAGM}),
1425             "8.2-A"),
1426         ARMCPUTestParams<AArch64::ExtensionBitset>(
1427             "cortex-x2", "armv9-a", "neon-fp-armv8",
1428             AArch64::ExtensionBitset(
1429                 {AArch64::AEK_CRC,         AArch64::AEK_FP,
1430                  AArch64::AEK_SIMD,        AArch64::AEK_RAS,
1431                  AArch64::AEK_LSE,         AArch64::AEK_RDM,
1432                  AArch64::AEK_RCPC,        AArch64::AEK_DOTPROD,
1433                  AArch64::AEK_MTE,         AArch64::AEK_PAUTH,
1434                  AArch64::AEK_I8MM,        AArch64::AEK_BF16,
1435                  AArch64::AEK_SVE,         AArch64::AEK_SVE2,
1436                  AArch64::AEK_SVE2BITPERM, AArch64::AEK_SSBS,
1437                  AArch64::AEK_SB,          AArch64::AEK_FP16,
1438                  AArch64::AEK_FP16FML,     AArch64::AEK_FLAGM,
1439                  AArch64::AEK_JSCVT,       AArch64::AEK_FCMA}),
1440             "9-A"),
1441         ARMCPUTestParams<AArch64::ExtensionBitset>(
1442             "cortex-x3", "armv9-a", "neon-fp-armv8",
1443             AArch64::ExtensionBitset(
1444                 {AArch64::AEK_CRC,     AArch64::AEK_FP,
1445                  AArch64::AEK_BF16,    AArch64::AEK_SIMD,
1446                  AArch64::AEK_RAS,     AArch64::AEK_LSE,
1447                  AArch64::AEK_RDM,     AArch64::AEK_RCPC,
1448                  AArch64::AEK_DOTPROD, AArch64::AEK_MTE,
1449                  AArch64::AEK_PAUTH,   AArch64::AEK_SVE,
1450                  AArch64::AEK_SVE2,    AArch64::AEK_SVE2BITPERM,
1451                  AArch64::AEK_SB,      AArch64::AEK_PROFILE,
1452                  AArch64::AEK_PERFMON, AArch64::AEK_I8MM,
1453                  AArch64::AEK_FP16,    AArch64::AEK_FP16FML,
1454                  AArch64::AEK_PREDRES, AArch64::AEK_FLAGM,
1455                  AArch64::AEK_SSBS,    AArch64::AEK_JSCVT,
1456                  AArch64::AEK_FCMA}),
1457             "9-A"),
1458         ARMCPUTestParams<AArch64::ExtensionBitset>(
1459             "cortex-x4", "armv9.2-a", "crypto-neon-fp-armv8",
1460             AArch64::ExtensionBitset(
1461                 {AArch64::AEK_BF16,        AArch64::AEK_I8MM,
1462                  AArch64::AEK_SVE,         AArch64::AEK_SVE2,
1463                  AArch64::AEK_FP16,        AArch64::AEK_DOTPROD,
1464                  AArch64::AEK_LSE,         AArch64::AEK_RDM,
1465                  AArch64::AEK_SIMD,        AArch64::AEK_RCPC,
1466                  AArch64::AEK_RAS,         AArch64::AEK_CRC,
1467                  AArch64::AEK_FP,          AArch64::AEK_SB,
1468                  AArch64::AEK_SSBS,        AArch64::AEK_MTE,
1469                  AArch64::AEK_FP16FML,     AArch64::AEK_PAUTH,
1470                  AArch64::AEK_SVE2BITPERM, AArch64::AEK_FLAGM,
1471                  AArch64::AEK_PERFMON,     AArch64::AEK_PREDRES,
1472                  AArch64::AEK_PROFILE,     AArch64::AEK_JSCVT,
1473                  AArch64::AEK_FCMA}),
1474             "9.2-A"),
1475         ARMCPUTestParams<AArch64::ExtensionBitset>(
1476             "cyclone", "armv8-a", "crypto-neon-fp-armv8",
1477             AArch64::ExtensionBitset({AArch64::AEK_NONE, AArch64::AEK_AES,
1478                                       AArch64::AEK_SHA2, AArch64::AEK_FP,
1479                                       AArch64::AEK_SIMD}),
1480             "8-A"),
1481         ARMCPUTestParams<AArch64::ExtensionBitset>(
1482             "apple-a7", "armv8-a", "crypto-neon-fp-armv8",
1483             AArch64::ExtensionBitset({AArch64::AEK_NONE, AArch64::AEK_AES,
1484                                       AArch64::AEK_SHA2, AArch64::AEK_FP,
1485                                       AArch64::AEK_SIMD}),
1486             "8-A"),
1487         ARMCPUTestParams<AArch64::ExtensionBitset>(
1488             "apple-a8", "armv8-a", "crypto-neon-fp-armv8",
1489             AArch64::ExtensionBitset({AArch64::AEK_NONE, AArch64::AEK_AES,
1490                                       AArch64::AEK_SHA2, AArch64::AEK_FP,
1491                                       AArch64::AEK_SIMD}),
1492             "8-A"),
1493         ARMCPUTestParams<AArch64::ExtensionBitset>(
1494             "apple-a9", "armv8-a", "crypto-neon-fp-armv8",
1495             AArch64::ExtensionBitset({AArch64::AEK_NONE, AArch64::AEK_AES,
1496                                       AArch64::AEK_SHA2, AArch64::AEK_FP,
1497                                       AArch64::AEK_SIMD}),
1498             "8-A"),
1499         ARMCPUTestParams<AArch64::ExtensionBitset>(
1500             "apple-a10", "armv8-a", "crypto-neon-fp-armv8",
1501             AArch64::ExtensionBitset({AArch64::AEK_CRC, AArch64::AEK_AES,
1502                                       AArch64::AEK_SHA2, AArch64::AEK_FP,
1503                                       AArch64::AEK_RDM, AArch64::AEK_SIMD}),
1504             "8-A"),
1505         ARMCPUTestParams<AArch64::ExtensionBitset>(
1506             "apple-a11", "armv8.2-a", "crypto-neon-fp-armv8",
1507             AArch64::ExtensionBitset(
1508                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1509                  AArch64::AEK_FP, AArch64::AEK_LSE, AArch64::AEK_RAS,
1510                  AArch64::AEK_RDM, AArch64::AEK_SIMD, AArch64::AEK_FP16}),
1511             "8.2-A"),
1512         ARMCPUTestParams<AArch64::ExtensionBitset>(
1513             "apple-a12", "armv8.3-a", "crypto-neon-fp-armv8",
1514             AArch64::ExtensionBitset(
1515                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1516                  AArch64::AEK_FP, AArch64::AEK_SIMD, AArch64::AEK_LSE,
1517                  AArch64::AEK_RAS, AArch64::AEK_RDM, AArch64::AEK_RCPC,
1518                  AArch64::AEK_FP16, AArch64::AEK_JSCVT, AArch64::AEK_FCMA,
1519                  AArch64::AEK_PAUTH}),
1520             "8.3-A"),
1521         ARMCPUTestParams<AArch64::ExtensionBitset>(
1522             "apple-a13", "armv8.4-a", "crypto-neon-fp-armv8",
1523             AArch64::ExtensionBitset(
1524                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1525                  AArch64::AEK_SHA3, AArch64::AEK_FP, AArch64::AEK_SIMD,
1526                  AArch64::AEK_LSE, AArch64::AEK_RAS, AArch64::AEK_RDM,
1527                  AArch64::AEK_RCPC, AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
1528                  AArch64::AEK_FP16FML, AArch64::AEK_SHA3, AArch64::AEK_JSCVT,
1529                  AArch64::AEK_FCMA, AArch64::AEK_PAUTH}),
1530             "8.4-A"),
1531         ARMCPUTestParams<AArch64::ExtensionBitset>(
1532             "apple-a14", "armv8.5-a", "crypto-neon-fp-armv8",
1533             AArch64::ExtensionBitset(
1534                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1535                  AArch64::AEK_SHA3, AArch64::AEK_FP, AArch64::AEK_SIMD,
1536                  AArch64::AEK_LSE, AArch64::AEK_RAS, AArch64::AEK_RDM,
1537                  AArch64::AEK_RCPC, AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
1538                  AArch64::AEK_FP16FML, AArch64::AEK_SHA3, AArch64::AEK_JSCVT,
1539                  AArch64::AEK_FCMA, AArch64::AEK_PAUTH}),
1540             "8.5-A"),
1541         ARMCPUTestParams<AArch64::ExtensionBitset>(
1542             "apple-a15", "armv8.6-a", "crypto-neon-fp-armv8",
1543             AArch64::ExtensionBitset(
1544                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1545                  AArch64::AEK_SHA3, AArch64::AEK_FP, AArch64::AEK_SIMD,
1546                  AArch64::AEK_LSE, AArch64::AEK_RAS, AArch64::AEK_RDM,
1547                  AArch64::AEK_RCPC, AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
1548                  AArch64::AEK_FP16FML, AArch64::AEK_SHA3, AArch64::AEK_BF16,
1549                  AArch64::AEK_I8MM, AArch64::AEK_JSCVT, AArch64::AEK_FCMA,
1550                  AArch64::AEK_PAUTH}),
1551             "8.6-A"),
1552         ARMCPUTestParams<AArch64::ExtensionBitset>(
1553             "apple-a16", "armv8.6-a", "crypto-neon-fp-armv8",
1554             AArch64::ExtensionBitset(
1555                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1556                  AArch64::AEK_SHA3, AArch64::AEK_FP, AArch64::AEK_SIMD,
1557                  AArch64::AEK_LSE, AArch64::AEK_RAS, AArch64::AEK_RDM,
1558                  AArch64::AEK_RCPC, AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
1559                  AArch64::AEK_FP16FML, AArch64::AEK_SHA3, AArch64::AEK_BF16,
1560                  AArch64::AEK_I8MM, AArch64::AEK_JSCVT, AArch64::AEK_FCMA,
1561                  AArch64::AEK_PAUTH}),
1562             "8.6-A"),
1563         ARMCPUTestParams<AArch64::ExtensionBitset>(
1564             "apple-a17", "armv8.6-a", "crypto-neon-fp-armv8",
1565             AArch64::ExtensionBitset(
1566                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1567                  AArch64::AEK_SHA3, AArch64::AEK_FP, AArch64::AEK_SIMD,
1568                  AArch64::AEK_LSE, AArch64::AEK_RAS, AArch64::AEK_RDM,
1569                  AArch64::AEK_RCPC, AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
1570                  AArch64::AEK_FP16FML, AArch64::AEK_SHA3, AArch64::AEK_BF16,
1571                  AArch64::AEK_I8MM, AArch64::AEK_JSCVT, AArch64::AEK_FCMA,
1572                  AArch64::AEK_PAUTH}),
1573             "8.6-A"),
1574         ARMCPUTestParams<AArch64::ExtensionBitset>(
1575             "apple-m1", "armv8.5-a", "crypto-neon-fp-armv8",
1576             AArch64::ExtensionBitset(
1577                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1578                  AArch64::AEK_SHA3, AArch64::AEK_FP, AArch64::AEK_SIMD,
1579                  AArch64::AEK_LSE, AArch64::AEK_RAS, AArch64::AEK_RDM,
1580                  AArch64::AEK_RCPC, AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
1581                  AArch64::AEK_FP16FML, AArch64::AEK_SHA3, AArch64::AEK_JSCVT,
1582                  AArch64::AEK_FCMA, AArch64::AEK_PAUTH}),
1583             "8.5-A"),
1584         ARMCPUTestParams<AArch64::ExtensionBitset>(
1585             "apple-m2", "armv8.6-a", "crypto-neon-fp-armv8",
1586             AArch64::ExtensionBitset(
1587                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1588                  AArch64::AEK_SHA3, AArch64::AEK_FP, AArch64::AEK_SIMD,
1589                  AArch64::AEK_LSE, AArch64::AEK_RAS, AArch64::AEK_RDM,
1590                  AArch64::AEK_RCPC, AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
1591                  AArch64::AEK_FP16FML, AArch64::AEK_SHA3, AArch64::AEK_BF16,
1592                  AArch64::AEK_I8MM, AArch64::AEK_JSCVT, AArch64::AEK_FCMA,
1593                  AArch64::AEK_PAUTH}),
1594             "8.6-A"),
1595         ARMCPUTestParams<AArch64::ExtensionBitset>(
1596             "apple-m3", "armv8.6-a", "crypto-neon-fp-armv8",
1597             AArch64::ExtensionBitset(
1598                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1599                  AArch64::AEK_SHA3, AArch64::AEK_FP, AArch64::AEK_SIMD,
1600                  AArch64::AEK_LSE, AArch64::AEK_RAS, AArch64::AEK_RDM,
1601                  AArch64::AEK_RCPC, AArch64::AEK_DOTPROD, AArch64::AEK_FP16,
1602                  AArch64::AEK_FP16FML, AArch64::AEK_SHA3, AArch64::AEK_BF16,
1603                  AArch64::AEK_I8MM, AArch64::AEK_JSCVT, AArch64::AEK_FCMA,
1604                  AArch64::AEK_PAUTH}),
1605             "8.6-A"),
1606         ARMCPUTestParams<AArch64::ExtensionBitset>(
1607             "apple-s4", "armv8.3-a", "crypto-neon-fp-armv8",
1608             AArch64::ExtensionBitset(
1609                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1610                  AArch64::AEK_FP, AArch64::AEK_SIMD, AArch64::AEK_LSE,
1611                  AArch64::AEK_RAS, AArch64::AEK_RDM, AArch64::AEK_RCPC,
1612                  AArch64::AEK_FP16, AArch64::AEK_JSCVT, AArch64::AEK_FCMA,
1613                  AArch64::AEK_PAUTH}),
1614             "8.3-A"),
1615         ARMCPUTestParams<AArch64::ExtensionBitset>(
1616             "apple-s5", "armv8.3-a", "crypto-neon-fp-armv8",
1617             AArch64::ExtensionBitset(
1618                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1619                  AArch64::AEK_FP, AArch64::AEK_SIMD, AArch64::AEK_LSE,
1620                  AArch64::AEK_RAS, AArch64::AEK_RDM, AArch64::AEK_RCPC,
1621                  AArch64::AEK_FP16, AArch64::AEK_JSCVT, AArch64::AEK_FCMA,
1622                  AArch64::AEK_PAUTH}),
1623             "8.3-A"),
1624         ARMCPUTestParams<AArch64::ExtensionBitset>(
1625             "exynos-m3", "armv8-a", "crypto-neon-fp-armv8",
1626             AArch64::ExtensionBitset({AArch64::AEK_CRC, AArch64::AEK_AES,
1627                                       AArch64::AEK_SHA2, AArch64::AEK_FP,
1628                                       AArch64::AEK_SIMD}),
1629             "8-A"),
1630         ARMCPUTestParams<AArch64::ExtensionBitset>(
1631             "exynos-m4", "armv8.2-a", "crypto-neon-fp-armv8",
1632             AArch64::ExtensionBitset({AArch64::AEK_CRC, AArch64::AEK_AES,
1633                                       AArch64::AEK_SHA2, AArch64::AEK_DOTPROD,
1634                                       AArch64::AEK_FP, AArch64::AEK_FP16,
1635                                       AArch64::AEK_LSE, AArch64::AEK_RAS,
1636                                       AArch64::AEK_RDM, AArch64::AEK_SIMD}),
1637             "8.2-A"),
1638         ARMCPUTestParams<AArch64::ExtensionBitset>(
1639             "exynos-m5", "armv8.2-a", "crypto-neon-fp-armv8",
1640             AArch64::ExtensionBitset({AArch64::AEK_CRC, AArch64::AEK_AES,
1641                                       AArch64::AEK_SHA2, AArch64::AEK_DOTPROD,
1642                                       AArch64::AEK_FP, AArch64::AEK_FP16,
1643                                       AArch64::AEK_LSE, AArch64::AEK_RAS,
1644                                       AArch64::AEK_RDM, AArch64::AEK_SIMD}),
1645             "8.2-A"),
1646         ARMCPUTestParams<AArch64::ExtensionBitset>(
1647             "falkor", "armv8-a", "crypto-neon-fp-armv8",
1648             AArch64::ExtensionBitset({AArch64::AEK_CRC, AArch64::AEK_AES,
1649                                       AArch64::AEK_SHA2, AArch64::AEK_FP,
1650                                       AArch64::AEK_SIMD, AArch64::AEK_RDM}),
1651             "8-A"),
1652         ARMCPUTestParams<AArch64::ExtensionBitset>(
1653             "kryo", "armv8-a", "crypto-neon-fp-armv8",
1654             AArch64::ExtensionBitset({AArch64::AEK_CRC, AArch64::AEK_AES,
1655                                       AArch64::AEK_SHA2, AArch64::AEK_FP,
1656                                       AArch64::AEK_SIMD}),
1657             "8-A"),
1658         ARMCPUTestParams<AArch64::ExtensionBitset>(
1659             "neoverse-e1", "armv8.2-a", "crypto-neon-fp-armv8",
1660             AArch64::ExtensionBitset(
1661                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1662                  AArch64::AEK_DOTPROD, AArch64::AEK_FP, AArch64::AEK_FP16,
1663                  AArch64::AEK_LSE, AArch64::AEK_RAS, AArch64::AEK_RCPC,
1664                  AArch64::AEK_RDM, AArch64::AEK_SIMD, AArch64::AEK_SSBS}),
1665             "8.2-A"),
1666         ARMCPUTestParams<AArch64::ExtensionBitset>(
1667             "neoverse-n1", "armv8.2-a", "crypto-neon-fp-armv8",
1668             AArch64::ExtensionBitset(
1669                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1670                  AArch64::AEK_DOTPROD, AArch64::AEK_FP, AArch64::AEK_FP16,
1671                  AArch64::AEK_LSE, AArch64::AEK_PROFILE, AArch64::AEK_RAS,
1672                  AArch64::AEK_RCPC, AArch64::AEK_RDM, AArch64::AEK_SIMD,
1673                  AArch64::AEK_SSBS}),
1674             "8.2-A"),
1675         ARMCPUTestParams<AArch64::ExtensionBitset>(
1676             "neoverse-n2", "armv9-a", "crypto-neon-fp-armv8",
1677             AArch64::ExtensionBitset(
1678                 {AArch64::AEK_CRC,         AArch64::AEK_FP,
1679                  AArch64::AEK_SIMD,        AArch64::AEK_FP16,
1680                  AArch64::AEK_RAS,         AArch64::AEK_LSE,
1681                  AArch64::AEK_SVE,         AArch64::AEK_DOTPROD,
1682                  AArch64::AEK_RCPC,        AArch64::AEK_RDM,
1683                  AArch64::AEK_MTE,         AArch64::AEK_SSBS,
1684                  AArch64::AEK_SB,          AArch64::AEK_SVE2,
1685                  AArch64::AEK_SVE2BITPERM, AArch64::AEK_BF16,
1686                  AArch64::AEK_I8MM,        AArch64::AEK_JSCVT,
1687                  AArch64::AEK_FCMA,        AArch64::AEK_PAUTH,
1688                  AArch64::AEK_FP16FML}),
1689             "9-A"),
1690         ARMCPUTestParams<AArch64::ExtensionBitset>(
1691             "neoverse-n3", "armv9.2-a", "neon-fp-armv8",
1692             AArch64::ExtensionBitset(
1693                 {AArch64::AEK_BF16,    AArch64::AEK_I8MM,
1694                  AArch64::AEK_SVE,     AArch64::AEK_SVE2,
1695                  AArch64::AEK_FP16,    AArch64::AEK_DOTPROD,
1696                  AArch64::AEK_LSE,     AArch64::AEK_RDM,
1697                  AArch64::AEK_SIMD,    AArch64::AEK_RCPC,
1698                  AArch64::AEK_RAS,     AArch64::AEK_CRC,
1699                  AArch64::AEK_FP,      AArch64::AEK_PROFILE,
1700                  AArch64::AEK_MTE,     AArch64::AEK_SSBS,
1701                  AArch64::AEK_SB,      AArch64::AEK_PREDRES,
1702                  AArch64::AEK_FCMA,    AArch64::AEK_PAUTH,
1703                  AArch64::AEK_FLAGM,   AArch64::AEK_PERFMON,
1704                  AArch64::AEK_RAND,    AArch64::AEK_SVE2BITPERM,
1705                  AArch64::AEK_FP16FML, AArch64::AEK_PROFILE,
1706                  AArch64::AEK_JSCVT}),
1707             "9.2-A"),
1708         ARMCPUTestParams<AArch64::ExtensionBitset>(
1709             "ampere1", "armv8.6-a", "crypto-neon-fp-armv8",
1710             AArch64::ExtensionBitset(
1711                 {AArch64::AEK_CRC,  AArch64::AEK_FP,   AArch64::AEK_FP16,
1712                  AArch64::AEK_SIMD, AArch64::AEK_RAS,  AArch64::AEK_LSE,
1713                  AArch64::AEK_RDM,  AArch64::AEK_RCPC, AArch64::AEK_DOTPROD,
1714                  AArch64::AEK_SHA3, AArch64::AEK_BF16, AArch64::AEK_SHA2,
1715                  AArch64::AEK_AES,  AArch64::AEK_I8MM, AArch64::AEK_SSBS,
1716                  AArch64::AEK_SB,   AArch64::AEK_RAND, AArch64::AEK_JSCVT,
1717                  AArch64::AEK_FCMA, AArch64::AEK_PAUTH}),
1718             "8.6-A"),
1719         ARMCPUTestParams<AArch64::ExtensionBitset>(
1720             "ampere1a", "armv8.6-a", "crypto-neon-fp-armv8",
1721             AArch64::ExtensionBitset(
1722                 {AArch64::AEK_CRC,  AArch64::AEK_FP,    AArch64::AEK_FP16,
1723                  AArch64::AEK_SIMD, AArch64::AEK_RAS,   AArch64::AEK_LSE,
1724                  AArch64::AEK_RDM,  AArch64::AEK_RCPC,  AArch64::AEK_DOTPROD,
1725                  AArch64::AEK_SM4,  AArch64::AEK_SHA3,  AArch64::AEK_BF16,
1726                  AArch64::AEK_SHA2, AArch64::AEK_AES,   AArch64::AEK_I8MM,
1727                  AArch64::AEK_SSBS, AArch64::AEK_SB,    AArch64::AEK_RAND,
1728                  AArch64::AEK_MTE,  AArch64::AEK_JSCVT, AArch64::AEK_FCMA,
1729                  AArch64::AEK_PAUTH}),
1730             "8.6-A"),
1731         ARMCPUTestParams<AArch64::ExtensionBitset>(
1732             "ampere1b", "armv8.7-a", "crypto-neon-fp-armv8",
1733             AArch64::ExtensionBitset(
1734                 {AArch64::AEK_CRC,   AArch64::AEK_FP,    AArch64::AEK_FP16,
1735                  AArch64::AEK_SIMD,  AArch64::AEK_RAS,   AArch64::AEK_LSE,
1736                  AArch64::AEK_RDM,   AArch64::AEK_RCPC,  AArch64::AEK_DOTPROD,
1737                  AArch64::AEK_SM4,   AArch64::AEK_SHA3,  AArch64::AEK_BF16,
1738                  AArch64::AEK_SHA2,  AArch64::AEK_AES,   AArch64::AEK_I8MM,
1739                  AArch64::AEK_SSBS,  AArch64::AEK_SB,    AArch64::AEK_RAND,
1740                  AArch64::AEK_MTE,   AArch64::AEK_JSCVT, AArch64::AEK_FCMA,
1741                  AArch64::AEK_PAUTH, AArch64::AEK_CSSC}),
1742             "8.7-A"),
1743         ARMCPUTestParams<AArch64::ExtensionBitset>(
1744             "neoverse-512tvb", "armv8.4-a", "crypto-neon-fp-armv8",
1745             AArch64::ExtensionBitset(
1746                 {AArch64::AEK_RAS,     AArch64::AEK_SVE,   AArch64::AEK_SSBS,
1747                  AArch64::AEK_RCPC,    AArch64::AEK_CRC,   AArch64::AEK_FP,
1748                  AArch64::AEK_SIMD,    AArch64::AEK_RAS,   AArch64::AEK_LSE,
1749                  AArch64::AEK_RDM,     AArch64::AEK_RCPC,  AArch64::AEK_DOTPROD,
1750                  AArch64::AEK_AES,     AArch64::AEK_SHA2,  AArch64::AEK_SHA3,
1751                  AArch64::AEK_SM4,     AArch64::AEK_FP16,  AArch64::AEK_BF16,
1752                  AArch64::AEK_PROFILE, AArch64::AEK_RAND,  AArch64::AEK_FP16FML,
1753                  AArch64::AEK_I8MM,    AArch64::AEK_JSCVT, AArch64::AEK_FCMA,
1754                  AArch64::AEK_PAUTH}),
1755             "8.4-A"),
1756         ARMCPUTestParams<AArch64::ExtensionBitset>(
1757             "thunderx2t99", "armv8.1-a", "crypto-neon-fp-armv8",
1758             AArch64::ExtensionBitset({AArch64::AEK_CRC, AArch64::AEK_AES,
1759                                       AArch64::AEK_SHA2, AArch64::AEK_LSE,
1760                                       AArch64::AEK_RDM, AArch64::AEK_FP,
1761                                       AArch64::AEK_SIMD}),
1762             "8.1-A"),
1763         ARMCPUTestParams<AArch64::ExtensionBitset>(
1764             "thunderx3t110", "armv8.3-a", "crypto-neon-fp-armv8",
1765             AArch64::ExtensionBitset(
1766                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1767                  AArch64::AEK_LSE, AArch64::AEK_RDM, AArch64::AEK_FP,
1768                  AArch64::AEK_SIMD, AArch64::AEK_RAS, AArch64::AEK_RCPC,
1769                  AArch64::AEK_JSCVT, AArch64::AEK_FCMA, AArch64::AEK_PAUTH}),
1770             "8.3-A"),
1771         ARMCPUTestParams<AArch64::ExtensionBitset>(
1772             "thunderx", "armv8-a", "crypto-neon-fp-armv8",
1773             AArch64::ExtensionBitset({AArch64::AEK_CRC, AArch64::AEK_AES,
1774                                       AArch64::AEK_SHA2, AArch64::AEK_SIMD,
1775                                       AArch64::AEK_FP}),
1776             "8-A"),
1777         ARMCPUTestParams<AArch64::ExtensionBitset>(
1778             "thunderxt81", "armv8-a", "crypto-neon-fp-armv8",
1779             AArch64::ExtensionBitset({AArch64::AEK_CRC, AArch64::AEK_AES,
1780                                       AArch64::AEK_SHA2, AArch64::AEK_SIMD,
1781                                       AArch64::AEK_FP}),
1782             "8-A"),
1783         ARMCPUTestParams<AArch64::ExtensionBitset>(
1784             "thunderxt83", "armv8-a", "crypto-neon-fp-armv8",
1785             AArch64::ExtensionBitset({AArch64::AEK_CRC, AArch64::AEK_AES,
1786                                       AArch64::AEK_SHA2, AArch64::AEK_SIMD,
1787                                       AArch64::AEK_FP}),
1788             "8-A"),
1789         ARMCPUTestParams<AArch64::ExtensionBitset>(
1790             "thunderxt88", "armv8-a", "crypto-neon-fp-armv8",
1791             AArch64::ExtensionBitset({AArch64::AEK_CRC, AArch64::AEK_AES,
1792                                       AArch64::AEK_SHA2, AArch64::AEK_SIMD,
1793                                       AArch64::AEK_FP}),
1794             "8-A"),
1795         ARMCPUTestParams<AArch64::ExtensionBitset>(
1796             "tsv110", "armv8.2-a", "crypto-neon-fp-armv8",
1797             AArch64::ExtensionBitset(
1798                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1799                  AArch64::AEK_FP, AArch64::AEK_SIMD, AArch64::AEK_RAS,
1800                  AArch64::AEK_LSE, AArch64::AEK_RDM, AArch64::AEK_PROFILE,
1801                  AArch64::AEK_JSCVT, AArch64::AEK_FCMA, AArch64::AEK_FP16,
1802                  AArch64::AEK_FP16FML, AArch64::AEK_DOTPROD}),
1803             "8.2-A"),
1804         ARMCPUTestParams<AArch64::ExtensionBitset>(
1805             "a64fx", "armv8.2-a", "crypto-neon-fp-armv8",
1806             AArch64::ExtensionBitset({AArch64::AEK_CRC, AArch64::AEK_AES,
1807                                       AArch64::AEK_SHA2, AArch64::AEK_FP,
1808                                       AArch64::AEK_SIMD, AArch64::AEK_FP16,
1809                                       AArch64::AEK_RAS, AArch64::AEK_LSE,
1810                                       AArch64::AEK_SVE, AArch64::AEK_RDM}),
1811             "8.2-A"),
1812         ARMCPUTestParams<AArch64::ExtensionBitset>(
1813             "carmel", "armv8.2-a", "crypto-neon-fp-armv8",
1814             AArch64::ExtensionBitset(
1815                 {AArch64::AEK_CRC, AArch64::AEK_AES, AArch64::AEK_SHA2,
1816                  AArch64::AEK_FP, AArch64::AEK_SIMD, AArch64::AEK_FP16,
1817                  AArch64::AEK_RAS, AArch64::AEK_LSE, AArch64::AEK_RDM}),
1818             "8.2-A"),
1819         ARMCPUTestParams<AArch64::ExtensionBitset>(
1820             "oryon-1", "armv8.6-a", "crypto-neon-fp-armv8",
1821             (AArch64::ExtensionBitset(
1822                 {AArch64::AEK_CRC,     AArch64::AEK_FP,      AArch64::AEK_PAUTH,
1823                  AArch64::AEK_FCMA,    AArch64::AEK_JSCVT,   AArch64::AEK_SIMD,
1824                  AArch64::AEK_RAS,     AArch64::AEK_LSE,     AArch64::AEK_RDM,
1825                  AArch64::AEK_RCPC,    AArch64::AEK_DOTPROD, AArch64::AEK_SM4,
1826                  AArch64::AEK_SHA3,    AArch64::AEK_BF16,    AArch64::AEK_SHA2,
1827                  AArch64::AEK_AES,     AArch64::AEK_I8MM,    AArch64::AEK_RAND,
1828                  AArch64::AEK_PROFILE, AArch64::AEK_CRYPTO})),
1829             "8.6-A")),
1830 
1831     ARMCPUTestParams<AArch64::ExtensionBitset>::PrintToStringParamName);
1832 
1833 // Note: number of CPUs includes aliases.
1834 static constexpr unsigned NumAArch64CPUArchs = 77;
1835 
1836 TEST(TargetParserTest, testAArch64CPUArchList) {
1837   SmallVector<StringRef, NumAArch64CPUArchs> List;
1838   AArch64::fillValidCPUArchList(List);
1839 
1840   // No list exists for these in this test suite, so ensure all are
1841   // valid, and match the expected 'magic' count.
1842   EXPECT_EQ(List.size(), NumAArch64CPUArchs);
1843   for (StringRef CPU : List) {
1844     EXPECT_TRUE(AArch64::parseCpu(CPU));
1845   }
1846 }
1847 
1848 bool testAArch64Arch(StringRef Arch, StringRef DefaultCPU, StringRef SubArch,
1849                      unsigned ArchAttr) {
1850   const AArch64::ArchInfo *AI = AArch64::parseArch(Arch);
1851   return AI != nullptr;
1852 }
1853 
1854 TEST(TargetParserTest, testAArch64Arch) {
1855   EXPECT_TRUE(testAArch64Arch("armv8-a", "cortex-a53", "v8a",
1856                               ARMBuildAttrs::CPUArch::v8_A));
1857   EXPECT_TRUE(testAArch64Arch("armv8.1-a", "generic", "v8.1a",
1858                               ARMBuildAttrs::CPUArch::v8_A));
1859   EXPECT_TRUE(testAArch64Arch("armv8.2-a", "generic", "v8.2a",
1860                               ARMBuildAttrs::CPUArch::v8_A));
1861   EXPECT_TRUE(testAArch64Arch("armv8.3-a", "generic", "v8.3a",
1862                               ARMBuildAttrs::CPUArch::v8_A));
1863   EXPECT_TRUE(testAArch64Arch("armv8.4-a", "generic", "v8.4a",
1864                               ARMBuildAttrs::CPUArch::v8_A));
1865   EXPECT_TRUE(testAArch64Arch("armv8.5-a", "generic", "v8.5a",
1866                               ARMBuildAttrs::CPUArch::v8_A));
1867   EXPECT_TRUE(testAArch64Arch("armv8.6-a", "generic", "v8.6a",
1868                               ARMBuildAttrs::CPUArch::v8_A));
1869   EXPECT_TRUE(testAArch64Arch("armv8.7-a", "generic", "v8.7a",
1870                               ARMBuildAttrs::CPUArch::v8_A));
1871   EXPECT_TRUE(testAArch64Arch("armv8.8-a", "generic", "v8.8a",
1872                               ARMBuildAttrs::CPUArch::v8_A));
1873   EXPECT_TRUE(testAArch64Arch("armv8.9-a", "generic", "v8.9a",
1874                               ARMBuildAttrs::CPUArch::v8_A));
1875   EXPECT_TRUE(testAArch64Arch("armv9-a", "generic", "v9a",
1876                               ARMBuildAttrs::CPUArch::v8_A));
1877   EXPECT_TRUE(testAArch64Arch("armv9.1-a", "generic", "v9.1a",
1878                               ARMBuildAttrs::CPUArch::v8_A));
1879   EXPECT_TRUE(testAArch64Arch("armv9.2-a", "generic", "v9.2a",
1880                               ARMBuildAttrs::CPUArch::v8_A));
1881   EXPECT_TRUE(testAArch64Arch("armv9.3-a", "generic", "v9.3a",
1882                               ARMBuildAttrs::CPUArch::v8_A));
1883   EXPECT_TRUE(testAArch64Arch("armv9.4-a", "generic", "v9.4a",
1884                               ARMBuildAttrs::CPUArch::v8_A));
1885   EXPECT_TRUE(testAArch64Arch("armv9.5-a", "generic", "v9.5a",
1886                               ARMBuildAttrs::CPUArch::v8_A));
1887 }
1888 
1889 bool testAArch64Extension(StringRef CPUName, StringRef ArchExt) {
1890   std::optional<AArch64::ExtensionInfo> Extension =
1891       AArch64::parseArchExtension(ArchExt);
1892   if (!Extension)
1893     return false;
1894   std::optional<AArch64::CpuInfo> CpuInfo = AArch64::parseCpu(CPUName);
1895   return CpuInfo->getImpliedExtensions().test(Extension->ID);
1896 }
1897 
1898 bool testAArch64Extension(const AArch64::ArchInfo &AI, StringRef ArchExt) {
1899   std::optional<AArch64::ExtensionInfo> Extension =
1900       AArch64::parseArchExtension(ArchExt);
1901   if (!Extension)
1902     return false;
1903   return AI.DefaultExts.test(Extension->ID);
1904 }
1905 
1906 TEST(TargetParserTest, testAArch64Extension) {
1907   EXPECT_FALSE(testAArch64Extension("cortex-a34", "ras"));
1908   EXPECT_FALSE(testAArch64Extension("cortex-a35", "ras"));
1909   EXPECT_FALSE(testAArch64Extension("cortex-a53", "ras"));
1910   EXPECT_TRUE(testAArch64Extension("cortex-a55", "ras"));
1911   EXPECT_TRUE(testAArch64Extension("cortex-a55", "fp16"));
1912   EXPECT_FALSE(testAArch64Extension("cortex-a55", "fp16fml"));
1913   EXPECT_TRUE(testAArch64Extension("cortex-a55", "dotprod"));
1914   EXPECT_FALSE(testAArch64Extension("cortex-a57", "ras"));
1915   EXPECT_FALSE(testAArch64Extension("cortex-a72", "ras"));
1916   EXPECT_FALSE(testAArch64Extension("cortex-a73", "ras"));
1917   EXPECT_TRUE(testAArch64Extension("cortex-a75", "ras"));
1918   EXPECT_TRUE(testAArch64Extension("cortex-a75", "fp16"));
1919   EXPECT_FALSE(testAArch64Extension("cortex-a75", "fp16fml"));
1920   EXPECT_TRUE(testAArch64Extension("cortex-a75", "dotprod"));
1921   EXPECT_TRUE(testAArch64Extension("cortex-r82", "ras"));
1922   EXPECT_TRUE(testAArch64Extension("cortex-r82", "fp16"));
1923   EXPECT_TRUE(testAArch64Extension("cortex-r82", "fp16fml"));
1924   EXPECT_TRUE(testAArch64Extension("cortex-r82", "dotprod"));
1925   EXPECT_TRUE(testAArch64Extension("cortex-r82", "lse"));
1926   EXPECT_FALSE(testAArch64Extension("cyclone", "ras"));
1927   EXPECT_FALSE(testAArch64Extension("exynos-m3", "ras"));
1928   EXPECT_TRUE(testAArch64Extension("exynos-m4", "dotprod"));
1929   EXPECT_TRUE(testAArch64Extension("exynos-m4", "fp16"));
1930   EXPECT_TRUE(testAArch64Extension("exynos-m4", "lse"));
1931   EXPECT_TRUE(testAArch64Extension("exynos-m4", "ras"));
1932   EXPECT_TRUE(testAArch64Extension("exynos-m4", "rdm"));
1933   EXPECT_TRUE(testAArch64Extension("exynos-m5", "dotprod"));
1934   EXPECT_TRUE(testAArch64Extension("exynos-m5", "fp16"));
1935   EXPECT_TRUE(testAArch64Extension("exynos-m5", "lse"));
1936   EXPECT_TRUE(testAArch64Extension("exynos-m5", "ras"));
1937   EXPECT_TRUE(testAArch64Extension("exynos-m5", "rdm"));
1938   EXPECT_TRUE(testAArch64Extension("falkor", "rdm"));
1939   EXPECT_FALSE(testAArch64Extension("kryo", "ras"));
1940   EXPECT_TRUE(testAArch64Extension("saphira", "crc"));
1941   EXPECT_TRUE(testAArch64Extension("saphira", "lse"));
1942   EXPECT_TRUE(testAArch64Extension("saphira", "rdm"));
1943   EXPECT_TRUE(testAArch64Extension("saphira", "ras"));
1944   EXPECT_TRUE(testAArch64Extension("saphira", "rcpc"));
1945   EXPECT_TRUE(testAArch64Extension("saphira", "profile"));
1946   EXPECT_FALSE(testAArch64Extension("saphira", "fp16"));
1947   EXPECT_FALSE(testAArch64Extension("thunderx2t99", "ras"));
1948   EXPECT_FALSE(testAArch64Extension("thunderx", "lse"));
1949   EXPECT_FALSE(testAArch64Extension("thunderxt81", "lse"));
1950   EXPECT_FALSE(testAArch64Extension("thunderxt83", "lse"));
1951   EXPECT_FALSE(testAArch64Extension("thunderxt88", "lse"));
1952   EXPECT_TRUE(testAArch64Extension("tsv110", "aes"));
1953   EXPECT_TRUE(testAArch64Extension("tsv110", "sha2"));
1954   EXPECT_FALSE(testAArch64Extension("tsv110", "sha3"));
1955   EXPECT_FALSE(testAArch64Extension("tsv110", "sm4"));
1956   EXPECT_TRUE(testAArch64Extension("tsv110", "ras"));
1957   EXPECT_TRUE(testAArch64Extension("tsv110", "profile"));
1958   EXPECT_TRUE(testAArch64Extension("tsv110", "fp16"));
1959   EXPECT_TRUE(testAArch64Extension("tsv110", "fp16fml"));
1960   EXPECT_TRUE(testAArch64Extension("tsv110", "dotprod"));
1961   EXPECT_TRUE(testAArch64Extension("tsv110", "jscvt"));
1962   EXPECT_TRUE(testAArch64Extension("tsv110", "fcma"));
1963   EXPECT_TRUE(testAArch64Extension("a64fx", "fp16"));
1964   EXPECT_TRUE(testAArch64Extension("a64fx", "sve"));
1965   EXPECT_FALSE(testAArch64Extension("a64fx", "sve2"));
1966   EXPECT_TRUE(testAArch64Extension("carmel", "aes"));
1967   EXPECT_TRUE(testAArch64Extension("carmel", "sha2"));
1968   EXPECT_TRUE(testAArch64Extension("carmel", "fp16"));
1969 
1970   EXPECT_FALSE(testAArch64Extension(AArch64::ARMV8A, "ras"));
1971   EXPECT_FALSE(testAArch64Extension(AArch64::ARMV8_1A, "ras"));
1972   EXPECT_FALSE(testAArch64Extension(AArch64::ARMV8_2A, "profile"));
1973   EXPECT_FALSE(testAArch64Extension(AArch64::ARMV8_2A, "fp16"));
1974   EXPECT_FALSE(testAArch64Extension(AArch64::ARMV8_2A, "fp16fml"));
1975   EXPECT_FALSE(testAArch64Extension(AArch64::ARMV8_3A, "fp16"));
1976   EXPECT_FALSE(testAArch64Extension(AArch64::ARMV8_3A, "fp16fml"));
1977   EXPECT_FALSE(testAArch64Extension(AArch64::ARMV8_4A, "fp16"));
1978   EXPECT_FALSE(testAArch64Extension(AArch64::ARMV8_4A, "fp16fml"));
1979 }
1980 
1981 TEST(TargetParserTest, AArch64ExtensionFeatures) {
1982   std::vector<uint64_t> Extensions = {
1983       AArch64::AEK_CRC,          AArch64::AEK_LSE,
1984       AArch64::AEK_RDM,          AArch64::AEK_CRYPTO,
1985       AArch64::AEK_SM4,          AArch64::AEK_SHA3,
1986       AArch64::AEK_SHA2,         AArch64::AEK_AES,
1987       AArch64::AEK_DOTPROD,      AArch64::AEK_FP,
1988       AArch64::AEK_SIMD,         AArch64::AEK_FP16,
1989       AArch64::AEK_FP16FML,      AArch64::AEK_PROFILE,
1990       AArch64::AEK_RAS,          AArch64::AEK_SVE,
1991       AArch64::AEK_SVE2,         AArch64::AEK_SVE2AES,
1992       AArch64::AEK_SVE2SM4,      AArch64::AEK_SVE2SHA3,
1993       AArch64::AEK_SVE2BITPERM,  AArch64::AEK_RCPC,
1994       AArch64::AEK_RAND,         AArch64::AEK_MTE,
1995       AArch64::AEK_SSBS,         AArch64::AEK_SB,
1996       AArch64::AEK_PREDRES,      AArch64::AEK_BF16,
1997       AArch64::AEK_I8MM,         AArch64::AEK_F32MM,
1998       AArch64::AEK_F64MM,        AArch64::AEK_TME,
1999       AArch64::AEK_LS64,         AArch64::AEK_BRBE,
2000       AArch64::AEK_PAUTH,        AArch64::AEK_FLAGM,
2001       AArch64::AEK_SME,          AArch64::AEK_SMEF64F64,
2002       AArch64::AEK_SMEI16I64,    AArch64::AEK_SME2,
2003       AArch64::AEK_HBC,          AArch64::AEK_MOPS,
2004       AArch64::AEK_PERFMON,      AArch64::AEK_SVE2P1,
2005       AArch64::AEK_SME2P1,       AArch64::AEK_B16B16,
2006       AArch64::AEK_SMEF16F16,    AArch64::AEK_CSSC,
2007       AArch64::AEK_RCPC3,        AArch64::AEK_THE,
2008       AArch64::AEK_D128,         AArch64::AEK_LSE128,
2009       AArch64::AEK_SPECRES2,     AArch64::AEK_RASV2,
2010       AArch64::AEK_ITE,          AArch64::AEK_GCS,
2011       AArch64::AEK_FAMINMAX,     AArch64::AEK_FP8FMA,
2012       AArch64::AEK_SSVE_FP8FMA,  AArch64::AEK_FP8DOT2,
2013       AArch64::AEK_SSVE_FP8DOT2, AArch64::AEK_FP8DOT4,
2014       AArch64::AEK_SSVE_FP8DOT4, AArch64::AEK_LUT,
2015       AArch64::AEK_SME_LUTV2,    AArch64::AEK_SMEF8F16,
2016       AArch64::AEK_SMEF8F32,     AArch64::AEK_SMEFA64,
2017       AArch64::AEK_CPA,          AArch64::AEK_PAUTHLR,
2018       AArch64::AEK_TLBIW,        AArch64::AEK_JSCVT,
2019       AArch64::AEK_FCMA,         AArch64::AEK_FP8,
2020 
2021   };
2022 
2023   std::vector<StringRef> Features;
2024 
2025   AArch64::ExtensionBitset ExtVal;
2026   for (auto Ext : Extensions)
2027     ExtVal.set(Ext);
2028 
2029   // NONE has no feature names.
2030   // We return True here because NONE is a valid choice.
2031   EXPECT_TRUE(AArch64::getExtensionFeatures(
2032       AArch64::ExtensionBitset({AArch64::AEK_NONE}), Features));
2033   EXPECT_TRUE(!Features.size());
2034 
2035   AArch64::getExtensionFeatures(ExtVal, Features);
2036   EXPECT_EQ(Extensions.size(), Features.size());
2037 
2038   EXPECT_TRUE(llvm::is_contained(Features, "+crc"));
2039   EXPECT_TRUE(llvm::is_contained(Features, "+lse"));
2040   EXPECT_TRUE(llvm::is_contained(Features, "+rdm"));
2041   EXPECT_TRUE(llvm::is_contained(Features, "+crypto"));
2042   EXPECT_TRUE(llvm::is_contained(Features, "+sm4"));
2043   EXPECT_TRUE(llvm::is_contained(Features, "+sha3"));
2044   EXPECT_TRUE(llvm::is_contained(Features, "+sha2"));
2045   EXPECT_TRUE(llvm::is_contained(Features, "+aes"));
2046   EXPECT_TRUE(llvm::is_contained(Features, "+dotprod"));
2047   EXPECT_TRUE(llvm::is_contained(Features, "+fp-armv8"));
2048   EXPECT_TRUE(llvm::is_contained(Features, "+neon"));
2049   EXPECT_TRUE(llvm::is_contained(Features, "+fullfp16"));
2050   EXPECT_TRUE(llvm::is_contained(Features, "+fp16fml"));
2051   EXPECT_TRUE(llvm::is_contained(Features, "+spe"));
2052   EXPECT_TRUE(llvm::is_contained(Features, "+ras"));
2053   EXPECT_TRUE(llvm::is_contained(Features, "+sve"));
2054   EXPECT_TRUE(llvm::is_contained(Features, "+sve2"));
2055   EXPECT_TRUE(llvm::is_contained(Features, "+sve2-aes"));
2056   EXPECT_TRUE(llvm::is_contained(Features, "+sve2-sm4"));
2057   EXPECT_TRUE(llvm::is_contained(Features, "+sve2-sha3"));
2058   EXPECT_TRUE(llvm::is_contained(Features, "+sve2-bitperm"));
2059   EXPECT_TRUE(llvm::is_contained(Features, "+sve2p1"));
2060   EXPECT_TRUE(llvm::is_contained(Features, "+b16b16"));
2061   EXPECT_TRUE(llvm::is_contained(Features, "+rcpc"));
2062   EXPECT_TRUE(llvm::is_contained(Features, "+rand"));
2063   EXPECT_TRUE(llvm::is_contained(Features, "+mte"));
2064   EXPECT_TRUE(llvm::is_contained(Features, "+ssbs"));
2065   EXPECT_TRUE(llvm::is_contained(Features, "+sb"));
2066   EXPECT_TRUE(llvm::is_contained(Features, "+predres"));
2067   EXPECT_TRUE(llvm::is_contained(Features, "+bf16"));
2068   EXPECT_TRUE(llvm::is_contained(Features, "+i8mm"));
2069   EXPECT_TRUE(llvm::is_contained(Features, "+f32mm"));
2070   EXPECT_TRUE(llvm::is_contained(Features, "+f64mm"));
2071   EXPECT_TRUE(llvm::is_contained(Features, "+tme"));
2072   EXPECT_TRUE(llvm::is_contained(Features, "+ls64"));
2073   EXPECT_TRUE(llvm::is_contained(Features, "+brbe"));
2074   EXPECT_TRUE(llvm::is_contained(Features, "+pauth"));
2075   EXPECT_TRUE(llvm::is_contained(Features, "+flagm"));
2076   EXPECT_TRUE(llvm::is_contained(Features, "+sme"));
2077   EXPECT_TRUE(llvm::is_contained(Features, "+sme-f64f64"));
2078   EXPECT_TRUE(llvm::is_contained(Features, "+sme-i16i64"));
2079   EXPECT_TRUE(llvm::is_contained(Features, "+sme-f16f16"));
2080   EXPECT_TRUE(llvm::is_contained(Features, "+sme2"));
2081   EXPECT_TRUE(llvm::is_contained(Features, "+sme2p1"));
2082   EXPECT_TRUE(llvm::is_contained(Features, "+hbc"));
2083   EXPECT_TRUE(llvm::is_contained(Features, "+mops"));
2084   EXPECT_TRUE(llvm::is_contained(Features, "+perfmon"));
2085   EXPECT_TRUE(llvm::is_contained(Features, "+cssc"));
2086   EXPECT_TRUE(llvm::is_contained(Features, "+rcpc3"));
2087   EXPECT_TRUE(llvm::is_contained(Features, "+the"));
2088   EXPECT_TRUE(llvm::is_contained(Features, "+d128"));
2089   EXPECT_TRUE(llvm::is_contained(Features, "+lse128"));
2090   EXPECT_TRUE(llvm::is_contained(Features, "+specres2"));
2091   EXPECT_TRUE(llvm::is_contained(Features, "+ite"));
2092   EXPECT_TRUE(llvm::is_contained(Features, "+gcs"));
2093   EXPECT_TRUE(llvm::is_contained(Features, "+fp8"));
2094   EXPECT_TRUE(llvm::is_contained(Features, "+faminmax"));
2095   EXPECT_TRUE(llvm::is_contained(Features, "+fp8fma"));
2096   EXPECT_TRUE(llvm::is_contained(Features, "+ssve-fp8fma"));
2097   EXPECT_TRUE(llvm::is_contained(Features, "+fp8dot2"));
2098   EXPECT_TRUE(llvm::is_contained(Features, "+ssve-fp8dot2"));
2099   EXPECT_TRUE(llvm::is_contained(Features, "+fp8dot4"));
2100   EXPECT_TRUE(llvm::is_contained(Features, "+ssve-fp8dot4"));
2101   EXPECT_TRUE(llvm::is_contained(Features, "+lut"));
2102   EXPECT_TRUE(llvm::is_contained(Features, "+sme-lutv2"));
2103   EXPECT_TRUE(llvm::is_contained(Features, "+sme-f8f16"));
2104   EXPECT_TRUE(llvm::is_contained(Features, "+sme-f8f32"));
2105   EXPECT_TRUE(llvm::is_contained(Features, "+sme-fa64"));
2106   EXPECT_TRUE(llvm::is_contained(Features, "+cpa"));
2107   EXPECT_TRUE(llvm::is_contained(Features, "+pauth-lr"));
2108   EXPECT_TRUE(llvm::is_contained(Features, "+tlbiw"));
2109   EXPECT_TRUE(llvm::is_contained(Features, "+jsconv"));
2110   EXPECT_TRUE(llvm::is_contained(Features, "+complxnum"));
2111 
2112   // Assuming we listed every extension above, this should produce the same
2113   // result. (note that AEK_NONE doesn't have a name so it won't be in the
2114   // result despite its bit being set)
2115   std::vector<StringRef> AllFeatures;
2116   EXPECT_TRUE(AArch64::getExtensionFeatures(ExtVal, AllFeatures));
2117   EXPECT_THAT(Features, ::testing::ContainerEq(AllFeatures));
2118 }
2119 
2120 TEST(TargetParserTest, AArch64ArchFeatures) {
2121   EXPECT_EQ(AArch64::ARMV8A.ArchFeature, "+v8a");
2122   EXPECT_EQ(AArch64::ARMV8_1A.ArchFeature, "+v8.1a");
2123   EXPECT_EQ(AArch64::ARMV8_2A.ArchFeature, "+v8.2a");
2124   EXPECT_EQ(AArch64::ARMV8_3A.ArchFeature, "+v8.3a");
2125   EXPECT_EQ(AArch64::ARMV8_4A.ArchFeature, "+v8.4a");
2126   EXPECT_EQ(AArch64::ARMV8_5A.ArchFeature, "+v8.5a");
2127   EXPECT_EQ(AArch64::ARMV8_6A.ArchFeature, "+v8.6a");
2128   EXPECT_EQ(AArch64::ARMV8_7A.ArchFeature, "+v8.7a");
2129   EXPECT_EQ(AArch64::ARMV8_8A.ArchFeature, "+v8.8a");
2130   EXPECT_EQ(AArch64::ARMV8_9A.ArchFeature, "+v8.9a");
2131   EXPECT_EQ(AArch64::ARMV9A.ArchFeature, "+v9a");
2132   EXPECT_EQ(AArch64::ARMV9_1A.ArchFeature, "+v9.1a");
2133   EXPECT_EQ(AArch64::ARMV9_2A.ArchFeature, "+v9.2a");
2134   EXPECT_EQ(AArch64::ARMV9_3A.ArchFeature, "+v9.3a");
2135   EXPECT_EQ(AArch64::ARMV9_4A.ArchFeature, "+v9.4a");
2136   EXPECT_EQ(AArch64::ARMV9_5A.ArchFeature, "+v9.5a");
2137   EXPECT_EQ(AArch64::ARMV8R.ArchFeature, "+v8r");
2138 }
2139 
2140 TEST(TargetParserTest, AArch64ArchPartialOrder) {
2141   for (const auto *A : AArch64::ArchInfos) {
2142     EXPECT_EQ(*A, *A);
2143 
2144     // v8r has no relation to other valid architectures
2145     if (*A != AArch64::ARMV8R) {
2146       EXPECT_FALSE(A->implies(AArch64::ARMV8R));
2147       EXPECT_FALSE(AArch64::ARMV8R.implies(*A));
2148     }
2149   }
2150 
2151   for (const auto *A : {
2152            &AArch64::ARMV8_1A,
2153            &AArch64::ARMV8_2A,
2154            &AArch64::ARMV8_3A,
2155            &AArch64::ARMV8_4A,
2156            &AArch64::ARMV8_5A,
2157            &AArch64::ARMV8_6A,
2158            &AArch64::ARMV8_7A,
2159            &AArch64::ARMV8_8A,
2160            &AArch64::ARMV8_9A,
2161        })
2162     EXPECT_TRUE(A->implies(AArch64::ARMV8A));
2163 
2164   for (const auto *A :
2165        {&AArch64::ARMV9_1A, &AArch64::ARMV9_2A, &AArch64::ARMV9_3A,
2166         &AArch64::ARMV9_4A, &AArch64::ARMV9_5A})
2167     EXPECT_TRUE(A->implies(AArch64::ARMV9A));
2168 
2169   EXPECT_TRUE(AArch64::ARMV8_1A.implies(AArch64::ARMV8A));
2170   EXPECT_TRUE(AArch64::ARMV8_2A.implies(AArch64::ARMV8_1A));
2171   EXPECT_TRUE(AArch64::ARMV8_3A.implies(AArch64::ARMV8_2A));
2172   EXPECT_TRUE(AArch64::ARMV8_4A.implies(AArch64::ARMV8_3A));
2173   EXPECT_TRUE(AArch64::ARMV8_5A.implies(AArch64::ARMV8_4A));
2174   EXPECT_TRUE(AArch64::ARMV8_6A.implies(AArch64::ARMV8_5A));
2175   EXPECT_TRUE(AArch64::ARMV8_7A.implies(AArch64::ARMV8_6A));
2176   EXPECT_TRUE(AArch64::ARMV8_8A.implies(AArch64::ARMV8_7A));
2177   EXPECT_TRUE(AArch64::ARMV8_9A.implies(AArch64::ARMV8_8A));
2178 
2179   EXPECT_TRUE(AArch64::ARMV9_1A.implies(AArch64::ARMV9A));
2180   EXPECT_TRUE(AArch64::ARMV9_2A.implies(AArch64::ARMV9_1A));
2181   EXPECT_TRUE(AArch64::ARMV9_3A.implies(AArch64::ARMV9_2A));
2182   EXPECT_TRUE(AArch64::ARMV9_4A.implies(AArch64::ARMV9_3A));
2183   EXPECT_TRUE(AArch64::ARMV9_5A.implies(AArch64::ARMV9_4A));
2184 
2185   EXPECT_TRUE(AArch64::ARMV9A.implies(AArch64::ARMV8_5A));
2186   EXPECT_TRUE(AArch64::ARMV9_1A.implies(AArch64::ARMV8_6A));
2187   EXPECT_TRUE(AArch64::ARMV9_2A.implies(AArch64::ARMV8_7A));
2188   EXPECT_TRUE(AArch64::ARMV9_3A.implies(AArch64::ARMV8_8A));
2189   EXPECT_TRUE(AArch64::ARMV9_4A.implies(AArch64::ARMV8_9A));
2190 }
2191 
2192 TEST(TargetParserTest, AArch64ArchExtFeature) {
2193   const char *ArchExt[][4] = {
2194       {"crc", "nocrc", "+crc", "-crc"},
2195       {"crypto", "nocrypto", "+crypto", "-crypto"},
2196       {"flagm", "noflagm", "+flagm", "-flagm"},
2197       {"fp", "nofp", "+fp-armv8", "-fp-armv8"},
2198       {"simd", "nosimd", "+neon", "-neon"},
2199       {"fp16", "nofp16", "+fullfp16", "-fullfp16"},
2200       {"fp16fml", "nofp16fml", "+fp16fml", "-fp16fml"},
2201       {"profile", "noprofile", "+spe", "-spe"},
2202       {"ras", "noras", "+ras", "-ras"},
2203       {"lse", "nolse", "+lse", "-lse"},
2204       {"rdm", "nordm", "+rdm", "-rdm"},
2205       {"sve", "nosve", "+sve", "-sve"},
2206       {"sve2", "nosve2", "+sve2", "-sve2"},
2207       {"sve2-aes", "nosve2-aes", "+sve2-aes", "-sve2-aes"},
2208       {"sve2-sm4", "nosve2-sm4", "+sve2-sm4", "-sve2-sm4"},
2209       {"sve2-sha3", "nosve2-sha3", "+sve2-sha3", "-sve2-sha3"},
2210       {"sve2p1", "nosve2p1", "+sve2p1", "-sve2p1"},
2211       {"b16b16", "nob16b16", "+b16b16", "-b16b16"},
2212       {"sve2-bitperm", "nosve2-bitperm", "+sve2-bitperm", "-sve2-bitperm"},
2213       {"dotprod", "nodotprod", "+dotprod", "-dotprod"},
2214       {"rcpc", "norcpc", "+rcpc", "-rcpc"},
2215       {"rng", "norng", "+rand", "-rand"},
2216       {"memtag", "nomemtag", "+mte", "-mte"},
2217       {"tme", "notme", "+tme", "-tme"},
2218       {"pauth", "nopauth", "+pauth", "-pauth"},
2219       {"ssbs", "nossbs", "+ssbs", "-ssbs"},
2220       {"sb", "nosb", "+sb", "-sb"},
2221       {"predres", "nopredres", "+predres", "-predres"},
2222       {"i8mm", "noi8mm", "+i8mm", "-i8mm"},
2223       {"f32mm", "nof32mm", "+f32mm", "-f32mm"},
2224       {"f64mm", "nof64mm", "+f64mm", "-f64mm"},
2225       {"sme", "nosme", "+sme", "-sme"},
2226       {"sme-fa64", "nosme-fa64", "+sme-fa64", "-sme-fa64"},
2227       {"sme-f64f64", "nosme-f64f64", "+sme-f64f64", "-sme-f64f64"},
2228       {"sme-i16i64", "nosme-i16i64", "+sme-i16i64", "-sme-i16i64"},
2229       {"sme-f16f16", "nosme-f16f16", "+sme-f16f16", "-sme-f16f16"},
2230       {"sme2", "nosme2", "+sme2", "-sme2"},
2231       {"sme2p1", "nosme2p1", "+sme2p1", "-sme2p1"},
2232       {"hbc", "nohbc", "+hbc", "-hbc"},
2233       {"mops", "nomops", "+mops", "-mops"},
2234       {"pmuv3", "nopmuv3", "+perfmon", "-perfmon"},
2235       {"predres2", "nopredres2", "+specres2", "-specres2"},
2236       {"rasv2", "norasv2", "+rasv2", "-rasv2"},
2237       {"gcs", "nogcs", "+gcs", "-gcs"},
2238       {"fp8", "nofp8", "+fp8", "-fp8"},
2239       {"faminmax", "nofaminmax", "+faminmax", "-faminmax"},
2240       {"fp8fma", "nofp8fma", "+fp8fma", "-fp8fma"},
2241       {"ssve-fp8fma", "nossve-fp8fma", "+ssve-fp8fma", "-ssve-fp8fma"},
2242       {"fp8dot2", "nofp8dot2", "+fp8dot2", "-fp8dot2"},
2243       {"ssve-fp8dot2", "nossve-fp8dot2", "+ssve-fp8dot2", "-ssve-fp8dot2"},
2244       {"fp8dot4", "nofp8dot4", "+fp8dot4", "-fp8dot4"},
2245       {"ssve-fp8dot4", "nossve-fp8dot4", "+ssve-fp8dot4", "-ssve-fp8dot4"},
2246       {"lut", "nolut", "+lut", "-lut"},
2247       {"sme-lutv2", "nosme-lutv2", "+sme-lutv2", "-sme-lutv2"},
2248       {"sme-f8f16", "nosme-f8f16", "+sme-f8f16", "-sme-f8f16"},
2249       {"sme-f8f32", "nosme-f8f32", "+sme-f8f32", "-sme-f8f32"},
2250   };
2251 
2252   for (unsigned i = 0; i < std::size(ArchExt); i++) {
2253     EXPECT_EQ(StringRef(ArchExt[i][2]),
2254               AArch64::getArchExtFeature(ArchExt[i][0]));
2255     EXPECT_EQ(StringRef(ArchExt[i][3]),
2256               AArch64::getArchExtFeature(ArchExt[i][1]));
2257   }
2258 }
2259 
2260 TEST(TargetParserTest, AArch64PrintSupportedExtensions) {
2261   std::string expected =
2262       "All available -march extensions for AArch64\n\n"
2263       "    Name                Description\n"
2264       "    aes                 This is a long dummy description\n"
2265       "    b16b16\n"
2266       "    bf16\n";
2267 
2268   StringMap<StringRef> DummyMap;
2269   DummyMap["aes"] = "This is a long dummy description";
2270 
2271   outs().flush();
2272   testing::internal::CaptureStdout();
2273   AArch64::PrintSupportedExtensions(DummyMap);
2274   outs().flush();
2275   std::string captured = testing::internal::GetCapturedStdout();
2276 
2277   // Check that the start of the output is as expected.
2278   EXPECT_EQ(0ULL, captured.find(expected));
2279 
2280   // Should not include "none".
2281   EXPECT_EQ(std::string::npos, captured.find("none"));
2282   // Should not include anything that lacks a feature name. Checking a few here
2283   // but not all as if one is hidden correctly the rest should be.
2284   EXPECT_EQ(std::string::npos, captured.find("memtag3"));
2285   EXPECT_EQ(std::string::npos, captured.find("sha1"));
2286   EXPECT_EQ(std::string::npos, captured.find("ssbs2"));
2287 }
2288 
2289 struct AArch64ExtensionDependenciesBaseArchTestParams {
2290   const llvm::AArch64::ArchInfo &Arch;
2291   std::vector<StringRef> Modifiers;
2292   std::vector<StringRef> ExpectedPos;
2293   std::vector<StringRef> ExpectedNeg;
2294 };
2295 
2296 class AArch64ExtensionDependenciesBaseArchTestFixture
2297     : public ::testing::TestWithParam<
2298           AArch64ExtensionDependenciesBaseArchTestParams> {};
2299 
2300 struct AArch64ExtensionDependenciesBaseCPUTestParams {
2301   StringRef CPUName;
2302   std::vector<StringRef> Modifiers;
2303   std::vector<StringRef> ExpectedPos;
2304   std::vector<StringRef> ExpectedNeg;
2305 };
2306 
2307 class AArch64ExtensionDependenciesBaseCPUTestFixture
2308     : public ::testing::TestWithParam<
2309           AArch64ExtensionDependenciesBaseCPUTestParams> {};
2310 
2311 TEST_P(AArch64ExtensionDependenciesBaseArchTestFixture,
2312        AArch64ExtensionDependenciesBaseArch) {
2313   auto Params = GetParam();
2314 
2315   llvm::AArch64::ExtensionSet Extensions;
2316   Extensions.addArchDefaults(Params.Arch);
2317   for (auto M : Params.Modifiers) {
2318     bool success = Extensions.parseModifier(M);
2319     EXPECT_TRUE(success);
2320   }
2321   std::vector<StringRef> Features;
2322   Extensions.toLLVMFeatureList(Features);
2323 
2324   for (auto E : Params.ExpectedPos) {
2325     std::string PosString = "+";
2326     PosString += E;
2327     std::string NegString = "-";
2328     NegString += E;
2329     ASSERT_THAT(Features, Contains(StrEq(PosString)));
2330     ASSERT_THAT(Features, Not(Contains(StrEq(NegString))));
2331   }
2332 
2333   for (auto E : Params.ExpectedNeg) {
2334     std::string PosString = "+";
2335     PosString += E;
2336     ASSERT_THAT(Features, Not(Contains(StrEq(PosString))));
2337     // Features default to off, so the negative string is not expected in many
2338     // cases.
2339   }
2340 }
2341 
2342 TEST_P(AArch64ExtensionDependenciesBaseCPUTestFixture,
2343        AArch64ExtensionDependenciesBaseCPU) {
2344   auto Params = GetParam();
2345 
2346   llvm::AArch64::ExtensionSet Extensions;
2347   const std::optional<llvm::AArch64::CpuInfo> CPU =
2348       llvm::AArch64::parseCpu(Params.CPUName);
2349   EXPECT_TRUE(CPU);
2350   Extensions.addCPUDefaults(*CPU);
2351   for (auto M : Params.Modifiers) {
2352     bool success = Extensions.parseModifier(M);
2353     EXPECT_TRUE(success);
2354   }
2355   std::vector<StringRef> Features;
2356   Extensions.toLLVMFeatureList(Features);
2357 
2358   for (auto E : Params.ExpectedPos) {
2359     std::string PosString = "+";
2360     PosString += E;
2361     std::string NegString = "-";
2362     NegString += E;
2363     ASSERT_THAT(Features, Contains(StrEq(PosString)));
2364     ASSERT_THAT(Features, Not(Contains(StrEq(NegString))));
2365   }
2366 
2367   for (auto E : Params.ExpectedNeg) {
2368     std::string PosString = "+";
2369     PosString += E;
2370     ASSERT_THAT(Features, Not(Contains(StrEq(PosString))));
2371     // Features default to off, so the negative string is not expected in many
2372     // cases.
2373   }
2374 }
2375 
2376 AArch64ExtensionDependenciesBaseArchTestParams
2377     AArch64ExtensionDependenciesArchData[] = {
2378         // Base architecture features
2379         {AArch64::ARMV8A, {}, {"v8a", "fp-armv8", "neon"}, {}},
2380         {AArch64::ARMV8_1A,
2381          {},
2382          {"v8.1a", "crc", "fp-armv8", "lse", "rdm", "neon"},
2383          {}},
2384         {AArch64::ARMV9_5A, {}, {"v9.5a", "sve", "sve2", "mops", "cpa"}, {}},
2385 
2386         // Positive modifiers
2387         {AArch64::ARMV8A, {"fp16"}, {"fullfp16"}, {}},
2388         {AArch64::ARMV8A, {"dotprod"}, {"dotprod"}, {}},
2389 
2390         // Negative modifiers
2391         {AArch64::ARMV8A, {"nofp"}, {"v8a"}, {"fp-armv8", "neon"}},
2392 
2393         // Mixed modifiers
2394         {AArch64::ARMV8A,
2395          {"fp16", "nofp16"},
2396          {"v8a", "fp-armv8", "neon"},
2397          {"fullfp16"}},
2398         {AArch64::ARMV8A,
2399          {"fp16", "nofp"},
2400          {"v8a"},
2401          {"fp-armv8", "neon", "fullfp16"}},
2402 
2403         // Long dependency chains: sve2-bitperm -> sve2 -> sve -> fp16 -> fp
2404         {AArch64::ARMV8A,
2405          {"nofp", "sve2-bitperm"},
2406          {"fp-armv8", "fullfp16", "sve", "sve2", "sve2-bitperm"},
2407          {}},
2408         {AArch64::ARMV8A,
2409          {"sve2-bitperm", "nofp16"},
2410          {"fp-armv8"},
2411          {"full-fp16", "sve", "sve2", "sve2-bitperm"}},
2412 
2413         // Meaning of +crypto varies with base architecture.
2414         {AArch64::ARMV8A, {"crypto"}, {"aes", "sha2"}, {}},
2415         {AArch64::ARMV8_4A, {"crypto"}, {"aes", "sha2", "sha3", "sm4"}, {}},
2416         {AArch64::ARMV9A, {"crypto"}, {"aes", "sha2", "sha3", "sm4"}, {}},
2417 
2418         // -crypto always disables all crypto features, even if it wouldn't
2419         // enable them.
2420         {AArch64::ARMV8A,
2421          {"aes", "sha2", "sha3", "sm4", "nocrypto"},
2422          {},
2423          {"aes", "sha2", "sha3", "sm4"}},
2424         {AArch64::ARMV8_4A,
2425          {"aes", "sha2", "sha3", "sm4", "nocrypto"},
2426          {},
2427          {"aes", "sha2", "sha3", "sm4"}},
2428 
2429         // +fp16 implies +fp16fml for v8.4A+, but not v9.0-A+
2430         {AArch64::ARMV8_3A, {"fp16"}, {"fullfp16"}, {"fp16fml"}},
2431         {AArch64::ARMV9A, {"fp16"}, {"fullfp16"}, {"fp16fml"}},
2432         {AArch64::ARMV8_4A, {"fp16"}, {"fullfp16", "fp16fml"}, {}},
2433 
2434         // fp -> fp16
2435         {AArch64::ARMV8A, {"nofp", "fp16"}, {"fp-armv8", "fullfp16"}, {}},
2436         {AArch64::ARMV8A, {"fp16", "nofp"}, {}, {"fp-armv8", "fullfp16"}},
2437 
2438         // fp -> simd
2439         {AArch64::ARMV8A, {"nofp", "simd"}, {"fp-armv8", "neon"}, {}},
2440         {AArch64::ARMV8A, {"simd", "nofp"}, {}, {"fp-armv8", "neon"}},
2441 
2442         // fp -> jscvt
2443         {AArch64::ARMV8A, {"nofp", "jscvt"}, {"fp-armv8", "jsconv"}, {}},
2444         {AArch64::ARMV8A, {"jscvt", "nofp"}, {}, {"fp-armv8", "jsconv"}},
2445 
2446         // simd -> {aes, sha2, sha3, sm4}
2447         {AArch64::ARMV8A, {"nosimd", "aes"}, {"neon", "aes"}, {}},
2448         {AArch64::ARMV8A, {"aes", "nosimd"}, {}, {"neon", "aes"}},
2449         {AArch64::ARMV8A, {"nosimd", "sha2"}, {"neon", "sha2"}, {}},
2450         {AArch64::ARMV8A, {"sha2", "nosimd"}, {}, {"neon", "sha2"}},
2451         {AArch64::ARMV8A, {"nosimd", "sha3"}, {"neon", "sha3"}, {}},
2452         {AArch64::ARMV8A, {"sha3", "nosimd"}, {}, {"neon", "sha3"}},
2453         {AArch64::ARMV8A, {"nosimd", "sm4"}, {"neon", "sm4"}, {}},
2454         {AArch64::ARMV8A, {"sm4", "nosimd"}, {}, {"neon", "sm4"}},
2455 
2456         // simd -> {rdm, dotprod, fcma}
2457         {AArch64::ARMV8A, {"nosimd", "rdm"}, {"neon", "rdm"}, {}},
2458         {AArch64::ARMV8A, {"rdm", "nosimd"}, {}, {"neon", "rdm"}},
2459         {AArch64::ARMV8A, {"nosimd", "dotprod"}, {"neon", "dotprod"}, {}},
2460         {AArch64::ARMV8A, {"dotprod", "nosimd"}, {}, {"neon", "dotprod"}},
2461         {AArch64::ARMV8A, {"nosimd", "fcma"}, {"neon", "complxnum"}, {}},
2462         {AArch64::ARMV8A, {"fcma", "nosimd"}, {}, {"neon", "complxnum"}},
2463 
2464         // fp16 -> {fp16fml, sve}
2465         {AArch64::ARMV8A, {"nofp16", "fp16fml"}, {"fullfp16", "fp16fml"}, {}},
2466         {AArch64::ARMV8A, {"fp16fml", "nofp16"}, {}, {"fullfp16", "fp16fml"}},
2467         {AArch64::ARMV8A, {"nofp16", "sve"}, {"fullfp16", "sve"}, {}},
2468         {AArch64::ARMV8A, {"sve", "nofp16"}, {}, {"fullfp16", "sve"}},
2469 
2470         // bf16 -> {sme, b16b16}
2471         {AArch64::ARMV8A, {"nobf16", "sme"}, {"bf16", "sme"}, {}},
2472         {AArch64::ARMV8A, {"sme", "nobf16"}, {}, {"bf16", "sme"}},
2473         {AArch64::ARMV8A, {"nobf16", "b16b16"}, {"bf16", "b16b16"}, {}},
2474         {AArch64::ARMV8A, {"b16b16", "nobf16"}, {}, {"bf16", "b16b16"}},
2475 
2476         // sve -> {sve2, f32mm, f64mm}
2477         {AArch64::ARMV8A, {"nosve", "sve2"}, {"sve", "sve2"}, {}},
2478         {AArch64::ARMV8A, {"sve2", "nosve"}, {}, {"sve", "sve2"}},
2479         {AArch64::ARMV8A, {"nosve", "f32mm"}, {"sve", "f32mm"}, {}},
2480         {AArch64::ARMV8A, {"f32mm", "nosve"}, {}, {"sve", "f32mm"}},
2481         {AArch64::ARMV8A, {"nosve", "f64mm"}, {"sve", "f64mm"}, {}},
2482         {AArch64::ARMV8A, {"f64mm", "nosve"}, {}, {"sve", "f64mm"}},
2483 
2484         // sve2 -> {sve2p1, sve2-bitperm, sve2-aes, sve2-sha3, sve2-sm4}
2485         {AArch64::ARMV8A, {"nosve2", "sve2p1"}, {"sve2", "sve2p1"}, {}},
2486         {AArch64::ARMV8A, {"sve2p1", "nosve2"}, {}, {"sve2", "sve2p1"}},
2487         {AArch64::ARMV8A,
2488          {"nosve2", "sve2-bitperm"},
2489          {"sve2", "sve2-bitperm"},
2490          {}},
2491         {AArch64::ARMV8A,
2492          {"sve2-bitperm", "nosve2"},
2493          {},
2494          {"sve2", "sve2-bitperm"}},
2495         {AArch64::ARMV8A, {"nosve2", "sve2-aes"}, {"sve2", "sve2-aes"}, {}},
2496         {AArch64::ARMV8A, {"sve2-aes", "nosve2"}, {}, {"sve2", "sve2-aes"}},
2497         {AArch64::ARMV8A, {"nosve2", "sve2-sha3"}, {"sve2", "sve2-sha3"}, {}},
2498         {AArch64::ARMV8A, {"sve2-sha3", "nosve2"}, {}, {"sve2", "sve2-sha3"}},
2499         {AArch64::ARMV8A, {"nosve2", "sve2-sm4"}, {"sve2", "sve2-sm4"}, {}},
2500         {AArch64::ARMV8A, {"sve2-sm4", "nosve2"}, {}, {"sve2", "sve2-sm4"}},
2501 
2502         // sme -> {sme2, sme-f16f16, sme-f64f64, sme-i16i64, sme-fa64}
2503         {AArch64::ARMV8A, {"nosme", "sme2"}, {"sme", "sme2"}, {}},
2504         {AArch64::ARMV8A, {"sme2", "nosme"}, {}, {"sme", "sme2"}},
2505         {AArch64::ARMV8A, {"nosme", "sme-f16f16"}, {"sme", "sme-f16f16"}, {}},
2506         {AArch64::ARMV8A, {"sme-f16f16", "nosme"}, {}, {"sme", "sme-f16f16"}},
2507         {AArch64::ARMV8A, {"nosme", "sme-f64f64"}, {"sme", "sme-f64f64"}, {}},
2508         {AArch64::ARMV8A, {"sme-f64f64", "nosme"}, {}, {"sme", "sme-f64f64"}},
2509         {AArch64::ARMV8A, {"nosme", "sme-i16i64"}, {"sme", "sme-i16i64"}, {}},
2510         {AArch64::ARMV8A, {"sme-i16i64", "nosme"}, {}, {"sme", "sme-i16i64"}},
2511         {AArch64::ARMV8A, {"nosme", "sme-fa64"}, {"sme", "sme-fa64"}, {}},
2512         {AArch64::ARMV8A, {"sme-fa64", "nosme"}, {}, {"sme", "sme-fa64"}},
2513 
2514         // sme2 -> {sme2p1, ssve-fp8fma, ssve-fp8dot2, ssve-fp8dot4, sme-f8f16,
2515         // sme-f8f32}
2516         {AArch64::ARMV8A, {"nosme2", "sme2p1"}, {"sme2", "sme2p1"}, {}},
2517         {AArch64::ARMV8A, {"sme2p1", "nosme2"}, {}, {"sme2", "sme2p1"}},
2518         {AArch64::ARMV8A,
2519          {"nosme2", "ssve-fp8fma"},
2520          {"sme2", "ssve-fp8fma"},
2521          {}},
2522         {AArch64::ARMV8A,
2523          {"ssve-fp8fma", "nosme2"},
2524          {},
2525          {"sme2", "ssve-fp8fma"}},
2526         {AArch64::ARMV8A,
2527          {"nosme2", "ssve-fp8dot2"},
2528          {"sme2", "ssve-fp8dot2"},
2529          {}},
2530         {AArch64::ARMV8A,
2531          {"ssve-fp8dot2", "nosme2"},
2532          {},
2533          {"sme2", "ssve-fp8dot2"}},
2534         {AArch64::ARMV8A,
2535          {"nosme2", "ssve-fp8dot4"},
2536          {"sme2", "ssve-fp8dot4"},
2537          {}},
2538         {AArch64::ARMV8A,
2539          {"ssve-fp8dot4", "nosme2"},
2540          {},
2541          {"sme2", "ssve-fp8dot4"}},
2542         {AArch64::ARMV8A, {"nosme2", "sme-f8f16"}, {"sme2", "sme-f8f16"}, {}},
2543         {AArch64::ARMV8A, {"sme-f8f16", "nosme2"}, {}, {"sme2", "sme-f8f16"}},
2544         {AArch64::ARMV8A, {"nosme2", "sme-f8f32"}, {"sme2", "sme-f8f32"}, {}},
2545         {AArch64::ARMV8A, {"sme-f8f32", "nosme2"}, {}, {"sme2", "sme-f8f32"}},
2546 
2547         // fp8 -> {sme-f8f16, sme-f8f32}
2548         {AArch64::ARMV8A, {"nofp8", "sme-f8f16"}, {"fp8", "sme-f8f16"}, {}},
2549         {AArch64::ARMV8A, {"sme-f8f16", "nofp8"}, {}, {"fp8", "sme-f8f16"}},
2550         {AArch64::ARMV8A, {"nofp8", "sme-f8f32"}, {"fp8", "sme-f8f32"}, {}},
2551         {AArch64::ARMV8A, {"sme-f8f32", "nofp8"}, {}, {"fp8", "sme-f8f32"}},
2552 
2553         // lse -> lse128
2554         {AArch64::ARMV8A, {"nolse", "lse128"}, {"lse", "lse128"}, {}},
2555         {AArch64::ARMV8A, {"lse128", "nolse"}, {}, {"lse", "lse128"}},
2556 
2557         // predres -> predres2
2558         {AArch64::ARMV8A,
2559          {"nopredres", "predres2"},
2560          {"predres", "specres2"},
2561          {}},
2562         {AArch64::ARMV8A,
2563          {"predres2", "nopredres"},
2564          {},
2565          {"predres", "specres2"}},
2566 
2567         // ras -> ras2
2568         {AArch64::ARMV8A, {"noras", "rasv2"}, {"ras", "rasv2"}, {}},
2569         {AArch64::ARMV8A, {"rasv2", "noras"}, {}, {"ras", "rasv2"}},
2570 
2571         // rcpc -> rcpc3
2572         {AArch64::ARMV8A, {"norcpc", "rcpc3"}, {"rcpc", "rcpc3"}, {}},
2573         {AArch64::ARMV8A, {"rcpc3", "norcpc"}, {}, {"rcpc", "rcpc3"}},
2574 };
2575 
2576 INSTANTIATE_TEST_SUITE_P(
2577     AArch64ExtensionDependenciesBaseArch,
2578     AArch64ExtensionDependenciesBaseArchTestFixture,
2579     ::testing::ValuesIn(AArch64ExtensionDependenciesArchData));
2580 
2581 AArch64ExtensionDependenciesBaseCPUTestParams
2582     AArch64ExtensionDependenciesCPUData[] = {
2583         // Base CPU features
2584         {"cortex-a57",
2585          {},
2586          {"v8a", "aes", "crc", "fp-armv8", "sha2", "neon"},
2587          {}},
2588         {"cortex-r82",
2589          {},
2590          {"v8r", "crc", "dotprod", "fp-armv8", "fullfp16", "fp16fml", "lse",
2591           "ras", "rcpc", "rdm", "sb", "neon", "ssbs"},
2592          {}},
2593         {"cortex-a520",
2594          {},
2595          {"v9.2a",    "bf16",    "crc",  "dotprod",      "flagm", "fp-armv8",
2596           "fullfp16", "fp16fml", "i8mm", "lse",          "mte",   "pauth",
2597           "perfmon",  "predres", "ras",  "rcpc",         "rdm",   "sb",
2598           "neon",     "ssbs",    "sve",  "sve2-bitperm", "sve2"},
2599          {}},
2600 
2601         // Negative modifiers
2602         {"cortex-r82",
2603          {"nofp"},
2604          {"v8r", "crc", "lse", "ras", "rcpc", "sb", "ssbs"},
2605          {"fp-armv8", "neon", "fullfp16", "fp16fml", "dotprod", "rdm"}},
2606 };
2607 
2608 INSTANTIATE_TEST_SUITE_P(
2609     AArch64ExtensionDependenciesBaseCPU,
2610     AArch64ExtensionDependenciesBaseCPUTestFixture,
2611     ::testing::ValuesIn(AArch64ExtensionDependenciesCPUData));
2612 
2613 } // namespace
2614