diff --git a/llvm/include/llvm/Support/AArch64TargetParser.def b/llvm/include/llvm/Support/AArch64TargetParser.def --- a/llvm/include/llvm/Support/AArch64TargetParser.def +++ b/llvm/include/llvm/Support/AArch64TargetParser.def @@ -175,6 +175,12 @@ (AArch64::AEK_FP16)) AARCH64_CPU_NAME("apple-a13", ARMV8_4A, FK_CRYPTO_NEON_FP_ARMV8, false, (AArch64::AEK_FP16 | AArch64::AEK_FP16FML)) +AARCH64_CPU_NAME("apple-m1", ARMV8A, FK_CRYPTO_NEON_FP_ARMV8, false, + (AArch64::AEK_CRC | AArch64::AEK_FP16 | AArch64::AEK_RAS | + AArch64::AEK_LSE | AArch64::AEK_DOTPROD | AArch64::AEK_RCPC | + AArch64::AEK_RDM | AArch64::AEK_SHA2 | AArch64::AEK_SHA3 | + AArch64::AEK_AES | AArch64::AEK_FP16FML | AArch64::AEK_SSBS | + AArch64::AEK_SB | AArch64::AEK_PREDRES)) AARCH64_CPU_NAME("apple-s4", ARMV8_3A, FK_CRYPTO_NEON_FP_ARMV8, false, (AArch64::AEK_FP16)) AARCH64_CPU_NAME("apple-s5", ARMV8_3A, FK_CRYPTO_NEON_FP_ARMV8, false, diff --git a/llvm/lib/Target/AArch64/AArch64.td b/llvm/lib/Target/AArch64/AArch64.td --- a/llvm/lib/Target/AArch64/AArch64.td +++ b/llvm/lib/Target/AArch64/AArch64.td @@ -810,6 +810,37 @@ HasV8_4aOps ]>; +def ProcAppleM1 : SubtargetFeature<"apple-m1", "ARMProcFamily", "Others", + "Apple M1", [ + FeatureAES, + FeatureAltFPCmp, + FeatureCacheDeepPersist, + FeatureCCPP, + FeatureComplxNum, + FeatureCRC, + FeatureDIT, + FeatureDotProd, + FeatureFMI, + FeatureFP16FML, + FeatureFRInt3264, + FeatureJS, + FeatureLOR, + FeatureLSE, + FeaturePA, + FeaturePAN, + FeaturePAN_RWV, + FeaturePredRes, + FeaturePsUAO, + FeatureRAS, + FeatureRCPC, + FeatureRDM, + FeatureSB, + FeatureSHA2, + FeatureSHA3, + FeatureSSBS, + FeatureTLB_RMI, + ]>; + def ProcExynosM3 : SubtargetFeature<"exynosm3", "ARMProcFamily", "ExynosM3", "Samsung Exynos-M3 processors", [FeatureCRC, @@ -1103,6 +1134,9 @@ def : ProcessorModel<"apple-a12", CycloneModel, [ProcAppleA12]>; def : ProcessorModel<"apple-a13", CycloneModel, [ProcAppleA13]>; +// Mac CPUs +def : ProcessorModel<"apple-m1", CycloneModel, [ProcAppleM1]>; + // watch CPUs. def : ProcessorModel<"apple-s4", CycloneModel, [ProcAppleA12]>; def : ProcessorModel<"apple-s5", CycloneModel, [ProcAppleA12]>; diff --git a/llvm/unittests/Support/TargetParserTest.cpp b/llvm/unittests/Support/TargetParserTest.cpp --- a/llvm/unittests/Support/TargetParserTest.cpp +++ b/llvm/unittests/Support/TargetParserTest.cpp @@ -952,6 +952,16 @@ AArch64::AEK_RDM | AArch64::AEK_RCPC | AArch64::AEK_DOTPROD | AArch64::AEK_FP16 | AArch64::AEK_FP16FML, "8.4-A")); + EXPECT_TRUE(testAArch64CPU( + "apple-m1", "armv8-a", "crypto-neon-fp-armv8", + AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP | + AArch64::AEK_SIMD | AArch64::AEK_FP16 | AArch64::AEK_RAS | + AArch64::AEK_LSE | AArch64::AEK_DOTPROD | AArch64::AEK_RCPC | + AArch64::AEK_RDM | AArch64::AEK_SHA2 | AArch64::AEK_SHA3 | + AArch64::AEK_AES | AArch64::AEK_FP16FML | AArch64::AEK_SSBS | + AArch64::AEK_SB | AArch64::AEK_PREDRES, + "8-A")); + EXPECT_TRUE(testAArch64CPU( "apple-s4", "armv8.3-a", "crypto-neon-fp-armv8", AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP | @@ -1063,7 +1073,7 @@ "8.2-A")); } -static constexpr unsigned NumAArch64CPUArchs = 45; +static constexpr unsigned NumAArch64CPUArchs = 46; TEST(TargetParserTest, testAArch64CPUArchList) { SmallVector List;