Skip to content

Commit b7e25ae

Browse files
[ARM][AArch64] Introduce the Armv9.7-A architecture version
This introduces the Armv9.7-A architecture version, including the relevant command-line option for -march. More details about the Armv9.7-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-2025 * https://developer.arm.com/documentation/109697/2025_09/2025-Architecture-Extensions * https://developer.arm.com/documentation/ddi0602/2025-09/ Co-authored-by: Caroline Concatto <[email protected]>
1 parent d478737 commit b7e25ae

File tree

21 files changed

+117
-4
lines changed

21 files changed

+117
-4
lines changed

clang/lib/Basic/Targets/AArch64.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,12 @@ void AArch64TargetInfo::getTargetDefinesARMV96A(const LangOptions &Opts,
398398
getTargetDefinesARMV95A(Opts, Builder);
399399
}
400400

401+
void AArch64TargetInfo::getTargetDefinesARMV97A(const LangOptions &Opts,
402+
MacroBuilder &Builder) const {
403+
// Armv9.7-A does not have a v8.* equivalent, but is a superset of v9.6-A.
404+
getTargetDefinesARMV96A(Opts, Builder);
405+
}
406+
401407
void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts,
402408
MacroBuilder &Builder) const {
403409
// Target identification.
@@ -714,6 +720,8 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts,
714720
getTargetDefinesARMV95A(Opts, Builder);
715721
else if (*ArchInfo == llvm::AArch64::ARMV9_6A)
716722
getTargetDefinesARMV96A(Opts, Builder);
723+
else if (*ArchInfo == llvm::AArch64::ARMV9_7A)
724+
getTargetDefinesARMV97A(Opts, Builder);
717725

718726
// All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8|16) builtins work.
719727
Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
@@ -1152,6 +1160,9 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
11521160
if (Feature == "+v9.6a" &&
11531161
ArchInfo->Version < llvm::AArch64::ARMV9_6A.Version)
11541162
ArchInfo = &llvm::AArch64::ARMV9_6A;
1163+
if (Feature == "+v9.7a" &&
1164+
ArchInfo->Version < llvm::AArch64::ARMV9_7A.Version)
1165+
ArchInfo = &llvm::AArch64::ARMV9_7A;
11551166
if (Feature == "+v8r")
11561167
ArchInfo = &llvm::AArch64::ARMV8R;
11571168
if (Feature == "+fullfp16") {

clang/lib/Basic/Targets/AArch64.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,8 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo {
190190
MacroBuilder &Builder) const;
191191
void getTargetDefinesARMV96A(const LangOptions &Opts,
192192
MacroBuilder &Builder) const;
193+
void getTargetDefinesARMV97A(const LangOptions &Opts,
194+
MacroBuilder &Builder) const;
193195
void getTargetDefines(const LangOptions &Opts,
194196
MacroBuilder &Builder) const override;
195197

clang/lib/Basic/Targets/ARM.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,8 @@ StringRef ARMTargetInfo::getCPUAttr() const {
231231
return "9_5A";
232232
case llvm::ARM::ArchKind::ARMV9_6A:
233233
return "9_6A";
234+
case llvm::ARM::ArchKind::ARMV9_7A:
235+
return "9_7A";
234236
case llvm::ARM::ArchKind::ARMV8MBaseline:
235237
return "8M_BASE";
236238
case llvm::ARM::ArchKind::ARMV8MMainline:
@@ -904,6 +906,7 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts,
904906
case llvm::ARM::ArchKind::ARMV9_4A:
905907
case llvm::ARM::ArchKind::ARMV9_5A:
906908
case llvm::ARM::ArchKind::ARMV9_6A:
909+
case llvm::ARM::ArchKind::ARMV9_7A:
907910
// Filter __arm_cdp, __arm_ldcl, __arm_stcl in arm_acle.h
908911
FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B3;
909912
break;
@@ -1074,6 +1077,7 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts,
10741077
case llvm::ARM::ArchKind::ARMV9_4A:
10751078
case llvm::ARM::ArchKind::ARMV9_5A:
10761079
case llvm::ARM::ArchKind::ARMV9_6A:
1080+
case llvm::ARM::ArchKind::ARMV9_7A:
10771081
getTargetDefinesARMV83A(Opts, Builder);
10781082
break;
10791083
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
// RUN: %clang_cc1 -triple armv9.4a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s
2727
// RUN: %clang_cc1 -triple armv9.5a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s
2828
// RUN: %clang_cc1 -triple armv9.6a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s
29+
// RUN: %clang_cc1 -triple armv9.7a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s
2930
// RUN: %clang_cc1 -triple thumbv4 %s -E -dD -o - | FileCheck --check-prefix=CHECK-V4-THUMB %s
3031
// RUN: %clang_cc1 -triple thumbv4t %s -E -dD -o - | FileCheck --check-prefix=CHECK-V4-THUMB %s
3132
// RUN: %clang_cc1 -triple thumbv5 %s -E -dD -o - | FileCheck --check-prefix=CHECK-V5-THUMB %s
@@ -56,6 +57,7 @@
5657
// RUN: %clang_cc1 -triple thumbv9.4a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s
5758
// RUN: %clang_cc1 -triple thumbv9.5a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s
5859
// RUN: %clang_cc1 -triple thumbv9.6a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s
60+
// RUN: %clang_cc1 -triple thumbv9.7a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s
5961
// RUN: %clang_cc1 -triple thumbv8m.base %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8-BASE %s
6062
// RUN: %clang_cc1 -triple thumbv8m.main %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8-MAIN %s
6163
// RUN: %clang_cc1 -triple thumbv8.1m.main %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8-MAIN %s

clang/test/Driver/aarch64-v97a.c

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

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,3 +512,20 @@
512512
// RUN: %clang -target arm -march=armebv9.6a -mbig-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V96A %s
513513
// RUN: %clang -target arm -march=armebv9.6-a -mbig-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V96A %s
514514
// CHECK-BE-V96A: "-cc1"{{.*}} "-triple" "armebv9.6{{.*}}" "-target-cpu" "generic"
515+
//
516+
// RUN: %clang -target armv9.7a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V97A %s
517+
// RUN: %clang -target arm -march=armv9.7a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V97A %s
518+
// RUN: %clang -target arm -march=armv9.7-a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V97A %s
519+
// RUN: %clang -target arm -march=armv9.7a -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V97A %s
520+
// RUN: %clang -target armv9.7a -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V97A %s
521+
// RUN: %clang -target arm -march=armv9.7a -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V97A %s
522+
// RUN: %clang -target arm -mlittle-endian -march=armv9.7-a -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V97A %s
523+
// CHECK-V97A: "-cc1"{{.*}} "-triple" "armv9.7{{.*}}" "-target-cpu" "generic"
524+
525+
// RUN: %clang -target armebv9.7a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V97A %s
526+
// RUN: %clang -target armv9.7a -mbig-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V97A %s
527+
// RUN: %clang -target armeb -march=armebv9.7a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V97A %s
528+
// RUN: %clang -target armeb -march=armebv9.7-a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V97A %s
529+
// RUN: %clang -target arm -march=armebv9.7a -mbig-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V97A %s
530+
// RUN: %clang -target arm -march=armebv9.7-a -mbig-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V97A %s
531+
// CHECK-BE-V97A: "-cc1"{{.*}} "-triple" "armebv9.7{{.*}}" "-target-cpu" "generic"

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@
215215
// RUN: %clang -target aarch64-none-linux-gnu -march=armv9.4-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2 %s
216216
// RUN: %clang -target aarch64-none-linux-gnu -march=armv9.5-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2 %s
217217
// RUN: %clang -target aarch64-none-linux-gnu -march=armv9.6-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2 %s
218+
// RUN: %clang -target aarch64-none-linux-gnu -march=armv9.7-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2 %s
218219
// RUN: %clang -target aarch64-none-linux-gnu -march=armv9-a+sve2 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2 %s
219220
// CHECK-SVE2: __ARM_FEATURE_FP16_SCALAR_ARITHMETIC 1
220221
// CHECK-SVE2: __ARM_FEATURE_FP16_VECTOR_ARITHMETIC 1
@@ -691,6 +692,7 @@
691692
// RUN: %clang -target aarch64-none-elf -march=armv9.4-a -x c -E -dM %s -o - | FileCheck --check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
692693
// 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
693694
// RUN: %clang -target aarch64-none-elf -march=armv9.6-a -x c -E -dM %s -o - | FileCheck --check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
695+
// RUN: %clang -target aarch64-none-elf -march=armv9.7-a -x c -E -dM %s -o - | FileCheck --check-prefixes=CHECK-V81-OR-LATER,CHECK-V83-OR-LATER,CHECK-V85-OR-LATER %s
694696
// CHECK-V81-OR-LATER: __ARM_FEATURE_ATOMICS 1
695697
// CHECK-V85-OR-LATER: __ARM_FEATURE_BTI 1
696698
// CHECK-V83-OR-LATER: __ARM_FEATURE_COMPLEX 1

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -934,6 +934,11 @@
934934
// CHECK-V96A: #define __ARM_ARCH_9_6A__ 1
935935
// CHECK-V96A: #define __ARM_ARCH_PROFILE 'A'
936936

937+
// RUN: %clang -target armv9.7a-none-none-eabi -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V97A %s
938+
// CHECK-V97A: #define __ARM_ARCH 9
939+
// CHECK-V97A: #define __ARM_ARCH_9_7A__ 1
940+
// CHECK-V97A: #define __ARM_ARCH_PROFILE 'A'
941+
937942
// RUN: %clang -target arm-none-none-eabi -march=armv7-m -mfpu=softvfp -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SOFTVFP %s
938943
// CHECK-SOFTVFP-NOT: #define __ARM_FP 0x
939944

llvm/docs/ReleaseNotes.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ Changes to Vectorizers
9494
Changes to the AArch64 Backend
9595
------------------------------
9696

97+
* Assembler/disassembler support has been added for Armv9.7-A (2025)
98+
architecture extensions.
99+
97100
Changes to the AMDGPU Backend
98101
-----------------------------
99102

llvm/include/llvm/TargetParser/AArch64TargetParser.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,9 @@ struct ArchInfo {
115115
// Defines the following partial order, indicating when an architecture is
116116
// a superset of another:
117117
//
118-
// v9.6a > v9.5a > v9.4a > v9.3a > v9.2a > v9.1a > v9a;
119-
// v v v v v
120-
// v8.9a > v8.8a > v8.7a > v8.6a > v8.5a > v8.4a > ... > v8a;
118+
// v9.7a > v9.6a > v9.5a > v9.4a > v9.3a > v9.2a > v9.1a > v9a;
119+
// v v v v v
120+
// v8.9a > v8.8a > v8.7a > v8.6a > v8.5a > ... > v8a;
121121
//
122122
// v8r has no relation to anything. This is used to determine which
123123
// features to enable for a given architecture. See

0 commit comments

Comments
 (0)