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