[llvm-branch-commits] [llvm] a6783cd - [llvm][ARM/AArch64] Convert Target Parser CPU tests to fixtures

David Spickett via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Dec 22 01:11:26 PST 2020


Author: David Spickett
Date: 2020-12-22T09:07:20Z
New Revision: a6783cd7b65d6c739c4dc20ec5191b2e862a4237

URL: https://github.com/llvm/llvm-project/commit/a6783cd7b65d6c739c4dc20ec5191b2e862a4237
DIFF: https://github.com/llvm/llvm-project/commit/a6783cd7b65d6c739c4dc20ec5191b2e862a4237.diff

LOG: [llvm][ARM/AArch64] Convert Target Parser CPU tests to fixtures

Also convert the test function to use EXPECT_EQ and
remove the special case for the AEK_NONE extension.

This means that each test is marked as failing separatley
and the accumultated EXPECT failures are printed next
to that test, with its parameters.

Before they would be hidden by the "pass &=" pattern
and failures would print in one block since it was a
"single" test.

Example of the new failure messages:
```
ARMCPUTestsPart1/ARMCPUTestFixture.ARMCPUTests/6
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from ARMCPUTestsPart1/ARMCPUTestFixture
[ RUN      ] ARMCPUTestsPart1/ARMCPUTestFixture.ARMCPUTests/6
/work/open_source/nightly-llvm/llvm-project/llvm/unittests/Support/TargetParserTest.cpp:66:
Failure
      Expected: params.ExpectedFlags
      Which is: 3405705229
To be equal to: default_extensions
      Which is: 1
[  FAILED  ] ARMCPUTestsPart1/ARMCPUTestFixture.ARMCPUTests/6, where
GetParam() = "arm8", "armv4", "none", 0xcafef00d, "4" (0 ms)
```

Reviewed By: MarkMurrayARM

Differential Revision: https://reviews.llvm.org/D93392

Added: 
    

Modified: 
    llvm/unittests/Support/TargetParserTest.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/unittests/Support/TargetParserTest.cpp b/llvm/unittests/Support/TargetParserTest.cpp
index 8407397e4ed8..5208f6a75b02 100644
--- a/llvm/unittests/Support/TargetParserTest.cpp
+++ b/llvm/unittests/Support/TargetParserTest.cpp
@@ -31,308 +31,315 @@ const char *ARMArch[] = {
     "armv8m.main", "iwmmxt",       "iwmmxt2",     "xscale",       "armv8.1-m.main",
 };
 
-bool testARMCPU(StringRef CPUName, StringRef ExpectedArch,
-                StringRef ExpectedFPU, uint64_t ExpectedFlags,
-                StringRef CPUAttr) {
-  ARM::ArchKind AK = ARM::parseCPUArch(CPUName);
-  bool pass = ARM::getArchName(AK).equals(ExpectedArch);
-  unsigned FPUKind = ARM::getDefaultFPU(CPUName, AK);
-  pass &= ARM::getFPUName(FPUKind).equals(ExpectedFPU);
-
-  uint64_t ExtKind = ARM::getDefaultExtensions(CPUName, AK);
-  if (ExtKind > 1 && (ExtKind & ARM::AEK_NONE))
-    pass &= ((ExtKind ^ ARM::AEK_NONE) == ExpectedFlags);
-  else
-    pass &= (ExtKind == ExpectedFlags);
-  pass &= ARM::getCPUAttr(AK).equals(CPUAttr);
-
-  return pass;
+struct ARMCPUTestParams {
+  ARMCPUTestParams(StringRef CPUName, StringRef ExpectedArch,
+                   StringRef ExpectedFPU, uint64_t ExpectedFlags,
+                   StringRef CPUAttr)
+      : CPUName(CPUName), ExpectedArch(ExpectedArch), ExpectedFPU(ExpectedFPU),
+        ExpectedFlags(ExpectedFlags), CPUAttr(CPUAttr) {}
+
+  friend std::ostream &operator<<(std::ostream &os,
+                                  const ARMCPUTestParams &params) {
+    return os << "\"" << params.CPUName.str() << "\", \""
+              << params.ExpectedArch.str() << "\", \""
+              << params.ExpectedFPU.str() << "\", 0x" << std::hex
+              << params.ExpectedFlags << ", \"" << params.CPUAttr.str() << "\"";
+  }
+
+  StringRef CPUName;
+  StringRef ExpectedArch;
+  StringRef ExpectedFPU;
+  uint64_t ExpectedFlags;
+  StringRef CPUAttr;
+};
+
+class ARMCPUTestFixture : public ::testing::TestWithParam<ARMCPUTestParams> {};
+
+TEST_P(ARMCPUTestFixture, ARMCPUTests) {
+  auto params = GetParam();
+
+  ARM::ArchKind AK = ARM::parseCPUArch(params.CPUName);
+  EXPECT_EQ(params.ExpectedArch, ARM::getArchName(AK));
+
+  unsigned FPUKind = ARM::getDefaultFPU(params.CPUName, AK);
+  EXPECT_EQ(params.ExpectedFPU, ARM::getFPUName(FPUKind));
+
+  uint64_t default_extensions = ARM::getDefaultExtensions(params.CPUName, AK);
+  EXPECT_EQ(params.ExpectedFlags, default_extensions);
+
+  EXPECT_EQ(params.CPUAttr, ARM::getCPUAttr(AK));
 }
 
-TEST(TargetParserTest, testARMCPU) {
-  EXPECT_TRUE(testARMCPU("invalid", "invalid", "invalid",
-                         ARM::AEK_NONE, ""));
-  EXPECT_TRUE(testARMCPU("generic", "invalid", "none",
-                         ARM::AEK_NONE, ""));
-
-  EXPECT_TRUE(testARMCPU("arm2", "armv2", "none",
-                         ARM::AEK_NONE, "2"));
-  EXPECT_TRUE(testARMCPU("arm3", "armv2a", "none",
-                         ARM::AEK_NONE, "2A"));
-  EXPECT_TRUE(testARMCPU("arm6", "armv3", "none",
-                         ARM::AEK_NONE, "3"));
-  EXPECT_TRUE(testARMCPU("arm7m", "armv3m", "none",
-                         ARM::AEK_NONE, "3M"));
-  EXPECT_TRUE(testARMCPU("arm8", "armv4", "none",
-                         ARM::AEK_NONE, "4"));
-  EXPECT_TRUE(testARMCPU("arm810", "armv4", "none",
-                         ARM::AEK_NONE, "4"));
-  EXPECT_TRUE(testARMCPU("strongarm", "armv4", "none",
-                         ARM::AEK_NONE, "4"));
-  EXPECT_TRUE(testARMCPU("strongarm110", "armv4", "none",
-                         ARM::AEK_NONE, "4"));
-  EXPECT_TRUE(testARMCPU("strongarm1100", "armv4", "none",
-                         ARM::AEK_NONE, "4"));
-  EXPECT_TRUE(testARMCPU("strongarm1110", "armv4", "none",
-                         ARM::AEK_NONE, "4"));
-  EXPECT_TRUE(testARMCPU("arm7tdmi", "armv4t", "none",
-                         ARM::AEK_NONE, "4T"));
-  EXPECT_TRUE(testARMCPU("arm7tdmi-s", "armv4t", "none",
-                         ARM::AEK_NONE, "4T"));
-  EXPECT_TRUE(testARMCPU("arm710t", "armv4t", "none",
-                         ARM::AEK_NONE, "4T"));
-  EXPECT_TRUE(testARMCPU("arm720t", "armv4t", "none",
-                         ARM::AEK_NONE, "4T"));
-  EXPECT_TRUE(testARMCPU("arm9", "armv4t", "none",
-                         ARM::AEK_NONE, "4T"));
-  EXPECT_TRUE(testARMCPU("arm9tdmi", "armv4t", "none",
-                         ARM::AEK_NONE, "4T"));
-  EXPECT_TRUE(testARMCPU("arm920", "armv4t", "none",
-                         ARM::AEK_NONE, "4T"));
-  EXPECT_TRUE(testARMCPU("arm920t", "armv4t", "none",
-                         ARM::AEK_NONE, "4T"));
-  EXPECT_TRUE(testARMCPU("arm922t", "armv4t", "none",
-                         ARM::AEK_NONE, "4T"));
-  EXPECT_TRUE(testARMCPU("arm9312", "armv4t", "none",
-                         ARM::AEK_NONE, "4T"));
-  EXPECT_TRUE(testARMCPU("arm940t", "armv4t", "none",
-                         ARM::AEK_NONE, "4T"));
-  EXPECT_TRUE(testARMCPU("ep9312", "armv4t", "none",
-                         ARM::AEK_NONE, "4T"));
-  EXPECT_TRUE(testARMCPU("arm10tdmi", "armv5t", "none",
-                         ARM::AEK_NONE, "5T"));
-  EXPECT_TRUE(testARMCPU("arm1020t", "armv5t", "none",
-                         ARM::AEK_NONE, "5T"));
-  EXPECT_TRUE(testARMCPU("arm9e", "armv5te", "none",
-                         ARM::AEK_DSP, "5TE"));
-  EXPECT_TRUE(testARMCPU("arm946e-s", "armv5te", "none",
-                         ARM::AEK_DSP, "5TE"));
-  EXPECT_TRUE(testARMCPU("arm966e-s", "armv5te", "none",
-                         ARM::AEK_DSP, "5TE"));
-  EXPECT_TRUE(testARMCPU("arm968e-s", "armv5te", "none",
-                         ARM::AEK_DSP, "5TE"));
-  EXPECT_TRUE(testARMCPU("arm10e", "armv5te", "none",
-                         ARM::AEK_DSP, "5TE"));
-  EXPECT_TRUE(testARMCPU("arm1020e", "armv5te", "none",
-                         ARM::AEK_DSP, "5TE"));
-  EXPECT_TRUE(testARMCPU("arm1022e", "armv5te", "none",
-                         ARM::AEK_DSP, "5TE"));
-  EXPECT_TRUE(testARMCPU("arm926ej-s", "armv5tej", "none",
-                         ARM::AEK_DSP, "5TEJ"));
-  EXPECT_TRUE(testARMCPU("arm1136j-s", "armv6", "none",
-                         ARM::AEK_DSP, "6"));
-  EXPECT_TRUE(testARMCPU("arm1136jf-s", "armv6", "vfpv2",
-                         ARM::AEK_DSP, "6"));
-  EXPECT_TRUE(testARMCPU("arm1136jz-s", "armv6", "none",
-                         ARM::AEK_DSP, "6"));
-  EXPECT_TRUE(testARMCPU("arm1176jz-s", "armv6kz", "none",
-                         ARM::AEK_SEC | ARM::AEK_DSP, "6KZ"));
-  EXPECT_TRUE(testARMCPU("mpcore", "armv6k", "vfpv2",
-                         ARM::AEK_DSP, "6K"));
-  EXPECT_TRUE(testARMCPU("mpcorenovfp", "armv6k", "none",
-                         ARM::AEK_DSP, "6K"));
-  EXPECT_TRUE(testARMCPU("arm1176jzf-s", "armv6kz", "vfpv2",
-                         ARM::AEK_SEC | ARM::AEK_DSP, "6KZ"));
-  EXPECT_TRUE(testARMCPU("arm1156t2-s", "armv6t2", "none",
-                         ARM::AEK_DSP, "6T2"));
-  EXPECT_TRUE(testARMCPU("arm1156t2f-s", "armv6t2", "vfpv2",
-                         ARM::AEK_DSP, "6T2"));
-  EXPECT_TRUE(testARMCPU("cortex-m0", "armv6-m", "none",
-                         ARM::AEK_NONE, "6-M"));
-  EXPECT_TRUE(testARMCPU("cortex-m0plus", "armv6-m", "none",
-                         ARM::AEK_NONE, "6-M"));
-  EXPECT_TRUE(testARMCPU("cortex-m1", "armv6-m", "none",
-                         ARM::AEK_NONE, "6-M"));
-  EXPECT_TRUE(testARMCPU("sc000", "armv6-m", "none",
-                         ARM::AEK_NONE, "6-M"));
-  EXPECT_TRUE(testARMCPU("cortex-a5", "armv7-a", "neon-vfpv4",
-                         ARM::AEK_MP | ARM::AEK_SEC | ARM::AEK_DSP, "7-A"));
-  EXPECT_TRUE(testARMCPU("cortex-a7", "armv7-a", "neon-vfpv4",
+// Note that we include ARM::AEK_NONE even when there are other extensions
+// we expect. This is because the default extensions for a CPU are the sum
+// of the default extensions for its architecture and for the CPU.
+// So if a CPU has no extra extensions, it adds AEK_NONE.
+INSTANTIATE_TEST_CASE_P(
+    ARMCPUTestsPart1, ARMCPUTestFixture,
+    ::testing::Values(
+        ARMCPUTestParams("invalid", "invalid", "invalid", ARM::AEK_NONE, ""),
+        ARMCPUTestParams("generic", "invalid", "none", ARM::AEK_NONE, ""),
+
+        ARMCPUTestParams("arm2", "armv2", "none", ARM::AEK_NONE, "2"),
+        ARMCPUTestParams("arm3", "armv2a", "none", ARM::AEK_NONE, "2A"),
+        ARMCPUTestParams("arm6", "armv3", "none", ARM::AEK_NONE, "3"),
+        ARMCPUTestParams("arm7m", "armv3m", "none", ARM::AEK_NONE, "3M"),
+        ARMCPUTestParams("arm8", "armv4", "none", ARM::AEK_NONE, "4"),
+        ARMCPUTestParams("arm810", "armv4", "none", ARM::AEK_NONE, "4"),
+        ARMCPUTestParams("strongarm", "armv4", "none", ARM::AEK_NONE, "4"),
+        ARMCPUTestParams("strongarm110", "armv4", "none", ARM::AEK_NONE, "4"),
+        ARMCPUTestParams("strongarm1100", "armv4", "none", ARM::AEK_NONE, "4"),
+        ARMCPUTestParams("strongarm1110", "armv4", "none", ARM::AEK_NONE, "4"),
+        ARMCPUTestParams("arm7tdmi", "armv4t", "none", ARM::AEK_NONE, "4T"),
+        ARMCPUTestParams("arm7tdmi-s", "armv4t", "none", ARM::AEK_NONE, "4T"),
+        ARMCPUTestParams("arm710t", "armv4t", "none", ARM::AEK_NONE, "4T"),
+        ARMCPUTestParams("arm720t", "armv4t", "none", ARM::AEK_NONE, "4T"),
+        ARMCPUTestParams("arm9", "armv4t", "none", ARM::AEK_NONE, "4T"),
+        ARMCPUTestParams("arm9tdmi", "armv4t", "none", ARM::AEK_NONE, "4T"),
+        ARMCPUTestParams("arm920", "armv4t", "none", ARM::AEK_NONE, "4T"),
+        ARMCPUTestParams("arm920t", "armv4t", "none", ARM::AEK_NONE, "4T"),
+        ARMCPUTestParams("arm922t", "armv4t", "none", ARM::AEK_NONE, "4T"),
+        ARMCPUTestParams("arm9312", "armv4t", "none", ARM::AEK_NONE, "4T"),
+        ARMCPUTestParams("arm940t", "armv4t", "none", ARM::AEK_NONE, "4T"),
+        ARMCPUTestParams("ep9312", "armv4t", "none", ARM::AEK_NONE, "4T"),
+        ARMCPUTestParams("arm10tdmi", "armv5t", "none", ARM::AEK_NONE, "5T"),
+        ARMCPUTestParams("arm1020t", "armv5t", "none", ARM::AEK_NONE, "5T"),
+        ARMCPUTestParams("arm9e", "armv5te", "none",
+                         ARM::AEK_NONE | ARM::AEK_DSP, "5TE"),
+        ARMCPUTestParams("arm946e-s", "armv5te", "none",
+                         ARM::AEK_NONE | ARM::AEK_DSP, "5TE"),
+        ARMCPUTestParams("arm966e-s", "armv5te", "none",
+                         ARM::AEK_NONE | ARM::AEK_DSP, "5TE"),
+        ARMCPUTestParams("arm968e-s", "armv5te", "none",
+                         ARM::AEK_NONE | ARM::AEK_DSP, "5TE"),
+        ARMCPUTestParams("arm10e", "armv5te", "none",
+                         ARM::AEK_NONE | ARM::AEK_DSP, "5TE"),
+        ARMCPUTestParams("arm1020e", "armv5te", "none",
+                         ARM::AEK_NONE | ARM::AEK_DSP, "5TE"),
+        ARMCPUTestParams("arm1022e", "armv5te", "none",
+                         ARM::AEK_NONE | ARM::AEK_DSP, "5TE"),
+        ARMCPUTestParams("arm926ej-s", "armv5tej", "none",
+                         ARM::AEK_NONE | ARM::AEK_DSP, "5TEJ"),
+        ARMCPUTestParams("arm1136j-s", "armv6", "none",
+                         ARM::AEK_NONE | ARM::AEK_DSP, "6"),
+        ARMCPUTestParams("arm1136jf-s", "armv6", "vfpv2",
+                         ARM::AEK_NONE | ARM::AEK_DSP, "6"),
+        ARMCPUTestParams("arm1136jz-s", "armv6", "none",
+                         ARM::AEK_NONE | ARM::AEK_DSP, "6"),
+        ARMCPUTestParams("arm1176jz-s", "armv6kz", "none",
+                         ARM::AEK_NONE | ARM::AEK_SEC | ARM::AEK_DSP, "6KZ"),
+        ARMCPUTestParams("mpcore", "armv6k", "vfpv2",
+                         ARM::AEK_NONE | ARM::AEK_DSP, "6K"),
+        ARMCPUTestParams("mpcorenovfp", "armv6k", "none",
+                         ARM::AEK_NONE | ARM::AEK_DSP, "6K"),
+        ARMCPUTestParams("arm1176jzf-s", "armv6kz", "vfpv2",
+                         ARM::AEK_NONE | ARM::AEK_SEC | ARM::AEK_DSP, "6KZ"),
+        ARMCPUTestParams("arm1156t2-s", "armv6t2", "none",
+                         ARM::AEK_NONE | ARM::AEK_DSP, "6T2"),
+        ARMCPUTestParams("arm1156t2f-s", "armv6t2", "vfpv2",
+                         ARM::AEK_NONE | ARM::AEK_DSP, "6T2"),
+        ARMCPUTestParams("cortex-m0", "armv6-m", "none", ARM::AEK_NONE, "6-M"),
+        ARMCPUTestParams("cortex-m0plus", "armv6-m", "none", ARM::AEK_NONE,
+                         "6-M"),
+        ARMCPUTestParams("cortex-m1", "armv6-m", "none", ARM::AEK_NONE, "6-M"),
+        ARMCPUTestParams("sc000", "armv6-m", "none", ARM::AEK_NONE, "6-M"),
+        ARMCPUTestParams("cortex-a5", "armv7-a", "neon-vfpv4",
+                         ARM::AEK_MP | ARM::AEK_SEC | ARM::AEK_DSP, "7-A"),
+        ARMCPUTestParams("cortex-a7", "armv7-a", "neon-vfpv4",
                          ARM::AEK_HWDIVTHUMB | ARM::AEK_HWDIVARM | ARM::AEK_MP |
                              ARM::AEK_SEC | ARM::AEK_VIRT | ARM::AEK_DSP,
-                         "7-A"));
-  EXPECT_TRUE(testARMCPU("cortex-a8", "armv7-a", "neon",
-                         ARM::AEK_SEC | ARM::AEK_DSP, "7-A"));
-  EXPECT_TRUE(testARMCPU("cortex-a9", "armv7-a", "neon-fp16",
-                         ARM::AEK_MP | ARM::AEK_SEC | ARM::AEK_DSP, "7-A"));
-  EXPECT_TRUE(testARMCPU("cortex-a12", "armv7-a", "neon-vfpv4",
+                         "7-A"),
+        ARMCPUTestParams("cortex-a8", "armv7-a", "neon",
+                         ARM::AEK_SEC | ARM::AEK_DSP, "7-A")), );
+
+// gtest in llvm has a limit of 50 test cases when using ::Values so we split
+// them into 2 blocks
+INSTANTIATE_TEST_CASE_P(
+    ARMCPUTestsPart2, ARMCPUTestFixture,
+    ::testing::Values(
+        ARMCPUTestParams("cortex-a9", "armv7-a", "neon-fp16",
+                         ARM::AEK_MP | ARM::AEK_SEC | ARM::AEK_DSP, "7-A"),
+        ARMCPUTestParams("cortex-a12", "armv7-a", "neon-vfpv4",
                          ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
                              ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
                              ARM::AEK_DSP,
-                         "7-A"));
-  EXPECT_TRUE(testARMCPU("cortex-a15", "armv7-a", "neon-vfpv4",
+                         "7-A"),
+        ARMCPUTestParams("cortex-a15", "armv7-a", "neon-vfpv4",
                          ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
                              ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
                              ARM::AEK_DSP,
-                         "7-A"));
-  EXPECT_TRUE(testARMCPU("cortex-a17", "armv7-a", "neon-vfpv4",
+                         "7-A"),
+        ARMCPUTestParams("cortex-a17", "armv7-a", "neon-vfpv4",
                          ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
                              ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
                              ARM::AEK_DSP,
-                         "7-A"));
-  EXPECT_TRUE(testARMCPU("krait", "armv7-a", "neon-vfpv4",
+                         "7-A"),
+        ARMCPUTestParams("krait", "armv7-a", "neon-vfpv4",
                          ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
-                         "7-A"));
-  EXPECT_TRUE(testARMCPU("cortex-r4", "armv7-r", "none",
-                         ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, "7-R"));
-  EXPECT_TRUE(testARMCPU("cortex-r4f", "armv7-r", "vfpv3-d16",
-                         ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, "7-R"));
-  EXPECT_TRUE(testARMCPU("cortex-r5", "armv7-r", "vfpv3-d16",
+                         "7-A"),
+        ARMCPUTestParams("cortex-r4", "armv7-r", "none",
+                         ARM::AEK_NONE | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
+                         "7-R"),
+        ARMCPUTestParams("cortex-r4f", "armv7-r", "vfpv3-d16",
+                         ARM::AEK_NONE | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
+                         "7-R"),
+        ARMCPUTestParams("cortex-r5", "armv7-r", "vfpv3-d16",
                          ARM::AEK_MP | ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
                              ARM::AEK_DSP,
-                         "7-R"));
-  EXPECT_TRUE(testARMCPU("cortex-r7", "armv7-r", "vfpv3-d16-fp16",
+                         "7-R"),
+        ARMCPUTestParams("cortex-r7", "armv7-r", "vfpv3-d16-fp16",
                          ARM::AEK_MP | ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
                              ARM::AEK_DSP,
-                         "7-R"));
-  EXPECT_TRUE(testARMCPU("cortex-r8", "armv7-r", "vfpv3-d16-fp16",
+                         "7-R"),
+        ARMCPUTestParams("cortex-r8", "armv7-r", "vfpv3-d16-fp16",
                          ARM::AEK_MP | ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
                              ARM::AEK_DSP,
-                         "7-R"));
-  EXPECT_TRUE(testARMCPU("cortex-r52", "armv8-r", "neon-fp-armv8",
-                         ARM::AEK_CRC | ARM::AEK_MP | ARM::AEK_VIRT |
-                             ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
-                             ARM::AEK_DSP,
-                         "8-R"));
-  EXPECT_TRUE(
-      testARMCPU("sc300", "armv7-m", "none", ARM::AEK_HWDIVTHUMB, "7-M"));
-  EXPECT_TRUE(
-      testARMCPU("cortex-m3", "armv7-m", "none", ARM::AEK_HWDIVTHUMB, "7-M"));
-  EXPECT_TRUE(testARMCPU("cortex-m4", "armv7e-m", "fpv4-sp-d16",
-                         ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, "7E-M"));
-  EXPECT_TRUE(testARMCPU("cortex-m7", "armv7e-m", "fpv5-d16",
-                         ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, "7E-M"));
-  EXPECT_TRUE(testARMCPU("cortex-a32", "armv8-a", "crypto-neon-fp-armv8",
+                         "7-R"),
+        ARMCPUTestParams("cortex-r52", "armv8-r", "neon-fp-armv8",
+                         ARM::AEK_NONE | ARM::AEK_CRC | ARM::AEK_MP |
+                             ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
+                             ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
+                         "8-R"),
+        ARMCPUTestParams("sc300", "armv7-m", "none",
+                         ARM::AEK_NONE | ARM::AEK_HWDIVTHUMB, "7-M"),
+        ARMCPUTestParams("cortex-m3", "armv7-m", "none",
+                         ARM::AEK_NONE | ARM::AEK_HWDIVTHUMB, "7-M"),
+        ARMCPUTestParams("cortex-m4", "armv7e-m", "fpv4-sp-d16",
+                         ARM::AEK_NONE | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
+                         "7E-M"),
+        ARMCPUTestParams("cortex-m7", "armv7e-m", "fpv5-d16",
+                         ARM::AEK_NONE | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
+                         "7E-M"),
+        ARMCPUTestParams("cortex-a32", "armv8-a", "crypto-neon-fp-armv8",
                          ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
                              ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
                              ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
-                         "8-A"));
-  EXPECT_TRUE(testARMCPU("cortex-a35", "armv8-a", "crypto-neon-fp-armv8",
+                         "8-A"),
+        ARMCPUTestParams("cortex-a35", "armv8-a", "crypto-neon-fp-armv8",
                          ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
                              ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
                              ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
-                         "8-A"));
-  EXPECT_TRUE(testARMCPU("cortex-a53", "armv8-a", "crypto-neon-fp-armv8",
+                         "8-A"),
+        ARMCPUTestParams("cortex-a53", "armv8-a", "crypto-neon-fp-armv8",
                          ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
                              ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
                              ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
-                         "8-A"));
-  EXPECT_TRUE(testARMCPU("cortex-a55", "armv8.2-a", "crypto-neon-fp-armv8",
+                         "8-A"),
+        ARMCPUTestParams("cortex-a55", "armv8.2-a", "crypto-neon-fp-armv8",
                          ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
-                         ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
-                         ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_FP16 |
-                         ARM::AEK_RAS | ARM::AEK_DOTPROD,
-                         "8.2-A"));
-  EXPECT_TRUE(testARMCPU("cortex-a57", "armv8-a", "crypto-neon-fp-armv8",
+                             ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
+                             ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP |
+                             ARM::AEK_FP16 | ARM::AEK_RAS | ARM::AEK_DOTPROD,
+                         "8.2-A"),
+        ARMCPUTestParams("cortex-a57", "armv8-a", "crypto-neon-fp-armv8",
                          ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
                              ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
                              ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
-                         "8-A"));
-  EXPECT_TRUE(testARMCPU("cortex-a72", "armv8-a", "crypto-neon-fp-armv8",
+                         "8-A"),
+        ARMCPUTestParams("cortex-a72", "armv8-a", "crypto-neon-fp-armv8",
                          ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
                              ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
                              ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
-                         "8-A"));
-  EXPECT_TRUE(testARMCPU("cortex-a73", "armv8-a", "crypto-neon-fp-armv8",
+                         "8-A"),
+        ARMCPUTestParams("cortex-a73", "armv8-a", "crypto-neon-fp-armv8",
                          ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
                              ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
                              ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
-                         "8-A"));
-  EXPECT_TRUE(testARMCPU("cortex-a75", "armv8.2-a", "crypto-neon-fp-armv8",
+                         "8-A"),
+        ARMCPUTestParams("cortex-a75", "armv8.2-a", "crypto-neon-fp-armv8",
                          ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
-                         ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
-                         ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_FP16 |
-                         ARM::AEK_RAS | ARM::AEK_DOTPROD,
-                         "8.2-A"));
-  EXPECT_TRUE(testARMCPU("cortex-a76", "armv8.2-a", "crypto-neon-fp-armv8",
+                             ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
+                             ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP |
+                             ARM::AEK_FP16 | ARM::AEK_RAS | ARM::AEK_DOTPROD,
+                         "8.2-A"),
+        ARMCPUTestParams("cortex-a76", "armv8.2-a", "crypto-neon-fp-armv8",
                          ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
-                         ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
-                         ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_FP16 |
-                         ARM::AEK_RAS | ARM::AEK_DOTPROD,
-                         "8.2-A"));
-  EXPECT_TRUE(testARMCPU("cortex-a76ae", "armv8.2-a", "crypto-neon-fp-armv8",
+                             ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
+                             ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP |
+                             ARM::AEK_FP16 | ARM::AEK_RAS | ARM::AEK_DOTPROD,
+                         "8.2-A"),
+        ARMCPUTestParams("cortex-a76ae", "armv8.2-a", "crypto-neon-fp-armv8",
                          ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
-                         ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
-                         ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_FP16 |
-                         ARM::AEK_RAS | ARM::AEK_DOTPROD,
-                         "8.2-A"));
-  EXPECT_TRUE(testARMCPU("cortex-a77", "armv8.2-a", "crypto-neon-fp-armv8",
+                             ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
+                             ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP |
+                             ARM::AEK_FP16 | ARM::AEK_RAS | ARM::AEK_DOTPROD,
+                         "8.2-A"),
+        ARMCPUTestParams("cortex-a77", "armv8.2-a", "crypto-neon-fp-armv8",
                          ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
-                         ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
-                         ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_FP16 |
-                         ARM::AEK_RAS | ARM::AEK_DOTPROD,
-                         "8.2-A"));
-  EXPECT_TRUE(testARMCPU("cortex-a78", "armv8.2-a", "crypto-neon-fp-armv8",
-                         ARM::AEK_DOTPROD | ARM::AEK_FP16 |
-                         ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
-                         ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
-                         ARM::AEK_DSP | ARM::AEK_CRC | ARM::AEK_RAS,
-                         "8.2-A"));
-  EXPECT_TRUE(testARMCPU("cortex-x1", "armv8.2-a", "crypto-neon-fp-armv8",
+                             ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
+                             ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP |
+                             ARM::AEK_FP16 | ARM::AEK_RAS | ARM::AEK_DOTPROD,
+                         "8.2-A"),
+        ARMCPUTestParams("cortex-a78", "armv8.2-a", "crypto-neon-fp-armv8",
+                         ARM::AEK_DOTPROD | ARM::AEK_FP16 | ARM::AEK_SEC |
+                             ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
+                             ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_CRC |
+                             ARM::AEK_RAS,
+                         "8.2-A"),
+        ARMCPUTestParams("cortex-x1", "armv8.2-a", "crypto-neon-fp-armv8",
                          ARM::AEK_RAS | ARM::AEK_FP16 | ARM::AEK_DOTPROD |
+                             ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
+                             ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
+                             ARM::AEK_DSP | ARM::AEK_CRC | ARM::AEK_RAS,
+                         "8.2-A"),
+        ARMCPUTestParams("neoverse-n1", "armv8.2-a", "crypto-neon-fp-armv8",
+                         ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
+                             ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
+                             ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP |
+                             ARM::AEK_FP16 | ARM::AEK_RAS | ARM::AEK_DOTPROD,
+                         "8.2-A"),
+        ARMCPUTestParams("neoverse-n2", "armv8.5-a", "crypto-neon-fp-armv8",
+                         ARM::AEK_CRC | ARM::AEK_HWDIVTHUMB |
+                             ARM::AEK_HWDIVARM | ARM::AEK_MP | ARM::AEK_SEC |
+                             ARM::AEK_VIRT | ARM::AEK_DSP | ARM::AEK_BF16 |
+                             ARM::AEK_DOTPROD | ARM::AEK_RAS | ARM::AEK_I8MM |
+                             ARM::AEK_SB,
+                         "8.5-A"),
+        ARMCPUTestParams("neoverse-v1", "armv8.4-a", "crypto-neon-fp-armv8",
                          ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
-                         ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
-                         ARM::AEK_DSP | ARM::AEK_CRC | ARM::AEK_RAS,
-                         "8.2-A"));
-  EXPECT_TRUE(testARMCPU("neoverse-n1", "armv8.2-a", "crypto-neon-fp-armv8",
-                        ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
-                        ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
-                        ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_FP16 |
-                        ARM::AEK_RAS | ARM::AEK_DOTPROD,
-                        "8.2-A"));
-  EXPECT_TRUE(testARMCPU("neoverse-n2", "armv8.5-a", "crypto-neon-fp-armv8",
-                         ARM::AEK_CRC | ARM::AEK_HWDIVTHUMB | ARM::AEK_HWDIVARM |
-                         ARM::AEK_MP | ARM::AEK_SEC | ARM::AEK_VIRT |
-                         ARM::AEK_DSP | ARM::AEK_BF16 | ARM::AEK_DOTPROD |
-                         ARM::AEK_RAS | ARM::AEK_I8MM | ARM::AEK_SB,
-                        "8.5-A"));
-  EXPECT_TRUE(testARMCPU("neoverse-v1", "armv8.4-a", "crypto-neon-fp-armv8",
-                         ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
-                         ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
-                         ARM::AEK_DSP | ARM::AEK_CRC | ARM::AEK_RAS |
-                         ARM::AEK_FP16 | ARM::AEK_BF16 | ARM::AEK_DOTPROD,
-                         "8.4-A"));
-  EXPECT_TRUE(testARMCPU("cyclone", "armv8-a", "crypto-neon-fp-armv8",
+                             ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
+                             ARM::AEK_DSP | ARM::AEK_CRC | ARM::AEK_RAS |
+                             ARM::AEK_FP16 | ARM::AEK_BF16 | ARM::AEK_DOTPROD,
+                         "8.4-A"),
+        ARMCPUTestParams("cyclone", "armv8-a", "crypto-neon-fp-armv8",
                          ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
                              ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
                              ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
-                         "8-A"));
-  EXPECT_TRUE(testARMCPU("exynos-m3", "armv8-a", "crypto-neon-fp-armv8",
+                         "8-A"),
+        ARMCPUTestParams("exynos-m3", "armv8-a", "crypto-neon-fp-armv8",
                          ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
-                         ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
-                         ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
-                         "8-A"));
-  EXPECT_TRUE(testARMCPU("exynos-m4", "armv8.2-a", "crypto-neon-fp-armv8",
+                             ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
+                             ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
+                         "8-A"),
+        ARMCPUTestParams("exynos-m4", "armv8.2-a", "crypto-neon-fp-armv8",
                          ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
-                         ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
-                         ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_DOTPROD |
-                         ARM::AEK_FP16 | ARM::AEK_RAS,
-                         "8.2-A"));
-  EXPECT_TRUE(testARMCPU("exynos-m5", "armv8.2-a", "crypto-neon-fp-armv8",
+                             ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
+                             ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP |
+                             ARM::AEK_DOTPROD | ARM::AEK_FP16 | ARM::AEK_RAS,
+                         "8.2-A"),
+        ARMCPUTestParams("exynos-m5", "armv8.2-a", "crypto-neon-fp-armv8",
                          ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
-                         ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
-                         ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_DOTPROD |
-                         ARM::AEK_FP16 | ARM::AEK_RAS,
-                         "8.2-A"));
-  EXPECT_TRUE(testARMCPU("cortex-m23", "armv8-m.base", "none",
-                         ARM::AEK_HWDIVTHUMB, "8-M.Baseline"));
-  EXPECT_TRUE(testARMCPU("cortex-m33", "armv8-m.main", "fpv5-sp-d16",
-                         ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, "8-M.Mainline"));
-  EXPECT_TRUE(testARMCPU("cortex-m35p", "armv8-m.main", "fpv5-sp-d16",
-                         ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, "8-M.Mainline"));
-  EXPECT_TRUE(testARMCPU("cortex-m55", "armv8.1-m.main", "fp-armv8-fullfp16-d16",
+                             ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
+                             ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP |
+                             ARM::AEK_DOTPROD | ARM::AEK_FP16 | ARM::AEK_RAS,
+                         "8.2-A"),
+        ARMCPUTestParams("cortex-m23", "armv8-m.base", "none",
+                         ARM::AEK_NONE | ARM::AEK_HWDIVTHUMB, "8-M.Baseline"),
+        ARMCPUTestParams("cortex-m33", "armv8-m.main", "fpv5-sp-d16",
+                         ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, "8-M.Mainline"),
+        ARMCPUTestParams("cortex-m35p", "armv8-m.main", "fpv5-sp-d16",
+                         ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, "8-M.Mainline"),
+        ARMCPUTestParams("cortex-m55", "armv8.1-m.main",
+                         "fp-armv8-fullfp16-d16",
                          ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_SIMD |
-                         ARM::AEK_FP         | ARM::AEK_RAS | ARM::AEK_LOB |
-                         ARM::AEK_FP16,
-                        "8.1-M.Mainline"));
-  EXPECT_TRUE(testARMCPU("iwmmxt", "iwmmxt", "none",
-                         ARM::AEK_NONE, "iwmmxt"));
-  EXPECT_TRUE(testARMCPU("xscale", "xscale", "none",
-                         ARM::AEK_NONE, "xscale"));
-  EXPECT_TRUE(testARMCPU("swift", "armv7s", "neon-vfpv4",
+                             ARM::AEK_FP | ARM::AEK_RAS | ARM::AEK_LOB |
+                             ARM::AEK_FP16,
+                         "8.1-M.Mainline"),
+        ARMCPUTestParams("iwmmxt", "iwmmxt", "none", ARM::AEK_NONE, "iwmmxt"),
+        ARMCPUTestParams("xscale", "xscale", "none", ARM::AEK_NONE, "xscale"),
+        ARMCPUTestParams("swift", "armv7s", "neon-vfpv4",
                          ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
-                         "7-S"));
-}
+                         "7-S")), );
 
 static constexpr unsigned NumARMCPUArchs = 91;
 
@@ -798,278 +805,307 @@ TEST(TargetParserTest, ARMparseArchVersion) {
       EXPECT_EQ(5u, ARM::parseArchVersion(ARMArch[i]));
 }
 
-bool testAArch64CPU(StringRef CPUName, StringRef ExpectedArch,
-                    StringRef ExpectedFPU, uint64_t ExpectedFlags,
-                    StringRef CPUAttr) {
-  AArch64::ArchKind AK = AArch64::parseCPUArch(CPUName);
-  bool pass = AArch64::getArchName(AK).equals(ExpectedArch);
+class AArch64CPUTestFixture
+    : public ::testing::TestWithParam<ARMCPUTestParams> {};
 
-  uint64_t ExtKind = AArch64::getDefaultExtensions(CPUName, AK);
-  if (ExtKind > 1 && (ExtKind & AArch64::AEK_NONE))
-    pass &= ((ExtKind ^ AArch64::AEK_NONE) == ExpectedFlags);
-  else
-    pass &= (ExtKind == ExpectedFlags);
+TEST_P(AArch64CPUTestFixture, testAArch64CPU) {
+  ARMCPUTestParams params = GetParam();
 
-  unsigned FPUKind = AArch64::getDefaultFPU(CPUName, AK);
-  pass &= ARM::getFPUName(FPUKind).equals(ExpectedFPU);
+  AArch64::ArchKind AK = AArch64::parseCPUArch(params.CPUName);
+  EXPECT_EQ(params.ExpectedArch, AArch64::getArchName(AK));
 
-  pass &= AArch64::getCPUAttr(AK).equals(CPUAttr);
+  uint64_t default_extensions =
+      AArch64::getDefaultExtensions(params.CPUName, AK);
+  EXPECT_EQ(params.ExpectedFlags, default_extensions);
 
-  return pass;
-}
+  unsigned FPUKind = AArch64::getDefaultFPU(params.CPUName, AK);
+  EXPECT_EQ(params.ExpectedFPU, ARM::getFPUName(FPUKind));
 
-TEST(TargetParserTest, testAArch64CPU) {
-  EXPECT_TRUE(testAArch64CPU(
-      "invalid", "invalid", "invalid",
-      AArch64::AEK_NONE, ""));
-  EXPECT_TRUE(testAArch64CPU(
-      "generic", "invalid", "none",
-      AArch64::AEK_NONE, ""));
-
-  EXPECT_TRUE(testAArch64CPU(
-      "cortex-a34", "armv8-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
-      AArch64::AEK_SIMD, "8-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "cortex-a35", "armv8-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
-      AArch64::AEK_SIMD, "8-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "cortex-a53", "armv8-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
-      AArch64::AEK_SIMD, "8-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "cortex-a55", "armv8.2-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
-      AArch64::AEK_SIMD | AArch64::AEK_RAS | AArch64::AEK_LSE |
-      AArch64::AEK_RDM | AArch64::AEK_FP16 | AArch64::AEK_DOTPROD |
-      AArch64::AEK_RCPC, "8.2-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "cortex-a57", "armv8-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
-      AArch64::AEK_SIMD, "8-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "cortex-a65", "armv8.2-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_DOTPROD |
-      AArch64::AEK_FP | AArch64::AEK_FP16 | AArch64::AEK_LSE |
-      AArch64::AEK_RAS | AArch64::AEK_RCPC | AArch64::AEK_RDM |
-      AArch64::AEK_SIMD | AArch64::AEK_SSBS,
-      "8.2-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "cortex-a65ae", "armv8.2-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_DOTPROD |
-      AArch64::AEK_FP | AArch64::AEK_FP16 | AArch64::AEK_LSE |
-      AArch64::AEK_RAS | AArch64::AEK_RCPC | AArch64::AEK_RDM |
-      AArch64::AEK_SIMD | AArch64::AEK_SSBS,
-      "8.2-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "cortex-a72", "armv8-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
-      AArch64::AEK_SIMD, "8-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "cortex-a73", "armv8-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
-      AArch64::AEK_SIMD, "8-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "cortex-a75", "armv8.2-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
-      AArch64::AEK_SIMD | AArch64::AEK_RAS | AArch64::AEK_LSE |
-      AArch64::AEK_RDM | AArch64::AEK_FP16 | AArch64::AEK_DOTPROD |
-      AArch64::AEK_RCPC, "8.2-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "cortex-a76", "armv8.2-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
-      AArch64::AEK_RDM | AArch64::AEK_SIMD | AArch64::AEK_RAS |
-      AArch64::AEK_LSE | AArch64::AEK_FP16 | AArch64::AEK_DOTPROD |
-      AArch64::AEK_RCPC| AArch64::AEK_SSBS, "8.2-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "cortex-a76ae", "armv8.2-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
-      AArch64::AEK_RDM | AArch64::AEK_SIMD | AArch64::AEK_RAS |
-      AArch64::AEK_LSE | AArch64::AEK_FP16 | AArch64::AEK_DOTPROD |
-      AArch64::AEK_RCPC| AArch64::AEK_SSBS, "8.2-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "cortex-a77", "armv8.2-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
-      AArch64::AEK_RDM | AArch64::AEK_SIMD | AArch64::AEK_RAS |
-      AArch64::AEK_LSE | AArch64::AEK_FP16 | AArch64::AEK_DOTPROD |
-      AArch64::AEK_RCPC | AArch64::AEK_SSBS, "8.2-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "cortex-a78", "armv8.2-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO  | AArch64::AEK_FP |
-      AArch64::AEK_RDM | AArch64::AEK_SIMD | AArch64::AEK_RAS |
-      AArch64::AEK_LSE | AArch64::AEK_FP16 | AArch64::AEK_DOTPROD |
-      AArch64::AEK_RCPC | AArch64::AEK_SSBS,
-      "8.2-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "neoverse-v1", "armv8.4-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_RAS | AArch64::AEK_SVE | AArch64::AEK_SSBS |
-      AArch64::AEK_RCPC | AArch64::AEK_CRC | AArch64::AEK_FP |
-      AArch64::AEK_SIMD | AArch64::AEK_RAS | AArch64::AEK_LSE |
-      AArch64::AEK_RDM | AArch64::AEK_RCPC | AArch64::AEK_DOTPROD |
-      AArch64::AEK_CRYPTO | AArch64::AEK_FP16 | AArch64::AEK_BF16,
-      "8.4-A"));
-  EXPECT_TRUE(testAArch64CPU(
-     "cortex-r82", "armv8-r", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC     | AArch64::AEK_RDM  | AArch64::AEK_SSBS |
-      AArch64::AEK_DOTPROD | AArch64::AEK_FP   | AArch64::AEK_SIMD |
-      AArch64::AEK_FP16    | AArch64::AEK_FP16FML | AArch64::AEK_RAS |
-      AArch64::AEK_RCPC    | AArch64::AEK_LSE  | AArch64::AEK_SB,
-      "8-R"));
-  EXPECT_TRUE(testAArch64CPU(
-      "cortex-x1", "armv8.2-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
-      AArch64::AEK_RDM | AArch64::AEK_SIMD | AArch64::AEK_RAS |
-      AArch64::AEK_LSE | AArch64::AEK_FP16 | AArch64::AEK_DOTPROD |
-      AArch64::AEK_RCPC | AArch64::AEK_SSBS,
-      "8.2-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "cyclone", "armv8-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRYPTO | AArch64::AEK_FP | AArch64::AEK_SIMD, "8-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "apple-a7", "armv8-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRYPTO | AArch64::AEK_FP | AArch64::AEK_SIMD, "8-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "apple-a8", "armv8-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRYPTO | AArch64::AEK_FP | AArch64::AEK_SIMD, "8-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "apple-a9", "armv8-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRYPTO | AArch64::AEK_FP | AArch64::AEK_SIMD, "8-A"));
-  EXPECT_TRUE(testAArch64CPU("apple-a10", "armv8-a", "crypto-neon-fp-armv8",
-                             AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
-                                 AArch64::AEK_FP | AArch64::AEK_RDM |
-                                 AArch64::AEK_SIMD,
-                             "8-A"));
-  EXPECT_TRUE(testAArch64CPU("apple-a11", "armv8.2-a", "crypto-neon-fp-armv8",
-                             AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
-                                 AArch64::AEK_FP | AArch64::AEK_LSE |
-                                 AArch64::AEK_RAS | AArch64::AEK_RDM |
-                                 AArch64::AEK_SIMD,
-                             "8.2-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "apple-a12", "armv8.3-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
-          AArch64::AEK_SIMD | AArch64::AEK_LSE | AArch64::AEK_RAS |
-          AArch64::AEK_RDM | AArch64::AEK_RCPC | AArch64::AEK_FP16,
-      "8.3-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "apple-a13", "armv8.4-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
-          AArch64::AEK_SIMD | AArch64::AEK_LSE | AArch64::AEK_RAS |
-          AArch64::AEK_RDM | AArch64::AEK_RCPC | AArch64::AEK_DOTPROD |
-          AArch64::AEK_FP16 | AArch64::AEK_FP16FML,
-      "8.4-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "apple-s4", "armv8.3-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
-          AArch64::AEK_SIMD | AArch64::AEK_LSE | AArch64::AEK_RAS |
-          AArch64::AEK_RDM | AArch64::AEK_RCPC | AArch64::AEK_FP16,
-      "8.3-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "apple-s5", "armv8.3-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
-          AArch64::AEK_SIMD | AArch64::AEK_LSE | AArch64::AEK_RAS |
-          AArch64::AEK_RDM | AArch64::AEK_RCPC | AArch64::AEK_FP16,
-      "8.3-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "exynos-m3", "armv8-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
-      AArch64::AEK_SIMD, "8-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "exynos-m4", "armv8.2-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
-      AArch64::AEK_DOTPROD | AArch64::AEK_FP | AArch64::AEK_FP16 |
-      AArch64::AEK_LSE | AArch64::AEK_RAS | AArch64::AEK_RDM |
-      AArch64::AEK_SIMD, "8.2-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "exynos-m5", "armv8.2-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
-      AArch64::AEK_DOTPROD | AArch64::AEK_FP | AArch64::AEK_FP16 |
-      AArch64::AEK_LSE | AArch64::AEK_RAS | AArch64::AEK_RDM |
-      AArch64::AEK_SIMD, "8.2-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "falkor", "armv8-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
-      AArch64::AEK_SIMD | AArch64::AEK_RDM, "8-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "kryo", "armv8-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
-      AArch64::AEK_SIMD, "8-A"));
-  EXPECT_TRUE(testAArch64CPU(
-     "neoverse-e1", "armv8.2-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_DOTPROD |
-      AArch64::AEK_FP | AArch64::AEK_FP16 | AArch64::AEK_LSE |
-      AArch64::AEK_RAS | AArch64::AEK_RCPC | AArch64::AEK_RDM |
-      AArch64::AEK_SIMD | AArch64::AEK_SSBS,
-     "8.2-A"));
-  EXPECT_TRUE(testAArch64CPU(
-     "neoverse-n1", "armv8.2-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_DOTPROD |
-      AArch64::AEK_FP | AArch64::AEK_FP16 | AArch64::AEK_LSE |
-      AArch64::AEK_PROFILE | AArch64::AEK_RAS | AArch64::AEK_RCPC |
-      AArch64::AEK_RDM | AArch64::AEK_SIMD | AArch64::AEK_SSBS,
-     "8.2-A"));
-  EXPECT_TRUE(testAArch64CPU(
-     "neoverse-n2", "armv8.5-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
-      AArch64::AEK_SIMD | AArch64::AEK_FP16 | AArch64::AEK_RAS |
-      AArch64::AEK_LSE | AArch64::AEK_SVE | AArch64::AEK_DOTPROD |
-      AArch64::AEK_RCPC | AArch64::AEK_RDM | AArch64::AEK_MTE |
-      AArch64::AEK_SSBS | AArch64::AEK_SB | AArch64::AEK_SVE2 |
-      AArch64::AEK_SVE2BITPERM | AArch64::AEK_BF16 | AArch64::AEK_I8MM,
-     "8.5-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "thunderx2t99", "armv8.1-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_LSE |
-      AArch64::AEK_RDM | AArch64::AEK_FP | AArch64::AEK_SIMD, "8.1-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "thunderx3t110", "armv8.3-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_LSE |
-          AArch64::AEK_RDM | AArch64::AEK_FP | AArch64::AEK_SIMD |
-          AArch64::AEK_PROFILE | AArch64::AEK_RAS | AArch64::AEK_RAND |
-          AArch64::AEK_RCPC,
-      "8.3-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "thunderx", "armv8-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_SIMD |
-      AArch64::AEK_FP | AArch64::AEK_PROFILE,
-      "8-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "thunderxt81", "armv8-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_SIMD |
-      AArch64::AEK_FP | AArch64::AEK_PROFILE,
-      "8-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "thunderxt83", "armv8-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_SIMD |
-      AArch64::AEK_FP | AArch64::AEK_PROFILE,
-      "8-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "thunderxt88", "armv8-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_SIMD |
-      AArch64::AEK_FP | AArch64::AEK_PROFILE,
-      "8-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "tsv110", "armv8.2-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
-      AArch64::AEK_SIMD | AArch64::AEK_RAS | AArch64::AEK_LSE |
-      AArch64::AEK_RDM | AArch64::AEK_PROFILE | AArch64::AEK_FP16 |
-      AArch64::AEK_FP16FML | AArch64::AEK_DOTPROD,
-      "8.2-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "a64fx", "armv8.2-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
-      AArch64::AEK_SIMD | AArch64::AEK_FP16 | AArch64::AEK_RAS |
-      AArch64::AEK_LSE | AArch64::AEK_SVE | AArch64::AEK_RDM,
-      "8.2-A"));
-  EXPECT_TRUE(testAArch64CPU(
-      "carmel", "armv8.2-a", "crypto-neon-fp-armv8",
-      AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
-      AArch64::AEK_SIMD | AArch64::AEK_FP16 | AArch64::AEK_RAS |
-      AArch64::AEK_LSE | AArch64::AEK_RDM,
-      "8.2-A"));
+  EXPECT_EQ(params.CPUAttr, AArch64::getCPUAttr(AK));
 }
 
+INSTANTIATE_TEST_CASE_P(
+    AArch64CPUTests, AArch64CPUTestFixture,
+    ::testing::Values(
+        ARMCPUTestParams("invalid", "invalid", "invalid", AArch64::AEK_NONE,
+                         ""),
+        ARMCPUTestParams("generic", "invalid", "none", AArch64::AEK_NONE, ""),
+
+        ARMCPUTestParams("cortex-a34", "armv8-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD,
+                         "8-A"),
+        ARMCPUTestParams("cortex-a35", "armv8-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD,
+                         "8-A"),
+        ARMCPUTestParams("cortex-a53", "armv8-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD,
+                         "8-A"),
+        ARMCPUTestParams("cortex-a55", "armv8.2-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD |
+                             AArch64::AEK_RAS | AArch64::AEK_LSE |
+                             AArch64::AEK_RDM | AArch64::AEK_FP16 |
+                             AArch64::AEK_DOTPROD | AArch64::AEK_RCPC,
+                         "8.2-A"),
+        ARMCPUTestParams("cortex-a57", "armv8-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD,
+                         "8-A"),
+        ARMCPUTestParams("cortex-a65", "armv8.2-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_DOTPROD | AArch64::AEK_FP |
+                             AArch64::AEK_FP16 | AArch64::AEK_LSE |
+                             AArch64::AEK_RAS | AArch64::AEK_RCPC |
+                             AArch64::AEK_RDM | AArch64::AEK_SIMD |
+                             AArch64::AEK_SSBS,
+                         "8.2-A"),
+        ARMCPUTestParams("cortex-a65ae", "armv8.2-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_DOTPROD | AArch64::AEK_FP |
+                             AArch64::AEK_FP16 | AArch64::AEK_LSE |
+                             AArch64::AEK_RAS | AArch64::AEK_RCPC |
+                             AArch64::AEK_RDM | AArch64::AEK_SIMD |
+                             AArch64::AEK_SSBS,
+                         "8.2-A"),
+        ARMCPUTestParams("cortex-a72", "armv8-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD,
+                         "8-A"),
+        ARMCPUTestParams("cortex-a73", "armv8-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD,
+                         "8-A"),
+        ARMCPUTestParams("cortex-a75", "armv8.2-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD |
+                             AArch64::AEK_RAS | AArch64::AEK_LSE |
+                             AArch64::AEK_RDM | AArch64::AEK_FP16 |
+                             AArch64::AEK_DOTPROD | AArch64::AEK_RCPC,
+                         "8.2-A"),
+        ARMCPUTestParams("cortex-a76", "armv8.2-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_RDM |
+                             AArch64::AEK_SIMD | AArch64::AEK_RAS |
+                             AArch64::AEK_LSE | AArch64::AEK_FP16 |
+                             AArch64::AEK_DOTPROD | AArch64::AEK_RCPC |
+                             AArch64::AEK_SSBS,
+                         "8.2-A"),
+        ARMCPUTestParams("cortex-a76ae", "armv8.2-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_RDM |
+                             AArch64::AEK_SIMD | AArch64::AEK_RAS |
+                             AArch64::AEK_LSE | AArch64::AEK_FP16 |
+                             AArch64::AEK_DOTPROD | AArch64::AEK_RCPC |
+                             AArch64::AEK_SSBS,
+                         "8.2-A"),
+        ARMCPUTestParams("cortex-a77", "armv8.2-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_RDM |
+                             AArch64::AEK_SIMD | AArch64::AEK_RAS |
+                             AArch64::AEK_LSE | AArch64::AEK_FP16 |
+                             AArch64::AEK_DOTPROD | AArch64::AEK_RCPC |
+                             AArch64::AEK_SSBS,
+                         "8.2-A"),
+        ARMCPUTestParams("cortex-a78", "armv8.2-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_RDM |
+                             AArch64::AEK_SIMD | AArch64::AEK_RAS |
+                             AArch64::AEK_LSE | AArch64::AEK_FP16 |
+                             AArch64::AEK_DOTPROD | AArch64::AEK_RCPC |
+                             AArch64::AEK_SSBS,
+                         "8.2-A"),
+        ARMCPUTestParams(
+            "neoverse-v1", "armv8.4-a", "crypto-neon-fp-armv8",
+            AArch64::AEK_RAS | AArch64::AEK_SVE | AArch64::AEK_SSBS |
+                AArch64::AEK_RCPC | AArch64::AEK_CRC | AArch64::AEK_FP |
+                AArch64::AEK_SIMD | AArch64::AEK_RAS | AArch64::AEK_LSE |
+                AArch64::AEK_RDM | AArch64::AEK_RCPC | AArch64::AEK_DOTPROD |
+                AArch64::AEK_CRYPTO | AArch64::AEK_FP16 | AArch64::AEK_BF16,
+            "8.4-A"),
+        ARMCPUTestParams("cortex-r82", "armv8-r", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_RDM |
+                             AArch64::AEK_SSBS | AArch64::AEK_DOTPROD |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD |
+                             AArch64::AEK_FP16 | AArch64::AEK_FP16FML |
+                             AArch64::AEK_RAS | AArch64::AEK_RCPC |
+                             AArch64::AEK_LSE | AArch64::AEK_SB,
+                         "8-R"),
+        ARMCPUTestParams("cortex-x1", "armv8.2-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_RDM |
+                             AArch64::AEK_SIMD | AArch64::AEK_RAS |
+                             AArch64::AEK_LSE | AArch64::AEK_FP16 |
+                             AArch64::AEK_DOTPROD | AArch64::AEK_RCPC |
+                             AArch64::AEK_SSBS,
+                         "8.2-A"),
+        ARMCPUTestParams("cyclone", "armv8-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_NONE | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD,
+                         "8-A"),
+        ARMCPUTestParams("apple-a7", "armv8-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_NONE | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD,
+                         "8-A"),
+        ARMCPUTestParams("apple-a8", "armv8-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_NONE | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD,
+                         "8-A"),
+        ARMCPUTestParams("apple-a9", "armv8-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_NONE | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD,
+                         "8-A"),
+        ARMCPUTestParams("apple-a10", "armv8-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_RDM |
+                             AArch64::AEK_SIMD,
+                         "8-A"),
+        ARMCPUTestParams("apple-a11", "armv8.2-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_NONE | AArch64::AEK_CRC |
+                             AArch64::AEK_CRYPTO | AArch64::AEK_FP |
+                             AArch64::AEK_LSE | AArch64::AEK_RAS |
+                             AArch64::AEK_RDM | AArch64::AEK_SIMD,
+                         "8.2-A"),
+        ARMCPUTestParams("apple-a12", "armv8.3-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD |
+                             AArch64::AEK_LSE | AArch64::AEK_RAS |
+                             AArch64::AEK_RDM | AArch64::AEK_RCPC |
+                             AArch64::AEK_FP16,
+                         "8.3-A"),
+        ARMCPUTestParams("apple-a13", "armv8.4-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD |
+                             AArch64::AEK_LSE | AArch64::AEK_RAS |
+                             AArch64::AEK_RDM | AArch64::AEK_RCPC |
+                             AArch64::AEK_DOTPROD | AArch64::AEK_FP16 |
+                             AArch64::AEK_FP16FML,
+                         "8.4-A"),
+        ARMCPUTestParams("apple-s4", "armv8.3-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD |
+                             AArch64::AEK_LSE | AArch64::AEK_RAS |
+                             AArch64::AEK_RDM | AArch64::AEK_RCPC |
+                             AArch64::AEK_FP16,
+                         "8.3-A"),
+        ARMCPUTestParams("apple-s5", "armv8.3-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD |
+                             AArch64::AEK_LSE | AArch64::AEK_RAS |
+                             AArch64::AEK_RDM | AArch64::AEK_RCPC |
+                             AArch64::AEK_FP16,
+                         "8.3-A"),
+        ARMCPUTestParams("exynos-m3", "armv8-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD,
+                         "8-A"),
+        ARMCPUTestParams("exynos-m4", "armv8.2-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_DOTPROD | AArch64::AEK_FP |
+                             AArch64::AEK_FP16 | AArch64::AEK_LSE |
+                             AArch64::AEK_RAS | AArch64::AEK_RDM |
+                             AArch64::AEK_SIMD,
+                         "8.2-A"),
+        ARMCPUTestParams("exynos-m5", "armv8.2-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_DOTPROD | AArch64::AEK_FP |
+                             AArch64::AEK_FP16 | AArch64::AEK_LSE |
+                             AArch64::AEK_RAS | AArch64::AEK_RDM |
+                             AArch64::AEK_SIMD,
+                         "8.2-A"),
+        ARMCPUTestParams("falkor", "armv8-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD |
+                             AArch64::AEK_RDM,
+                         "8-A"),
+        ARMCPUTestParams("kryo", "armv8-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD,
+                         "8-A"),
+        ARMCPUTestParams("neoverse-e1", "armv8.2-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_DOTPROD | AArch64::AEK_FP |
+                             AArch64::AEK_FP16 | AArch64::AEK_LSE |
+                             AArch64::AEK_RAS | AArch64::AEK_RCPC |
+                             AArch64::AEK_RDM | AArch64::AEK_SIMD |
+                             AArch64::AEK_SSBS,
+                         "8.2-A"),
+        ARMCPUTestParams("neoverse-n1", "armv8.2-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_DOTPROD | AArch64::AEK_FP |
+                             AArch64::AEK_FP16 | AArch64::AEK_LSE |
+                             AArch64::AEK_PROFILE | AArch64::AEK_RAS |
+                             AArch64::AEK_RCPC | AArch64::AEK_RDM |
+                             AArch64::AEK_SIMD | AArch64::AEK_SSBS,
+                         "8.2-A"),
+        ARMCPUTestParams("neoverse-n2", "armv8.5-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD |
+                             AArch64::AEK_FP16 | AArch64::AEK_RAS |
+                             AArch64::AEK_LSE | AArch64::AEK_SVE |
+                             AArch64::AEK_DOTPROD | AArch64::AEK_RCPC |
+                             AArch64::AEK_RDM | AArch64::AEK_MTE |
+                             AArch64::AEK_SSBS | AArch64::AEK_SB |
+                             AArch64::AEK_SVE2 | AArch64::AEK_SVE2BITPERM |
+                             AArch64::AEK_BF16 | AArch64::AEK_I8MM,
+                         "8.5-A"),
+        ARMCPUTestParams("thunderx2t99", "armv8.1-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_NONE | AArch64::AEK_CRC |
+                             AArch64::AEK_CRYPTO | AArch64::AEK_LSE |
+                             AArch64::AEK_RDM | AArch64::AEK_FP |
+                             AArch64::AEK_SIMD,
+                         "8.1-A"),
+        ARMCPUTestParams("thunderx3t110", "armv8.3-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_LSE | AArch64::AEK_RDM |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD |
+                             AArch64::AEK_PROFILE | AArch64::AEK_RAS |
+                             AArch64::AEK_RAND | AArch64::AEK_RCPC,
+                         "8.3-A"),
+        ARMCPUTestParams("thunderx", "armv8-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_SIMD | AArch64::AEK_FP |
+                             AArch64::AEK_PROFILE,
+                         "8-A"),
+        ARMCPUTestParams("thunderxt81", "armv8-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_SIMD | AArch64::AEK_FP |
+                             AArch64::AEK_PROFILE,
+                         "8-A"),
+        ARMCPUTestParams("thunderxt83", "armv8-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_SIMD | AArch64::AEK_FP |
+                             AArch64::AEK_PROFILE,
+                         "8-A"),
+        ARMCPUTestParams("thunderxt88", "armv8-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_SIMD | AArch64::AEK_FP |
+                             AArch64::AEK_PROFILE,
+                         "8-A"),
+        ARMCPUTestParams("tsv110", "armv8.2-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD |
+                             AArch64::AEK_RAS | AArch64::AEK_LSE |
+                             AArch64::AEK_RDM | AArch64::AEK_PROFILE |
+                             AArch64::AEK_FP16 | AArch64::AEK_FP16FML |
+                             AArch64::AEK_DOTPROD,
+                         "8.2-A"),
+        ARMCPUTestParams("a64fx", "armv8.2-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD |
+                             AArch64::AEK_FP16 | AArch64::AEK_RAS |
+                             AArch64::AEK_LSE | AArch64::AEK_SVE |
+                             AArch64::AEK_RDM,
+                         "8.2-A"),
+        ARMCPUTestParams("carmel", "armv8.2-a", "crypto-neon-fp-armv8",
+                         AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
+                             AArch64::AEK_FP | AArch64::AEK_SIMD |
+                             AArch64::AEK_FP16 | AArch64::AEK_RAS |
+                             AArch64::AEK_LSE | AArch64::AEK_RDM,
+                         "8.2-A")), );
+
 static constexpr unsigned NumAArch64CPUArchs = 45;
 
 TEST(TargetParserTest, testAArch64CPUArchList) {
@@ -1350,4 +1386,5 @@ TEST(TargetParserTest, AArch64ArchExtFeature) {
               AArch64::getArchExtFeature(ArchExt[i][1]));
   }
 }
-}
+
+} // namespace


        


More information about the llvm-branch-commits mailing list