Skip to content

Commit 59b2301

Browse files
authored
[AArch64] Introduce the Armv9.5-A architecture version (#72392)
This introduces the Armv9.5-A architecture version, including the relevant command-line option for -march. Mode details about the Armv9.5-A architecture version can be found at: * https://community.arm.com/arm-community-blogs/b/architectures-and-processors-blog/posts/arm-a-profile-architecture-developments-2023 * https://developer.arm.com/documentation/ddi0602/2023-09/ Patch by Oliver Stannard.
1 parent f432a00 commit 59b2301

File tree

11 files changed

+50
-5
lines changed

11 files changed

+50
-5
lines changed

clang/lib/Basic/Targets/AArch64.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,12 @@ void AArch64TargetInfo::getTargetDefinesARMV94A(const LangOptions &Opts,
333333
getTargetDefinesARMV89A(Opts, Builder);
334334
}
335335

336+
void AArch64TargetInfo::getTargetDefinesARMV95A(const LangOptions &Opts,
337+
MacroBuilder &Builder) const {
338+
// Armv9.5-A does not have a v8.* equivalent, but is a superset of v9.4-A.
339+
getTargetDefinesARMV94A(Opts, Builder);
340+
}
341+
336342
void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts,
337343
MacroBuilder &Builder) const {
338344
// Target identification.
@@ -565,6 +571,8 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts,
565571
getTargetDefinesARMV93A(Opts, Builder);
566572
else if (*ArchInfo == llvm::AArch64::ARMV9_4A)
567573
getTargetDefinesARMV94A(Opts, Builder);
574+
else if (*ArchInfo == llvm::AArch64::ARMV9_5A)
575+
getTargetDefinesARMV95A(Opts, Builder);
568576

569577
// All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
570578
Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
@@ -899,6 +907,9 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
899907
if (Feature == "+v9.4a" &&
900908
ArchInfo->Version < llvm::AArch64::ARMV9_4A.Version)
901909
ArchInfo = &llvm::AArch64::ARMV9_4A;
910+
if (Feature == "+v9.5a" &&
911+
ArchInfo->Version < llvm::AArch64::ARMV9_5A.Version)
912+
ArchInfo = &llvm::AArch64::ARMV9_5A;
902913
if (Feature == "+v8r")
903914
ArchInfo = &llvm::AArch64::ARMV8R;
904915
if (Feature == "+fullfp16") {

clang/lib/Basic/Targets/AArch64.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,8 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo {
143143
MacroBuilder &Builder) const;
144144
void getTargetDefinesARMV94A(const LangOptions &Opts,
145145
MacroBuilder &Builder) const;
146+
void getTargetDefinesARMV95A(const LangOptions &Opts,
147+
MacroBuilder &Builder) const;
146148
void getTargetDefines(const LangOptions &Opts,
147149
MacroBuilder &Builder) const override;
148150

clang/lib/Driver/ToolChains/Arch/AArch64.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,7 @@ void aarch64::getAArch64TargetFeatures(const Driver &D,
411411
else if (*I == "+v9.2a") V9Version = 2;
412412
else if (*I == "+v9.3a") V9Version = 3;
413413
else if (*I == "+v9.4a") V9Version = 4;
414+
else if (*I == "+v9.5a") V9Version = 5;
414415
else if (*I == "+sm4") HasSM4 = true;
415416
else if (*I == "+sha3") HasSHA3 = true;
416417
else if (*I == "+sha2") HasSHA2 = true;

clang/test/Driver/aarch64-v95a.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// RUN: %clang -target aarch64 -march=armv9.5a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV95A %s
2+
// RUN: %clang -target aarch64 -march=armv9.5-a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV95A %s
3+
// RUN: %clang -target aarch64 -mlittle-endian -march=armv9.5a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV95A %s
4+
// RUN: %clang -target aarch64 -mlittle-endian -march=armv9.5-a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV95A %s
5+
// RUN: %clang -target aarch64_be -mlittle-endian -march=armv9.5a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV95A %s
6+
// RUN: %clang -target aarch64_be -mlittle-endian -march=armv9.5-a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV95A %s
7+
// GENERICV95A: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-cpu" "generic" "-target-feature" "+neon" "-target-feature" "+v9.5a"
8+
// RUN: %clang -target aarch64_be -march=armv9.5a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV95A-BE %s
9+
// RUN: %clang -target aarch64_be -march=armv9.5-a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV95A-BE %s
10+
// RUN: %clang -target aarch64 -mbig-endian -march=armv9.5a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV95A-BE %s
11+
// RUN: %clang -target aarch64 -mbig-endian -march=armv9.5-a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV95A-BE %s
12+
// RUN: %clang -target aarch64_be -mbig-endian -march=armv9.5a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV95A-BE %s
13+
// RUN: %clang -target aarch64_be -mbig-endian -march=armv9.5-a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV95A-BE %s
14+
// GENERICV95A-BE: "-cc1"{{.*}} "-triple" "aarch64_be{{.*}}" "-target-cpu" "generic" "-target-feature" "+neon" "-target-feature" "+v9.5a"
15+

clang/test/Preprocessor/aarch64-target-features.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@
207207
// RUN: %clang -target aarch64-none-linux-gnu -march=armv9.2-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2 %s
208208
// RUN: %clang -target aarch64-none-linux-gnu -march=armv9.3-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2 %s
209209
// RUN: %clang -target aarch64-none-linux-gnu -march=armv9.4-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2 %s
210+
// RUN: %clang -target aarch64-none-linux-gnu -march=armv9.5-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2 %s
210211
// RUN: %clang -target aarch64-none-linux-gnu -march=armv9-a+sve2 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2 %s
211212
// CHECK-SVE2: __ARM_FEATURE_FP16_SCALAR_ARITHMETIC 1
212213
// CHECK-SVE2: __ARM_FEATURE_FP16_VECTOR_ARITHMETIC 1
@@ -599,6 +600,7 @@
599600
// RUN: %clang -target aarch64-none-elf -march=armv9.1-a -x c -E -dM %s -o - | FileCheck --check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
600601
// RUN: %clang -target aarch64-none-elf -march=armv9.2-a -x c -E -dM %s -o - | FileCheck --check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
601602
// RUN: %clang -target aarch64-none-elf -march=armv9.3-a -x c -E -dM %s -o - | FileCheck --check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
603+
// RUN: %clang -target aarch64-none-elf -march=armv9.5-a -x c -E -dM %s -o - | FileCheck --check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
602604
// CHECK-V81-OR-LATER: __ARM_FEATURE_ATOMICS 1
603605
// CHECK-V85-OR-LATER: __ARM_FEATURE_BTI 1
604606
// CHECK-V83-OR-LATER: __ARM_FEATURE_COMPLEX 1

llvm/include/llvm/TargetParser/AArch64TargetParser.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -376,17 +376,18 @@ inline constexpr ArchInfo ARMV9_3A = { VersionTuple{9, 3}, AProfile, "armv9.3-a
376376
AArch64::ExtensionBitset({AArch64::AEK_MOPS, AArch64::AEK_HBC}))};
377377
inline constexpr ArchInfo ARMV9_4A = { VersionTuple{9, 4}, AProfile, "armv9.4-a", "+v9.4a", (ARMV9_3A.DefaultExts |
378378
AArch64::ExtensionBitset({AArch64::AEK_SPECRES2, AArch64::AEK_CSSC, AArch64::AEK_RASv2}))};
379+
inline constexpr ArchInfo ARMV9_5A = { VersionTuple{9, 5}, AProfile, "armv9.5-a", "+v9.5a", (ARMV9_4A.DefaultExts)};
379380
// For v8-R, we do not enable crypto and align with GCC that enables a more minimal set of optional architecture extensions.
380381
inline constexpr ArchInfo ARMV8R = { VersionTuple{8, 0}, RProfile, "armv8-r", "+v8r", (ARMV8_5A.DefaultExts |
381382
AArch64::ExtensionBitset({AArch64::AEK_SSBS,
382383
AArch64::AEK_FP16, AArch64::AEK_FP16FML, AArch64::AEK_SB}).flip(AArch64::AEK_LSE))};
383384
// clang-format on
384385

385386
// The set of all architectures
386-
static constexpr std::array<const ArchInfo *, 16> ArchInfos = {
387+
static constexpr std::array<const ArchInfo *, 17> ArchInfos = {
387388
&ARMV8A, &ARMV8_1A, &ARMV8_2A, &ARMV8_3A, &ARMV8_4A, &ARMV8_5A,
388-
&ARMV8_6A, &ARMV8_7A, &ARMV8_8A, &ARMV8_9A, &ARMV9A, &ARMV9_1A,
389-
&ARMV9_2A, &ARMV9_3A, &ARMV9_4A, &ARMV8R,
389+
&ARMV8_6A, &ARMV8_7A, &ARMV8_8A, &ARMV8_9A, &ARMV9A, &ARMV9_1A,
390+
&ARMV9_2A, &ARMV9_3A, &ARMV9_4A, &ARMV9_5A, &ARMV8R,
390391
};
391392

392393
// Details of a specific CPU.

llvm/include/llvm/TargetParser/Triple.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ class Triple {
112112
enum SubArchType {
113113
NoSubArch,
114114

115+
ARMSubArch_v9_5a,
115116
ARMSubArch_v9_4a,
116117
ARMSubArch_v9_3a,
117118
ARMSubArch_v9_2a,

llvm/lib/Target/AArch64/AArch64.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -687,6 +687,10 @@ def HasV9_4aOps : SubtargetFeature<
687687
"v9.4a", "HasV9_4aOps", "true", "Support ARM v9.4a instructions",
688688
[HasV8_9aOps, HasV9_3aOps]>;
689689

690+
def HasV9_5aOps : SubtargetFeature<
691+
"v9.5a", "HasV9_5aOps", "true", "Support ARM v9.5a instructions",
692+
[HasV9_4aOps]>;
693+
690694
def HasV8_0rOps : SubtargetFeature<
691695
"v8r", "HasV8_0rOps", "true", "Support ARM v8r instructions",
692696
[//v8.1

llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3696,6 +3696,8 @@ static void setRequiredFeatureString(FeatureBitset FBS, std::string &Str) {
36963696
Str += "ARMv9.3a";
36973697
else if (FBS[AArch64::HasV9_4aOps])
36983698
Str += "ARMv9.4a";
3699+
else if (FBS[AArch64::HasV9_5aOps])
3700+
Str += "ARMv9.5a";
36993701
else if (FBS[AArch64::HasV8_0rOps])
37003702
Str += "ARMv8r";
37013703
else {

llvm/lib/TargetParser/ARMTargetParserCommon.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ StringRef ARM::getArchSynonym(StringRef Arch) {
4444
.Case("v9.2a", "v9.2-a")
4545
.Case("v9.3a", "v9.3-a")
4646
.Case("v9.4a", "v9.4-a")
47+
.Case("v9.5a", "v9.5-a")
4748
.Case("v8m.base", "v8-m.base")
4849
.Case("v8m.main", "v8-m.main")
4950
.Case("v8.1m.main", "v8.1-m.main")

llvm/unittests/TargetParser/TargetParserTest.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1619,6 +1619,8 @@ TEST(TargetParserTest, testAArch64Arch) {
16191619
ARMBuildAttrs::CPUArch::v8_A));
16201620
EXPECT_TRUE(testAArch64Arch("armv9.4-a", "generic", "v9.4a",
16211621
ARMBuildAttrs::CPUArch::v8_A));
1622+
EXPECT_TRUE(testAArch64Arch("armv9.5-a", "generic", "v9.5a",
1623+
ARMBuildAttrs::CPUArch::v8_A));
16221624
}
16231625

16241626
bool testAArch64Extension(StringRef CPUName, StringRef ArchExt) {
@@ -1857,6 +1859,7 @@ TEST(TargetParserTest, AArch64ArchFeatures) {
18571859
EXPECT_EQ(AArch64::ARMV9_2A.ArchFeature, "+v9.2a");
18581860
EXPECT_EQ(AArch64::ARMV9_3A.ArchFeature, "+v9.3a");
18591861
EXPECT_EQ(AArch64::ARMV9_4A.ArchFeature, "+v9.4a");
1862+
EXPECT_EQ(AArch64::ARMV9_5A.ArchFeature, "+v9.5a");
18601863
EXPECT_EQ(AArch64::ARMV8R.ArchFeature, "+v8r");
18611864
}
18621865

@@ -1884,8 +1887,9 @@ TEST(TargetParserTest, AArch64ArchPartialOrder) {
18841887
})
18851888
EXPECT_TRUE(A->implies(AArch64::ARMV8A));
18861889

1887-
for (const auto *A : {&AArch64::ARMV9_1A, &AArch64::ARMV9_2A,
1888-
&AArch64::ARMV9_3A, &AArch64::ARMV9_4A})
1890+
for (const auto *A :
1891+
{&AArch64::ARMV9_1A, &AArch64::ARMV9_2A, &AArch64::ARMV9_3A,
1892+
&AArch64::ARMV9_4A, &AArch64::ARMV9_5A})
18891893
EXPECT_TRUE(A->implies(AArch64::ARMV9A));
18901894

18911895
EXPECT_TRUE(AArch64::ARMV8_1A.implies(AArch64::ARMV8A));
@@ -1902,6 +1906,7 @@ TEST(TargetParserTest, AArch64ArchPartialOrder) {
19021906
EXPECT_TRUE(AArch64::ARMV9_2A.implies(AArch64::ARMV9_1A));
19031907
EXPECT_TRUE(AArch64::ARMV9_3A.implies(AArch64::ARMV9_2A));
19041908
EXPECT_TRUE(AArch64::ARMV9_4A.implies(AArch64::ARMV9_3A));
1909+
EXPECT_TRUE(AArch64::ARMV9_5A.implies(AArch64::ARMV9_4A));
19051910

19061911
EXPECT_TRUE(AArch64::ARMV9A.implies(AArch64::ARMV8_5A));
19071912
EXPECT_TRUE(AArch64::ARMV9_1A.implies(AArch64::ARMV8_6A));

0 commit comments

Comments
 (0)