X86Subtarget.h revision 63ec90a6a8e0e441a1560f4386c5b6d538ad6583
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, or none supported. 57 /// 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 85 /// HasLow4GUserAddress - True if the low 4G user-space address is available. 86 /// 87 bool HasLow4GUserAddress; 88 89public: 90 enum { 91 isELF, isCygwin, isDarwin, isWindows, isMingw 92 } TargetType; 93 94 /// This constructor initializes the data members to match that 95 /// of the specified module. 96 /// 97 X86Subtarget(const Module &M, const std::string &FS, bool is64Bit); 98 99 /// getStackAlignment - Returns the minimum alignment known to hold of the 100 /// stack frame on entry to the function and which must be maintained by every 101 /// function for this subtarget. 102 unsigned getStackAlignment() const { return stackAlignment; } 103 104 /// getMaxInlineSizeThreshold - Returns the maximum memset / memcpy size 105 /// that still makes it profitable to inline the call. 106 unsigned getMaxInlineSizeThreshold() const { return MaxInlineSizeThreshold; } 107 108 /// ParseSubtargetFeatures - Parses features string setting specified 109 /// subtarget options. Definition of function is auto generated by tblgen. 110 void ParseSubtargetFeatures(const std::string &FS, const std::string &CPU); 111 112 /// AutoDetectSubtargetFeatures - Auto-detect CPU features using CPUID 113 /// instruction. 114 void AutoDetectSubtargetFeatures(); 115 116 bool is64Bit() const { return Is64Bit; } 117 118 /// hasLow4GUserSpaceAddress - True if lower 4G user-space address is 119 /// available. 120 bool hasLow4GUserSpaceAddress() const { return HasLow4GUserAddress; } 121 122 PICStyle::Style getPICStyle() const { return PICStyle; } 123 void setPICStyle(PICStyle::Style Style) { PICStyle = Style; } 124 125 bool hasMMX() const { return X86SSELevel >= MMX; } 126 bool hasSSE1() const { return X86SSELevel >= SSE1; } 127 bool hasSSE2() const { return X86SSELevel >= SSE2; } 128 bool hasSSE3() const { return X86SSELevel >= SSE3; } 129 bool hasSSSE3() const { return X86SSELevel >= SSSE3; } 130 bool hasSSE41() const { return X86SSELevel >= SSE41; } 131 bool hasSSE42() const { return X86SSELevel >= SSE42; } 132 bool has3DNow() const { return X863DNowLevel >= ThreeDNow; } 133 bool has3DNowA() const { return X863DNowLevel >= ThreeDNowA; } 134 135 unsigned getAsmFlavor() const { 136 return AsmFlavor != Unset ? unsigned(AsmFlavor) : 0; 137 } 138 139 bool isFlavorAtt() const { return AsmFlavor == ATT; } 140 bool isFlavorIntel() const { return AsmFlavor == Intel; } 141 142 bool isTargetDarwin() const { return TargetType == isDarwin; } 143 bool isTargetELF() const { return TargetType == isELF; } 144 bool isTargetWindows() const { return TargetType == isWindows; } 145 bool isTargetMingw() const { return TargetType == isMingw; } 146 bool isTargetCygMing() const { return (TargetType == isMingw || 147 TargetType == isCygwin); } 148 bool isTargetCygwin() const { return TargetType == isCygwin; } 149 150 std::string getDataLayout() const { 151 const char *p; 152 if (is64Bit()) 153 p = "e-p:64:64-s:64-f64:64:64-i64:64:64-f80:128:128"; 154 else { 155 if (isTargetDarwin()) 156 p = "e-p:32:32-f64:32:64-i64:32:64-f80:128:128"; 157 else 158 p = "e-p:32:32-f64:32:64-i64:32:64-f80:32:32"; 159 } 160 return std::string(p); 161 } 162 163 bool isPICStyleSet() const { return PICStyle != PICStyle::None; } 164 bool isPICStyleGOT() const { return PICStyle == PICStyle::GOT; } 165 bool isPICStyleStub() const { return PICStyle == PICStyle::Stub; } 166 bool isPICStyleRIPRel() const { return PICStyle == PICStyle::RIPRel; } 167 bool isPICStyleWinPIC() const { return PICStyle == PICStyle:: WinPIC; } 168 169 /// getDarwinVers - Return the darwin version number, 8 = tiger, 9 = leopard. 170 unsigned getDarwinVers() const { return DarwinVers; } 171 172 /// True if accessing the GV requires an extra load. For Windows, dllimported 173 /// symbols are indirect, loading the value at address GV rather then the 174 /// value of GV itself. This means that the GlobalAddress must be in the base 175 /// or index register of the address, not the GV offset field. 176 bool GVRequiresExtraLoad(const GlobalValue* GV, const TargetMachine& TM, 177 bool isDirectCall) const; 178 179}; 180 181namespace X86 { 182 /// GetCpuIDAndInfo - Execute the specified cpuid and return the 4 values in 183 /// the specified arguments. If we can't run cpuid on the host, return true. 184 bool GetCpuIDAndInfo(unsigned value, unsigned *rEAX, unsigned *rEBX, 185 unsigned *rECX, unsigned *rEDX); 186} 187 188} // End llvm namespace 189 190#endif 191