Skip to content

Commit 0804c8c

Browse files
committed
[TargetParser][AArch64] Add alias for FEAT_RDM.
This patch allows using the name "rdma" as an alias for "rdm". The name makes its way to target attributes as well as the command line via the -march and -mcpu options. The motivation was originally to support this in Function Multi Versioning but it also makes sense to align with GCC on the command line.
1 parent 260fe03 commit 0804c8c

File tree

7 files changed

+35
-11
lines changed

7 files changed

+35
-11
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,12 @@ X86 Support
222222
Arm and AArch64 Support
223223
^^^^^^^^^^^^^^^^^^^^^^^
224224

225+
- An alias identifier (rdma) has been added for targeting the AArch64
226+
Architecture Extension which uses Rounding Doubling Multiply Accumulate
227+
instructions (rdm). The identifier is available on the command line as
228+
a feature modifier for -march and -mcpu as well as via target attributes
229+
like ``target_version`` or ``target_clones``.
230+
225231
Android Support
226232
^^^^^^^^^^^^^^^
227233

clang/test/CodeGen/attr-target-version.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ inline int __attribute__((target_version("memtag3+rcpc3+mops"))) fmv_inline(void
3939
inline int __attribute__((target_version("aes+dotprod"))) fmv_inline(void) { return 13; }
4040
inline int __attribute__((target_version("simd+fp16fml"))) fmv_inline(void) { return 14; }
4141
inline int __attribute__((target_version("fp+sm4"))) fmv_inline(void) { return 15; }
42-
inline int __attribute__((target_version("lse+rdm"))) fmv_inline(void) { return 16; }
42+
inline int __attribute__((target_version("lse+rdma"))) fmv_inline(void) { return 16; }
4343
inline int __attribute__((target_version("default"))) fmv_inline(void) { return 3; }
4444

4545
__attribute__((target_version("ls64"))) int fmv_e(void);
@@ -385,7 +385,7 @@ int hoo(void) {
385385
// CHECK-NEXT: [[TMP59:%.*]] = and i1 true, [[TMP58]]
386386
// CHECK-NEXT: br i1 [[TMP59]], label [[RESOLVER_RETURN27:%.*]], label [[RESOLVER_ELSE28:%.*]]
387387
// CHECK: resolver_return27:
388-
// CHECK-NEXT: ret ptr @fmv_inline._MlseMrdm
388+
// CHECK-NEXT: ret ptr @fmv_inline._MlseMrdma
389389
// CHECK: resolver_else28:
390390
// CHECK-NEXT: [[TMP60:%.*]] = load i64, ptr @__aarch64_cpu_features, align 8
391391
// CHECK-NEXT: [[TMP61:%.*]] = and i64 [[TMP60]], 32
@@ -673,7 +673,7 @@ int hoo(void) {
673673
//
674674
//
675675
// CHECK: Function Attrs: noinline nounwind optnone
676-
// CHECK-LABEL: define {{[^@]+}}@fmv_inline._MlseMrdm
676+
// CHECK-LABEL: define {{[^@]+}}@fmv_inline._MlseMrdma
677677
// CHECK-SAME: () #[[ATTR25:[0-9]+]] {
678678
// CHECK-NEXT: entry:
679679
// CHECK-NEXT: ret i32 16

clang/test/Driver/aarch64-rdm.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
// RUN: %clang --target=aarch64-none-elf -march=armv8a+rdm -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-RDM %s
2+
// RUN: %clang --target=aarch64-none-elf -march=armv8a+rdma -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-RDM %s
23
// RUN: %clang --target=aarch64-none-elf -mcpu=generic+rdm -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-RDM %s
34
// RUN: %clang --target=aarch64-none-elf -mcpu=falkor -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-RDM %s
45
// RUN: %clang --target=aarch64-none-elf -mcpu=thunderx2t99 -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-RDM %s
56
// CHECK-RDM: "-target-feature" "+rdm"
67

78
// RUN: %clang --target=aarch64-none-elf -march=armv8a+nordm -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-NORDM %s
9+
// RUN: %clang --target=aarch64-none-elf -march=armv8a+nordma -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-NORDM %s
810
// RUN: %clang --target=aarch64-none-elf -mcpu=generic+nordm -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-NORDM %s
911
// CHECK-NORDM-NOT: "-target-feature" "+rdm"
1012
//
1113
// RUN: %clang --target=aarch64-none-elf -march=armv8.1a -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-RDM %s
1214
// RUN: %clang --target=aarch64-none-elf -march=armv8.1a+nordm -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-NORDM-DEFAULT %s
15+
// RUN: %clang --target=aarch64-none-elf -march=armv8.1a+nordma -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-NORDM-DEFAULT %s
1316
// CHECK-NORDM-DEFAULT: "-target-feature" "-rdm"

clang/test/Sema/attr-target-clones-aarch64.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// RUN: %clang_cc1 -triple aarch64-linux-gnu -fsyntax-only -verify %s
22

3-
void __attribute__((target_clones("fp16+sve2-aes", "sb+sve2-sha3+rcpc3+mops"))) no_def(void);
3+
void __attribute__((target_clones("fp16+sve2-aes", "sb+sve2-sha3+rcpc3+mops", "rdma"))) no_def(void);
44

55
// expected-warning@+1 {{unsupported 'default' in the 'target_clones' attribute string; 'target_clones' attribute ignored}}
66
void __attribute__((target_clones("default+sha3"))) warn1(void);

clang/test/SemaCXX/attr-target-version.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ void __attribute__((target_version("dotprod"))) no_def(void);
77
void __attribute__((target_version("rdm+fp"))) no_def(void);
88
void __attribute__((target_version("rcpc3"))) no_def(void);
99
void __attribute__((target_version("mops"))) no_def(void);
10+
void __attribute__((target_version("rdma"))) no_def(void);
1011

1112
// expected-error@+1 {{no matching function for call to 'no_def'}}
1213
void foo(void) { no_def(); }

llvm/include/llvm/TargetParser/AArch64TargetParser.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -807,21 +807,24 @@ inline constexpr CpuInfo CpuInfos[] = {
807807
AArch64::AEK_MTE, AArch64::AEK_SB, AArch64::AEK_SSBS}))},
808808
};
809809

810-
// An alias for a CPU.
811-
struct CpuAlias {
812-
StringRef Alias;
810+
// Name alias.
811+
struct Alias {
812+
StringRef AltName;
813813
StringRef Name;
814814
};
815815

816-
inline constexpr CpuAlias CpuAliases[] = {{"cobalt-100", "neoverse-n2"},
817-
{"grace", "neoverse-v2"}};
816+
inline constexpr Alias CpuAliases[] = {{"cobalt-100", "neoverse-n2"},
817+
{"grace", "neoverse-v2"}};
818+
819+
inline constexpr Alias ExtAliases[] = {{"rdma", "rdm"}};
818820

819821
bool getExtensionFeatures(
820822
const AArch64::ExtensionBitset &Extensions,
821823
std::vector<StringRef> &Features);
822824

823825
StringRef getArchExtFeature(StringRef ArchExt);
824826
StringRef resolveCPUAlias(StringRef CPU);
827+
StringRef resolveExtAlias(StringRef ArchExt);
825828

826829
// Information by Name
827830
const ArchInfo *getArchForCpu(StringRef CPU);

llvm/lib/TargetParser/AArch64TargetParser.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,14 @@ bool AArch64::getExtensionFeatures(
6969

7070
StringRef AArch64::resolveCPUAlias(StringRef Name) {
7171
for (const auto &A : CpuAliases)
72-
if (A.Alias == Name)
72+
if (A.AltName == Name)
73+
return A.Name;
74+
return Name;
75+
}
76+
77+
StringRef AArch64::resolveExtAlias(StringRef Name) {
78+
for (const auto &A : ExtAliases)
79+
if (A.AltName == Name)
7380
return A.Name;
7481
return Name;
7582
}
@@ -91,7 +98,7 @@ void AArch64::fillValidCPUArchList(SmallVectorImpl<StringRef> &Values) {
9198
Values.push_back(C.Name);
9299

93100
for (const auto &Alias : CpuAliases)
94-
Values.push_back(Alias.Alias);
101+
Values.push_back(Alias.AltName);
95102
}
96103

97104
bool AArch64::isX18ReservedByDefault(const Triple &TT) {
@@ -114,6 +121,10 @@ const AArch64::ArchInfo *AArch64::parseArch(StringRef Arch) {
114121
}
115122

116123
std::optional<AArch64::ExtensionInfo> AArch64::parseArchExtension(StringRef ArchExt) {
124+
// Resolve aliases first.
125+
ArchExt = resolveExtAlias(ArchExt);
126+
127+
// Then find the Extension name.
117128
for (const auto &A : Extensions) {
118129
if (ArchExt == A.Name)
119130
return A;

0 commit comments

Comments
 (0)