X86Subtarget.h revision 6e08738d4b1bb6c087d81bca656c24cdc1d504f8
18c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman//=====---- X86Subtarget.h - Define Subtarget for the X86 -----*- C++ -*--====// 2fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman// 3fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman// The LLVM Compiler Infrastructure 4fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman// 8fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman//===----------------------------------------------------------------------===// 9fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman// 10fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman// This file declares the X86 specific subclass of TargetSubtarget. 11fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman// 12fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman//===----------------------------------------------------------------------===// 13fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman 14fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman#ifndef X86SUBTARGET_H 15fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman#define X86SUBTARGET_H 16fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman 17fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman#include "llvm/Target/TargetSubtarget.h" 18fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman 19b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey#include <string> 20b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey 21fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begemannamespace llvm { 22fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begemanclass Module; 237784ebc239202bba4859855c3f438319144535f0Anton Korobeynikovclass GlobalValue; 242b2bc688849234b9ee5e0c8704a2984f0e9cbba3Anton Korobeynikovclass TargetMachine; 257f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov 267f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikovnamespace PICStyle { 277f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikovenum Style { 287f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov Stub, GOT, RIPRel, WinPIC, None 297f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov}; 307f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov} 31fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman 32fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begemanclass X86Subtarget : public TargetSubtarget { 3305a059d5d8d039dbbec3607b313c38fba14f972eJim Laskeypublic: 3405a059d5d8d039dbbec3607b313c38fba14f972eJim Laskey enum AsmWriterFlavorTy { 3526aa785942fa43eac68ec9a7592ab49df5d1dc57Chris Lattner // Note: This numbering has to match the GCC assembler dialects for inline 3626aa785942fa43eac68ec9a7592ab49df5d1dc57Chris Lattner // asm alternatives to work right. 3726aa785942fa43eac68ec9a7592ab49df5d1dc57Chris Lattner ATT = 0, Intel = 1, Unset 3805a059d5d8d039dbbec3607b313c38fba14f972eJim Laskey }; 39fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begemanprotected: 40559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng enum X86SSEEnum { 4163ec90a6a8e0e441a1560f4386c5b6d538ad6583Nate Begeman NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42 42559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng }; 43559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng 44a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng enum X863DNowEnum { 45a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng NoThreeDNow, ThreeDNow, ThreeDNowA 46a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng }; 47a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng 4805a059d5d8d039dbbec3607b313c38fba14f972eJim Laskey /// AsmFlavor - Which x86 asm dialect to use. 49f6844ca0e4a02fae3b100db7b0c62170d05e5b53Evan Cheng /// 5005a059d5d8d039dbbec3607b313c38fba14f972eJim Laskey AsmWriterFlavorTy AsmFlavor; 5105a059d5d8d039dbbec3607b313c38fba14f972eJim Laskey 527f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov /// PICStyle - Which PIC style to use 53f6844ca0e4a02fae3b100db7b0c62170d05e5b53Evan Cheng /// 547f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov PICStyle::Style PICStyle; 557f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov 56add251754cd18f4ef9f4eb1ead16a0c98887066eEvan Cheng /// X86SSELevel - MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, or 57add251754cd18f4ef9f4eb1ead16a0c98887066eEvan Cheng /// none supported. 58559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng X86SSEEnum X86SSELevel; 59559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng 60a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng /// X863DNowLevel - 3DNow or 3DNow Athlon, or none supported. 61f6844ca0e4a02fae3b100db7b0c62170d05e5b53Evan Cheng /// 62a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng X863DNowEnum X863DNowLevel; 63a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng 6425ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng /// HasX86_64 - True if the processor supports X86-64 instructions. 65f6844ca0e4a02fae3b100db7b0c62170d05e5b53Evan Cheng /// 6625ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng bool HasX86_64; 677ad92d81e2c2d1fe8ae89e5638fc57925d747429Chris Lattner 687ad92d81e2c2d1fe8ae89e5638fc57925d747429Chris Lattner /// DarwinVers - Nonzero if this is a darwin platform: the numeric 697ad92d81e2c2d1fe8ae89e5638fc57925d747429Chris Lattner /// version of the platform, e.g. 8 = 10.4 (Tiger), 9 = 10.5 (Leopard), etc. 70600bf16cf7b1667f85c8531432aae0dd23d553abDan Gohman unsigned char DarwinVers; // Is any darwin-x86 platform. 71600bf16cf7b1667f85c8531432aae0dd23d553abDan Gohman 72600bf16cf7b1667f85c8531432aae0dd23d553abDan Gohman /// isLinux - true if this is a "linux" platform. 73600bf16cf7b1667f85c8531432aae0dd23d553abDan Gohman bool IsLinux; 74559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng 75b151acadc85011961e24d98fa6ce626ea45cd074Chris Lattner /// stackAlignment - The minimum alignment known to hold of the stack frame on 76b151acadc85011961e24d98fa6ce626ea45cd074Chris Lattner /// entry to the function and which must be maintained by every function. 77fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman unsigned stackAlignment; 789eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen 79fc05f402ea22e8a9ae465d209b65be7e857a89ffRafael Espindola /// Max. memset / memcpy size that is turned into rep/movs, rep/stos ops. 80f6844ca0e4a02fae3b100db7b0c62170d05e5b53Evan Cheng /// 81fc05f402ea22e8a9ae465d209b65be7e857a89ffRafael Espindola unsigned MaxInlineSizeThreshold; 8218a8452f3d2cc0bbfea427b10e2c7dccc86f2188Evan Cheng 8325ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Chengprivate: 8425ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng /// Is64Bit - True if the processor supports 64-bit instructions and module 8525ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng /// pointer size is 64 bit. 8625ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng bool Is64Bit; 8725ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng 88fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begemanpublic: 89e5600e5509be43097e5f3b7e0f5d33305dc77630Chris Lattner enum { 90600bf16cf7b1667f85c8531432aae0dd23d553abDan Gohman isELF, isCygwin, isDarwin, isWindows, isMingw 91e5600e5509be43097e5f3b7e0f5d33305dc77630Chris Lattner } TargetType; 9212c49af81e370df835ca1b72cdcefcadafcede4bAnton Korobeynikov 939eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen /// This constructor initializes the data members to match that 94fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman /// of the specified module. 95fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman /// 9625ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng X86Subtarget(const Module &M, const std::string &FS, bool is64Bit); 97b151acadc85011961e24d98fa6ce626ea45cd074Chris Lattner 98b151acadc85011961e24d98fa6ce626ea45cd074Chris Lattner /// getStackAlignment - Returns the minimum alignment known to hold of the 99b151acadc85011961e24d98fa6ce626ea45cd074Chris Lattner /// stack frame on entry to the function and which must be maintained by every 100b151acadc85011961e24d98fa6ce626ea45cd074Chris Lattner /// function for this subtarget. 101fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman unsigned getStackAlignment() const { return stackAlignment; } 1029eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen 103fc05f402ea22e8a9ae465d209b65be7e857a89ffRafael Espindola /// getMaxInlineSizeThreshold - Returns the maximum memset / memcpy size 104fc05f402ea22e8a9ae465d209b65be7e857a89ffRafael Espindola /// that still makes it profitable to inline the call. 105fc05f402ea22e8a9ae465d209b65be7e857a89ffRafael Espindola unsigned getMaxInlineSizeThreshold() const { return MaxInlineSizeThreshold; } 10612c49af81e370df835ca1b72cdcefcadafcede4bAnton Korobeynikov 10712c49af81e370df835ca1b72cdcefcadafcede4bAnton Korobeynikov /// ParseSubtargetFeatures - Parses features string setting specified 108a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng /// subtarget options. Definition of function is auto generated by tblgen. 109a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng void ParseSubtargetFeatures(const std::string &FS, const std::string &CPU); 110a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng 111a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng /// AutoDetectSubtargetFeatures - Auto-detect CPU features using CPUID 112a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng /// instruction. 113a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng void AutoDetectSubtargetFeatures(); 11497c7fc351e4dd73041bc7e47c8a144216a50a648Evan Cheng 11597c7fc351e4dd73041bc7e47c8a144216a50a648Evan Cheng bool is64Bit() const { return Is64Bit; } 11697c7fc351e4dd73041bc7e47c8a144216a50a648Evan Cheng 1177f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov PICStyle::Style getPICStyle() const { return PICStyle; } 1187f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov void setPICStyle(PICStyle::Style Style) { PICStyle = Style; } 1197f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov 120559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng bool hasMMX() const { return X86SSELevel >= MMX; } 121259e97cc725011a3c138563d421a4654b082a64cChris Lattner bool hasSSE1() const { return X86SSELevel >= SSE1; } 122559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng bool hasSSE2() const { return X86SSELevel >= SSE2; } 123559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng bool hasSSE3() const { return X86SSELevel >= SSE3; } 124bb1ee05253d965e0944351a21e9970c02b1aebfeBill Wendling bool hasSSSE3() const { return X86SSELevel >= SSSE3; } 12543b7ca15a3f5c80847e078d2201e935ffc3e0e4aEvan Cheng bool hasSSE41() const { return X86SSELevel >= SSE41; } 12643b7ca15a3f5c80847e078d2201e935ffc3e0e4aEvan Cheng bool hasSSE42() const { return X86SSELevel >= SSE42; } 127a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng bool has3DNow() const { return X863DNowLevel >= ThreeDNow; } 128a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng bool has3DNowA() const { return X863DNowLevel >= ThreeDNowA; } 12912c49af81e370df835ca1b72cdcefcadafcede4bAnton Korobeynikov 130cb9009993b20ab41fab56518d666ba69533db4b3Bill Wendling unsigned getAsmFlavor() const { 131cb9009993b20ab41fab56518d666ba69533db4b3Bill Wendling return AsmFlavor != Unset ? unsigned(AsmFlavor) : 0; 132cb9009993b20ab41fab56518d666ba69533db4b3Bill Wendling } 133cb9009993b20ab41fab56518d666ba69533db4b3Bill Wendling 1347f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov bool isFlavorAtt() const { return AsmFlavor == ATT; } 1357f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov bool isFlavorIntel() const { return AsmFlavor == Intel; } 1367ccced634ae0ecdc1c4f599fd3abf188c367e231Evan Cheng 1377ccced634ae0ecdc1c4f599fd3abf188c367e231Evan Cheng bool isTargetDarwin() const { return TargetType == isDarwin; } 138a779a9899a5e23bd5198973f4709d66cb4bc2e64Dan Gohman bool isTargetELF() const { 139600bf16cf7b1667f85c8531432aae0dd23d553abDan Gohman return TargetType == isELF; 140a779a9899a5e23bd5198973f4709d66cb4bc2e64Dan Gohman } 141b74ed07bfd3af42331b1964c24c39912610a08f4Anton Korobeynikov bool isTargetWindows() const { return TargetType == isWindows; } 142317848f4a11f7fe55afdd6d90ded8444069b56fbAnton Korobeynikov bool isTargetMingw() const { return TargetType == isMingw; } 143317848f4a11f7fe55afdd6d90ded8444069b56fbAnton Korobeynikov bool isTargetCygMing() const { return (TargetType == isMingw || 144317848f4a11f7fe55afdd6d90ded8444069b56fbAnton Korobeynikov TargetType == isCygwin); } 14512c49af81e370df835ca1b72cdcefcadafcede4bAnton Korobeynikov bool isTargetCygwin() const { return TargetType == isCygwin; } 1461a979d9eab68b353208cdff87b09ff703d5bf15dAnton Korobeynikov bool isTargetWin64() const { 1471a979d9eab68b353208cdff87b09ff703d5bf15dAnton Korobeynikov return (Is64Bit && (TargetType == isMingw || TargetType == isWindows)); 1481a979d9eab68b353208cdff87b09ff703d5bf15dAnton Korobeynikov } 14912c49af81e370df835ca1b72cdcefcadafcede4bAnton Korobeynikov 1509989a65693c357809e8e131b0a4ff1285b5e968aDale Johannesen std::string getDataLayout() const { 1519989a65693c357809e8e131b0a4ff1285b5e968aDale Johannesen const char *p; 15229d62bebd91fbd8a79996c3983dcd567c30c112cEvan Cheng if (is64Bit()) 153588af2fb99bf255c350fcfc582e475cf4840c606Rafael Espindola p = "e-p:64:64-s:64-f64:64:64-i64:64:64-f80:128:128"; 1547240ae3cac925ea3cface5982d75aa19c1d7c4b7Rafael Espindola else { 1557240ae3cac925ea3cface5982d75aa19c1d7c4b7Rafael Espindola if (isTargetDarwin()) 1567240ae3cac925ea3cface5982d75aa19c1d7c4b7Rafael Espindola p = "e-p:32:32-f64:32:64-i64:32:64-f80:128:128"; 1577240ae3cac925ea3cface5982d75aa19c1d7c4b7Rafael Espindola else 1587240ae3cac925ea3cface5982d75aa19c1d7c4b7Rafael Espindola p = "e-p:32:32-f64:32:64-i64:32:64-f80:32:32"; 1597240ae3cac925ea3cface5982d75aa19c1d7c4b7Rafael Espindola } 1609989a65693c357809e8e131b0a4ff1285b5e968aDale Johannesen return std::string(p); 1619989a65693c357809e8e131b0a4ff1285b5e968aDale Johannesen } 16227f92be8b7e83d3fe612ecf28393a9ce8334898aDale Johannesen 1637f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov bool isPICStyleSet() const { return PICStyle != PICStyle::None; } 1647f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov bool isPICStyleGOT() const { return PICStyle == PICStyle::GOT; } 1657f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov bool isPICStyleStub() const { return PICStyle == PICStyle::Stub; } 1667f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov bool isPICStyleRIPRel() const { return PICStyle == PICStyle::RIPRel; } 1677f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov bool isPICStyleWinPIC() const { return PICStyle == PICStyle:: WinPIC; } 1687ad92d81e2c2d1fe8ae89e5638fc57925d747429Chris Lattner 1697ad92d81e2c2d1fe8ae89e5638fc57925d747429Chris Lattner /// getDarwinVers - Return the darwin version number, 8 = tiger, 9 = leopard. 1707ad92d81e2c2d1fe8ae89e5638fc57925d747429Chris Lattner unsigned getDarwinVers() const { return DarwinVers; } 1717ad92d81e2c2d1fe8ae89e5638fc57925d747429Chris Lattner 172600bf16cf7b1667f85c8531432aae0dd23d553abDan Gohman /// isLinux - Return true if the target is "Linux". 173600bf16cf7b1667f85c8531432aae0dd23d553abDan Gohman bool isLinux() const { return IsLinux; } 174600bf16cf7b1667f85c8531432aae0dd23d553abDan Gohman 17512c49af81e370df835ca1b72cdcefcadafcede4bAnton Korobeynikov /// True if accessing the GV requires an extra load. For Windows, dllimported 17612c49af81e370df835ca1b72cdcefcadafcede4bAnton Korobeynikov /// symbols are indirect, loading the value at address GV rather then the 17712c49af81e370df835ca1b72cdcefcadafcede4bAnton Korobeynikov /// value of GV itself. This means that the GlobalAddress must be in the base 17812c49af81e370df835ca1b72cdcefcadafcede4bAnton Korobeynikov /// or index register of the address, not the GV offset field. 1792b2bc688849234b9ee5e0c8704a2984f0e9cbba3Anton Korobeynikov bool GVRequiresExtraLoad(const GlobalValue* GV, const TargetMachine& TM, 1802b2bc688849234b9ee5e0c8704a2984f0e9cbba3Anton Korobeynikov bool isDirectCall) const; 18115fccf1d9395ccf3f60404e71dc9db029d04f910Anton Korobeynikov 18268d599df37218452acd5a680d5360d3caaa1623cDan Gohman /// This function returns the name of a function which has an interface 18368d599df37218452acd5a680d5360d3caaa1623cDan Gohman /// like the non-standard bzero function, if such a function exists on 18468d599df37218452acd5a680d5360d3caaa1623cDan Gohman /// the current subtarget and it is considered prefereable over 18568d599df37218452acd5a680d5360d3caaa1623cDan Gohman /// memset with zero passed as the second argument. Otherwise it 18668d599df37218452acd5a680d5360d3caaa1623cDan Gohman /// returns null. 1876e08738d4b1bb6c087d81bca656c24cdc1d504f8Bill Wendling const char *getBZeroEntry() const; 188fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman}; 189751c0e12dbabe90c98f1f050baea714e79c837d6Evan Cheng 190751c0e12dbabe90c98f1f050baea714e79c837d6Evan Chengnamespace X86 { 191751c0e12dbabe90c98f1f050baea714e79c837d6Evan Cheng /// GetCpuIDAndInfo - Execute the specified cpuid and return the 4 values in 192751c0e12dbabe90c98f1f050baea714e79c837d6Evan Cheng /// the specified arguments. If we can't run cpuid on the host, return true. 193751c0e12dbabe90c98f1f050baea714e79c837d6Evan Cheng bool GetCpuIDAndInfo(unsigned value, unsigned *rEAX, unsigned *rEBX, 194751c0e12dbabe90c98f1f050baea714e79c837d6Evan Cheng unsigned *rECX, unsigned *rEDX); 195751c0e12dbabe90c98f1f050baea714e79c837d6Evan Cheng} 196751c0e12dbabe90c98f1f050baea714e79c837d6Evan Cheng 197fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman} // End llvm namespace 198fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman 199fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman#endif 200