PPCSubtarget.h revision 198090
1//=====-- PPCSubtarget.h - Define Subtarget for the PPC -------*- C++ -*--====// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file declares the PowerPC specific subclass of TargetSubtarget. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef POWERPCSUBTARGET_H 15#define POWERPCSUBTARGET_H 16 17#include "llvm/Target/TargetInstrItineraries.h" 18#include "llvm/Target/TargetSubtarget.h" 19 20#include <string> 21 22// GCC #defines PPC on Linux but we use it as our namespace name 23#undef PPC 24 25namespace llvm { 26 27namespace PPC { 28 // -m directive values. 29 enum { 30 DIR_NONE, 31 DIR_32, 32 DIR_601, 33 DIR_602, 34 DIR_603, 35 DIR_7400, 36 DIR_750, 37 DIR_970, 38 DIR_64 39 }; 40} 41 42class GlobalValue; 43class TargetMachine; 44 45class PPCSubtarget : public TargetSubtarget { 46protected: 47 /// stackAlignment - The minimum alignment known to hold of the stack frame on 48 /// entry to the function and which must be maintained by every function. 49 unsigned StackAlignment; 50 51 /// Selected instruction itineraries (one entry per itinerary class.) 52 InstrItineraryData InstrItins; 53 54 /// Which cpu directive was used. 55 unsigned DarwinDirective; 56 57 /// Used by the ISel to turn in optimizations for POWER4-derived architectures 58 bool IsGigaProcessor; 59 bool Has64BitSupport; 60 bool Use64BitRegs; 61 bool IsPPC64; 62 bool HasAltivec; 63 bool HasFSQRT; 64 bool HasSTFIWX; 65 bool HasLazyResolverStubs; 66 67 /// DarwinVers - Nonzero if this is a darwin platform. Otherwise, the numeric 68 /// version of the platform, e.g. 8 = 10.4 (Tiger), 9 = 10.5 (Leopard), etc. 69 unsigned char DarwinVers; // Is any darwin-ppc platform. 70public: 71 /// This constructor initializes the data members to match that 72 /// of the specified triple. 73 /// 74 PPCSubtarget(const std::string &TT, const std::string &FS, bool is64Bit); 75 76 /// ParseSubtargetFeatures - Parses features string setting specified 77 /// subtarget options. Definition of function is auto generated by tblgen. 78 std::string ParseSubtargetFeatures(const std::string &FS, 79 const std::string &CPU); 80 81 82 /// SetJITMode - This is called to inform the subtarget info that we are 83 /// producing code for the JIT. 84 void SetJITMode(); 85 86 /// getStackAlignment - Returns the minimum alignment known to hold of the 87 /// stack frame on entry to the function and which must be maintained by every 88 /// function for this subtarget. 89 unsigned getStackAlignment() const { return StackAlignment; } 90 91 /// getDarwinDirective - Returns the -m directive specified for the cpu. 92 /// 93 unsigned getDarwinDirective() const { return DarwinDirective; } 94 95 /// getInstrItins - Return the instruction itineraies based on subtarget 96 /// selection. 97 const InstrItineraryData &getInstrItineraryData() const { return InstrItins; } 98 99 /// getTargetDataString - Return the pointer size and type alignment 100 /// properties of this subtarget. 101 const char *getTargetDataString() const { 102 // Note, the alignment values for f64 and i64 on ppc64 in Darwin 103 // documentation are wrong; these are correct (i.e. "what gcc does"). 104 return isPPC64() ? "E-p:64:64-f64:64:64-i64:64:64-f128:64:128" 105 : "E-p:32:32-f64:32:64-i64:32:64-f128:64:128"; 106 } 107 108 /// isPPC64 - Return true if we are generating code for 64-bit pointer mode. 109 /// 110 bool isPPC64() const { return IsPPC64; } 111 112 /// has64BitSupport - Return true if the selected CPU supports 64-bit 113 /// instructions, regardless of whether we are in 32-bit or 64-bit mode. 114 bool has64BitSupport() const { return Has64BitSupport; } 115 116 /// use64BitRegs - Return true if in 64-bit mode or if we should use 64-bit 117 /// registers in 32-bit mode when possible. This can only true if 118 /// has64BitSupport() returns true. 119 bool use64BitRegs() const { return Use64BitRegs; } 120 121 /// hasLazyResolverStub - Return true if accesses to the specified global have 122 /// to go through a dyld lazy resolution stub. This means that an extra load 123 /// is required to get the address of the global. 124 bool hasLazyResolverStub(const GlobalValue *GV, 125 const TargetMachine &TM) const; 126 127 // Specific obvious features. 128 bool hasFSQRT() const { return HasFSQRT; } 129 bool hasSTFIWX() const { return HasSTFIWX; } 130 bool hasAltivec() const { return HasAltivec; } 131 bool isGigaProcessor() const { return IsGigaProcessor; } 132 133 /// isDarwin - True if this is any darwin platform. 134 bool isDarwin() const { return DarwinVers != 0; } 135 /// isDarwin - True if this is darwin9 (leopard, 10.5) or above. 136 bool isDarwin9() const { return DarwinVers >= 9; } 137 138 /// getDarwinVers - Return the darwin version number, 8 = tiger, 9 = leopard. 139 unsigned getDarwinVers() const { return DarwinVers; } 140 141 bool isDarwinABI() const { return isDarwin(); } 142 bool isSVR4ABI() const { return !isDarwin(); } 143 144}; 145} // End llvm namespace 146 147#endif 148