diff --git a/lldb/test/Shell/Commands/command-disassemble-aarch64-extensions.s b/lldb/test/Shell/Commands/command-disassemble-aarch64-extensions.s --- a/lldb/test/Shell/Commands/command-disassemble-aarch64-extensions.s +++ b/lldb/test/Shell/Commands/command-disassemble-aarch64-extensions.s @@ -9,98 +9,111 @@ .globl fn .type fn, @function fn: - // These are in the same order as llvm/include/llvm/Support/AArch64TargetParser.def - crc32b w0, w0, w0 // CRC - ldaddab w0, w0, [sp] // LSE - sqrdmlah v0.4h, v1.4h, v2.4h // RDM - // CRYPTO enables a combination of other features - sm4e v0.4s, v0.4s // SM4 - bcax v0.16b, v0.16b, v0.16b, v0.16b // SHA3 - sha256h q0, q0, v0.4s // SHA256 - aesd v0.16b, v0.16b // AES - sdot v0.2s, v1.8b, v2.8b // DOTPROD - fcvt d0, s0 // FP - addp v0.4s, v0.4s, v0.4s // SIMD (neon) - fabs h1, h2 // FP16 - fmlal v0.2s, v1.2h, v2.2h // FP16FML - psb csync // PROFILE/SPE - msr erxpfgctl_el1, x0 // RAS - abs z31.h, p7/m, z31.h // SVE - sqdmlslbt z0.d, z1.s, z31.s // SVE2 - aesd z0.b, z0.b, z31.b // SVE2AES - sm4e z0.s, z0.s, z0.s // SVE2SM4 - rax1 z0.d, z0.d, z0.d // SVE2SHA3 - bdep z0.b, z1.b, z31.b // SVE2BITPERM - addqv v0.8h, p0, z0.h // SVE2p1 / SME2p1 - bfadd z23.h, p3/m, z23.h, z13.h // B16B16 - ldaprb w0, [x0, #0] // RCPC - mrs x0, rndr // RAND - irg x0, x0 // MTE - mrs x2, ssbs // SSBS - sb // SB - cfp rctx, x0 // PREDRES - bfdot v2.2s, v3.4h, v4.4h // BF16 - smmla v1.4s, v16.16b, v31.16b // I8MM - fmmla z0.s, z1.s, z2.s // F32MM - fmmla z0.d, z1.d, z2.d // F64MM - tcommit // TME - ld64b x0, [x13] // LS64 - brb iall // BRBE - pacia x0, x1 // PAUTH - cfinv // FLAGM - addha za0.s, p0/m, p0/m, z0.s // SME - fmopa za0.d, p0/m, p0/m, z0.d, z0.d // SMEF64 - addha za0.d, p0/m, p0/m, z0.d // SMEI64 - add {z0.h, z1.h}, {z0.h, z1.h}, z0.h // SME2 + // These are in alphabetical order by extension name + aesd v0.16b, v0.16b // AEK_AES + bfadd z23.h, p3/m, z23.h, z13.h // AEK_B16B16 + bfdot v2.2s, v3.4h, v4.4h // AEK_BF16 + brb iall // AEK_BRBE + crc32b w0, w0, w0 // AEK_CRC + // AEK_CRYPTO enables a combination of other features + smin x0, x0, #0 // AEK_CSSC + sysp #0, c2, c0, #0, x0, x1 // AEK_D128 + sdot v0.2s, v1.8b, v2.8b // AEK_DOTPROD + fmmla z0.s, z1.s, z2.s // AEK_F32MM + fmmla z0.d, z1.d, z2.d // AEK_F64MM + cfinv // AEK_FLAGM + fcvt d0, s0 // AEK_FP + fabs h1, h2 // AEK_FP16 + fmlal v0.2s, v1.2h, v2.2h // AEK_FP16FML + bc.eq lbl // AEK_HBC + smmla v1.4s, v16.16b, v31.16b // AEK_I8MM + ld64b x0, [x13] // AEK_LS64 + ldaddab w0, w0, [sp] // AEK_LSE + ldclrp x1, x2, [x11] // AEK_LSE128 + irg x0, x0 // AEK_MTE + cpyfp [x0]!, [x1]!, x2! // AEK_MOPS + pacia x0, x1 // AEK_PAUTH + mrs x0, pmccntr_el0 // AEK_PERFMON + cfp rctx, x0 // AEK_PREDRES + psb csync // AEK_PROFILE/SPE + msr erxpfgctl_el1, x0 // AEK_RAS + ldaprb w0, [x0, #0] // AEK_RCPC + stilp w26, w2, [x18] // AEK_RCPC3 + sqrdmlah v0.4h, v1.4h, v2.4h // AEK_RDM + mrs x0, rndr // AEK_RAND + sb // AEK_SB + sha256h q0, q0, v0.4s // AEK_SHA2 + bcax v0.16b, v0.16b, v0.16b, v0.16b // AEK_SHA3 + addp v0.4s, v0.4s, v0.4s // AEK_SIMD (neon) + sm4e v0.4s, v0.4s // AEK_SM4 + addha za0.s, p0/m, p0/m, z0.s // AEK_SME + fadd za.h[w11, 7], {z12.h - z13.h} // AEK_SMEF16F16 + fmopa za0.d, p0/m, p0/m, z0.d, z0.d // AEK_SMEF64F64 + addha za0.d, p0/m, p0/m, z0.d // AEK_SMEI16I64 + add {z0.h, z1.h}, {z0.h, z1.h}, z0.h // AEK_SME2 + // AEK_SME2P1: see AEK_SVE2P1 + mrs x2, ssbs // AEK_SSBS + abs z31.h, p7/m, z31.h // AEK_SVE + sqdmlslbt z0.d, z1.s, z31.s // AEK_SVE2 + aesd z0.b, z0.b, z31.b // AEK_SVE2AES + bdep z0.b, z1.b, z31.b // AEK_SVE2BITPERM + rax1 z0.d, z0.d, z0.d // AEK_SVE2SHA3 + sm4e z0.s, z0.s, z0.s // AEK_SVE2SM4 + addqv v0.8h, p0, z0.h // AEK_SVE2p1 / AEK_SME2p1 + rcwswp x0, x1, [x2] // AEK_THE + tcommit // AEK_TME lbl: - bc.eq lbl // HBC - cpyfp [x0]!, [x1]!, x2! // MOPS - mrs x0, pmccntr_el0 // PERFMON .fn_end: .size fn, .fn_end-fn # CHECK: command-disassemble-aarch64-extensions.s.tmp`fn: -# CHECK: crc32b w0, w0, w0 -# CHECK: ldaddab w0, w0, [sp] -# CHECK: sqrdmlah v0.4h, v1.4h, v2.4h -# CHECK: sm4e v0.4s, v0.4s -# CHECK: bcax v0.16b, v0.16b, v0.16b, v0.16b -# CHECK: sha256h q0, q0, v0.4s -# CHECK: aesd v0.16b, v0.16b -# CHECK: sdot v0.2s, v1.8b, v2.8b -# CHECK: fcvt d0, s0 -# CHECK: addp v0.4s, v0.4s, v0.4s -# CHECK: fabs h1, h2 -# CHECK: fmlal v0.2s, v1.2h, v2.2h -# CHECK: psb csync -# CHECK: msr ERXPFGCTL_EL1, x0 -# CHECK: abs z31.h, p7/m, z31.h -# CHECK: sqdmlslbt z0.d, z1.s, z31.s -# CHECK: aesd z0.b, z0.b, z31.b -# CHECK: sm4e z0.s, z0.s, z0.s -# CHECK: rax1 z0.d, z0.d, z0.d -# CHECK: bdep z0.b, z1.b, z31.b -# CHECK: addqv v0.8h, p0, z0.h -# CHECK: bfadd z23.h, p3/m, z23.h, z13.h -# CHECK: ldaprb w0, [x0] -# CHECK: mrs x0, RNDR -# CHECK: irg x0, x0 -# CHECK: mrs x2, SSBS -# CHECK: sb -# CHECK: cfp rctx, x0 -# CHECK: bfdot v2.2s, v3.4h, v4.4h -# CHECK: smmla v1.4s, v16.16b, v31.16b -# CHECK: fmmla z0.s, z1.s, z2.s -# CHECK: fmmla z0.d, z1.d, z2.d -# CHECK: tcommit -# CHECK: ld64b x0, [x13] -# CHECK: brb iall -# CHECK: pacia x0, x1 -# CHECK: cfinv -# CHECK: addha za0.s, p0/m, p0/m, z0.s -# CHECK: fmopa za0.d, p0/m, p0/m, z0.d, z0.d -# CHECK: addha za0.d, p0/m, p0/m, z0.d -# CHECK: add { z0.h, z1.h }, { z0.h, z1.h }, z0.h -# CHECK: bc.eq 0xa4 -# CHECK: cpyfp [x0]!, [x1]!, x2! -# CHECK: mrs x0, PMCCNTR_EL0 +# CHECK-NEXT: aesd v0.16b, v0.16b +# CHECK-NEXT: bfadd z23.h, p3/m, z23.h, z13.h +# CHECK-NEXT: bfdot v2.2s, v3.4h, v4.4h +# CHECK-NEXT: brb iall +# CHECK-NEXT: crc32b w0, w0, w0 +# CHECK-NEXT: smin x0, x0, #0 +# CHECK-NEXT: sysp #0x0, c2, c0, #0x0, x0, x1 +# CHECK-NEXT: sdot v0.2s, v1.8b, v2.8b +# CHECK-NEXT: fmmla z0.s, z1.s, z2.s +# CHECK-NEXT: fmmla z0.d, z1.d, z2.d +# CHECK-NEXT: cfinv +# CHECK-NEXT: fcvt d0, s0 +# CHECK-NEXT: fabs h1, h2 +# CHECK-NEXT: fmlal v0.2s, v1.2h, v2.2h +# CHECK-NEXT: bc.eq 0xc8 +# CHECK-NEXT: smmla v1.4s, v16.16b, v31.16b +# CHECK-NEXT: ld64b x0, [x13] +# CHECK-NEXT: ldaddab w0, w0, [sp] +# CHECK-NEXT: ldclrp x1, x2, [x11] +# CHECK-NEXT: irg x0, x0 +# CHECK-NEXT: cpyfp [x0]!, [x1]!, x2! +# CHECK-NEXT: pacia x0, x1 +# CHECK-NEXT: mrs x0, PMCCNTR_EL0 +# CHECK-NEXT: cfp rctx, x0 +# CHECK-NEXT: psb csync +# CHECK-NEXT: msr ERXPFGCTL_EL1, x0 +# CHECK-NEXT: ldaprb w0, [x0] +# CHECK-NEXT: stilp w26, w2, [x18] +# CHECK-NEXT: sqrdmlah v0.4h, v1.4h, v2.4h +# CHECK-NEXT: mrs x0, RNDR +# CHECK-NEXT: sb +# CHECK-NEXT: sha256h q0, q0, v0.4s +# CHECK-NEXT: bcax v0.16b, v0.16b, v0.16b, v0.16b +# CHECK-NEXT: addp v0.4s, v0.4s, v0.4s +# CHECK-NEXT: sm4e v0.4s, v0.4s +# CHECK-NEXT: addha za0.s, p0/m, p0/m, z0.s +# CHECK-NEXT: fadd za.h[w11, 7, vgx2], { z12.h, z13.h } +# CHECK-NEXT: fmopa za0.d, p0/m, p0/m, z0.d, z0.d +# CHECK-NEXT: addha za0.d, p0/m, p0/m, z0.d +# CHECK-NEXT: add { z0.h, z1.h }, { z0.h, z1.h }, z0.h +# CHECK-NEXT: mrs x2, SSBS +# CHECK-NEXT: abs z31.h, p7/m, z31.h +# CHECK-NEXT: sqdmlslbt z0.d, z1.s, z31.s +# CHECK-NEXT: aesd z0.b, z0.b, z31.b +# CHECK-NEXT: bdep z0.b, z1.b, z31.b +# CHECK-NEXT: rax1 z0.d, z0.d, z0.d +# CHECK-NEXT: sm4e z0.s, z0.s, z0.s +# CHECK-NEXT: addqv v0.8h, p0, z0.h +# CHECK-NEXT: rcwswp x0, x1, [x2] +# CHECK-NEXT: tcommit diff --git a/llvm/include/llvm/Support/AArch64TargetParser.h b/llvm/include/llvm/Support/AArch64TargetParser.h --- a/llvm/include/llvm/Support/AArch64TargetParser.h +++ b/llvm/include/llvm/Support/AArch64TargetParser.h @@ -99,9 +99,62 @@ }; inline constexpr ExtensionInfo Extensions[] = { -#define AARCH64_ARCH_EXT_NAME(NAME, ID, FEATURE, NEGFEATURE) \ - {NAME, ID, FEATURE, NEGFEATURE}, -#include "AArch64TargetParser.def" + {"aes", AArch64::AEK_AES, "+aes", "-aes"}, + {"b16b16", AArch64::AEK_B16B16, "+b16b16", "-b16b16"}, + {"bf16", AArch64::AEK_BF16, "+bf16", "-bf16"}, + {"brbe", AArch64::AEK_BRBE, "+brbe", "-brbe"}, + {"crc", AArch64::AEK_CRC, "+crc", "-crc"}, + {"crypto", AArch64::AEK_CRYPTO, "+crypto", "-crypto"}, + {"cssc", AArch64::AEK_CSSC, "+cssc", "-cssc"}, + {"d128", AArch64::AEK_D128, "+d128", "-d128"}, + {"dotprod", AArch64::AEK_DOTPROD, "+dotprod", "-dotprod"}, + {"f32mm", AArch64::AEK_F32MM, "+f32mm", "-f32mm"}, + {"f64mm", AArch64::AEK_F64MM, "+f64mm", "-f64mm"}, + {"flagm", AArch64::AEK_FLAGM, "+flagm", "-flagm"}, + {"fp", AArch64::AEK_FP, "+fp-armv8", "-fp-armv8"}, + {"fp16", AArch64::AEK_FP16, "+fullfp16", "-fullfp16"}, + {"fp16fml", AArch64::AEK_FP16FML, "+fp16fml", "-fp16fml"}, + {"hbc", AArch64::AEK_HBC, "+hbc", "-hbc"}, + {"i8mm", AArch64::AEK_I8MM, "+i8mm", "-i8mm"}, + {"ls64", AArch64::AEK_LS64, "+ls64", "-ls64"}, + {"lse", AArch64::AEK_LSE, "+lse", "-lse"}, + {"lse128", AArch64::AEK_LSE128, "+lse128", "-lse128"}, + {"memtag", AArch64::AEK_MTE, "+mte", "-mte"}, + {"mops", AArch64::AEK_MOPS, "+mops", "-mops"}, + {"pauth", AArch64::AEK_PAUTH, "+pauth", "-pauth"}, + {"pmuv3", AArch64::AEK_PERFMON, "+perfmon", "-perfmon"}, + {"predres", AArch64::AEK_PREDRES, "+predres", "-predres"}, + {"profile", AArch64::AEK_PROFILE, "+spe", "-spe"}, + {"ras", AArch64::AEK_RAS, "+ras", "-ras"}, + {"rcpc", AArch64::AEK_RCPC, "+rcpc", "-rcpc"}, + {"rcpc3", AArch64::AEK_RCPC3, "+rcpc3", "-rcpc3"}, + {"rdm", AArch64::AEK_RDM, "+rdm", "-rdm"}, + {"rng", AArch64::AEK_RAND, "+rand", "-rand"}, + {"sb", AArch64::AEK_SB, "+sb", "-sb"}, + {"sha2", AArch64::AEK_SHA2, "+sha2", "-sha2"}, + {"sha3", AArch64::AEK_SHA3, "+sha3", "-sha3"}, + {"simd", AArch64::AEK_SIMD, "+neon", "-neon"}, + {"sm4", AArch64::AEK_SM4, "+sm4", "-sm4"}, + {"sme-f16f16", AArch64::AEK_SMEF16F16, "+sme-f16f16", "-sme-f16f16"}, + {"sme-f64f64", AArch64::AEK_SMEF64F64, "+sme-f64f64", "-sme-f64f64"}, + {"sme-i16i64", AArch64::AEK_SMEI16I64, "+sme-i16i64", "-sme-i16i64"}, + {"sme", AArch64::AEK_SME, "+sme", "-sme"}, + {"sme2", AArch64::AEK_SME2, "+sme2", "-sme2"}, + {"sme2p1", AArch64::AEK_SME2p1, "+sme2p1", "-sme2p1"}, + {"ssbs", AArch64::AEK_SSBS, "+ssbs", "-ssbs"}, + {"sve", AArch64::AEK_SVE, "+sve", "-sve"}, + {"sve2-aes", AArch64::AEK_SVE2AES, "+sve2-aes", "-sve2-aes"}, + {"sve2-bitperm", AArch64::AEK_SVE2BITPERM, "+sve2-bitperm", + "-sve2-bitperm"}, + {"sve2-sha3", AArch64::AEK_SVE2SHA3, "+sve2-sha3", "-sve2-sha3"}, + {"sve2-sm4", AArch64::AEK_SVE2SM4, "+sve2-sm4", "-sve2-sm4"}, + {"sve2", AArch64::AEK_SVE2, "+sve2", "-sve2"}, + {"sve2p1", AArch64::AEK_SVE2p1, "+sve2p1", "-sve2p1"}, + {"the", AArch64::AEK_THE, "+the", "-the"}, + {"tme", AArch64::AEK_TME, "+tme", "-tme"}, + // Special cases + {"none", AArch64::AEK_NONE, {}, {}}, + {"invalid", AArch64::AEK_INVALID, {}, {}}, }; enum ArchProfile { AProfile = 'A', RProfile = 'R', InvalidProfile = '?' }; @@ -154,33 +207,179 @@ static const ArchInfo &findBySubArch(StringRef SubArch); }; -// Create ArchInfo structs named -#define AARCH64_ARCH(MAJOR, MINOR, PROFILE, NAME, ID, ARCH_FEATURE, \ - ARCH_BASE_EXT) \ - inline constexpr ArchInfo ID = {VersionTuple{MAJOR, MINOR}, PROFILE, NAME, \ - ARCH_FEATURE, ARCH_BASE_EXT}; -#include "AArch64TargetParser.def" -#undef AARCH64_ARCH +// clang-format off +inline constexpr ArchInfo INVALID = { VersionTuple{0, 0}, AProfile, "invalid", "+", (AArch64::AEK_NONE)}; +inline constexpr ArchInfo ARMV8A = { VersionTuple{8, 0}, AProfile, "armv8-a", "+v8a", (AArch64::AEK_CRYPTO | AArch64::AEK_FP | AArch64::AEK_SIMD), }; +inline constexpr ArchInfo ARMV8_1A = { VersionTuple{8, 1}, AProfile, "armv8.1-a", "+v8.1a", (ARMV8A.DefaultExts | AArch64::AEK_CRC | AArch64::AEK_LSE | AArch64::AEK_RDM)}; +inline constexpr ArchInfo ARMV8_2A = { VersionTuple{8, 2}, AProfile, "armv8.2-a", "+v8.2a", (ARMV8_1A.DefaultExts | AArch64::AEK_RAS)}; +inline constexpr ArchInfo ARMV8_3A = { VersionTuple{8, 3}, AProfile, "armv8.3-a", "+v8.3a", (ARMV8_2A.DefaultExts | AArch64::AEK_RCPC)}; +inline constexpr ArchInfo ARMV8_4A = { VersionTuple{8, 4}, AProfile, "armv8.4-a", "+v8.4a", (ARMV8_3A.DefaultExts | AArch64::AEK_DOTPROD)}; +inline constexpr ArchInfo ARMV8_5A = { VersionTuple{8, 5}, AProfile, "armv8.5-a", "+v8.5a", (ARMV8_4A.DefaultExts)}; +constexpr unsigned BaseNoCrypto = ARMV8_5A.DefaultExts ^ AArch64::AEK_CRYPTO; // 8.6 onwards has no AEK_CRYPTO +inline constexpr ArchInfo ARMV8_6A = { VersionTuple{8, 6}, AProfile, "armv8.6-a", "+v8.6a", (BaseNoCrypto | AArch64::AEK_SM4 | AArch64::AEK_SHA3 | AArch64::AEK_BF16 | AArch64::AEK_SHA2 | AArch64::AEK_AES | AArch64::AEK_I8MM)}; +inline constexpr ArchInfo ARMV8_7A = { VersionTuple{8, 7}, AProfile, "armv8.7-a", "+v8.7a", (ARMV8_6A.DefaultExts)}; +inline constexpr ArchInfo ARMV8_8A = { VersionTuple{8, 8}, AProfile, "armv8.8-a", "+v8.8a", (ARMV8_7A.DefaultExts)}; +inline constexpr ArchInfo ARMV8_9A = { VersionTuple{8, 9}, AProfile, "armv8.9-a", "+v8.9a", (ARMV8_8A.DefaultExts)}; +inline constexpr ArchInfo ARMV9A = { VersionTuple{9, 0}, AProfile, "armv9-a", "+v9a", (BaseNoCrypto | AArch64::AEK_SVE2)}; +inline constexpr ArchInfo ARMV9_1A = { VersionTuple{9, 1}, AProfile, "armv9.1-a", "+v9.1a", (ARMV9A.DefaultExts | AArch64::AEK_BF16 | AArch64::AEK_I8MM)}; +inline constexpr ArchInfo ARMV9_2A = { VersionTuple{9, 2}, AProfile, "armv9.2-a", "+v9.2a", (ARMV9_1A.DefaultExts)}; +inline constexpr ArchInfo ARMV9_3A = { VersionTuple{9, 3}, AProfile, "armv9.3-a", "+v9.3a", (ARMV9_2A.DefaultExts)}; +inline constexpr ArchInfo ARMV9_4A = { VersionTuple{9, 4}, AProfile, "armv9.4-a", "+v9.4a", (ARMV9_3A.DefaultExts)}; +// For v8-R, we do not enable crypto and align with GCC that enables a more minimal set of optional architecture extensions. +inline constexpr ArchInfo ARMV8R = { VersionTuple{8, 0}, RProfile, "armv8-r", "+v8r", ((BaseNoCrypto ^ AArch64::AEK_LSE) | AArch64::AEK_SSBS | AArch64::AEK_FP16 | AArch64::AEK_FP16FML | AArch64::AEK_SB), }; +// clang-format on // The set of all architectures -inline constexpr std::array ArchInfos = { -#define AARCH64_ARCH(MAJOR, MINOR, PROFILE, NAME, ID, ARCH_FEATURE, \ - ARCH_BASE_EXT) \ - &ID, -#include "AArch64TargetParser.def" +static constexpr std::array ArchInfos = { + &INVALID, &ARMV8A, &ARMV8_1A, &ARMV8_2A, &ARMV8_3A, &ARMV8_4A, + &ARMV8_5A, &ARMV8_6A, &ARMV8_7A, &ARMV8_8A, &ARMV8_9A, &ARMV9A, + &ARMV9_1A, &ARMV9_2A, &ARMV9_3A, &ARMV9_4A, &ARMV8R, }; // Details of a specific CPU. struct CpuInfo { StringRef Name; // Name, as written for -mcpu. const ArchInfo &Arch; - uint64_t DefaultExtensions; + uint64_t DefaultExtensions; // Default extensions for this CPU. These will be + // ORd with the architecture defaults. }; inline constexpr CpuInfo CpuInfos[] = { -#define AARCH64_CPU_NAME(NAME, ARCH_ID, DEFAULT_EXT) \ - {NAME, ARCH_ID, DEFAULT_EXT}, -#include "AArch64TargetParser.def" + {"cortex-a34", ARMV8A, (AArch64::AEK_CRC)}, + {"cortex-a35", ARMV8A, (AArch64::AEK_CRC)}, + {"cortex-a53", ARMV8A, (AArch64::AEK_CRC)}, + {"cortex-a55", ARMV8_2A, + (AArch64::AEK_FP16 | AArch64::AEK_DOTPROD | AArch64::AEK_RCPC)}, + {"cortex-a510", ARMV9A, + (AArch64::AEK_BF16 | AArch64::AEK_I8MM | AArch64::AEK_SB | + AArch64::AEK_PAUTH | AArch64::AEK_MTE | AArch64::AEK_SSBS | + AArch64::AEK_SVE | AArch64::AEK_SVE2 | AArch64::AEK_SVE2BITPERM | + AArch64::AEK_FP16FML)}, + {"cortex-a57", ARMV8A, (AArch64::AEK_CRC)}, + {"cortex-a65", ARMV8_2A, + (AArch64::AEK_DOTPROD | AArch64::AEK_FP16 | AArch64::AEK_RCPC | + AArch64::AEK_SSBS)}, + {"cortex-a65ae", ARMV8_2A, + (AArch64::AEK_DOTPROD | AArch64::AEK_FP16 | AArch64::AEK_RCPC | + AArch64::AEK_SSBS)}, + {"cortex-a72", ARMV8A, (AArch64::AEK_CRC)}, + {"cortex-a73", ARMV8A, (AArch64::AEK_CRC)}, + {"cortex-a75", ARMV8_2A, + (AArch64::AEK_FP16 | AArch64::AEK_DOTPROD | AArch64::AEK_RCPC)}, + {"cortex-a76", ARMV8_2A, + (AArch64::AEK_FP16 | AArch64::AEK_DOTPROD | AArch64::AEK_RCPC | + AArch64::AEK_SSBS)}, + {"cortex-a76ae", ARMV8_2A, + (AArch64::AEK_FP16 | AArch64::AEK_DOTPROD | AArch64::AEK_RCPC | + AArch64::AEK_SSBS)}, + {"cortex-a77", ARMV8_2A, + (AArch64::AEK_FP16 | AArch64::AEK_RCPC | AArch64::AEK_DOTPROD | + AArch64::AEK_SSBS)}, + {"cortex-a78", ARMV8_2A, + (AArch64::AEK_FP16 | AArch64::AEK_DOTPROD | AArch64::AEK_RCPC | + AArch64::AEK_SSBS | AArch64::AEK_PROFILE)}, + {"cortex-a78c", ARMV8_2A, + (AArch64::AEK_FP16 | AArch64::AEK_DOTPROD | AArch64::AEK_RCPC | + AArch64::AEK_SSBS | AArch64::AEK_PROFILE | AArch64::AEK_FLAGM | + AArch64::AEK_PAUTH | AArch64::AEK_FP16FML)}, + {"cortex-a710", ARMV9A, + (AArch64::AEK_MTE | AArch64::AEK_PAUTH | AArch64::AEK_FLAGM | + AArch64::AEK_SB | AArch64::AEK_I8MM | AArch64::AEK_FP16FML | + AArch64::AEK_SVE | AArch64::AEK_SVE2 | AArch64::AEK_SVE2BITPERM | + AArch64::AEK_BF16)}, + {"cortex-a715", ARMV9A, + (AArch64::AEK_SB | AArch64::AEK_SSBS | AArch64::AEK_MTE | + AArch64::AEK_FP16 | AArch64::AEK_FP16FML | AArch64::AEK_PAUTH | + AArch64::AEK_I8MM | AArch64::AEK_PREDRES | AArch64::AEK_PERFMON | + AArch64::AEK_PROFILE | AArch64::AEK_SVE | AArch64::AEK_SVE2BITPERM | + AArch64::AEK_BF16 | AArch64::AEK_FLAGM)}, + {"cortex-r82", ARMV8R, (AArch64::AEK_LSE)}, + {"cortex-x1", ARMV8_2A, + (AArch64::AEK_FP16 | AArch64::AEK_DOTPROD | AArch64::AEK_RCPC | + AArch64::AEK_SSBS | AArch64::AEK_PROFILE)}, + {"cortex-x1c", ARMV8_2A, + (AArch64::AEK_FP16 | AArch64::AEK_DOTPROD | AArch64::AEK_RCPC | + AArch64::AEK_SSBS | AArch64::AEK_PAUTH | AArch64::AEK_PROFILE)}, + {"cortex-x2", ARMV9A, + (AArch64::AEK_MTE | AArch64::AEK_BF16 | AArch64::AEK_I8MM | + AArch64::AEK_PAUTH | AArch64::AEK_SSBS | AArch64::AEK_SB | + AArch64::AEK_SVE | AArch64::AEK_SVE2 | AArch64::AEK_SVE2BITPERM | + AArch64::AEK_FP16FML)}, + {"cortex-x3", ARMV9A, + (AArch64::AEK_SVE | AArch64::AEK_PERFMON | AArch64::AEK_PROFILE | + AArch64::AEK_BF16 | AArch64::AEK_I8MM | AArch64::AEK_MTE | + AArch64::AEK_SVE2BITPERM | AArch64::AEK_SB | AArch64::AEK_PAUTH | + AArch64::AEK_FP16 | AArch64::AEK_FP16FML | AArch64::AEK_PREDRES | + AArch64::AEK_FLAGM | AArch64::AEK_SSBS)}, + {"neoverse-e1", ARMV8_2A, + (AArch64::AEK_DOTPROD | AArch64::AEK_FP16 | AArch64::AEK_RCPC | + AArch64::AEK_SSBS)}, + {"neoverse-n1", ARMV8_2A, + (AArch64::AEK_DOTPROD | AArch64::AEK_FP16 | AArch64::AEK_PROFILE | + AArch64::AEK_RCPC | AArch64::AEK_SSBS)}, + {"neoverse-n2", ARMV8_5A, + (AArch64::AEK_BF16 | AArch64::AEK_DOTPROD | AArch64::AEK_FP16 | + AArch64::AEK_I8MM | AArch64::AEK_MTE | AArch64::AEK_SB | + AArch64::AEK_SSBS | AArch64::AEK_SVE | AArch64::AEK_SVE2 | + AArch64::AEK_SVE2BITPERM)}, + {"neoverse-512tvb", ARMV8_4A, + (AArch64::AEK_SVE | AArch64::AEK_SSBS | AArch64::AEK_FP16 | + AArch64::AEK_BF16 | AArch64::AEK_DOTPROD | AArch64::AEK_PROFILE | + AArch64::AEK_RAND | AArch64::AEK_FP16FML | AArch64::AEK_I8MM)}, + {"neoverse-v1", ARMV8_4A, + (AArch64::AEK_SVE | AArch64::AEK_SSBS | AArch64::AEK_FP16 | + AArch64::AEK_BF16 | AArch64::AEK_DOTPROD | AArch64::AEK_PROFILE | + AArch64::AEK_RAND | AArch64::AEK_FP16FML | AArch64::AEK_I8MM)}, + {"neoverse-v2", ARMV9A, + (AArch64::AEK_SVE | AArch64::AEK_SVE2 | AArch64::AEK_SSBS | + AArch64::AEK_FP16 | AArch64::AEK_BF16 | AArch64::AEK_RAND | + AArch64::AEK_DOTPROD | AArch64::AEK_PROFILE | AArch64::AEK_SVE2BITPERM | + AArch64::AEK_FP16FML | AArch64::AEK_I8MM | AArch64::AEK_MTE)}, + {"cyclone", ARMV8A, (AArch64::AEK_NONE)}, + {"apple-a7", ARMV8A, (AArch64::AEK_NONE)}, + {"apple-a8", ARMV8A, (AArch64::AEK_NONE)}, + {"apple-a9", ARMV8A, (AArch64::AEK_NONE)}, + {"apple-a10", ARMV8A, (AArch64::AEK_CRC | AArch64::AEK_RDM)}, + {"apple-a11", ARMV8_2A, (AArch64::AEK_FP16)}, + {"apple-a12", ARMV8_3A, (AArch64::AEK_FP16)}, + {"apple-a13", ARMV8_4A, + (AArch64::AEK_FP16 | AArch64::AEK_FP16FML | AArch64::AEK_SHA3)}, + {"apple-a14", ARMV8_5A, + (AArch64::AEK_FP16 | AArch64::AEK_FP16FML | AArch64::AEK_SHA3)}, + {"apple-a15", ARMV8_5A, + (AArch64::AEK_FP16 | AArch64::AEK_FP16FML | AArch64::AEK_SHA3 | + AArch64::AEK_BF16 | AArch64::AEK_I8MM)}, + {"apple-a16", ARMV8_5A, + (AArch64::AEK_FP16 | AArch64::AEK_FP16FML | AArch64::AEK_SHA3 | + AArch64::AEK_BF16 | AArch64::AEK_I8MM)}, + {"apple-m1", ARMV8_5A, + (AArch64::AEK_FP16 | AArch64::AEK_FP16FML | AArch64::AEK_SHA3)}, + {"apple-m2", ARMV8_5A, + (AArch64::AEK_FP16 | AArch64::AEK_FP16FML | AArch64::AEK_SHA3 | + AArch64::AEK_BF16 | AArch64::AEK_I8MM)}, + {"apple-s4", ARMV8_3A, (AArch64::AEK_FP16)}, + {"apple-s5", ARMV8_3A, (AArch64::AEK_FP16)}, + {"exynos-m3", ARMV8A, (AArch64::AEK_CRC)}, + {"exynos-m4", ARMV8_2A, (AArch64::AEK_DOTPROD | AArch64::AEK_FP16)}, + {"exynos-m5", ARMV8_2A, (AArch64::AEK_DOTPROD | AArch64::AEK_FP16)}, + {"falkor", ARMV8A, (AArch64::AEK_CRC | AArch64::AEK_RDM)}, + {"saphira", ARMV8_3A, (AArch64::AEK_PROFILE)}, + {"kryo", ARMV8A, (AArch64::AEK_CRC)}, + {"thunderx2t99", ARMV8_1A, (AArch64::AEK_NONE)}, + {"thunderx3t110", ARMV8_3A, (AArch64::AEK_NONE)}, + {"thunderx", ARMV8A, (AArch64::AEK_CRC)}, + {"thunderxt88", ARMV8A, (AArch64::AEK_CRC)}, + {"thunderxt81", ARMV8A, (AArch64::AEK_CRC)}, + {"thunderxt83", ARMV8A, (AArch64::AEK_CRC)}, + {"tsv110", ARMV8_2A, + (AArch64::AEK_DOTPROD | AArch64::AEK_FP16 | AArch64::AEK_FP16FML | + AArch64::AEK_PROFILE)}, + {"a64fx", ARMV8_2A, (AArch64::AEK_FP16 | AArch64::AEK_SVE)}, + {"carmel", ARMV8_2A, (AArch64::AEK_FP16)}, + {"ampere1", ARMV8_6A, + (AArch64::AEK_FP16 | AArch64::AEK_SB | AArch64::AEK_SSBS)}, + // Invalid CPU + {"invalid", INVALID, (AArch64::AEK_INVALID)}, }; // An alias for a CPU. @@ -189,10 +388,7 @@ StringRef Name; }; -inline constexpr CpuAlias CpuAliases[] = { -#define AARCH64_CPU_ALIAS(ALIAS, NAME) {ALIAS, NAME}, -#include "AArch64TargetParser.def" -}; +inline constexpr CpuAlias CpuAliases[] = {{"grace", "neoverse-v2"}}; bool getExtensionFeatures(uint64_t Extensions, std::vector &Features); diff --git a/llvm/include/llvm/Support/AArch64TargetParser.def b/llvm/include/llvm/Support/AArch64TargetParser.def deleted file mode 100644 --- a/llvm/include/llvm/Support/AArch64TargetParser.def +++ /dev/null @@ -1,339 +0,0 @@ -//===- AARCH64TargetParser.def - AARCH64 target parsing defines ---------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -// This file provides defines to build up the AARCH64 target parser's logic. -// -//===----------------------------------------------------------------------===// - -// NOTE: NO INCLUDE GUARD DESIRED! - -#ifndef AARCH64_ARCH -#define AARCH64_ARCH(MAJOR, MINOR, PROFILE, NAME, ID, ARCH_FEATURE, ARCH_BASE_EXT) -#endif -// NOTE: The order and the grouping of the elements matter to make ArchKind iterable. -// List is organised as armv8a -> armv8n-a, armv9a -> armv9m-a and armv8-r. -AARCH64_ARCH(0, 0, InvalidProfile, "invalid", INVALID, "+", - AArch64::AEK_NONE) -AARCH64_ARCH(8, 0, AProfile, "armv8-a", ARMV8A, "+v8a", - (AArch64::AEK_CRYPTO | AArch64::AEK_FP | AArch64::AEK_SIMD)) -AARCH64_ARCH(8, 1, AProfile, "armv8.1-a", ARMV8_1A, "+v8.1a", - (AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP | - AArch64::AEK_SIMD | AArch64::AEK_LSE | AArch64::AEK_RDM)) -AARCH64_ARCH(8, 2, AProfile, "armv8.2-a", ARMV8_2A, "+v8.2a", - (AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP | - AArch64::AEK_SIMD | AArch64::AEK_RAS | AArch64::AEK_LSE | - AArch64::AEK_RDM)) -AARCH64_ARCH(8, 3, AProfile, "armv8.3-a", ARMV8_3A, "+v8.3a", - (AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP | - AArch64::AEK_SIMD | AArch64::AEK_RAS | AArch64::AEK_LSE | - AArch64::AEK_RDM | AArch64::AEK_RCPC)) -AARCH64_ARCH(8, 4, AProfile, "armv8.4-a", ARMV8_4A, "+v8.4a", - (AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP | - AArch64::AEK_SIMD | AArch64::AEK_RAS | AArch64::AEK_LSE | - AArch64::AEK_RDM | AArch64::AEK_RCPC | AArch64::AEK_DOTPROD)) -AARCH64_ARCH(8, 5, AProfile, "armv8.5-a", ARMV8_5A, "+v8.5a", - (AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP | - AArch64::AEK_SIMD | AArch64::AEK_RAS | AArch64::AEK_LSE | - AArch64::AEK_RDM | AArch64::AEK_RCPC | AArch64::AEK_DOTPROD)) -AARCH64_ARCH(8, 6, AProfile, "armv8.6-a", ARMV8_6A, "+v8.6a", - (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_SM4 | AArch64::AEK_SHA3 | AArch64::AEK_BF16 | - AArch64::AEK_SHA2 | AArch64::AEK_AES | AArch64::AEK_I8MM)) -AARCH64_ARCH(8, 7, AProfile, "armv8.7-a", ARMV8_7A, "+v8.7a", - (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_SM4 | AArch64::AEK_SHA3 | AArch64::AEK_BF16 | - AArch64::AEK_SHA2 | AArch64::AEK_AES | AArch64::AEK_I8MM)) -AARCH64_ARCH(8, 8, AProfile, "armv8.8-a", ARMV8_8A, "+v8.8a", - (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_SM4 | AArch64::AEK_SHA3 | AArch64::AEK_BF16 | - AArch64::AEK_SHA2 | AArch64::AEK_AES | AArch64::AEK_I8MM)) -AARCH64_ARCH(8, 9, AProfile, "armv8.9-a", ARMV8_9A, "+v8.9a", - (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_SM4 | AArch64::AEK_SHA3 | AArch64::AEK_BF16 | - AArch64::AEK_SHA2 | AArch64::AEK_AES | AArch64::AEK_I8MM)) -AARCH64_ARCH(9, 0, AProfile, "armv9-a", ARMV9A, "+v9a", - (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_SVE2)) -AARCH64_ARCH(9, 1, AProfile, "armv9.1-a", ARMV9_1A, "+v9.1a", - (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_BF16 | AArch64::AEK_I8MM | AArch64::AEK_SVE2)) -AARCH64_ARCH(9, 2, AProfile, "armv9.2-a", ARMV9_2A, "+v9.2a", - (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_BF16 | AArch64::AEK_I8MM | AArch64::AEK_SVE2)) -AARCH64_ARCH(9, 3, AProfile, "armv9.3-a", ARMV9_3A, "+v9.3a", - (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_BF16 | AArch64::AEK_I8MM | AArch64::AEK_SVE2)) -AARCH64_ARCH(9, 4, AProfile, "armv9.4-a", ARMV9_4A, "+v9.4a", - (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_BF16 | AArch64::AEK_I8MM | AArch64::AEK_SVE2)) -// For v8-R, we do not enable crypto and align with GCC that enables a more -// minimal set of optional architecture extensions. -AARCH64_ARCH(8, 0, RProfile, "armv8-r", ARMV8R, "+v8r", - (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_SB)) -#undef AARCH64_ARCH - -#ifndef AARCH64_ARCH_EXT_NAME -#define AARCH64_ARCH_EXT_NAME(NAME, ID, FEATURE, NEGFEATURE) -#endif -AARCH64_ARCH_EXT_NAME("invalid", AArch64::AEK_INVALID, {}, {}) -AARCH64_ARCH_EXT_NAME("none", AArch64::AEK_NONE, {}, {}) -AARCH64_ARCH_EXT_NAME("crc", AArch64::AEK_CRC, "+crc", "-crc") -AARCH64_ARCH_EXT_NAME("lse", AArch64::AEK_LSE, "+lse", "-lse") -AARCH64_ARCH_EXT_NAME("rdm", AArch64::AEK_RDM, "+rdm", "-rdm") -AARCH64_ARCH_EXT_NAME("crypto", AArch64::AEK_CRYPTO, "+crypto", "-crypto") -AARCH64_ARCH_EXT_NAME("sm4", AArch64::AEK_SM4, "+sm4", "-sm4") -AARCH64_ARCH_EXT_NAME("sha3", AArch64::AEK_SHA3, "+sha3", "-sha3") -AARCH64_ARCH_EXT_NAME("sha2", AArch64::AEK_SHA2, "+sha2", "-sha2") -AARCH64_ARCH_EXT_NAME("aes", AArch64::AEK_AES, "+aes", "-aes") -AARCH64_ARCH_EXT_NAME("dotprod", AArch64::AEK_DOTPROD, "+dotprod", "-dotprod") -AARCH64_ARCH_EXT_NAME("fp", AArch64::AEK_FP, "+fp-armv8", "-fp-armv8") -AARCH64_ARCH_EXT_NAME("simd", AArch64::AEK_SIMD, "+neon", "-neon") -AARCH64_ARCH_EXT_NAME("fp16", AArch64::AEK_FP16, "+fullfp16", "-fullfp16") -AARCH64_ARCH_EXT_NAME("fp16fml", AArch64::AEK_FP16FML, "+fp16fml", "-fp16fml") -AARCH64_ARCH_EXT_NAME("profile", AArch64::AEK_PROFILE, "+spe", "-spe") -AARCH64_ARCH_EXT_NAME("ras", AArch64::AEK_RAS, "+ras", "-ras") -AARCH64_ARCH_EXT_NAME("sve", AArch64::AEK_SVE, "+sve", "-sve") -AARCH64_ARCH_EXT_NAME("sve2", AArch64::AEK_SVE2, "+sve2", "-sve2") -AARCH64_ARCH_EXT_NAME("sve2-aes", AArch64::AEK_SVE2AES, "+sve2-aes", "-sve2-aes") -AARCH64_ARCH_EXT_NAME("sve2-sm4", AArch64::AEK_SVE2SM4, "+sve2-sm4", "-sve2-sm4") -AARCH64_ARCH_EXT_NAME("sve2-sha3", AArch64::AEK_SVE2SHA3, "+sve2-sha3", "-sve2-sha3") -AARCH64_ARCH_EXT_NAME("sve2-bitperm", AArch64::AEK_SVE2BITPERM, "+sve2-bitperm", "-sve2-bitperm") -AARCH64_ARCH_EXT_NAME("sve2p1", AArch64::AEK_SVE2p1, "+sve2p1", "-sve2p1") -AARCH64_ARCH_EXT_NAME("b16b16", AArch64::AEK_B16B16, "+b16b16", "-b16b16") -AARCH64_ARCH_EXT_NAME("rcpc", AArch64::AEK_RCPC, "+rcpc", "-rcpc") -AARCH64_ARCH_EXT_NAME("rng", AArch64::AEK_RAND, "+rand", "-rand") -AARCH64_ARCH_EXT_NAME("memtag", AArch64::AEK_MTE, "+mte", "-mte") -AARCH64_ARCH_EXT_NAME("ssbs", AArch64::AEK_SSBS, "+ssbs", "-ssbs") -AARCH64_ARCH_EXT_NAME("sb", AArch64::AEK_SB, "+sb", "-sb") -AARCH64_ARCH_EXT_NAME("predres", AArch64::AEK_PREDRES, "+predres", "-predres") -AARCH64_ARCH_EXT_NAME("bf16", AArch64::AEK_BF16, "+bf16", "-bf16") -AARCH64_ARCH_EXT_NAME("i8mm", AArch64::AEK_I8MM, "+i8mm", "-i8mm") -AARCH64_ARCH_EXT_NAME("f32mm", AArch64::AEK_F32MM, "+f32mm", "-f32mm") -AARCH64_ARCH_EXT_NAME("f64mm", AArch64::AEK_F64MM, "+f64mm", "-f64mm") -AARCH64_ARCH_EXT_NAME("tme", AArch64::AEK_TME, "+tme", "-tme") -AARCH64_ARCH_EXT_NAME("ls64", AArch64::AEK_LS64, "+ls64", "-ls64") -AARCH64_ARCH_EXT_NAME("brbe", AArch64::AEK_BRBE, "+brbe", "-brbe") -AARCH64_ARCH_EXT_NAME("pauth", AArch64::AEK_PAUTH, "+pauth", "-pauth") -AARCH64_ARCH_EXT_NAME("flagm", AArch64::AEK_FLAGM, "+flagm", "-flagm") -AARCH64_ARCH_EXT_NAME("sme", AArch64::AEK_SME, "+sme", "-sme") -AARCH64_ARCH_EXT_NAME("sme-f64f64", AArch64::AEK_SMEF64F64, "+sme-f64f64", "-sme-f64f64") -AARCH64_ARCH_EXT_NAME("sme-i16i64", AArch64::AEK_SMEI16I64, "+sme-i16i64", "-sme-i16i64") -AARCH64_ARCH_EXT_NAME("sme-f16f16", AArch64::AEK_SMEF16F16, "+sme-f16f16", "-sme-f16f16") -AARCH64_ARCH_EXT_NAME("sme2", AArch64::AEK_SME2, "+sme2", "-sme2") -AARCH64_ARCH_EXT_NAME("sme2p1", AArch64::AEK_SME2p1, "+sme2p1", "-sme2p1") -AARCH64_ARCH_EXT_NAME("hbc", AArch64::AEK_HBC, "+hbc", "-hbc") -AARCH64_ARCH_EXT_NAME("mops", AArch64::AEK_MOPS, "+mops", "-mops") -AARCH64_ARCH_EXT_NAME("pmuv3", AArch64::AEK_PERFMON, "+perfmon", "-perfmon") -AARCH64_ARCH_EXT_NAME("cssc", AArch64::AEK_CSSC, "+cssc", "-cssc") -AARCH64_ARCH_EXT_NAME("rcpc3", AArch64::AEK_RCPC3, "+rcpc3", "-rcpc3") -AARCH64_ARCH_EXT_NAME("the", AArch64::AEK_THE, "+the", "-the") -AARCH64_ARCH_EXT_NAME("d128", AArch64::AEK_D128, "+d128", "-d128") -AARCH64_ARCH_EXT_NAME("lse128", AArch64::AEK_LSE128, "+lse128", "-lse128") -#undef AARCH64_ARCH_EXT_NAME - -#ifndef AARCH64_CPU_NAME -#define AARCH64_CPU_NAME(NAME, ID, DEFAULT_EXT) -#endif -AARCH64_CPU_NAME("cortex-a34", ARMV8A, - (AArch64::AEK_CRC)) -AARCH64_CPU_NAME("cortex-a35", ARMV8A, - (AArch64::AEK_CRC)) -AARCH64_CPU_NAME("cortex-a53", ARMV8A, - (AArch64::AEK_CRC)) -AARCH64_CPU_NAME("cortex-a55", ARMV8_2A, - (AArch64::AEK_FP16 | AArch64::AEK_DOTPROD | AArch64::AEK_RCPC)) -AARCH64_CPU_NAME("cortex-a510", ARMV9A, - (AArch64::AEK_BF16 | AArch64::AEK_I8MM | AArch64::AEK_SB | - AArch64::AEK_PAUTH | AArch64::AEK_MTE | AArch64::AEK_SSBS | - AArch64::AEK_SVE | AArch64::AEK_SVE2 | AArch64::AEK_SVE2BITPERM | - AArch64::AEK_FP16FML)) -AARCH64_CPU_NAME("cortex-a57", ARMV8A, - (AArch64::AEK_CRC)) -AARCH64_CPU_NAME("cortex-a65", ARMV8_2A, - (AArch64::AEK_DOTPROD | AArch64::AEK_FP16 | - AArch64::AEK_RCPC | AArch64::AEK_SSBS)) -AARCH64_CPU_NAME("cortex-a65ae", ARMV8_2A, - (AArch64::AEK_DOTPROD | AArch64::AEK_FP16 | - AArch64::AEK_RCPC | AArch64::AEK_SSBS)) -AARCH64_CPU_NAME("cortex-a72", ARMV8A, - (AArch64::AEK_CRC)) -AARCH64_CPU_NAME("cortex-a73", ARMV8A, - (AArch64::AEK_CRC)) -AARCH64_CPU_NAME("cortex-a75", ARMV8_2A, - (AArch64::AEK_FP16 | AArch64::AEK_DOTPROD | AArch64::AEK_RCPC)) -AARCH64_CPU_NAME("cortex-a76", ARMV8_2A, - (AArch64::AEK_FP16 | AArch64::AEK_DOTPROD | AArch64::AEK_RCPC | - AArch64::AEK_SSBS)) -AARCH64_CPU_NAME("cortex-a76ae", ARMV8_2A, - (AArch64::AEK_FP16 | AArch64::AEK_DOTPROD | AArch64::AEK_RCPC | - AArch64::AEK_SSBS)) -AARCH64_CPU_NAME("cortex-a77", ARMV8_2A, - (AArch64::AEK_FP16 | AArch64::AEK_RCPC | AArch64::AEK_DOTPROD | - AArch64::AEK_SSBS)) -AARCH64_CPU_NAME("cortex-a78", ARMV8_2A, - (AArch64::AEK_FP16 | AArch64::AEK_DOTPROD | AArch64::AEK_RCPC | - AArch64::AEK_SSBS | AArch64::AEK_PROFILE)) -AARCH64_CPU_NAME("cortex-a78c", ARMV8_2A, - (AArch64::AEK_FP16 | AArch64::AEK_DOTPROD | AArch64::AEK_RCPC | - AArch64::AEK_SSBS | AArch64::AEK_PROFILE | AArch64::AEK_FLAGM | - AArch64::AEK_PAUTH | AArch64::AEK_FP16FML)) -AARCH64_CPU_NAME("cortex-a710", ARMV9A, - (AArch64::AEK_MTE | AArch64::AEK_PAUTH | AArch64::AEK_FLAGM | - AArch64::AEK_SB | AArch64::AEK_I8MM | AArch64::AEK_FP16FML | - AArch64::AEK_SVE | AArch64::AEK_SVE2 | AArch64::AEK_SVE2BITPERM | - AArch64::AEK_BF16)) -AARCH64_CPU_NAME("cortex-a715", ARMV9A, - (AArch64::AEK_SB | AArch64::AEK_SSBS | AArch64::AEK_MTE | - AArch64::AEK_FP16 | AArch64::AEK_FP16FML | AArch64::AEK_PAUTH | - AArch64::AEK_I8MM | AArch64::AEK_PREDRES | AArch64::AEK_PERFMON | - AArch64::AEK_PROFILE | AArch64::AEK_SVE | AArch64::AEK_SVE2BITPERM | - AArch64::AEK_BF16 | AArch64::AEK_FLAGM)) -AARCH64_CPU_NAME("cortex-r82", ARMV8R, - (AArch64::AEK_LSE)) -AARCH64_CPU_NAME("cortex-x1", ARMV8_2A, - (AArch64::AEK_FP16 | AArch64::AEK_DOTPROD | AArch64::AEK_RCPC | - AArch64::AEK_SSBS | AArch64::AEK_PROFILE)) -AARCH64_CPU_NAME("cortex-x1c", ARMV8_2A, - (AArch64::AEK_FP16 | AArch64::AEK_DOTPROD | AArch64::AEK_RCPC | - AArch64::AEK_SSBS | AArch64::AEK_PAUTH | AArch64::AEK_PROFILE)) -AARCH64_CPU_NAME("cortex-x2", ARMV9A, - (AArch64::AEK_MTE | AArch64::AEK_BF16 | AArch64::AEK_I8MM | - AArch64::AEK_PAUTH | AArch64::AEK_SSBS | AArch64::AEK_SB | - AArch64::AEK_SVE | AArch64::AEK_SVE2 | AArch64::AEK_SVE2BITPERM | - AArch64::AEK_FP16FML)) -AARCH64_CPU_NAME("cortex-x3", ARMV9A, - (AArch64::AEK_SVE | AArch64::AEK_PERFMON | AArch64::AEK_PROFILE | - AArch64::AEK_BF16 | AArch64::AEK_I8MM | AArch64::AEK_MTE | - AArch64::AEK_SVE2BITPERM | AArch64::AEK_SB | AArch64::AEK_PAUTH | - AArch64::AEK_FP16 | AArch64::AEK_FP16FML | AArch64::AEK_PREDRES | - AArch64::AEK_FLAGM | AArch64::AEK_SSBS)) -AARCH64_CPU_NAME("neoverse-e1", ARMV8_2A, - (AArch64::AEK_DOTPROD | AArch64::AEK_FP16 | - AArch64::AEK_RCPC | AArch64::AEK_SSBS)) -AARCH64_CPU_NAME("neoverse-n1", ARMV8_2A, - (AArch64::AEK_DOTPROD | AArch64::AEK_FP16 | - AArch64::AEK_PROFILE | AArch64::AEK_RCPC | - AArch64::AEK_SSBS)) -AARCH64_CPU_NAME("neoverse-n2", ARMV8_5A, - (AArch64::AEK_BF16 | AArch64::AEK_DOTPROD | AArch64::AEK_FP16 | - AArch64::AEK_I8MM | AArch64::AEK_MTE | - AArch64::AEK_SB | AArch64::AEK_SSBS | - AArch64::AEK_SVE | AArch64::AEK_SVE2 | AArch64::AEK_SVE2BITPERM)) -AARCH64_CPU_NAME("neoverse-512tvb", ARMV8_4A, - (AArch64::AEK_SVE | AArch64::AEK_SSBS | - AArch64::AEK_FP16 | AArch64::AEK_BF16 | - AArch64::AEK_DOTPROD | AArch64::AEK_PROFILE | - AArch64::AEK_RAND | AArch64::AEK_FP16FML | AArch64::AEK_I8MM)) -AARCH64_CPU_NAME("neoverse-v1", ARMV8_4A, - (AArch64::AEK_SVE | AArch64::AEK_SSBS | - AArch64::AEK_FP16 | AArch64::AEK_BF16 | - AArch64::AEK_DOTPROD | AArch64::AEK_PROFILE | - AArch64::AEK_RAND | AArch64::AEK_FP16FML | AArch64::AEK_I8MM)) -AARCH64_CPU_NAME("neoverse-v2", ARMV9A, - (AArch64::AEK_SVE | AArch64::AEK_SVE2 | AArch64::AEK_SSBS | - AArch64::AEK_FP16 | AArch64::AEK_BF16 | AArch64::AEK_RAND | - AArch64::AEK_DOTPROD | AArch64::AEK_PROFILE | - AArch64::AEK_SVE2BITPERM | AArch64::AEK_FP16FML | - AArch64::AEK_I8MM | AArch64::AEK_MTE)) -AARCH64_CPU_NAME("cyclone", ARMV8A, - (AArch64::AEK_NONE)) -AARCH64_CPU_NAME("apple-a7", ARMV8A, - (AArch64::AEK_NONE)) -AARCH64_CPU_NAME("apple-a8", ARMV8A, - (AArch64::AEK_NONE)) -AARCH64_CPU_NAME("apple-a9", ARMV8A, - (AArch64::AEK_NONE)) -AARCH64_CPU_NAME("apple-a10", ARMV8A, - (AArch64::AEK_CRC | AArch64::AEK_RDM)) -AARCH64_CPU_NAME("apple-a11", ARMV8_2A, - (AArch64::AEK_FP16)) -AARCH64_CPU_NAME("apple-a12", ARMV8_3A, - (AArch64::AEK_FP16)) -AARCH64_CPU_NAME("apple-a13", ARMV8_4A, - (AArch64::AEK_FP16 | AArch64::AEK_FP16FML | AArch64::AEK_SHA3)) -AARCH64_CPU_NAME("apple-a14", ARMV8_5A, - (AArch64::AEK_FP16 | AArch64::AEK_FP16FML | AArch64::AEK_SHA3)) -AARCH64_CPU_NAME("apple-a15", ARMV8_5A, - (AArch64::AEK_FP16 | AArch64::AEK_FP16FML | AArch64::AEK_SHA3 | - AArch64::AEK_BF16 | AArch64::AEK_I8MM)) -AARCH64_CPU_NAME("apple-a16", ARMV8_5A, - (AArch64::AEK_FP16 | AArch64::AEK_FP16FML | AArch64::AEK_SHA3 | - AArch64::AEK_BF16 | AArch64::AEK_I8MM)) -AARCH64_CPU_NAME("apple-m1", ARMV8_5A, - (AArch64::AEK_FP16 | AArch64::AEK_FP16FML | AArch64::AEK_SHA3)) -AARCH64_CPU_NAME("apple-m2", ARMV8_5A, - (AArch64::AEK_FP16 | AArch64::AEK_FP16FML | AArch64::AEK_SHA3 | - AArch64::AEK_BF16 | AArch64::AEK_I8MM)) -AARCH64_CPU_NAME("apple-s4", ARMV8_3A, - (AArch64::AEK_FP16)) -AARCH64_CPU_NAME("apple-s5", ARMV8_3A, - (AArch64::AEK_FP16)) -AARCH64_CPU_NAME("exynos-m3", ARMV8A, - (AArch64::AEK_CRC)) -AARCH64_CPU_NAME("exynos-m4", ARMV8_2A, - (AArch64::AEK_DOTPROD | AArch64::AEK_FP16)) -AARCH64_CPU_NAME("exynos-m5", ARMV8_2A, - (AArch64::AEK_DOTPROD | AArch64::AEK_FP16)) -AARCH64_CPU_NAME("falkor", ARMV8A, - (AArch64::AEK_CRC | AArch64::AEK_RDM)) -AARCH64_CPU_NAME("saphira", ARMV8_3A, - (AArch64::AEK_PROFILE)) -AARCH64_CPU_NAME("kryo", ARMV8A, - (AArch64::AEK_CRC)) -AARCH64_CPU_NAME("thunderx2t99", ARMV8_1A, - (AArch64::AEK_NONE)) -AARCH64_CPU_NAME("thunderx3t110", ARMV8_3A, - (AArch64::AEK_NONE)) -AARCH64_CPU_NAME("thunderx", ARMV8A, - (AArch64::AEK_CRC)) -AARCH64_CPU_NAME("thunderxt88", ARMV8A, - (AArch64::AEK_CRC)) -AARCH64_CPU_NAME("thunderxt81", ARMV8A, - (AArch64::AEK_CRC)) -AARCH64_CPU_NAME("thunderxt83", ARMV8A, - (AArch64::AEK_CRC)) -AARCH64_CPU_NAME("tsv110", ARMV8_2A, - (AArch64::AEK_DOTPROD | - AArch64::AEK_FP16 | AArch64::AEK_FP16FML | - AArch64::AEK_PROFILE)) -AARCH64_CPU_NAME("a64fx", ARMV8_2A, - (AArch64::AEK_FP16 | AArch64::AEK_SVE)) -AARCH64_CPU_NAME("carmel", ARMV8_2A, - AArch64::AEK_FP16) -AARCH64_CPU_NAME("ampere1", ARMV8_6A, - (AArch64::AEK_FP16 | AArch64::AEK_SB | AArch64::AEK_SSBS)) -// Invalid CPU -AARCH64_CPU_NAME("invalid", INVALID, AArch64::AEK_INVALID) -#undef AARCH64_CPU_NAME - -#ifndef AARCH64_CPU_ALIAS -#define AARCH64_CPU_ALIAS(ALIAS,NAME) -#endif -AARCH64_CPU_ALIAS("grace", "neoverse-v2") -#undef AARCH64_CPU_ALIAS diff --git a/llvm/lib/Support/AArch64TargetParser.cpp b/llvm/lib/Support/AArch64TargetParser.cpp --- a/llvm/lib/Support/AArch64TargetParser.cpp +++ b/llvm/lib/Support/AArch64TargetParser.cpp @@ -30,21 +30,18 @@ if (CPU == "generic") return AI.DefaultExts; - return StringSwitch(CPU) -#define AARCH64_CPU_NAME(NAME, ARCH_ID, DEFAULT_EXT) \ - .Case(NAME, ARCH_ID.DefaultExts | DEFAULT_EXT) -#include "../../include/llvm/Support/AArch64TargetParser.def" - .Default(AArch64::AEK_INVALID); + // Note: this now takes cpu aliases into account + const CpuInfo &Cpu = parseCpu(CPU); + return Cpu.Arch.DefaultExts | Cpu.DefaultExtensions; } const AArch64::ArchInfo &AArch64::getArchForCpu(StringRef CPU) { if (CPU == "generic") return ARMV8A; - return *StringSwitch(CPU) -#define AARCH64_CPU_NAME(NAME, ARCH_ID, DEFAULT_EXT) .Case(NAME, &ARCH_ID) -#include "../../include/llvm/Support/AArch64TargetParser.def" - .Default(&INVALID); + // Note: this now takes cpu aliases into account + const CpuInfo &Cpu = parseCpu(CPU); + return Cpu.Arch; } const AArch64::ArchInfo &AArch64::ArchInfo::findBySubArch(StringRef SubArch) { @@ -54,28 +51,24 @@ return AArch64::INVALID; } -bool AArch64::getExtensionFeatures(uint64_t Extensions, +bool AArch64::getExtensionFeatures(uint64_t InputExts, std::vector &Features) { - if (Extensions == AArch64::AEK_INVALID) + if (InputExts == AArch64::AEK_INVALID) return false; -#define AARCH64_ARCH_EXT_NAME(NAME, ID, FEATURE, NEGFEATURE) \ - if (Extensions & ID) { \ - const char *feature = FEATURE; \ - /* INVALID and NONE have no feature name. */ \ - if (feature) \ - Features.push_back(feature); \ - } -#include "../../include/llvm/Support/AArch64TargetParser.def" + for (const auto &E : Extensions) + /* INVALID and NONE have no feature name. */ + if ((InputExts & E.ID) && !E.Feature.empty()) + Features.push_back(E.Feature); return true; } -StringRef AArch64::resolveCPUAlias(StringRef CPU) { - return StringSwitch(CPU) -#define AARCH64_CPU_ALIAS(ALIAS, NAME) .Case(ALIAS, NAME) -#include "../../include/llvm/Support/AArch64TargetParser.def" - .Default(CPU); +StringRef AArch64::resolveCPUAlias(StringRef Name) { + for (const auto &A : CpuAliases) + if (A.Alias == Name) + return A.Name; + return Name; } StringRef AArch64::getArchExtFeature(StringRef ArchExt) {