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