forked from OSchip/llvm-project
[TargetParser][ARM] Account dependencies when processing target features
Teaches ARM::appendArchExtFeatures to account dependencies when processing target features: i.e. when you say -march=armv8.1-m.main+mve.fp+nofp it means mve.fp should get discarded too. (Split from D63936) Differential Revision: https://reviews.llvm.org/D64048 llvm-svn: 366031
This commit is contained in:
parent
9428d95ce7
commit
951bb68ce2
|
@ -762,12 +762,29 @@
|
|||
// CHECK-V81M-MVE: #define __ARM_FEATURE_MVE 1
|
||||
// CHECK-V81M-MVE: #define __ARM_FEATURE_SIMD32 1
|
||||
|
||||
// RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main+mve.fp -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V81M-MVE-FP %s
|
||||
// CHECK-V81M-MVE-FP: #define __ARM_FEATURE_DSP 1
|
||||
// CHECK-V81M-MVE-FP: #define __ARM_FEATURE_FP16_SCALAR_ARITHMETIC 1
|
||||
// CHECK-V81M-MVE-FP: #define __ARM_FEATURE_MVE 3
|
||||
// CHECK-V81M-MVE-FP: #define __ARM_FEATURE_SIMD32 1
|
||||
// CHECK-V81M-MVE-FP: #define __ARM_FPV5__ 1
|
||||
// RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main+mve.fp -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V81M-MVEFP %s
|
||||
// CHECK-V81M-MVEFP: #define __ARM_FEATURE_DSP 1
|
||||
// CHECK-V81M-MVEFP: #define __ARM_FEATURE_FP16_SCALAR_ARITHMETIC 1
|
||||
// CHECK-V81M-MVEFP: #define __ARM_FEATURE_MVE 3
|
||||
// CHECK-V81M-MVEFP: #define __ARM_FEATURE_SIMD32 1
|
||||
// CHECK-V81M-MVEFP: #define __ARM_FPV5__ 1
|
||||
|
||||
// nofp discards mve.fp
|
||||
// RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main+mve.fp+nofp -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V81M-MVEFP-NOFP %s
|
||||
// CHECK-V81M-MVEFP-NOFP-NOT: #define __ARM_FEATURE_MVE
|
||||
|
||||
// nomve discards mve.fp
|
||||
// RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main+mve.fp+nomve -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V81M-MVEFP-NOMVE %s
|
||||
// CHECK-V81M-MVEFP-NOMVE-NOT: #define __ARM_FEATURE_MVE
|
||||
|
||||
// mve+fp doesn't imply mve.fp
|
||||
// RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main+mve+fp -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V81M-MVE-FP %s
|
||||
// CHECK-V81M-MVE-FP: #define __ARM_FEATURE_MVE 1
|
||||
|
||||
// nodsp discards both dsp and mve
|
||||
// RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main+mve+nodsp -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V81M-MVE-NODSP %s
|
||||
// CHECK-V81M-MVE-NODSP-NOT: #define __ARM_FEATURE_MVE
|
||||
// CHECK-V81M-MVE-NODSP-NOT: #define __ARM_FEATURE_DSP
|
||||
|
||||
// RUN: %clang -target armv8.1a-none-none-eabi -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V81A %s
|
||||
// CHECK-V81A: #define __ARM_ARCH 8
|
||||
|
|
|
@ -149,8 +149,8 @@ ARM_ARCH_EXT_NAME("dotprod", ARM::AEK_DOTPROD, "+dotprod","-dotprod")
|
|||
ARM_ARCH_EXT_NAME("dsp", ARM::AEK_DSP, "+dsp", "-dsp")
|
||||
ARM_ARCH_EXT_NAME("fp", ARM::AEK_FP, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("fp.dp", ARM::AEK_FP_DP, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("mve", ARM::AEK_SIMD, "+mve", "-mve")
|
||||
ARM_ARCH_EXT_NAME("mve.fp", (ARM::AEK_SIMD | ARM::AEK_FP), "+mve.fp", "-mve.fp")
|
||||
ARM_ARCH_EXT_NAME("mve", (ARM::AEK_DSP | ARM::AEK_SIMD), "+mve", "-mve")
|
||||
ARM_ARCH_EXT_NAME("mve.fp", (ARM::AEK_DSP | ARM::AEK_SIMD | ARM::AEK_FP), "+mve.fp", "-mve.fp")
|
||||
ARM_ARCH_EXT_NAME("idiv", (ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB), nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("mp", ARM::AEK_MP, nullptr, nullptr)
|
||||
ARM_ARCH_EXT_NAME("simd", ARM::AEK_SIMD, nullptr, nullptr)
|
||||
|
|
|
@ -490,16 +490,30 @@ static unsigned findDoublePrecisionFPU(unsigned InputFPUKind) {
|
|||
return ARM::FK_INVALID;
|
||||
}
|
||||
|
||||
static unsigned getAEKID(StringRef ArchExtName) {
|
||||
for (const auto AE : ARM::ARCHExtNames)
|
||||
if (AE.getName() == ArchExtName)
|
||||
return AE.ID;
|
||||
return ARM::AEK_INVALID;
|
||||
}
|
||||
|
||||
bool ARM::appendArchExtFeatures(
|
||||
StringRef CPU, ARM::ArchKind AK, StringRef ArchExt,
|
||||
std::vector<StringRef> &Features) {
|
||||
StringRef StandardFeature = getArchExtFeature(ArchExt);
|
||||
if (!StandardFeature.empty()) {
|
||||
Features.push_back(StandardFeature);
|
||||
return true;
|
||||
}
|
||||
|
||||
size_t StartingNumFeatures = Features.size();
|
||||
const bool Negated = stripNegationPrefix(ArchExt);
|
||||
unsigned ID = getAEKID(ArchExt);
|
||||
|
||||
if (ID == AEK_INVALID)
|
||||
return false;
|
||||
|
||||
for (const auto AE : ARCHExtNames) {
|
||||
if (Negated && (AE.ID & ID) == ID && AE.NegFeature)
|
||||
Features.push_back(AE.NegFeature);
|
||||
else if (AE.ID == ID && AE.Feature)
|
||||
Features.push_back(AE.Feature);
|
||||
}
|
||||
|
||||
if (CPU == "")
|
||||
CPU = "generic";
|
||||
|
@ -519,7 +533,7 @@ bool ARM::appendArchExtFeatures(
|
|||
}
|
||||
return ARM::getFPUFeatures(FPUKind, Features);
|
||||
}
|
||||
return false;
|
||||
return StartingNumFeatures != Features.size();
|
||||
}
|
||||
|
||||
StringRef ARM::getHWDivName(unsigned HWDivKind) {
|
||||
|
|
Loading…
Reference in New Issue