Skip to content

Commit 6bbaad1

Browse files
authored
[ARM] Introduce the v9.5-A architecture version to Arm targets (#78994)
This introduces the Armv9.5-A architecture version to the Arm backend, following on from the existing implementation for AArch64 targets. 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/
1 parent 40bdfd3 commit 6bbaad1

File tree

11 files changed

+62
-1
lines changed

11 files changed

+62
-1
lines changed

clang/lib/Basic/Targets/ARM.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,8 @@ StringRef ARMTargetInfo::getCPUAttr() const {
227227
return "9_3A";
228228
case llvm::ARM::ArchKind::ARMV9_4A:
229229
return "9_4A";
230+
case llvm::ARM::ArchKind::ARMV9_5A:
231+
return "9_5A";
230232
case llvm::ARM::ArchKind::ARMV8MBaseline:
231233
return "8M_BASE";
232234
case llvm::ARM::ArchKind::ARMV8MMainline:
@@ -889,6 +891,7 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts,
889891
case llvm::ARM::ArchKind::ARMV9_2A:
890892
case llvm::ARM::ArchKind::ARMV9_3A:
891893
case llvm::ARM::ArchKind::ARMV9_4A:
894+
case llvm::ARM::ArchKind::ARMV9_5A:
892895
// Filter __arm_cdp, __arm_ldcl, __arm_stcl in arm_acle.h
893896
FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B3;
894897
break;
@@ -1057,6 +1060,7 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts,
10571060
case llvm::ARM::ArchKind::ARMV9_2A:
10581061
case llvm::ARM::ArchKind::ARMV9_3A:
10591062
case llvm::ARM::ArchKind::ARMV9_4A:
1063+
case llvm::ARM::ArchKind::ARMV9_5A:
10601064
getTargetDefinesARMV83A(Opts, Builder);
10611065
break;
10621066
}

clang/test/CodeGen/arm-acle-coproc.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
// RUN: %clang_cc1 -triple armv9.2a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s
2525
// RUN: %clang_cc1 -triple armv9.3a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s
2626
// RUN: %clang_cc1 -triple armv9.4a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s
27+
// RUN: %clang_cc1 -triple armv9.5a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s
2728
// RUN: %clang_cc1 -triple thumbv4 %s -E -dD -o - | FileCheck --check-prefix=CHECK-V4-THUMB %s
2829
// RUN: %clang_cc1 -triple thumbv4t %s -E -dD -o - | FileCheck --check-prefix=CHECK-V4-THUMB %s
2930
// RUN: %clang_cc1 -triple thumbv5 %s -E -dD -o - | FileCheck --check-prefix=CHECK-V5-THUMB %s
@@ -52,6 +53,7 @@
5253
// RUN: %clang_cc1 -triple thumbv9.2a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s
5354
// RUN: %clang_cc1 -triple thumbv9.3a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s
5455
// RUN: %clang_cc1 -triple thumbv9.4a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s
56+
// RUN: %clang_cc1 -triple thumbv9.5a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s
5557
// RUN: %clang_cc1 -triple thumbv8m.base %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8-BASE %s
5658
// RUN: %clang_cc1 -triple thumbv8m.main %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8-MAIN %s
5759
// RUN: %clang_cc1 -triple thumbv8.1m.main %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8-MAIN %s

clang/test/Driver/arm-cortex-cpus-1.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,3 +478,20 @@
478478
// RUN: %clang -target arm -march=armebv9.4a -mbig-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V94A %s
479479
// RUN: %clang -target arm -march=armebv9.4-a -mbig-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V94A %s
480480
// CHECK-BE-V94A: "-cc1"{{.*}} "-triple" "armebv9.4{{.*}}" "-target-cpu" "generic"
481+
482+
// RUN: %clang -target armv9.5a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V95A %s
483+
// RUN: %clang -target arm -march=armv9.5a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V95A %s
484+
// RUN: %clang -target arm -march=armv9.5-a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V95A %s
485+
// RUN: %clang -target arm -march=armv9.5a -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V95A %s
486+
// RUN: %clang -target armv9.5a -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V95A %s
487+
// RUN: %clang -target arm -march=armv9.5a -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V95A %s
488+
// RUN: %clang -target arm -mlittle-endian -march=armv9.5-a -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V95A %s
489+
// CHECK-V95A: "-cc1"{{.*}} "-triple" "armv9.5{{.*}}" "-target-cpu" "generic"
490+
491+
// RUN: %clang -target armebv9.5a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V95A %s
492+
// RUN: %clang -target armv9.5a -mbig-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V95A %s
493+
// RUN: %clang -target armeb -march=armebv9.5a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V95A %s
494+
// RUN: %clang -target armeb -march=armebv9.5-a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V95A %s
495+
// RUN: %clang -target arm -march=armebv9.5a -mbig-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V95A %s
496+
// RUN: %clang -target arm -march=armebv9.5-a -mbig-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V95A %s
497+
// CHECK-BE-V95A: "-cc1"{{.*}} "-triple" "armebv9.5{{.*}}" "-target-cpu" "generic"

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -897,6 +897,11 @@
897897
// CHECK-V94A: #define __ARM_ARCH_9_4A__ 1
898898
// CHECK-V94A: #define __ARM_ARCH_PROFILE 'A'
899899

900+
// RUN: %clang -target armv9.5a-none-none-eabi -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V95A %s
901+
// CHECK-V95A: #define __ARM_ARCH 9
902+
// CHECK-V95A: #define __ARM_ARCH_9_5A__ 1
903+
// CHECK-V95A: #define __ARM_ARCH_PROFILE 'A'
904+
900905
// RUN: %clang -target arm-none-none-eabi -march=armv7-m -mfpu=softvfp -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SOFTVFP %s
901906
// CHECK-SOFTVFP-NOT: #define __ARM_FP 0x
902907

llvm/include/llvm/TargetParser/ARMTargetParser.def

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,11 @@ ARM_ARCH("armv9.4-a", ARMV9_4A, "9.4-A", "+v9.4a",
151151
(ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
152152
ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_CRC | ARM::AEK_RAS |
153153
ARM::AEK_DOTPROD | ARM::AEK_BF16 | ARM::AEK_I8MM))
154+
ARM_ARCH("armv9.5-a", ARMV9_5A, "9.5-A", "+v9.5a",
155+
ARMBuildAttrs::CPUArch::v9_A, FK_NEON_FP_ARMV8,
156+
(ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
157+
ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_CRC | ARM::AEK_RAS |
158+
ARM::AEK_DOTPROD | ARM::AEK_BF16 | ARM::AEK_I8MM))
154159
ARM_ARCH("armv8-r", ARMV8R, "8-R", "+v8r", ARMBuildAttrs::CPUArch::v8_R,
155160
FK_NEON_FP_ARMV8,
156161
(ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |

llvm/lib/Target/ARM/ARM.td

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,12 @@ def HasV9_4aOps : SubtargetFeature<"v9.4a", "HasV9_4aOps", "true",
704704
"Support ARM v9.4a instructions",
705705
[HasV8_9aOps, HasV9_3aOps]>;
706706

707+
// Armv9.5-A is a v9-only architecture. From v9.5-A onwards there's no mapping
708+
// to an equivalent v8.x version.
709+
def HasV9_5aOps : SubtargetFeature<"v9.5a", "HasV9_5aOps", "true",
710+
"Support ARM v9.5a instructions",
711+
[HasV9_4aOps]>;
712+
707713
def HasV8_1MMainlineOps : SubtargetFeature<
708714
"v8.1m.main", "HasV8_1MMainlineOps", "true",
709715
"Support ARM v8-1M Mainline instructions",
@@ -1139,6 +1145,18 @@ def ARMv94a : Architecture<"armv9.4-a", "ARMv94a", [HasV9_4aOps,
11391145
FeatureCRC,
11401146
FeatureRAS,
11411147
FeatureDotProd]>;
1148+
def ARMv95a : Architecture<"armv9.5-a", "ARMv95a", [HasV9_5aOps,
1149+
FeatureAClass,
1150+
FeatureDB,
1151+
FeatureFPARMv8,
1152+
FeatureNEON,
1153+
FeatureDSP,
1154+
FeatureTrustZone,
1155+
FeatureMP,
1156+
FeatureVirtualization,
1157+
FeatureCRC,
1158+
FeatureRAS,
1159+
FeatureDotProd]>;
11421160

11431161
def ARMv8r : Architecture<"armv8-r", "ARMv8r", [HasV8Ops,
11441162
FeatureRClass,

llvm/lib/Target/ARM/ARMSubtarget.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ class ARMSubtarget : public ARMGenSubtargetInfo {
132132
ARMv92a,
133133
ARMv93a,
134134
ARMv94a,
135+
ARMv95a,
135136
};
136137

137138
public:

llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -898,6 +898,7 @@ void ARMTargetELFStreamer::emitArchDefaultAttributes() {
898898
case ARM::ArchKind::ARMV9_2A:
899899
case ARM::ArchKind::ARMV9_3A:
900900
case ARM::ArchKind::ARMV9_4A:
901+
case ARM::ArchKind::ARMV9_5A:
901902
S.setAttributeItem(CPU_arch_profile, ApplicationProfile, false);
902903
S.setAttributeItem(ARM_ISA_use, Allowed, false);
903904
S.setAttributeItem(THUMB_ISA_use, AllowThumb32, false);

llvm/lib/TargetParser/ARMTargetParser.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ unsigned ARM::parseArchVersion(StringRef Arch) {
8686
case ArchKind::ARMV9_2A:
8787
case ArchKind::ARMV9_3A:
8888
case ArchKind::ARMV9_4A:
89+
case ArchKind::ARMV9_5A:
8990
return 9;
9091
case ArchKind::INVALID:
9192
return 0;
@@ -123,6 +124,7 @@ static ARM::ProfileKind getProfileKind(ARM::ArchKind AK) {
123124
case ARM::ArchKind::ARMV9_2A:
124125
case ARM::ArchKind::ARMV9_3A:
125126
case ARM::ArchKind::ARMV9_4A:
127+
case ARM::ArchKind::ARMV9_5A:
126128
return ARM::ProfileKind::A;
127129
case ARM::ArchKind::ARMV4:
128130
case ARM::ArchKind::ARMV4T:

llvm/lib/TargetParser/Triple.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -811,6 +811,8 @@ static Triple::SubArchType parseSubArch(StringRef SubArchName) {
811811
return Triple::ARMSubArch_v9_3a;
812812
case ARM::ArchKind::ARMV9_4A:
813813
return Triple::ARMSubArch_v9_4a;
814+
case ARM::ArchKind::ARMV9_5A:
815+
return Triple::ARMSubArch_v9_5a;
814816
case ARM::ArchKind::ARMV8R:
815817
return Triple::ARMSubArch_v8r;
816818
case ARM::ArchKind::ARMV8MBaseline:

llvm/unittests/TargetParser/TargetParserTest.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ const char *ARMArch[] = {
4545
"armv8m.main", "iwmmxt", "iwmmxt2", "xscale", "armv8.1-m.main",
4646
"armv9-a", "armv9", "armv9a", "armv9.1-a", "armv9.1a",
4747
"armv9.2-a", "armv9.2a", "armv9.3-a", "armv9.3a", "armv9.4-a",
48-
"armv9.4a",
48+
"armv9.4a", "armv9.5-a", "armv9.5a",
4949
};
5050

5151
std::string FormatExtensionFlags(int64_t Flags) {
@@ -605,6 +605,9 @@ TEST(TargetParserTest, testARMArch) {
605605
EXPECT_TRUE(
606606
testARMArch("armv9.4-a", "generic", "v9.4a",
607607
ARMBuildAttrs::CPUArch::v9_A));
608+
EXPECT_TRUE(
609+
testARMArch("armv9.5-a", "generic", "v9.5a",
610+
ARMBuildAttrs::CPUArch::v9_A));
608611
EXPECT_TRUE(
609612
testARMArch("armv8-r", "cortex-r52", "v8r",
610613
ARMBuildAttrs::CPUArch::v8_R));
@@ -940,6 +943,7 @@ TEST(TargetParserTest, ARMparseArchProfile) {
940943
case ARM::ArchKind::ARMV9_2A:
941944
case ARM::ArchKind::ARMV9_3A:
942945
case ARM::ArchKind::ARMV9_4A:
946+
case ARM::ArchKind::ARMV9_5A:
943947
EXPECT_EQ(ARM::ProfileKind::A, ARM::parseArchProfile(ARMArch[i]));
944948
break;
945949
default:

0 commit comments

Comments
 (0)