X86Subtarget.h revision 7784ebc239202bba4859855c3f438319144535f0
18c00f8cdc7ae0cdd18d91b3a31a70da0f78aa04fNate Begeman//=====---- X86Subtarget.h - Define Subtarget for the X86 -----*- C++ -*--====// 2fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman// 3fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman// The LLVM Compiler Infrastructure 4fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman// 5fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman// This file was developed by Nate Begeman and is distributed under the 6fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman// University of Illinois Open Source 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; 24fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman 25fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begemanclass X86Subtarget : public TargetSubtarget { 2605a059d5d8d039dbbec3607b313c38fba14f972eJim Laskeypublic: 2705a059d5d8d039dbbec3607b313c38fba14f972eJim Laskey enum AsmWriterFlavorTy { 282dd538c2d27ac6ff4dbbe221a6199a1f8e12c8bcChris Lattner att, intel, unset 2905a059d5d8d039dbbec3607b313c38fba14f972eJim Laskey }; 3005a059d5d8d039dbbec3607b313c38fba14f972eJim Laskey 31fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begemanprotected: 32559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng enum X86SSEEnum { 33259e97cc725011a3c138563d421a4654b082a64cChris Lattner NoMMXSSE, MMX, SSE1, SSE2, SSE3 34559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng }; 35559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng 36a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng enum X863DNowEnum { 37a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng NoThreeDNow, ThreeDNow, ThreeDNowA 38a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng }; 39a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng 4005a059d5d8d039dbbec3607b313c38fba14f972eJim Laskey /// AsmFlavor - Which x86 asm dialect to use. 4105a059d5d8d039dbbec3607b313c38fba14f972eJim Laskey AsmWriterFlavorTy AsmFlavor; 4205a059d5d8d039dbbec3607b313c38fba14f972eJim Laskey 43259e97cc725011a3c138563d421a4654b082a64cChris Lattner /// X86SSELevel - MMX, SSE1, SSE2, SSE3, or none supported. 44559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng X86SSEEnum X86SSELevel; 45559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng 46a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng /// X863DNowLevel - 3DNow or 3DNow Athlon, or none supported. 47a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng X863DNowEnum X863DNowLevel; 48a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng 4925ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng /// HasX86_64 - True if the processor supports X86-64 instructions. 5025ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng bool HasX86_64; 51559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng 52b151acadc85011961e24d98fa6ce626ea45cd074Chris Lattner /// stackAlignment - The minimum alignment known to hold of the stack frame on 53b151acadc85011961e24d98fa6ce626ea45cd074Chris Lattner /// entry to the function and which must be maintained by every function. 54fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman unsigned stackAlignment; 559eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen 5618a8452f3d2cc0bbfea427b10e2c7dccc86f2188Evan Cheng /// Min. memset / memcpy size that is turned into rep/movs, rep/stos ops. 5718a8452f3d2cc0bbfea427b10e2c7dccc86f2188Evan Cheng unsigned MinRepStrSizeThreshold; 5818a8452f3d2cc0bbfea427b10e2c7dccc86f2188Evan Cheng 5925ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Chengprivate: 6025ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng /// Is64Bit - True if the processor supports 64-bit instructions and module 6125ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng /// pointer size is 64 bit. 6225ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng bool Is64Bit; 6325ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng 64fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begemanpublic: 65e5600e5509be43097e5f3b7e0f5d33305dc77630Chris Lattner enum { 66e5600e5509be43097e5f3b7e0f5d33305dc77630Chris Lattner isELF, isCygwin, isDarwin, isWindows 67e5600e5509be43097e5f3b7e0f5d33305dc77630Chris Lattner } TargetType; 6812c49af81e370df835ca1b72cdcefcadafcede4bAnton Korobeynikov 699eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen /// This constructor initializes the data members to match that 70fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman /// of the specified module. 71fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman /// 7225ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng X86Subtarget(const Module &M, const std::string &FS, bool is64Bit); 73b151acadc85011961e24d98fa6ce626ea45cd074Chris Lattner 74b151acadc85011961e24d98fa6ce626ea45cd074Chris Lattner /// getStackAlignment - Returns the minimum alignment known to hold of the 75b151acadc85011961e24d98fa6ce626ea45cd074Chris Lattner /// stack frame on entry to the function and which must be maintained by every 76b151acadc85011961e24d98fa6ce626ea45cd074Chris Lattner /// function for this subtarget. 77fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman unsigned getStackAlignment() const { return stackAlignment; } 789eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen 7918a8452f3d2cc0bbfea427b10e2c7dccc86f2188Evan Cheng /// getMinRepStrSizeThreshold - Returns the minimum memset / memcpy size 8018a8452f3d2cc0bbfea427b10e2c7dccc86f2188Evan Cheng /// required to turn the operation into a X86 rep/movs or rep/stos 8118a8452f3d2cc0bbfea427b10e2c7dccc86f2188Evan Cheng /// instruction. This is only used if the src / dst alignment is not DWORD 8218a8452f3d2cc0bbfea427b10e2c7dccc86f2188Evan Cheng /// aligned. 8318a8452f3d2cc0bbfea427b10e2c7dccc86f2188Evan Cheng unsigned getMinRepStrSizeThreshold() const { return MinRepStrSizeThreshold; } 8412c49af81e370df835ca1b72cdcefcadafcede4bAnton Korobeynikov 8512c49af81e370df835ca1b72cdcefcadafcede4bAnton Korobeynikov /// ParseSubtargetFeatures - Parses features string setting specified 86a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng /// subtarget options. Definition of function is auto generated by tblgen. 87a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng void ParseSubtargetFeatures(const std::string &FS, const std::string &CPU); 88a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng 89a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng /// AutoDetectSubtargetFeatures - Auto-detect CPU features using CPUID 90a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng /// instruction. 91a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng void AutoDetectSubtargetFeatures(); 9297c7fc351e4dd73041bc7e47c8a144216a50a648Evan Cheng 9397c7fc351e4dd73041bc7e47c8a144216a50a648Evan Cheng bool is64Bit() const { return Is64Bit; } 9497c7fc351e4dd73041bc7e47c8a144216a50a648Evan Cheng 95559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng bool hasMMX() const { return X86SSELevel >= MMX; } 96259e97cc725011a3c138563d421a4654b082a64cChris Lattner bool hasSSE1() const { return X86SSELevel >= SSE1; } 97559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng bool hasSSE2() const { return X86SSELevel >= SSE2; } 98559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng bool hasSSE3() const { return X86SSELevel >= SSE3; } 99a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng bool has3DNow() const { return X863DNowLevel >= ThreeDNow; } 100a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng bool has3DNowA() const { return X863DNowLevel >= ThreeDNowA; } 10112c49af81e370df835ca1b72cdcefcadafcede4bAnton Korobeynikov 10205a059d5d8d039dbbec3607b313c38fba14f972eJim Laskey bool isFlavorAtt() const { return AsmFlavor == att; } 10305a059d5d8d039dbbec3607b313c38fba14f972eJim Laskey bool isFlavorIntel() const { return AsmFlavor == intel; } 1047ccced634ae0ecdc1c4f599fd3abf188c367e231Evan Cheng 1057ccced634ae0ecdc1c4f599fd3abf188c367e231Evan Cheng bool isTargetDarwin() const { return TargetType == isDarwin; } 106dd842e12e1a054256314d36f3cab3d59da39fc68Chris Lattner bool isTargetELF() const { return TargetType == isELF; } 107b74ed07bfd3af42331b1964c24c39912610a08f4Anton Korobeynikov bool isTargetWindows() const { return TargetType == isWindows; } 10812c49af81e370df835ca1b72cdcefcadafcede4bAnton Korobeynikov bool isTargetCygwin() const { return TargetType == isCygwin; } 10912c49af81e370df835ca1b72cdcefcadafcede4bAnton Korobeynikov 11012c49af81e370df835ca1b72cdcefcadafcede4bAnton Korobeynikov /// True if accessing the GV requires an extra load. For Windows, dllimported 11112c49af81e370df835ca1b72cdcefcadafcede4bAnton Korobeynikov /// symbols are indirect, loading the value at address GV rather then the 11212c49af81e370df835ca1b72cdcefcadafcede4bAnton Korobeynikov /// value of GV itself. This means that the GlobalAddress must be in the base 11312c49af81e370df835ca1b72cdcefcadafcede4bAnton Korobeynikov /// or index register of the address, not the GV offset field. 1147784ebc239202bba4859855c3f438319144535f0Anton Korobeynikov bool GVRequiresExtraLoad(const GlobalValue* GV, bool isDirectCall) const; 115fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman}; 116751c0e12dbabe90c98f1f050baea714e79c837d6Evan Cheng 117751c0e12dbabe90c98f1f050baea714e79c837d6Evan Chengnamespace X86 { 118751c0e12dbabe90c98f1f050baea714e79c837d6Evan Cheng /// GetCpuIDAndInfo - Execute the specified cpuid and return the 4 values in 119751c0e12dbabe90c98f1f050baea714e79c837d6Evan Cheng /// the specified arguments. If we can't run cpuid on the host, return true. 120751c0e12dbabe90c98f1f050baea714e79c837d6Evan Cheng bool GetCpuIDAndInfo(unsigned value, unsigned *rEAX, unsigned *rEBX, 121751c0e12dbabe90c98f1f050baea714e79c837d6Evan Cheng unsigned *rECX, unsigned *rEDX); 122751c0e12dbabe90c98f1f050baea714e79c837d6Evan Cheng} 123751c0e12dbabe90c98f1f050baea714e79c837d6Evan Cheng 124fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman} // End llvm namespace 125fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman 126fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman#endif 127