diff options
Diffstat (limited to 'llvm/lib/Target/PowerPC/PPCSubtarget.h')
-rw-r--r-- | llvm/lib/Target/PowerPC/PPCSubtarget.h | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCSubtarget.h b/llvm/lib/Target/PowerPC/PPCSubtarget.h index d96c2893aee9..044e982740e9 100644 --- a/llvm/lib/Target/PowerPC/PPCSubtarget.h +++ b/llvm/lib/Target/PowerPC/PPCSubtarget.h @@ -57,6 +57,7 @@ namespace PPC { DIR_PWR7, DIR_PWR8, DIR_PWR9, + DIR_PWR_FUTURE, DIR_64 }; } @@ -84,7 +85,7 @@ protected: InstrItineraryData InstrItins; /// Which cpu directive was used. - unsigned DarwinDirective; + unsigned CPUDirective; /// Used by the ISel to turn in optimizations for POWER4-derived architectures bool HasMFOCRF; @@ -123,6 +124,7 @@ protected: bool IsPPC4xx; bool IsPPC6xx; bool FeatureMFTB; + bool AllowsUnalignedFPAccess; bool DeprecatedDST; bool HasLazyResolverStubs; bool IsLittleEndian; @@ -169,8 +171,11 @@ public: Align getStackAlignment() const { return StackAlignment; } /// getDarwinDirective - Returns the -m directive specified for the cpu. + unsigned getDarwinDirective() const { return CPUDirective; } + + /// getCPUDirective - Returns the -m directive specified for the cpu. /// - unsigned getDarwinDirective() const { return DarwinDirective; } + unsigned getCPUDirective() const { return CPUDirective; } /// getInstrItins - Return the instruction itineraries based on subtarget /// selection. @@ -270,6 +275,7 @@ public: bool vectorsUseTwoUnits() const {return VectorsUseTwoUnits; } bool isE500() const { return IsE500; } bool isFeatureMFTB() const { return FeatureMFTB; } + bool allowsUnalignedFPAccess() const { return AllowsUnalignedFPAccess; } bool isDeprecatedDST() const { return DeprecatedDST; } bool hasICBT() const { return HasICBT; } bool hasInvariantFunctionDescriptors() const { @@ -347,6 +353,41 @@ public: /// True if the GV will be accessed via an indirect symbol. bool isGVIndirectSymbol(const GlobalValue *GV) const; + /// True if the ABI is descriptor based. + bool usesFunctionDescriptors() const { + // Both 32-bit and 64-bit AIX are descriptor based. For ELF only the 64-bit + // v1 ABI uses descriptors. + return isAIXABI() || (is64BitELFABI() && !isELFv2ABI()); + } + + unsigned descriptorTOCAnchorOffset() const { + assert(usesFunctionDescriptors() && + "Should only be called when the target uses descriptors."); + return IsPPC64 ? 8 : 4; + } + + unsigned descriptorEnvironmentPointerOffset() const { + assert(usesFunctionDescriptors() && + "Should only be called when the target uses descriptors."); + return IsPPC64 ? 16 : 8; + } + + MCRegister getEnvironmentPointerRegister() const { + assert(usesFunctionDescriptors() && + "Should only be called when the target uses descriptors."); + return IsPPC64 ? PPC::X11 : PPC::R11; + } + + MCRegister getTOCPointerRegister() const { + assert((is64BitELFABI() || isAIXABI()) && + "Should only be called when the target is a TOC based ABI."); + return IsPPC64 ? PPC::X2 : PPC::R2; + } + + MCRegister getStackPointerRegister() const { + return IsPPC64 ? PPC::X1 : PPC::R1; + } + bool isXRaySupported() const override { return IsPPC64 && IsLittleEndian; } }; } // End llvm namespace |