diff options
Diffstat (limited to 'lib/Target/PowerPC/PPCSubtarget.cpp')
-rw-r--r-- | lib/Target/PowerPC/PPCSubtarget.cpp | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/lib/Target/PowerPC/PPCSubtarget.cpp b/lib/Target/PowerPC/PPCSubtarget.cpp index c0fcb6cbb9dc..603f0fccc7c6 100644 --- a/lib/Target/PowerPC/PPCSubtarget.cpp +++ b/lib/Target/PowerPC/PPCSubtarget.cpp @@ -70,6 +70,8 @@ void PPCSubtarget::initializeEnvironment() { HasP8Vector = false; HasP8Altivec = false; HasP8Crypto = false; + HasP9Vector = false; + HasP9Altivec = false; HasFCPSGN = false; HasFSQRT = false; HasFRE = false; @@ -82,7 +84,6 @@ void PPCSubtarget::initializeEnvironment() { HasFPRND = false; HasFPCVT = false; HasISEL = false; - HasPOPCNTD = false; HasBPERMD = false; HasExtDiv = false; HasCMPB = false; @@ -103,12 +104,15 @@ void PPCSubtarget::initializeEnvironment() { HasHTM = false; HasFusion = false; HasFloat128 = false; + IsISA3_0 = false; + + HasPOPCNTD = POPCNTD_Unavailable; } void PPCSubtarget::initSubtargetFeatures(StringRef CPU, StringRef FS) { // Determine default and user specified characteristics std::string CPUName = CPU; - if (CPUName.empty()) { + if (CPUName.empty() || CPU == "generic") { // If cross-compiling with -march=ppc64le without -mcpu if (TargetTriple.getArch() == Triple::ppc64le) CPUName = "ppc64le"; @@ -142,18 +146,20 @@ void PPCSubtarget::initSubtargetFeatures(StringRef CPU, StringRef FS) { IsLittleEndian = (TargetTriple.getArch() == Triple::ppc64le); } -/// hasLazyResolverStub - Return true if accesses to the specified global have -/// to go through a dyld lazy resolution stub. This means that an extra load -/// is required to get the address of the global. +/// Return true if accesses to the specified global have to go through a dyld +/// lazy resolution stub. This means that an extra load is required to get the +/// address of the global. bool PPCSubtarget::hasLazyResolverStub(const GlobalValue *GV) const { - // We never have stubs if HasLazyResolverStubs=false or if in static mode. - if (!HasLazyResolverStubs || TM.getRelocationModel() == Reloc::Static) - return false; - bool isDecl = GV->isDeclaration(); - if (GV->hasHiddenVisibility() && !isDecl && !GV->hasCommonLinkage()) + if (!HasLazyResolverStubs) return false; - return GV->hasWeakLinkage() || GV->hasLinkOnceLinkage() || - GV->hasCommonLinkage() || isDecl; + if (!TM.shouldAssumeDSOLocal(*GV->getParent(), GV)) + return true; + // 32 bit macho has no relocation for a-b if a is undefined, even if b is in + // the section that is being relocated. This means we have to use o load even + // for GVs that are known to be local to the dso. + if (GV->isDeclarationForLinker() || GV->hasCommonLinkage()) + return true; + return false; } // Embedded cores need aggressive scheduling (and some others also benefit). @@ -166,6 +172,8 @@ static bool needsAggressiveScheduling(unsigned Directive) { case PPC::DIR_E5500: case PPC::DIR_PWR7: case PPC::DIR_PWR8: + // FIXME: Same as P8 until POWER9 scheduling info is available + case PPC::DIR_PWR9: return true; } } @@ -191,8 +199,6 @@ void PPCSubtarget::getCriticalPathRCs(RegClassVector &CriticalPathRCs) const { } void PPCSubtarget::overrideSchedPolicy(MachineSchedPolicy &Policy, - MachineInstr *begin, - MachineInstr *end, unsigned NumRegionInstrs) const { if (needsAggressiveScheduling(DarwinDirective)) { Policy.OnlyTopDown = false; |