X86Subtarget.h revision b4e56d4a2bc5a18507b2d255abf75f7850f41c04
1//=====---- X86Subtarget.h - Define Subtarget for the X86 -----*- 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 X86 specific subclass of TargetSubtarget. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef X86SUBTARGET_H 15#define X86SUBTARGET_H 16 17#include "llvm/Target/TargetSubtarget.h" 18 19#include <string> 20 21namespace llvm { 22class Module; 23class GlobalValue; 24class TargetMachine; 25 26namespace PICStyle { 27enum Style { 28 Stub, GOT, RIPRel, WinPIC, None 29}; 30} 31 32class X86Subtarget : public TargetSubtarget { 33public: 34 enum AsmWriterFlavorTy { 35 // Note: This numbering has to match the GCC assembler dialects for inline 36 // asm alternatives to work right. 37 ATT = 0, Intel = 1, Unset 38 }; 39protected: 40 enum X86SSEEnum { 41 NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42 42 }; 43 44 enum X863DNowEnum { 45 NoThreeDNow, ThreeDNow, ThreeDNowA 46 }; 47 48 /// AsmFlavor - Which x86 asm dialect to use. 49 /// 50 AsmWriterFlavorTy AsmFlavor; 51 52 /// PICStyle - Which PIC style to use 53 /// 54 PICStyle::Style PICStyle; 55 56 /// X86SSELevel - MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, or 57 /// none supported. 58 X86SSEEnum X86SSELevel; 59 60 /// X863DNowLevel - 3DNow or 3DNow Athlon, or none supported. 61 /// 62 X863DNowEnum X863DNowLevel; 63 64 /// HasX86_64 - True if the processor supports X86-64 instructions. 65 /// 66 bool HasX86_64; 67 68 /// DarwinVers - Nonzero if this is a darwin platform: the numeric 69 /// version of the platform, e.g. 8 = 10.4 (Tiger), 9 = 10.5 (Leopard), etc. 70 unsigned char DarwinVers; // Is any darwin-ppc platform. 71 72 /// stackAlignment - The minimum alignment known to hold of the stack frame on 73 /// entry to the function and which must be maintained by every function. 74 unsigned stackAlignment; 75 76 /// Max. memset / memcpy size that is turned into rep/movs, rep/stos ops. 77 /// 78 unsigned MaxInlineSizeThreshold; 79 80private: 81 /// Is64Bit - True if the processor supports 64-bit instructions and module 82 /// pointer size is 64 bit. 83 bool Is64Bit; 84 85public: 86 enum { 87 isELF, isCygwin, isDarwin, isWindows, isMingw 88 } TargetType; 89 90 /// This constructor initializes the data members to match that 91 /// of the specified module. 92 /// 93 X86Subtarget(const Module &M, const std::string &FS, bool is64Bit); 94 95 /// getStackAlignment - Returns the minimum alignment known to hold of the 96 /// stack frame on entry to the function and which must be maintained by every 97 /// function for this subtarget. 98 unsigned getStackAlignment() const { return stackAlignment; } 99 100 /// getMaxInlineSizeThreshold - Returns the maximum memset / memcpy size 101 /// that still makes it profitable to inline the call. 102 unsigned getMaxInlineSizeThreshold() const { return MaxInlineSizeThreshold; } 103 104 /// ParseSubtargetFeatures - Parses features string setting specified 105 /// subtarget options. Definition of function is auto generated by tblgen. 106 void ParseSubtargetFeatures(const std::string &FS, const std::string &CPU); 107 108 /// AutoDetectSubtargetFeatures - Auto-detect CPU features using CPUID 109 /// instruction. 110 void AutoDetectSubtargetFeatures(); 111 112 bool is64Bit() const { return Is64Bit; } 113 114 PICStyle::Style getPICStyle() const { return PICStyle; } 115 void setPICStyle(PICStyle::Style Style) { PICStyle = Style; } 116 117 bool hasMMX() const { return X86SSELevel >= MMX; } 118 bool hasSSE1() const { return X86SSELevel >= SSE1; } 119 bool hasSSE2() const { return X86SSELevel >= SSE2; } 120 bool hasSSE3() const { return X86SSELevel >= SSE3; } 121 bool hasSSSE3() const { return X86SSELevel >= SSSE3; } 122 // Temporarily disabling SSE4. 123 bool hasSSE41() const { return false && X86SSELevel >= SSE41; } 124 bool hasSSE42() const { return false && X86SSELevel >= SSE42; } 125 bool has3DNow() const { return X863DNowLevel >= ThreeDNow; } 126 bool has3DNowA() const { return X863DNowLevel >= ThreeDNowA; } 127 128 unsigned getAsmFlavor() const { 129 return AsmFlavor != Unset ? unsigned(AsmFlavor) : 0; 130 } 131 132 bool isFlavorAtt() const { return AsmFlavor == ATT; } 133 bool isFlavorIntel() const { return AsmFlavor == Intel; } 134 135 bool isTargetDarwin() const { return TargetType == isDarwin; } 136 bool isTargetELF() const { return TargetType == isELF; } 137 bool isTargetWindows() const { return TargetType == isWindows; } 138 bool isTargetMingw() const { return TargetType == isMingw; } 139 bool isTargetCygMing() const { return (TargetType == isMingw || 140 TargetType == isCygwin); } 141 bool isTargetCygwin() const { return TargetType == isCygwin; } 142 bool isTargetWin64() const { 143 return (Is64Bit && (TargetType == isMingw || TargetType == isWindows)); 144 } 145 146 std::string getDataLayout() const { 147 const char *p; 148 if (is64Bit()) 149 p = "e-p:64:64-s:64-f64:64:64-i64:64:64-f80:128:128"; 150 else { 151 if (isTargetDarwin()) 152 p = "e-p:32:32-f64:32:64-i64:32:64-f80:128:128"; 153 else 154 p = "e-p:32:32-f64:32:64-i64:32:64-f80:32:32"; 155 } 156 return std::string(p); 157 } 158 159 bool isPICStyleSet() const { return PICStyle != PICStyle::None; } 160 bool isPICStyleGOT() const { return PICStyle == PICStyle::GOT; } 161 bool isPICStyleStub() const { return PICStyle == PICStyle::Stub; } 162 bool isPICStyleRIPRel() const { return PICStyle == PICStyle::RIPRel; } 163 bool isPICStyleWinPIC() const { return PICStyle == PICStyle:: WinPIC; } 164 165 /// getDarwinVers - Return the darwin version number, 8 = tiger, 9 = leopard. 166 unsigned getDarwinVers() const { return DarwinVers; } 167 168 /// True if accessing the GV requires an extra load. For Windows, dllimported 169 /// symbols are indirect, loading the value at address GV rather then the 170 /// value of GV itself. This means that the GlobalAddress must be in the base 171 /// or index register of the address, not the GV offset field. 172 bool GVRequiresExtraLoad(const GlobalValue* GV, const TargetMachine& TM, 173 bool isDirectCall) const; 174 175 /// This function returns the name of a function which has an interface 176 /// like the non-standard bzero function, if such a function exists on 177 /// the current subtarget and it is considered prefereable over 178 /// memset with zero passed as the second argument. Otherwise it 179 /// returns null. 180 const char *getBZeroEntry() const; 181}; 182 183namespace X86 { 184 /// GetCpuIDAndInfo - Execute the specified cpuid and return the 4 values in 185 /// the specified arguments. If we can't run cpuid on the host, return true. 186 bool GetCpuIDAndInfo(unsigned value, unsigned *rEAX, unsigned *rEBX, 187 unsigned *rECX, unsigned *rEDX); 188} 189 190} // End llvm namespace 191 192#endif 193