Skip to content

Commit d0756ca

Browse files
authored
[ARM][AArch64] Introduce the Armv9.6-A architecture version (#110825)
This introduces the Armv9.6-A architecture version, including the relevant command-line option for -march. More details about the Armv9.6-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-2024 * https://developer.arm.com/documentation/ddi0602/2024-09/
1 parent d9d6233 commit d0756ca

File tree

20 files changed

+112
-6
lines changed

20 files changed

+112
-6
lines changed

clang/lib/Basic/Targets/AArch64.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,12 @@ void AArch64TargetInfo::getTargetDefinesARMV95A(const LangOptions &Opts,
373373
getTargetDefinesARMV94A(Opts, Builder);
374374
}
375375

376+
void AArch64TargetInfo::getTargetDefinesARMV96A(const LangOptions &Opts,
377+
MacroBuilder &Builder) const {
378+
// Armv9.6-A does not have a v8.* equivalent, but is a superset of v9.5-A.
379+
getTargetDefinesARMV95A(Opts, Builder);
380+
}
381+
376382
void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts,
377383
MacroBuilder &Builder) const {
378384
// Target identification.
@@ -657,6 +663,8 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts,
657663
getTargetDefinesARMV94A(Opts, Builder);
658664
else if (*ArchInfo == llvm::AArch64::ARMV9_5A)
659665
getTargetDefinesARMV95A(Opts, Builder);
666+
else if (*ArchInfo == llvm::AArch64::ARMV9_6A)
667+
getTargetDefinesARMV96A(Opts, Builder);
660668

661669
// All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8|16) builtins work.
662670
Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
@@ -1044,6 +1052,9 @@ bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
10441052
if (Feature == "+v9.5a" &&
10451053
ArchInfo->Version < llvm::AArch64::ARMV9_5A.Version)
10461054
ArchInfo = &llvm::AArch64::ARMV9_5A;
1055+
if (Feature == "+v9.6a" &&
1056+
ArchInfo->Version < llvm::AArch64::ARMV9_6A.Version)
1057+
ArchInfo = &llvm::AArch64::ARMV9_6A;
10471058
if (Feature == "+v8r")
10481059
ArchInfo = &llvm::AArch64::ARMV8R;
10491060
if (Feature == "+fullfp16") {

clang/lib/Basic/Targets/AArch64.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,8 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo {
148148
MacroBuilder &Builder) const;
149149
void getTargetDefinesARMV95A(const LangOptions &Opts,
150150
MacroBuilder &Builder) const;
151+
void getTargetDefinesARMV96A(const LangOptions &Opts,
152+
MacroBuilder &Builder) const;
151153
void getTargetDefines(const LangOptions &Opts,
152154
MacroBuilder &Builder) const override;
153155

clang/lib/Basic/Targets/ARM.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,8 @@ StringRef ARMTargetInfo::getCPUAttr() const {
228228
return "9_4A";
229229
case llvm::ARM::ArchKind::ARMV9_5A:
230230
return "9_5A";
231+
case llvm::ARM::ArchKind::ARMV9_6A:
232+
return "9_6A";
231233
case llvm::ARM::ArchKind::ARMV8MBaseline:
232234
return "8M_BASE";
233235
case llvm::ARM::ArchKind::ARMV8MMainline:
@@ -891,6 +893,7 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts,
891893
case llvm::ARM::ArchKind::ARMV9_3A:
892894
case llvm::ARM::ArchKind::ARMV9_4A:
893895
case llvm::ARM::ArchKind::ARMV9_5A:
896+
case llvm::ARM::ArchKind::ARMV9_6A:
894897
// Filter __arm_cdp, __arm_ldcl, __arm_stcl in arm_acle.h
895898
FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B3;
896899
break;
@@ -1060,6 +1063,7 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts,
10601063
case llvm::ARM::ArchKind::ARMV9_3A:
10611064
case llvm::ARM::ArchKind::ARMV9_4A:
10621065
case llvm::ARM::ArchKind::ARMV9_5A:
1066+
case llvm::ARM::ArchKind::ARMV9_6A:
10631067
getTargetDefinesARMV83A(Opts, Builder);
10641068
break;
10651069
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
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
2727
// RUN: %clang_cc1 -triple armv9.5a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s
28+
// RUN: %clang_cc1 -triple armv9.6a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s
2829
// RUN: %clang_cc1 -triple thumbv4 %s -E -dD -o - | FileCheck --check-prefix=CHECK-V4-THUMB %s
2930
// RUN: %clang_cc1 -triple thumbv4t %s -E -dD -o - | FileCheck --check-prefix=CHECK-V4-THUMB %s
3031
// RUN: %clang_cc1 -triple thumbv5 %s -E -dD -o - | FileCheck --check-prefix=CHECK-V5-THUMB %s
@@ -54,6 +55,7 @@
5455
// RUN: %clang_cc1 -triple thumbv9.3a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s
5556
// RUN: %clang_cc1 -triple thumbv9.4a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s
5657
// RUN: %clang_cc1 -triple thumbv9.5a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s
58+
// RUN: %clang_cc1 -triple thumbv9.6a %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8 %s
5759
// RUN: %clang_cc1 -triple thumbv8m.base %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8-BASE %s
5860
// RUN: %clang_cc1 -triple thumbv8m.main %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8-MAIN %s
5961
// RUN: %clang_cc1 -triple thumbv8.1m.main %s -E -dD -o - | FileCheck --check-prefix=CHECK-V8-MAIN %s

clang/test/Driver/aarch64-v96a.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// ===== Base v9.6a architecture =====
2+
3+
// RUN: %clang -target aarch64 -march=armv9.6a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV96A %s
4+
// RUN: %clang -target aarch64 -march=armv9.6-a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV96A %s
5+
// RUN: %clang -target aarch64 -mlittle-endian -march=armv9.6a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV96A %s
6+
// RUN: %clang -target aarch64 -mlittle-endian -march=armv9.6-a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV96A %s
7+
// RUN: %clang -target aarch64_be -mlittle-endian -march=armv9.6a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV96A %s
8+
// RUN: %clang -target aarch64_be -mlittle-endian -march=armv9.6-a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV96A %s
9+
// GENERICV96A: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-cpu" "generic" "-target-feature" "+v9.6a"
10+
11+
// RUN: %clang -target aarch64_be -march=armv9.6a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV96A-BE %s
12+
// RUN: %clang -target aarch64_be -march=armv9.6-a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV96A-BE %s
13+
// RUN: %clang -target aarch64 -mbig-endian -march=armv9.6a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV96A-BE %s
14+
// RUN: %clang -target aarch64 -mbig-endian -march=armv9.6-a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV96A-BE %s
15+
// RUN: %clang -target aarch64_be -mbig-endian -march=armv9.6a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV96A-BE %s
16+
// RUN: %clang -target aarch64_be -mbig-endian -march=armv9.6-a -### -c %s 2>&1 | FileCheck -check-prefix=GENERICV96A-BE %s
17+
// GENERICV96A-BE: "-cc1"{{.*}} "-triple" "aarch64_be{{.*}}" "-target-cpu" "generic" "-target-feature" "+v9.6a"
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
@@ -495,3 +495,20 @@
495495
// RUN: %clang -target arm -march=armebv9.5a -mbig-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V95A %s
496496
// RUN: %clang -target arm -march=armebv9.5-a -mbig-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V95A %s
497497
// CHECK-BE-V95A: "-cc1"{{.*}} "-triple" "armebv9.5{{.*}}" "-target-cpu" "generic"
498+
//
499+
// RUN: %clang -target armv9.6a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V96A %s
500+
// RUN: %clang -target arm -march=armv9.6a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V96A %s
501+
// RUN: %clang -target arm -march=armv9.6-a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V96A %s
502+
// RUN: %clang -target arm -march=armv9.6a -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V96A %s
503+
// RUN: %clang -target armv9.6a -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V96A %s
504+
// RUN: %clang -target arm -march=armv9.6a -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V96A %s
505+
// RUN: %clang -target arm -mlittle-endian -march=armv9.6-a -mlittle-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-V96A %s
506+
// CHECK-V96A: "-cc1"{{.*}} "-triple" "armv9.6{{.*}}" "-target-cpu" "generic"
507+
508+
// RUN: %clang -target armebv9.6a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V96A %s
509+
// RUN: %clang -target armv9.6a -mbig-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V96A %s
510+
// RUN: %clang -target armeb -march=armebv9.6a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V96A %s
511+
// RUN: %clang -target armeb -march=armebv9.6-a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V96A %s
512+
// RUN: %clang -target arm -march=armebv9.6a -mbig-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V96A %s
513+
// RUN: %clang -target arm -march=armebv9.6-a -mbig-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V96A %s
514+
// CHECK-BE-V96A: "-cc1"{{.*}} "-triple" "armebv9.6{{.*}}" "-target-cpu" "generic"

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@
213213
// RUN: %clang -target aarch64-none-linux-gnu -march=armv9.3-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2 %s
214214
// RUN: %clang -target aarch64-none-linux-gnu -march=armv9.4-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2 %s
215215
// RUN: %clang -target aarch64-none-linux-gnu -march=armv9.5-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2 %s
216+
// RUN: %clang -target aarch64-none-linux-gnu -march=armv9.6-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2 %s
216217
// RUN: %clang -target aarch64-none-linux-gnu -march=armv9-a+sve2 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SVE2 %s
217218
// CHECK-SVE2: __ARM_FEATURE_FP16_SCALAR_ARITHMETIC 1
218219
// CHECK-SVE2: __ARM_FEATURE_FP16_VECTOR_ARITHMETIC 1
@@ -671,6 +672,7 @@
671672
// 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
672673
// 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
673674
// 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
675+
// 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
674676
// CHECK-V81-OR-LATER: __ARM_FEATURE_ATOMICS 1
675677
// CHECK-V85-OR-LATER: __ARM_FEATURE_BTI 1
676678
// 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
@@ -902,6 +902,11 @@
902902
// CHECK-V95A: #define __ARM_ARCH_9_5A__ 1
903903
// CHECK-V95A: #define __ARM_ARCH_PROFILE 'A'
904904

905+
// RUN: %clang -target armv9.6a-none-none-eabi -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V96A %s
906+
// CHECK-V96A: #define __ARM_ARCH 9
907+
// CHECK-V96A: #define __ARM_ARCH_9_6A__ 1
908+
// CHECK-V96A: #define __ARM_ARCH_PROFILE 'A'
909+
905910
// RUN: %clang -target arm-none-none-eabi -march=armv7-m -mfpu=softvfp -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SOFTVFP %s
906911
// CHECK-SOFTVFP-NOT: #define __ARM_FP 0x
907912

llvm/include/llvm/TargetParser/AArch64TargetParser.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,9 @@ struct ArchInfo {
118118
// Defines the following partial order, indicating when an architecture is
119119
// a superset of another:
120120
//
121-
// v9.5a > v9.4a > v9.3a > v9.2a > v9.1a > v9a;
122-
// v v v v v
123-
// v8.9a > v8.8a > v8.7a > v8.6a > v8.5a > v8.4a > ... > v8a;
121+
// v9.6a > v9.5a > v9.4a > v9.3a > v9.2a > v9.1a > v9a;
122+
// v v v v v
123+
// v8.9a > v8.8a > v8.7a > v8.6a > v8.5a > v8.4a > ... > v8a;
124124
//
125125
// v8r has no relation to anything. This is used to determine which
126126
// features to enable for a given architecture. See

llvm/include/llvm/TargetParser/ARMTargetParser.def

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,11 @@ ARM_ARCH("armv9.5-a", ARMV9_5A, "9.5-A", "+v9.5a", ARMBuildAttrs::CPUArch::v9_A,
182182
(ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
183183
ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_CRC | ARM::AEK_RAS |
184184
ARM::AEK_DOTPROD | ARM::AEK_BF16 | ARM::AEK_I8MM))
185+
ARM_ARCH("armv9.6-a", ARMV9_6A, "9.6-A", "+v9.6a", ARMBuildAttrs::CPUArch::v9_A,
186+
FK_NEON_FP_ARMV8,
187+
(ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
188+
ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_CRC | ARM::AEK_RAS |
189+
ARM::AEK_DOTPROD | ARM::AEK_BF16 | ARM::AEK_I8MM))
185190
ARM_ARCH("armv8-r", ARMV8R, "8-R", "+v8r", ARMBuildAttrs::CPUArch::v8_R,
186191
FK_FPV5_SP_D16,
187192
(ARM::AEK_MP | ARM::AEK_VIRT | ARM::AEK_HWDIVARM |

0 commit comments

Comments
 (0)