[PowerPC] Add support for -mcpu=pwr10 in both clang and llvm

Summary:
This patch simply adds support for the new CPU in anticipation of
Power10. There isn't really any functionality added so there are no
associated test cases at this time.

Reviewers: stefanp, nemanjai, amyk, hfinkel, power-llvm-team, #powerpc

Reviewed By: stefanp, nemanjai, amyk, #powerpc

Subscribers: NeHuang, steven.zhang, hiraditya, llvm-commits, wuzish, shchenz, cfe-commits, kbarton, echristo

Tags: #clang, #powerpc, #llvm

Differential Revision: https://reviews.llvm.org/D80020
This commit is contained in:
Lei Huang 2020-05-27 09:50:14 -05:00
parent c295a65da4
commit 2368bf52cd
12 changed files with 152 additions and 77 deletions

View File

@ -151,6 +151,8 @@ void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Builder.defineMacro("_ARCH_PWR8"); Builder.defineMacro("_ARCH_PWR8");
if (ArchDefs & ArchDefinePwr9) if (ArchDefs & ArchDefinePwr9)
Builder.defineMacro("_ARCH_PWR9"); Builder.defineMacro("_ARCH_PWR9");
if (ArchDefs & ArchDefinePwr10)
Builder.defineMacro("_ARCH_PWR10");
if (ArchDefs & ArchDefineA2) if (ArchDefs & ArchDefineA2)
Builder.defineMacro("_ARCH_A2"); Builder.defineMacro("_ARCH_A2");
if (ArchDefs & ArchDefineA2q) { if (ArchDefs & ArchDefineA2q) {
@ -313,10 +315,17 @@ bool PPCTargetInfo::initFeatureMap(
.Case("e500", true) .Case("e500", true)
.Default(false); .Default(false);
// Future CPU should include all of the features of Power 9 as well as any // Power10 includes all the same features as Power9 plus any features specific
// to the Power10 core.
if (CPU == "pwr10" || CPU == "power10") {
initFeatureMap(Features, Diags, "pwr9", FeaturesVec);
addP10SpecificFeatures(Features);
}
// Future CPU should include all of the features of Power 10 as well as any
// additional features (yet to be determined) specific to it. // additional features (yet to be determined) specific to it.
if (CPU == "future") { if (CPU == "future") {
initFeatureMap(Features, Diags, "pwr9", FeaturesVec); initFeatureMap(Features, Diags, "pwr10", FeaturesVec);
addFutureSpecificFeatures(Features); addFutureSpecificFeatures(Features);
} }
@ -333,6 +342,13 @@ bool PPCTargetInfo::initFeatureMap(
return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec); return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
} }
// Add any Power10 specific features.
void PPCTargetInfo::addP10SpecificFeatures(
llvm::StringMap<bool> &Features) const {
Features["htm"] = false; // HTM was removed for P10.
return;
}
// Add features specific to the "Future" CPU. // Add features specific to the "Future" CPU.
void PPCTargetInfo::addFutureSpecificFeatures( void PPCTargetInfo::addFutureSpecificFeatures(
llvm::StringMap<bool> &Features) const { llvm::StringMap<bool> &Features) const {
@ -463,18 +479,17 @@ ArrayRef<TargetInfo::AddlRegName> PPCTargetInfo::getGCCAddlRegNames() const {
} }
static constexpr llvm::StringLiteral ValidCPUNames[] = { static constexpr llvm::StringLiteral ValidCPUNames[] = {
{"generic"}, {"440"}, {"450"}, {"601"}, {"602"}, {"generic"}, {"440"}, {"450"}, {"601"}, {"602"},
{"603"}, {"603e"}, {"603ev"}, {"604"}, {"604e"}, {"603"}, {"603e"}, {"603ev"}, {"604"}, {"604e"},
{"620"}, {"630"}, {"g3"}, {"7400"}, {"g4"}, {"620"}, {"630"}, {"g3"}, {"7400"}, {"g4"},
{"7450"}, {"g4+"}, {"750"}, {"8548"}, {"970"}, {"7450"}, {"g4+"}, {"750"}, {"8548"}, {"970"},
{"g5"}, {"a2"}, {"a2q"}, {"e500"}, {"e500mc"}, {"g5"}, {"a2"}, {"a2q"}, {"e500"}, {"e500mc"},
{"e5500"}, {"power3"}, {"pwr3"}, {"power4"}, {"pwr4"}, {"e5500"}, {"power3"}, {"pwr3"}, {"power4"}, {"pwr4"},
{"power5"}, {"pwr5"}, {"power5x"}, {"pwr5x"}, {"power6"}, {"power5"}, {"pwr5"}, {"power5x"}, {"pwr5x"}, {"power6"},
{"pwr6"}, {"power6x"}, {"pwr6x"}, {"power7"}, {"pwr7"}, {"pwr6"}, {"power6x"}, {"pwr6x"}, {"power7"}, {"pwr7"},
{"power8"}, {"pwr8"}, {"power9"}, {"pwr9"}, {"powerpc"}, {"power8"}, {"pwr8"}, {"power9"}, {"pwr9"}, {"power10"},
{"ppc"}, {"powerpc64"}, {"ppc64"}, {"powerpc64le"}, {"ppc64le"}, {"pwr10"}, {"powerpc"}, {"ppc"}, {"powerpc64"}, {"ppc64"},
{"future"} {"powerpc64le"}, {"ppc64le"}, {"future"}};
};
bool PPCTargetInfo::isValidCPUName(StringRef Name) const { bool PPCTargetInfo::isValidCPUName(StringRef Name) const {
return llvm::find(ValidCPUNames, Name) != std::end(ValidCPUNames); return llvm::find(ValidCPUNames, Name) != std::end(ValidCPUNames);

View File

@ -43,13 +43,13 @@ class LLVM_LIBRARY_VISIBILITY PPCTargetInfo : public TargetInfo {
ArchDefinePwr7 = 1 << 11, ArchDefinePwr7 = 1 << 11,
ArchDefinePwr8 = 1 << 12, ArchDefinePwr8 = 1 << 12,
ArchDefinePwr9 = 1 << 13, ArchDefinePwr9 = 1 << 13,
ArchDefineFuture = 1 << 14, ArchDefinePwr10 = 1 << 14,
ArchDefineA2 = 1 << 15, ArchDefineFuture = 1 << 15,
ArchDefineA2q = 1 << 16, ArchDefineA2 = 1 << 16,
ArchDefineE500 = 1 << 17 ArchDefineA2q = 1 << 17,
ArchDefineE500 = 1 << 18
} ArchDefineTypes; } ArchDefineTypes;
ArchDefineTypes ArchDefs = ArchDefineNone; ArchDefineTypes ArchDefs = ArchDefineNone;
static const Builtin::Info BuiltinInfo[]; static const Builtin::Info BuiltinInfo[];
static const char *const GCCRegNames[]; static const char *const GCCRegNames[];
@ -119,20 +119,20 @@ public:
.Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q) .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
.Cases("power3", "pwr3", ArchDefinePpcgr) .Cases("power3", "pwr3", ArchDefinePpcgr)
.Cases("power4", "pwr4", .Cases("power4", "pwr4",
ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq) ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
.Cases("power5", "pwr5", .Cases("power5", "pwr5",
ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
ArchDefinePpcsq) ArchDefinePpcsq)
.Cases("power5x", "pwr5x", .Cases("power5x", "pwr5x",
ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 |
ArchDefinePpcgr | ArchDefinePpcsq) ArchDefinePpcgr | ArchDefinePpcsq)
.Cases("power6", "pwr6", .Cases("power6", "pwr6",
ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5 |
ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq) ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
.Cases("power6x", "pwr6x", .Cases("power6x", "pwr6x",
ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x |
ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
ArchDefinePpcsq) ArchDefinePpcsq)
.Cases("power7", "pwr7", .Cases("power7", "pwr7",
ArchDefinePwr7 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr7 | ArchDefinePwr6 | ArchDefinePwr5x |
ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
@ -146,11 +146,16 @@ public:
ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7 |
ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5 |
ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq) ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
.Cases("power10", "pwr10",
ArchDefinePwr10 | ArchDefinePwr9 | ArchDefinePwr8 |
ArchDefinePwr7 | ArchDefinePwr6 | ArchDefinePwr5x |
ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
ArchDefinePpcsq)
.Case("future", .Case("future",
ArchDefineFuture | ArchDefinePwr9 | ArchDefinePwr8 | ArchDefineFuture | ArchDefinePwr10 | ArchDefinePwr9 |
ArchDefinePwr7 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6 |
ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 |
ArchDefinePpcsq) ArchDefinePpcgr | ArchDefinePpcsq)
.Cases("8548", "e500", ArchDefineE500) .Cases("8548", "e500", ArchDefineE500)
.Default(ArchDefineNone); .Default(ArchDefineNone);
} }
@ -171,6 +176,7 @@ public:
StringRef CPU, StringRef CPU,
const std::vector<std::string> &FeaturesVec) const override; const std::vector<std::string> &FeaturesVec) const override;
void addP10SpecificFeatures(llvm::StringMap<bool> &Features) const;
void addFutureSpecificFeatures(llvm::StringMap<bool> &Features) const; void addFutureSpecificFeatures(llvm::StringMap<bool> &Features) const;
bool handleTargetFeatures(std::vector<std::string> &Features, bool handleTargetFeatures(std::vector<std::string> &Features,

View File

@ -70,6 +70,7 @@ std::string ppc::getPPCTargetCPU(const ArgList &Args) {
.Case("power7", "pwr7") .Case("power7", "pwr7")
.Case("power8", "pwr8") .Case("power8", "pwr8")
.Case("power9", "pwr9") .Case("power9", "pwr9")
.Case("power10", "pwr10")
.Case("future", "future") .Case("future", "future")
.Case("pwr3", "pwr3") .Case("pwr3", "pwr3")
.Case("pwr4", "pwr4") .Case("pwr4", "pwr4")
@ -80,6 +81,7 @@ std::string ppc::getPPCTargetCPU(const ArgList &Args) {
.Case("pwr7", "pwr7") .Case("pwr7", "pwr7")
.Case("pwr8", "pwr8") .Case("pwr8", "pwr8")
.Case("pwr9", "pwr9") .Case("pwr9", "pwr9")
.Case("pwr10", "pwr10")
.Case("powerpc", "ppc") .Case("powerpc", "ppc")
.Case("powerpc64", "ppc64") .Case("powerpc64", "ppc64")
.Case("powerpc64le", "ppc64le") .Case("powerpc64le", "ppc64le")
@ -91,14 +93,16 @@ std::string ppc::getPPCTargetCPU(const ArgList &Args) {
const char *ppc::getPPCAsmModeForCPU(StringRef Name) { const char *ppc::getPPCAsmModeForCPU(StringRef Name) {
return llvm::StringSwitch<const char *>(Name) return llvm::StringSwitch<const char *>(Name)
.Case("pwr7", "-mpower7") .Case("pwr7", "-mpower7")
.Case("power7", "-mpower7") .Case("power7", "-mpower7")
.Case("pwr8", "-mpower8") .Case("pwr8", "-mpower8")
.Case("power8", "-mpower8") .Case("power8", "-mpower8")
.Case("ppc64le", "-mpower8") .Case("ppc64le", "-mpower8")
.Case("pwr9", "-mpower9") .Case("pwr9", "-mpower9")
.Case("power9", "-mpower9") .Case("power9", "-mpower9")
.Default("-many"); .Case("pwr10", "-mpower10")
.Case("power10", "-mpower10")
.Default("-many");
} }
void ppc::getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple, void ppc::getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,

View File

@ -81,7 +81,7 @@
// PPC-SAME: 603e, 603ev, 604, 604e, 620, 630, g3, 7400, g4, 7450, g4+, 750, // PPC-SAME: 603e, 603ev, 604, 604e, 620, 630, g3, 7400, g4, 7450, g4+, 750,
// PPC-SAME: 8548, 970, g5, a2, a2q, e500, e500mc, e5500, power3, pwr3, power4, // PPC-SAME: 8548, 970, g5, a2, a2q, e500, e500mc, e5500, power3, pwr3, power4,
// PPC-SAME: pwr4, power5, pwr5, power5x, pwr5x, power6, pwr6, power6x, pwr6x, // PPC-SAME: pwr4, power5, pwr5, power5x, pwr5x, power6, pwr6, power6x, pwr6x,
// PPC-SAME: power7, pwr7, power8, pwr8, power9, pwr9, powerpc, ppc, powerpc64, // PPC-SAME: power7, pwr7, power8, pwr8, power9, pwr9, power10, pwr10, powerpc, ppc, powerpc64,
// PPC-SAME: ppc64, powerpc64le, ppc64le, future // PPC-SAME: ppc64, powerpc64le, ppc64le, future
// RUN: not %clang_cc1 -triple mips--- -target-cpu not-a-cpu -fsyntax-only %s 2>&1 | FileCheck %s --check-prefix MIPS // RUN: not %clang_cc1 -triple mips--- -target-cpu not-a-cpu -fsyntax-only %s 2>&1 | FileCheck %s --check-prefix MIPS

View File

@ -627,12 +627,30 @@
// PPCPOWER9:#define _ARCH_PWR7 1 // PPCPOWER9:#define _ARCH_PWR7 1
// PPCPOWER9:#define _ARCH_PWR9 1 // PPCPOWER9:#define _ARCH_PWR9 1
// //
// RUN: %clang_cc1 -E -dM -ffreestanding -triple=powerpc64-none-none -target-cpu pwr10 -fno-signed-char < /dev/null | FileCheck -match-full-lines -check-prefix PPCPOWER10 %s
// RUN: %clang_cc1 -E -dM -ffreestanding -triple=powerpc64-none-none -target-cpu power10 -fno-signed-char < /dev/null | FileCheck -match-full-lines -check-prefix PPCPOWER10 %s
//
// PPCPOWER10:#define _ARCH_PPC 1
// PPCPOWER10:#define _ARCH_PPC64 1
// PPCPOWER10:#define _ARCH_PPCGR 1
// PPCPOWER10:#define _ARCH_PPCSQ 1
// PPCPOWER10:#define _ARCH_PWR10 1
// PPCPOWER10:#define _ARCH_PWR4 1
// PPCPOWER10:#define _ARCH_PWR5 1
// PPCPOWER10:#define _ARCH_PWR5X 1
// PPCPOWER10:#define _ARCH_PWR6 1
// PPCPOWER10-NOT:#define _ARCH_PWR6X 1
// PPCPOWER10:#define _ARCH_PWR7 1
// PPCPOWER10:#define _ARCH_PWR8 1
// PPCPOWER10:#define _ARCH_PWR9 1
//
// RUN: %clang_cc1 -E -dM -ffreestanding -triple=powerpc64-none-none -target-cpu future -fno-signed-char < /dev/null | FileCheck -match-full-lines -check-prefix PPCFUTURE %s // RUN: %clang_cc1 -E -dM -ffreestanding -triple=powerpc64-none-none -target-cpu future -fno-signed-char < /dev/null | FileCheck -match-full-lines -check-prefix PPCFUTURE %s
// //
// PPCFUTURE:#define _ARCH_PPC 1 // PPCFUTURE:#define _ARCH_PPC 1
// PPCFUTURE:#define _ARCH_PPC64 1 // PPCFUTURE:#define _ARCH_PPC64 1
// PPCFUTURE:#define _ARCH_PPCGR 1 // PPCFUTURE:#define _ARCH_PPCGR 1
// PPCFUTURE:#define _ARCH_PPCSQ 1 // PPCFUTURE:#define _ARCH_PPCSQ 1
// PPCFUTURE:#define _ARCH_PWR10 1
// PPCFUTURE:#define _ARCH_PWR4 1 // PPCFUTURE:#define _ARCH_PWR4 1
// PPCFUTURE:#define _ARCH_PWR5 1 // PPCFUTURE:#define _ARCH_PWR5 1
// PPCFUTURE:#define _ARCH_PWR5X 1 // PPCFUTURE:#define _ARCH_PWR5X 1

View File

@ -142,6 +142,7 @@ StringRef sys::detail::getHostCPUNameForPowerPC(StringRef ProcCpuinfoContent) {
.Case("POWER8E", "pwr8") .Case("POWER8E", "pwr8")
.Case("POWER8NVL", "pwr8") .Case("POWER8NVL", "pwr8")
.Case("POWER9", "pwr9") .Case("POWER9", "pwr9")
.Case("POWER10", "pwr10")
// FIXME: If we get a simulator or machine with the capabilities of // FIXME: If we get a simulator or machine with the capabilities of
// mcpu=future, we should revisit this and add the name reported by the // mcpu=future, we should revisit this and add the name reported by the
// simulator/machine. // simulator/machine.

View File

@ -51,6 +51,7 @@ def DirectivePwr6x
def DirectivePwr7: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR7", "">; def DirectivePwr7: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR7", "">;
def DirectivePwr8: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR8", "">; def DirectivePwr8: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR8", "">;
def DirectivePwr9: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR9", "">; def DirectivePwr9: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR9", "">;
def DirectivePwr10: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR10", "">;
def DirectivePwrFuture def DirectivePwrFuture
: SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR_FUTURE", "">; : SubtargetFeature<"", "CPUDirective", "PPC::DIR_PWR_FUTURE", "">;
@ -205,6 +206,9 @@ def DeprecatedDST : SubtargetFeature<"", "DeprecatedDST", "true",
def FeatureISA3_0 : SubtargetFeature<"isa-v30-instructions", "IsISA3_0", def FeatureISA3_0 : SubtargetFeature<"isa-v30-instructions", "IsISA3_0",
"true", "true",
"Enable instructions added in ISA 3.0.">; "Enable instructions added in ISA 3.0.">;
def FeatureISA3_1 : SubtargetFeature<"isa-v31-instructions", "IsISA3_1",
"true",
"Enable instructions added in ISA 3.1.">;
def FeatureP9Altivec : SubtargetFeature<"power9-altivec", "HasP9Altivec", "true", def FeatureP9Altivec : SubtargetFeature<"power9-altivec", "HasP9Altivec", "true",
"Enable POWER9 Altivec instructions", "Enable POWER9 Altivec instructions",
[FeatureISA3_0, FeatureP8Altivec]>; [FeatureISA3_0, FeatureP8Altivec]>;
@ -328,14 +332,25 @@ def ProcessorFeatures {
list<SubtargetFeature> P9Features = list<SubtargetFeature> P9Features =
!listconcat(P9InheritableFeatures, P9SpecificFeatures); !listconcat(P9InheritableFeatures, P9SpecificFeatures);
// Power10
// For P10 CPU we assume that all of the existing features from Power9
// still exist with the exception of those we know are Power9 specific.
list<SubtargetFeature> P10AdditionalFeatures =
[DirectivePwr10, FeatureISA3_1, FeaturePrefixInstrs,
FeaturePCRelativeMemops];
list<SubtargetFeature> P10SpecificFeatures = [];
list<SubtargetFeature> P10InheritableFeatures =
!listconcat(P9InheritableFeatures, P10AdditionalFeatures);
list<SubtargetFeature> P10Features =
!listconcat(P10InheritableFeatures, P10SpecificFeatures);
// Future // Future
// For future CPU we assume that all of the existing features from Power 9 // For future CPU we assume that all of the existing features from Power10
// still exist with the exception of those we know are Power 9 specific. // still exist with the exception of those we know are Power10 specific.
list<SubtargetFeature> FutureAdditionalFeatures = []; list<SubtargetFeature> FutureAdditionalFeatures = [];
list<SubtargetFeature> FutureSpecificFeatures = list<SubtargetFeature> FutureSpecificFeatures = [];
[FeaturePrefixInstrs, FeaturePCRelativeMemops];
list<SubtargetFeature> FutureInheritableFeatures = list<SubtargetFeature> FutureInheritableFeatures =
!listconcat(P9InheritableFeatures, FutureAdditionalFeatures); !listconcat(P10InheritableFeatures, FutureAdditionalFeatures);
list<SubtargetFeature> FutureFeatures = list<SubtargetFeature> FutureFeatures =
!listconcat(FutureInheritableFeatures, FutureSpecificFeatures); !listconcat(FutureInheritableFeatures, FutureSpecificFeatures);
} }
@ -540,6 +555,8 @@ def : ProcessorModel<"pwr6x", G5Model,
def : ProcessorModel<"pwr7", P7Model, ProcessorFeatures.P7Features>; def : ProcessorModel<"pwr7", P7Model, ProcessorFeatures.P7Features>;
def : ProcessorModel<"pwr8", P8Model, ProcessorFeatures.P8Features>; def : ProcessorModel<"pwr8", P8Model, ProcessorFeatures.P8Features>;
def : ProcessorModel<"pwr9", P9Model, ProcessorFeatures.P9Features>; def : ProcessorModel<"pwr9", P9Model, ProcessorFeatures.P9Features>;
// No scheduler model yet.
def : ProcessorModel<"pwr10", NoSchedModel, ProcessorFeatures.P10Features>;
// No scheduler model for future CPU. // No scheduler model for future CPU.
def : ProcessorModel<"future", NoSchedModel, def : ProcessorModel<"future", NoSchedModel,
ProcessorFeatures.FutureFeatures>; ProcessorFeatures.FutureFeatures>;

View File

@ -1306,6 +1306,7 @@ PPCTargetLowering::PPCTargetLowering(const PPCTargetMachine &TM,
case PPC::DIR_PWR7: case PPC::DIR_PWR7:
case PPC::DIR_PWR8: case PPC::DIR_PWR8:
case PPC::DIR_PWR9: case PPC::DIR_PWR9:
case PPC::DIR_PWR10:
case PPC::DIR_PWR_FUTURE: case PPC::DIR_PWR_FUTURE:
setPrefLoopAlignment(Align(16)); setPrefLoopAlignment(Align(16));
setPrefFunctionAlignment(Align(16)); setPrefFunctionAlignment(Align(16));
@ -14913,6 +14914,7 @@ Align PPCTargetLowering::getPrefLoopAlignment(MachineLoop *ML) const {
case PPC::DIR_PWR7: case PPC::DIR_PWR7:
case PPC::DIR_PWR8: case PPC::DIR_PWR8:
case PPC::DIR_PWR9: case PPC::DIR_PWR9:
case PPC::DIR_PWR10:
case PPC::DIR_PWR_FUTURE: { case PPC::DIR_PWR_FUTURE: {
if (!ML) if (!ML)
break; break;
@ -16103,6 +16105,7 @@ SDValue PPCTargetLowering::combineMUL(SDNode *N, DAGCombinerInfo &DCI) const {
// vector 7 2 2 // vector 7 2 2
return true; return true;
case PPC::DIR_PWR9: case PPC::DIR_PWR9:
case PPC::DIR_PWR10:
case PPC::DIR_PWR_FUTURE: case PPC::DIR_PWR_FUTURE:
// type mul add shl // type mul add shl
// scalar 5 2 2 // scalar 5 2 2

View File

@ -115,6 +115,7 @@ void PPCSubtarget::initializeEnvironment() {
HasAddiLoadFusion = false; HasAddiLoadFusion = false;
HasAddisLoadFusion = false; HasAddisLoadFusion = false;
IsISA3_0 = false; IsISA3_0 = false;
IsISA3_1 = false;
UseLongCalls = false; UseLongCalls = false;
SecurePlt = false; SecurePlt = false;
VectorsUseTwoUnits = false; VectorsUseTwoUnits = false;

View File

@ -34,32 +34,33 @@ class StringRef;
namespace PPC { namespace PPC {
// -m directive values. // -m directive values.
enum { enum {
DIR_NONE, DIR_NONE,
DIR_32, DIR_32,
DIR_440, DIR_440,
DIR_601, DIR_601,
DIR_602, DIR_602,
DIR_603, DIR_603,
DIR_7400, DIR_7400,
DIR_750, DIR_750,
DIR_970, DIR_970,
DIR_A2, DIR_A2,
DIR_E500, DIR_E500,
DIR_E500mc, DIR_E500mc,
DIR_E5500, DIR_E5500,
DIR_PWR3, DIR_PWR3,
DIR_PWR4, DIR_PWR4,
DIR_PWR5, DIR_PWR5,
DIR_PWR5X, DIR_PWR5X,
DIR_PWR6, DIR_PWR6,
DIR_PWR6X, DIR_PWR6X,
DIR_PWR7, DIR_PWR7,
DIR_PWR8, DIR_PWR8,
DIR_PWR9, DIR_PWR9,
DIR_PWR_FUTURE, DIR_PWR10,
DIR_64 DIR_PWR_FUTURE,
}; DIR_64
};
} }
class GlobalValue; class GlobalValue;
@ -138,6 +139,7 @@ protected:
bool HasAddiLoadFusion; bool HasAddiLoadFusion;
bool HasAddisLoadFusion; bool HasAddisLoadFusion;
bool IsISA3_0; bool IsISA3_0;
bool IsISA3_1;
bool UseLongCalls; bool UseLongCalls;
bool SecurePlt; bool SecurePlt;
bool VectorsUseTwoUnits; bool VectorsUseTwoUnits;
@ -308,6 +310,7 @@ public:
bool hasHTM() const { return HasHTM; } bool hasHTM() const { return HasHTM; }
bool hasFloat128() const { return HasFloat128; } bool hasFloat128() const { return HasFloat128; }
bool isISA3_0() const { return IsISA3_0; } bool isISA3_0() const { return IsISA3_0; }
bool isISA3_1() const { return IsISA3_1; }
bool useLongCalls() const { return UseLongCalls; } bool useLongCalls() const { return UseLongCalls; }
bool hasFusion() const { return HasFusion; } bool hasFusion() const { return HasFusion; }
bool hasAddiLoadFusion() const { return HasAddiLoadFusion; } bool hasAddiLoadFusion() const { return HasAddiLoadFusion; }

View File

@ -651,11 +651,12 @@ unsigned PPCTTIImpl::getCacheLineSize() const {
if (CacheLineSize.getNumOccurrences() > 0) if (CacheLineSize.getNumOccurrences() > 0)
return CacheLineSize; return CacheLineSize;
// On P7, P8 or P9 we have a cache line size of 128. // Starting with P7 we have a cache line size of 128.
unsigned Directive = ST->getCPUDirective(); unsigned Directive = ST->getCPUDirective();
// Assume that Future CPU has the same cache line size as the others. // Assume that Future CPU has the same cache line size as the others.
if (Directive == PPC::DIR_PWR7 || Directive == PPC::DIR_PWR8 || if (Directive == PPC::DIR_PWR7 || Directive == PPC::DIR_PWR8 ||
Directive == PPC::DIR_PWR9 || Directive == PPC::DIR_PWR_FUTURE) Directive == PPC::DIR_PWR9 || Directive == PPC::DIR_PWR10 ||
Directive == PPC::DIR_PWR_FUTURE)
return 128; return 128;
// On other processors return a default of 64 bytes. // On other processors return a default of 64 bytes.
@ -687,9 +688,11 @@ unsigned PPCTTIImpl::getMaxInterleaveFactor(unsigned VF) {
// For P7 and P8, floating-point instructions have a 6-cycle latency and // For P7 and P8, floating-point instructions have a 6-cycle latency and
// there are two execution units, so unroll by 12x for latency hiding. // there are two execution units, so unroll by 12x for latency hiding.
// FIXME: the same for P9 as previous gen until POWER9 scheduling is ready // FIXME: the same for P9 as previous gen until POWER9 scheduling is ready
// FIXME: the same for P10 as previous gen until POWER10 scheduling is ready
// Assume that future is the same as the others. // Assume that future is the same as the others.
if (Directive == PPC::DIR_PWR7 || Directive == PPC::DIR_PWR8 || if (Directive == PPC::DIR_PWR7 || Directive == PPC::DIR_PWR8 ||
Directive == PPC::DIR_PWR9 || Directive == PPC::DIR_PWR_FUTURE) Directive == PPC::DIR_PWR9 || Directive == PPC::DIR_PWR10 ||
Directive == PPC::DIR_PWR_FUTURE)
return 12; return 12;
// For most things, modern systems have two execution units (and // For most things, modern systems have two execution units (and

View File

@ -2,9 +2,13 @@
; RUN: -mcpu=future < %s | FileCheck %s ; RUN: -mcpu=future < %s | FileCheck %s
; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \ ; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \
; RUN: -mcpu=future < %s | FileCheck %s ; RUN: -mcpu=future < %s | FileCheck %s
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
; RUN: -mcpu=power10 < %s | FileCheck %s
; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \
; RUN: -mcpu=pwr10 < %s | FileCheck %s
; Test mcpu=future that should be recognized on PowerPC. ; Test -mcpu=[pwr10|future] is recognized on PowerPC.
; CHECK-NOT: is not a recognized processor for this target ; CHECK-NOT: is not a recognized processor for this target
; CHECK: .text ; CHECK: .text