Skip to content

Commit cb75f61

Browse files
author
Sjoerd Meijer
committedJun 30, 2017
ARMV8-A archkind and target defines helper functions
This introduces helper functions that set target defines for different ARMV8-A architecture kinds. It fixes an issue that the v8.1 define ARM_FEATURE_QRDMX was not set for v8.2. These helper functions make things more “scalable” if we want to add ARMv8.3 at some point, and a cleanup has been done to hold the architecture kind in one variable (instead of one for each). Differential Revision: https://reviews.llvm.org/D34686 llvm-svn: 306805
1 parent d27538a commit cb75f61

File tree

3 files changed

+51
-14
lines changed

3 files changed

+51
-14
lines changed
 

‎clang/lib/Basic/Targets.cpp

+47-12
Original file line numberDiff line numberDiff line change
@@ -5615,6 +5615,17 @@ class ARMTargetInfo : public TargetInfo {
56155615

56165616
bool setFPMath(StringRef Name) override;
56175617

5618+
void getTargetDefinesARMV81A(const LangOptions &Opts,
5619+
MacroBuilder &Builder) const {
5620+
Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5621+
}
5622+
5623+
void getTargetDefinesARMV82A(const LangOptions &Opts,
5624+
MacroBuilder &Builder) const {
5625+
// Also include the ARMv8.1-A defines
5626+
getTargetDefinesARMV81A(Opts, Builder);
5627+
}
5628+
56185629
void getTargetDefines(const LangOptions &Opts,
56195630
MacroBuilder &Builder) const override {
56205631
// Target identification.
@@ -5813,8 +5824,15 @@ class ARMTargetInfo : public TargetInfo {
58135824
if (Opts.UnsafeFPMath)
58145825
Builder.defineMacro("__ARM_FP_FAST", "1");
58155826

5816-
if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5817-
Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5827+
switch(ArchKind) {
5828+
default: break;
5829+
case llvm::ARM::AK_ARMV8_1A:
5830+
getTargetDefinesARMV81A(Opts, Builder);
5831+
break;
5832+
case llvm::ARM::AK_ARMV8_2A:
5833+
getTargetDefinesARMV82A(Opts, Builder);
5834+
break;
5835+
}
58185836
}
58195837

58205838
ArrayRef<Builtin::Info> getTargetBuiltins() const override {
@@ -6207,9 +6225,8 @@ class AArch64TargetInfo : public TargetInfo {
62076225
unsigned CRC;
62086226
unsigned Crypto;
62096227
unsigned Unaligned;
6210-
unsigned V8_1A;
6211-
unsigned V8_2A;
62126228
unsigned HasFullFP16;
6229+
llvm::AArch64::ArchKind ArchKind;
62136230

62146231
static const Builtin::Info BuiltinInfo[];
62156232

@@ -6275,6 +6292,20 @@ class AArch64TargetInfo : public TargetInfo {
62756292
static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
62766293
}
62776294

6295+
void getTargetDefinesARMV81A(const LangOptions &Opts,
6296+
MacroBuilder &Builder) const {
6297+
Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
6298+
}
6299+
6300+
void getTargetDefinesARMV82A(const LangOptions &Opts,
6301+
MacroBuilder &Builder) const {
6302+
// Also include the ARMv8.1 defines
6303+
getTargetDefinesARMV81A(Opts, Builder);
6304+
6305+
if (FPU == NeonMode && HasFullFP16)
6306+
Builder.defineMacro("__ARM_FEATURE_FP16_VECTOR_ARITHMETIC", "1");
6307+
}
6308+
62786309
void getTargetDefines(const LangOptions &Opts,
62796310
MacroBuilder &Builder) const override {
62806311
// Target identification.
@@ -6339,10 +6370,15 @@ class AArch64TargetInfo : public TargetInfo {
63396370
if (Unaligned)
63406371
Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
63416372

6342-
if (V8_1A)
6343-
Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
6344-
if (V8_2A && FPU == NeonMode && HasFullFP16)
6345-
Builder.defineMacro("__ARM_FEATURE_FP16_VECTOR_ARITHMETIC", "1");
6373+
switch(ArchKind) {
6374+
default: break;
6375+
case llvm::AArch64::ArchKind::AK_ARMV8_1A:
6376+
getTargetDefinesARMV81A(Opts, Builder);
6377+
break;
6378+
case llvm::AArch64::ArchKind::AK_ARMV8_2A:
6379+
getTargetDefinesARMV82A(Opts, Builder);
6380+
break;
6381+
}
63466382

63476383
// All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
63486384
Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
@@ -6369,9 +6405,8 @@ class AArch64TargetInfo : public TargetInfo {
63696405
CRC = 0;
63706406
Crypto = 0;
63716407
Unaligned = 1;
6372-
V8_1A = 0;
6373-
V8_2A = 0;
63746408
HasFullFP16 = 0;
6409+
ArchKind = llvm::AArch64::ArchKind::AK_ARMV8A;
63756410

63766411
for (const auto &Feature : Features) {
63776412
if (Feature == "+neon")
@@ -6383,9 +6418,9 @@ class AArch64TargetInfo : public TargetInfo {
63836418
if (Feature == "+strict-align")
63846419
Unaligned = 0;
63856420
if (Feature == "+v8.1a")
6386-
V8_1A = 1;
6421+
ArchKind = llvm::AArch64::ArchKind::AK_ARMV8_1A;
63876422
if (Feature == "+v8.2a")
6388-
V8_2A = 1;
6423+
ArchKind = llvm::AArch64::ArchKind::AK_ARMV8_2A;
63896424
if (Feature == "+fullfp16")
63906425
HasFullFP16 = 1;
63916426
}

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

+3-2
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,9 @@
7171
// CHECK-NEON: __ARM_NEON 1
7272
// CHECK-NEON: __ARM_NEON_FP 0xE
7373

74-
// RUN: %clang -target aarch64-none-eabi -march=armv8.1-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-V81A %s
75-
// CHECK-V81A: __ARM_FEATURE_QRDMX 1
74+
// RUN: %clang -target aarch64-none-eabi -march=armv8.1-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-QRDMX %s
75+
// RUN: %clang -target aarch64-none-eabi -march=armv8.2-a -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-QRDMX %s
76+
// CHECK-QRDMX: __ARM_FEATURE_QRDMX 1
7677

7778
// RUN: %clang -target aarch64 -march=arm64 -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-ARCH-NOT-ACCEPT %s
7879
// RUN: %clang -target aarch64 -march=aarch64 -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-ARCH-NOT-ACCEPT %s

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

+1
Original file line numberDiff line numberDiff line change
@@ -441,4 +441,5 @@
441441
// CHECK-V82A: #define __ARM_ARCH 8
442442
// CHECK-V82A: #define __ARM_ARCH_8_2A__ 1
443443
// CHECK-V82A: #define __ARM_ARCH_PROFILE 'A'
444+
// CHECK-V82A: #define __ARM_FEATURE_QRDMX 1
444445
// CHECK-V82A: #define __ARM_FP 0xE

0 commit comments

Comments
 (0)