144de83a7f6c814cf534b2bb58042035a778da5a8Jia Liu//===-- 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//
105b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng// This file declares the X86 specific subclass of TargetSubtargetInfo.
11fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman//
12fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman//===----------------------------------------------------------------------===//
13fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman
14fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman#ifndef X86SUBTARGET_H
15fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman#define X86SUBTARGET_H
16fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman
1762f35a2c133cd7de818dfc366a393282f01b111cEric Christopher#include "llvm/ADT/Triple.h"
180b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/CallingConv.h"
195b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng#include "llvm/Target/TargetSubtargetInfo.h"
20b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey#include <string>
21b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey
2294214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng#define GET_SUBTARGETINFO_HEADER
23385e930d55f3ecd3c9538823dfa5896a12461845Evan Cheng#include "X86GenSubtargetInfo.inc"
2494214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng
25fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begemannamespace llvm {
267784ebc239202bba4859855c3f438319144535f0Anton Korobeynikovclass GlobalValue;
270ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Chengclass StringRef;
282b2bc688849234b9ee5e0c8704a2984f0e9cbba3Anton Korobeynikovclass TargetMachine;
295d96eb867196d8e0b70266fb5eebd9b754c90d9bMikhail Glushenkov
30e4df756289b6d80dcfd67b9f97fd464f62fd4902Chris Lattner/// PICStyles - The X86 backend supports a number of different styles of PIC.
315d96eb867196d8e0b70266fb5eebd9b754c90d9bMikhail Glushenkov///
32f9a67a894366482cb2aa70a0e4dfeb5d76f91988Duncan Sandsnamespace PICStyles {
337f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikovenum Style {
348097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner  StubPIC,          // Used on i386-darwin in -fPIC mode.
358097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner  StubDynamicNoPIC, // Used on i386-darwin in -mdynamic-no-pic mode.
368097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner  GOT,              // Used on many 32-bit unices in -fPIC mode.
378097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner  RIPRel,           // Used on X86-64 when not in -static mode.
388097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner  None              // Set when in -static mode (not PIC or DynamicNoPIC mode).
397f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov};
407f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov}
41fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman
4294214703d97d8d9dfca88174ffc7e94820a85e62Evan Chengclass X86Subtarget : public X86GenSubtargetInfo {
43fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begemanprotected:
44559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng  enum X86SSEEnum {
4516de4632bb263d7e0def43ebc13af5077726f067Craig Topper    NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2
46559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng  };
47559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng
48a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng  enum X863DNowEnum {
49a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng    NoThreeDNow, ThreeDNow, ThreeDNowA
50a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng  };
51a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng
52922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick  enum X86ProcFamilyEnum {
53922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick    Others, IntelAtom
54922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick  };
55922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick
56922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick  /// X86ProcFamily - X86 processor family: Intel Atom, and others
57922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick  X86ProcFamilyEnum X86ProcFamily;
58a20e1e7ef596842127794372244fd5c646f71296Chad Rosier
597f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov  /// PICStyle - Which PIC style to use
60f6844ca0e4a02fae3b100db7b0c62170d05e5b53Evan Cheng  ///
61f9a67a894366482cb2aa70a0e4dfeb5d76f91988Duncan Sands  PICStyles::Style PICStyle;
625d96eb867196d8e0b70266fb5eebd9b754c90d9bMikhail Glushenkov
63add251754cd18f4ef9f4eb1ead16a0c98887066eEvan Cheng  /// X86SSELevel - MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, or
64add251754cd18f4ef9f4eb1ead16a0c98887066eEvan Cheng  /// none supported.
65559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng  X86SSEEnum X86SSELevel;
66559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng
67a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng  /// X863DNowLevel - 3DNow or 3DNow Athlon, or none supported.
68f6844ca0e4a02fae3b100db7b0c62170d05e5b53Evan Cheng  ///
69a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng  X863DNowEnum X863DNowLevel;
70a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng
71700841617a9cfdc08323449ab14f42513c106430Chris Lattner  /// HasCMov - True if this processor has conditional move instructions
72700841617a9cfdc08323449ab14f42513c106430Chris Lattner  /// (generally pentium pro+).
73700841617a9cfdc08323449ab14f42513c106430Chris Lattner  bool HasCMov;
745d96eb867196d8e0b70266fb5eebd9b754c90d9bMikhail Glushenkov
7525ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng  /// HasX86_64 - True if the processor supports X86-64 instructions.
76f6844ca0e4a02fae3b100db7b0c62170d05e5b53Evan Cheng  ///
7725ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng  bool HasX86_64;
78ccb6976a69a6e146db049fff8e6338e31c91b6f8Evan Cheng
791292c226458b68a119d3a387a0527f453b2065c2Benjamin Kramer  /// HasPOPCNT - True if the processor supports POPCNT.
801292c226458b68a119d3a387a0527f453b2065c2Benjamin Kramer  bool HasPOPCNT;
811292c226458b68a119d3a387a0527f453b2065c2Benjamin Kramer
828cf5ab153d3873d8565d5433527bd0219f7b8043Stefanus Du Toit  /// HasSSE4A - True if the processor supports SSE4A instructions.
838cf5ab153d3873d8565d5433527bd0219f7b8043Stefanus Du Toit  bool HasSSE4A;
848cf5ab153d3873d8565d5433527bd0219f7b8043Stefanus Du Toit
856d1cd1cd04abb1828a14980e15252985c8c728b2Eric Christopher  /// HasAES - Target has AES instructions
866d1cd1cd04abb1828a14980e15252985c8c728b2Eric Christopher  bool HasAES;
876d1cd1cd04abb1828a14980e15252985c8c728b2Eric Christopher
88c8e340da823e8ff10b947429ef99e34ffc3067d8Benjamin Kramer  /// HasPCLMUL - Target has carry-less multiplication
89c8e340da823e8ff10b947429ef99e34ffc3067d8Benjamin Kramer  bool HasPCLMUL;
90cdae7e8244e37f539a5f1c9b780de7817b40de52Bruno Cardoso Lopes
91a15f9d53114a86005b260cbc451b0c63aa92bc1dCraig Topper  /// HasFMA - Target has 3-operand fused multiply-add
92a15f9d53114a86005b260cbc451b0c63aa92bc1dCraig Topper  bool HasFMA;
93343dadbb368ec4de546c2cc3ffb1dac4cdbe14b9David Greene
94343dadbb368ec4de546c2cc3ffb1dac4cdbe14b9David Greene  /// HasFMA4 - Target has 4-operand fused multiply-add
95343dadbb368ec4de546c2cc3ffb1dac4cdbe14b9David Greene  bool HasFMA4;
96343dadbb368ec4de546c2cc3ffb1dac4cdbe14b9David Greene
97ce25d26b400d25c9e20ac9fe2d5b0cafb9d7fa15Jan Sjödin  /// HasXOP - Target has XOP instructions
98ce25d26b400d25c9e20ac9fe2d5b0cafb9d7fa15Jan Sjödin  bool HasXOP;
99ce25d26b400d25c9e20ac9fe2d5b0cafb9d7fa15Jan Sjödin
100da394041c409cb06008e60b9f9f845e845215b03Craig Topper  /// HasMOVBE - True if the processor has the MOVBE instruction.
101581fe82c84839f769a7275cf4cde7ea209f5ed04Craig Topper  bool HasMOVBE;
102581fe82c84839f769a7275cf4cde7ea209f5ed04Craig Topper
103da394041c409cb06008e60b9f9f845e845215b03Craig Topper  /// HasRDRAND - True if the processor has the RDRAND instruction.
104581fe82c84839f769a7275cf4cde7ea209f5ed04Craig Topper  bool HasRDRAND;
105581fe82c84839f769a7275cf4cde7ea209f5ed04Craig Topper
106da394041c409cb06008e60b9f9f845e845215b03Craig Topper  /// HasF16C - Processor has 16-bit floating point conversion instructions.
107da394041c409cb06008e60b9f9f845e845215b03Craig Topper  bool HasF16C;
108da394041c409cb06008e60b9f9f845e845215b03Craig Topper
109e7b05504faa86a5c0b80a62ddb60cbb0cf163d5dCraig Topper  /// HasFSGSBase - Processor has FS/GS base insturctions.
110e7b05504faa86a5c0b80a62ddb60cbb0cf163d5dCraig Topper  bool HasFSGSBase;
111e7b05504faa86a5c0b80a62ddb60cbb0cf163d5dCraig Topper
11237f2167f15608ff56d202ff21954a456aab6e534Craig Topper  /// HasLZCNT - Processor has LZCNT instruction.
11337f2167f15608ff56d202ff21954a456aab6e534Craig Topper  bool HasLZCNT;
11437f2167f15608ff56d202ff21954a456aab6e534Craig Topper
115909652f6876a97d63db20606cd1b37e95d016cafCraig Topper  /// HasBMI - Processor has BMI1 instructions.
116909652f6876a97d63db20606cd1b37e95d016cafCraig Topper  bool HasBMI;
117909652f6876a97d63db20606cd1b37e95d016cafCraig Topper
118b53fa8bf19a51f0c49a9f8b6ede3e2ff3bdfb961Craig Topper  /// HasBMI2 - Processor has BMI2 instructions.
119b53fa8bf19a51f0c49a9f8b6ede3e2ff3bdfb961Craig Topper  bool HasBMI2;
120b53fa8bf19a51f0c49a9f8b6ede3e2ff3bdfb961Craig Topper
121be02a90de17f857ba65bbd8a11653ca1bad30adcMichael Liao  /// HasRTM - Processor has RTM instructions.
122be02a90de17f857ba65bbd8a11653ca1bad30adcMichael Liao  bool HasRTM;
123be02a90de17f857ba65bbd8a11653ca1bad30adcMichael Liao
1247b672ed380cf44894f8b96c52558dcfc136af383Kay Tiong Khoo  /// HasADX - Processor has ADX instructions.
1257b672ed380cf44894f8b96c52558dcfc136af383Kay Tiong Khoo  bool HasADX;
1267b672ed380cf44894f8b96c52558dcfc136af383Kay Tiong Khoo
127343dadbb368ec4de546c2cc3ffb1dac4cdbe14b9David Greene  /// IsBTMemSlow - True if BT (bit test) of memory instructions are slow.
128343dadbb368ec4de546c2cc3ffb1dac4cdbe14b9David Greene  bool IsBTMemSlow;
129400073d5467b79534d8c63b0d996a55e4252ff4bEvan Cheng
13048c58bb8610cd475d1acb073694e0d2b4dd7cc8cEvan Cheng  /// IsUAMemFast - True if unaligned memory access is fast.
13148c58bb8610cd475d1acb073694e0d2b4dd7cc8cEvan Cheng  bool IsUAMemFast;
13248c58bb8610cd475d1acb073694e0d2b4dd7cc8cEvan Cheng
1335d96eb867196d8e0b70266fb5eebd9b754c90d9bMikhail Glushenkov  /// HasVectorUAMem - True if SIMD operations can have unaligned memory
1345528e7bcb1209094a68bbf6d1efeefc3ca34774fEvan Cheng  /// operands. This may require setting a feature bit in the processor.
13595eb2eeea65fbae223ffd517f3984f14b034fcb8David Greene  bool HasVectorUAMem;
13695eb2eeea65fbae223ffd517f3984f14b034fcb8David Greene
13743f51aeca8367ea35adad963c00bd2bc5b8d1391Eli Friedman  /// HasCmpxchg16b - True if this processor has the CMPXCHG16B instruction;
13843f51aeca8367ea35adad963c00bd2bc5b8d1391Eli Friedman  /// this is true for most x86-64 chips, but not the first AMD chips.
13943f51aeca8367ea35adad963c00bd2bc5b8d1391Eli Friedman  bool HasCmpxchg16b;
14043f51aeca8367ea35adad963c00bd2bc5b8d1391Eli Friedman
141de1df103b9c578d0a1609054a5944342c5d0ba23Evan Cheng  /// UseLeaForSP - True if the LEA instruction should be used for adjusting
142de1df103b9c578d0a1609054a5944342c5d0ba23Evan Cheng  /// the stack pointer. This is an optimization for Intel Atom processors.
143de1df103b9c578d0a1609054a5944342c5d0ba23Evan Cheng  bool UseLeaForSP;
144de1df103b9c578d0a1609054a5944342c5d0ba23Evan Cheng
1452e2efd960056bbb7e4bbd843c8de55116d52aa7dPreston Gurd  /// HasSlowDivide - True if smaller divides are significantly faster than
1462e2efd960056bbb7e4bbd843c8de55116d52aa7dPreston Gurd  /// full divides and should be used when possible.
1472e2efd960056bbb7e4bbd843c8de55116d52aa7dPreston Gurd  bool HasSlowDivide;
1482e2efd960056bbb7e4bbd843c8de55116d52aa7dPreston Gurd
149922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick  /// PostRAScheduler - True if using post-register-allocation scheduler.
150922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick  bool PostRAScheduler;
151922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick
152c7b902e7fe3498503efbfd98cabb1b1c67cadda6Preston Gurd  /// PadShortFunctions - True if the short functions should be padded to prevent
153c7b902e7fe3498503efbfd98cabb1b1c67cadda6Preston Gurd  /// a stall when returning too early.
154c7b902e7fe3498503efbfd98cabb1b1c67cadda6Preston Gurd  bool PadShortFunctions;
155c7b902e7fe3498503efbfd98cabb1b1c67cadda6Preston Gurd
156b151acadc85011961e24d98fa6ce626ea45cd074Chris Lattner  /// stackAlignment - The minimum alignment known to hold of the stack frame on
157b151acadc85011961e24d98fa6ce626ea45cd074Chris Lattner  /// entry to the function and which must be maintained by every function.
158fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman  unsigned stackAlignment;
1599eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen
160fc05f402ea22e8a9ae465d209b65be7e857a89ffRafael Espindola  /// Max. memset / memcpy size that is turned into rep/movs, rep/stos ops.
161f6844ca0e4a02fae3b100db7b0c62170d05e5b53Evan Cheng  ///
162fc05f402ea22e8a9ae465d209b65be7e857a89ffRafael Espindola  unsigned MaxInlineSizeThreshold;
163e310b3a2a32d356f3f890fb138b1694b53d15f4eNAKAMURA Takumi
16462f35a2c133cd7de818dfc366a393282f01b111cEric Christopher  /// TargetTriple - What processor and OS we're targeting.
16562f35a2c133cd7de818dfc366a393282f01b111cEric Christopher  Triple TargetTriple;
166a20e1e7ef596842127794372244fd5c646f71296Chad Rosier
167922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick  /// Instruction itineraries for scheduling
168922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick  InstrItineraryData InstrItins;
16918a8452f3d2cc0bbfea427b10e2c7dccc86f2188Evan Cheng
17025ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Chengprivate:
171789cb5df9ca61f8a3794a4fbde7cc020fd00a02aBill Wendling  /// StackAlignOverride - Override the stack alignment.
172789cb5df9ca61f8a3794a4fbde7cc020fd00a02aBill Wendling  unsigned StackAlignOverride;
173789cb5df9ca61f8a3794a4fbde7cc020fd00a02aBill Wendling
17418fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng  /// In64BitMode - True if compiling for 64-bit, false for 32-bit.
17518fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng  bool In64BitMode;
17625ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng
177fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begemanpublic:
1789eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen  /// This constructor initializes the data members to match that
1793be03406c9c3b2075d5ae416499af2f15f703d6fDaniel Dunbar  /// of the specified triple.
180fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman  ///
181276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng  X86Subtarget(const std::string &TT, const std::string &CPU,
18218fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng               const std::string &FS,
1834d1a8dde2d9eea508f66d51428b4f155fa6a6756Evan Cheng               unsigned StackAlignOverride, bool is64Bit);
184b151acadc85011961e24d98fa6ce626ea45cd074Chris Lattner
185b151acadc85011961e24d98fa6ce626ea45cd074Chris Lattner  /// getStackAlignment - Returns the minimum alignment known to hold of the
186b151acadc85011961e24d98fa6ce626ea45cd074Chris Lattner  /// stack frame on entry to the function and which must be maintained by every
187b151acadc85011961e24d98fa6ce626ea45cd074Chris Lattner  /// function for this subtarget.
188fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman  unsigned getStackAlignment() const { return stackAlignment; }
1899eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen
190fc05f402ea22e8a9ae465d209b65be7e857a89ffRafael Espindola  /// getMaxInlineSizeThreshold - Returns the maximum memset / memcpy size
191fc05f402ea22e8a9ae465d209b65be7e857a89ffRafael Espindola  /// that still makes it profitable to inline the call.
192fc05f402ea22e8a9ae465d209b65be7e857a89ffRafael Espindola  unsigned getMaxInlineSizeThreshold() const { return MaxInlineSizeThreshold; }
19312c49af81e370df835ca1b72cdcefcadafcede4bAnton Korobeynikov
19412c49af81e370df835ca1b72cdcefcadafcede4bAnton Korobeynikov  /// ParseSubtargetFeatures - Parses features string setting specified
195a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng  /// subtarget options.  Definition of function is auto generated by tblgen.
1960ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng  void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
197a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng
198a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng  /// AutoDetectSubtargetFeatures - Auto-detect CPU features using CPUID
199a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng  /// instruction.
200a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng  void AutoDetectSubtargetFeatures();
20197c7fc351e4dd73041bc7e47c8a144216a50a648Evan Cheng
202789cb5df9ca61f8a3794a4fbde7cc020fd00a02aBill Wendling  /// \brief Reset the features for the X86 target.
203789cb5df9ca61f8a3794a4fbde7cc020fd00a02aBill Wendling  virtual void resetSubtargetFeatures(const MachineFunction *MF);
204901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendlingprivate:
205901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling  void initializeEnvironment();
206789cb5df9ca61f8a3794a4fbde7cc020fd00a02aBill Wendling  void resetSubtargetFeatures(StringRef CPU, StringRef FS);
207901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendlingpublic:
208a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky  /// Is this x86_64? (disregarding specific ABI / programming model)
209a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky  bool is64Bit() const {
210a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky    return In64BitMode;
211a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky  }
212a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky
213a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky  /// Is this x86_64 with the ILP32 programming model (x32 ABI)?
214a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky  bool isTarget64BitILP32() const {
215a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky    return In64BitMode && (TargetTriple.getEnvironment() == Triple::GNUX32);
216a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky  }
217a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky
218a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky  /// Is this x86_64 with the LP64 programming model (standard AMD64, no x32)?
219a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky  bool isTarget64BitLP64() const {
220a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky    return In64BitMode && (TargetTriple.getEnvironment() != Triple::GNUX32);
221a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky  }
22297c7fc351e4dd73041bc7e47c8a144216a50a648Evan Cheng
223f9a67a894366482cb2aa70a0e4dfeb5d76f91988Duncan Sands  PICStyles::Style getPICStyle() const { return PICStyle; }
224f9a67a894366482cb2aa70a0e4dfeb5d76f91988Duncan Sands  void setPICStyle(PICStyles::Style Style)  { PICStyle = Style; }
2257f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov
226314a11318404569efaee74b7208d4b8ab1f64510Chris Lattner  bool hasCMov() const { return HasCMov; }
227559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng  bool hasMMX() const { return X86SSELevel >= MMX; }
228c6d59954d8b4bc63aa8e6333d902a3fffc774189Craig Topper  bool hasSSE1() const { return X86SSELevel >= SSE1; }
229c6d59954d8b4bc63aa8e6333d902a3fffc774189Craig Topper  bool hasSSE2() const { return X86SSELevel >= SSE2; }
230c6d59954d8b4bc63aa8e6333d902a3fffc774189Craig Topper  bool hasSSE3() const { return X86SSELevel >= SSE3; }
231c6d59954d8b4bc63aa8e6333d902a3fffc774189Craig Topper  bool hasSSSE3() const { return X86SSELevel >= SSSE3; }
232c6d59954d8b4bc63aa8e6333d902a3fffc774189Craig Topper  bool hasSSE41() const { return X86SSELevel >= SSE41; }
233c6d59954d8b4bc63aa8e6333d902a3fffc774189Craig Topper  bool hasSSE42() const { return X86SSELevel >= SSE42; }
2341accb7ed98d823c291a4d5df172d0538451aba9eCraig Topper  bool hasAVX() const { return X86SSELevel >= AVX; }
2351accb7ed98d823c291a4d5df172d0538451aba9eCraig Topper  bool hasAVX2() const { return X86SSELevel >= AVX2; }
2368564dc67b5840da1633e29bade33185f4a36bb2dElena Demikhovsky  bool hasFp256() const { return hasAVX(); }
2378564dc67b5840da1633e29bade33185f4a36bb2dElena Demikhovsky  bool hasInt256() const { return hasAVX2(); }
2388cf5ab153d3873d8565d5433527bd0219f7b8043Stefanus Du Toit  bool hasSSE4A() const { return HasSSE4A; }
239a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng  bool has3DNow() const { return X863DNowLevel >= ThreeDNow; }
240a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng  bool has3DNowA() const { return X863DNowLevel >= ThreeDNowA; }
2411292c226458b68a119d3a387a0527f453b2065c2Benjamin Kramer  bool hasPOPCNT() const { return HasPOPCNT; }
2426d1cd1cd04abb1828a14980e15252985c8c728b2Eric Christopher  bool hasAES() const { return HasAES; }
243c8e340da823e8ff10b947429ef99e34ffc3067d8Benjamin Kramer  bool hasPCLMUL() const { return HasPCLMUL; }
244a15f9d53114a86005b260cbc451b0c63aa92bc1dCraig Topper  bool hasFMA() const { return HasFMA; }
2450e292376d09223d791ed2ccc8935e98cbd36f1f8Craig Topper  // FIXME: Favor FMA when both are enabled. Is this the right thing to do?
2469b54141cae0d3f429c414f28cd8c3dc1e819eb92Craig Topper  bool hasFMA4() const { return HasFMA4 && !HasFMA; }
247ce25d26b400d25c9e20ac9fe2d5b0cafb9d7fa15Jan Sjödin  bool hasXOP() const { return HasXOP; }
248581fe82c84839f769a7275cf4cde7ea209f5ed04Craig Topper  bool hasMOVBE() const { return HasMOVBE; }
249581fe82c84839f769a7275cf4cde7ea209f5ed04Craig Topper  bool hasRDRAND() const { return HasRDRAND; }
250da394041c409cb06008e60b9f9f845e845215b03Craig Topper  bool hasF16C() const { return HasF16C; }
251e7b05504faa86a5c0b80a62ddb60cbb0cf163d5dCraig Topper  bool hasFSGSBase() const { return HasFSGSBase; }
25237f2167f15608ff56d202ff21954a456aab6e534Craig Topper  bool hasLZCNT() const { return HasLZCNT; }
253909652f6876a97d63db20606cd1b37e95d016cafCraig Topper  bool hasBMI() const { return HasBMI; }
254b53fa8bf19a51f0c49a9f8b6ede3e2ff3bdfb961Craig Topper  bool hasBMI2() const { return HasBMI2; }
255be02a90de17f857ba65bbd8a11653ca1bad30adcMichael Liao  bool hasRTM() const { return HasRTM; }
2567b672ed380cf44894f8b96c52558dcfc136af383Kay Tiong Khoo  bool hasADX() const { return HasADX; }
257ccb6976a69a6e146db049fff8e6338e31c91b6f8Evan Cheng  bool isBTMemSlow() const { return IsBTMemSlow; }
25848c58bb8610cd475d1acb073694e0d2b4dd7cc8cEvan Cheng  bool isUnalignedMemAccessFast() const { return IsUAMemFast; }
25995eb2eeea65fbae223ffd517f3984f14b034fcb8David Greene  bool hasVectorUAMem() const { return HasVectorUAMem; }
26043f51aeca8367ea35adad963c00bd2bc5b8d1391Eli Friedman  bool hasCmpxchg16b() const { return HasCmpxchg16b; }
261de1df103b9c578d0a1609054a5944342c5d0ba23Evan Cheng  bool useLeaForSP() const { return UseLeaForSP; }
2622e2efd960056bbb7e4bbd843c8de55116d52aa7dPreston Gurd  bool hasSlowDivide() const { return HasSlowDivide; }
263c7b902e7fe3498503efbfd98cabb1b1c67cadda6Preston Gurd  bool padShortFunctions() const { return PadShortFunctions; }
264ccb6976a69a6e146db049fff8e6338e31c91b6f8Evan Cheng
265922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick  bool isAtom() const { return X86ProcFamily == IntelAtom; }
266922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick
26724cfd06d031da285286a330c1fbc61127643dd2dDaniel Dunbar  const Triple &getTargetTriple() const { return TargetTriple; }
26824cfd06d031da285286a330c1fbc61127643dd2dDaniel Dunbar
269912225e18559a73228099330a4c253fdccf9fa3dDaniel Dunbar  bool isTargetDarwin() const { return TargetTriple.isOSDarwin(); }
270912225e18559a73228099330a4c253fdccf9fa3dDaniel Dunbar  bool isTargetFreeBSD() const {
271912225e18559a73228099330a4c253fdccf9fa3dDaniel Dunbar    return TargetTriple.getOS() == Triple::FreeBSD;
272912225e18559a73228099330a4c253fdccf9fa3dDaniel Dunbar  }
273912225e18559a73228099330a4c253fdccf9fa3dDaniel Dunbar  bool isTargetSolaris() const {
274912225e18559a73228099330a4c253fdccf9fa3dDaniel Dunbar    return TargetTriple.getOS() == Triple::Solaris;
275912225e18559a73228099330a4c253fdccf9fa3dDaniel Dunbar  }
2767bbd6e366b39157445cc921024a987e61ea68c00Andrew Kaylor  bool isTargetELF() const {
2777bbd6e366b39157445cc921024a987e61ea68c00Andrew Kaylor    return (TargetTriple.getEnvironment() == Triple::ELF ||
2787bbd6e366b39157445cc921024a987e61ea68c00Andrew Kaylor            TargetTriple.isOSBinFormatELF());
2797bbd6e366b39157445cc921024a987e61ea68c00Andrew Kaylor  }
28062f35a2c133cd7de818dfc366a393282f01b111cEric Christopher  bool isTargetLinux() const { return TargetTriple.getOS() == Triple::Linux; }
2811fac6b50ea720d75fc2bf01a288e99f239869e90Nick Lewycky  bool isTargetNaCl() const {
282f659c0de6c7a4684a2a30c344ce6827ea87032d8Eli Bendersky    return TargetTriple.getOS() == Triple::NaCl;
2831fac6b50ea720d75fc2bf01a288e99f239869e90Nick Lewycky  }
2841fac6b50ea720d75fc2bf01a288e99f239869e90Nick Lewycky  bool isTargetNaCl32() const { return isTargetNaCl() && !is64Bit(); }
2851fac6b50ea720d75fc2bf01a288e99f239869e90Nick Lewycky  bool isTargetNaCl64() const { return isTargetNaCl() && is64Bit(); }
28662f35a2c133cd7de818dfc366a393282f01b111cEric Christopher  bool isTargetWindows() const { return TargetTriple.getOS() == Triple::Win32; }
2876904f05e607b6bbdfa96a2ebb628ebf3a1f21455NAKAMURA Takumi  bool isTargetMingw() const { return TargetTriple.getOS() == Triple::MinGW32; }
28862f35a2c133cd7de818dfc366a393282f01b111cEric Christopher  bool isTargetCygwin() const { return TargetTriple.getOS() == Triple::Cygwin; }
28969f44692bf5fea1d908fc06487e173837d06ea58Chandler Carruth  bool isTargetCygMing() const { return TargetTriple.isOSCygMing(); }
2907bbd6e366b39157445cc921024a987e61ea68c00Andrew Kaylor  bool isTargetCOFF() const {
2917bbd6e366b39157445cc921024a987e61ea68c00Andrew Kaylor    return (TargetTriple.getEnvironment() != Triple::ELF &&
2927bbd6e366b39157445cc921024a987e61ea68c00Andrew Kaylor            TargetTriple.isOSBinFormatCOFF());
2937bbd6e366b39157445cc921024a987e61ea68c00Andrew Kaylor  }
29469f44692bf5fea1d908fc06487e173837d06ea58Chandler Carruth  bool isTargetEnvMacho() const { return TargetTriple.isEnvironmentMachO(); }
2955d96eb867196d8e0b70266fb5eebd9b754c90d9bMikhail Glushenkov
2961a979d9eab68b353208cdff87b09ff703d5bf15dAnton Korobeynikov  bool isTargetWin64() const {
297e3345c4e4a9d9afe43bad24d287d44baa1a5dc9aNAKAMURA Takumi    // FIXME: x86_64-cygwin has not been released yet.
29869f44692bf5fea1d908fc06487e173837d06ea58Chandler Carruth    return In64BitMode && TargetTriple.isOSWindows();
2992bffee2ee725047137d2523e31db9ecc7b246cbbEvan Cheng  }
3002bffee2ee725047137d2523e31db9ecc7b246cbbEvan Cheng
301ace53f2fbc65f1e26c084c733ffbdbe3516580a6Anton Korobeynikov  bool isTargetWin32() const {
30269f44692bf5fea1d908fc06487e173837d06ea58Chandler Carruth    // FIXME: Cygwin is included for isTargetWin64 -- should it be included
30369f44692bf5fea1d908fc06487e173837d06ea58Chandler Carruth    // here too?
30418fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng    return !In64BitMode && (isTargetMingw() || isTargetWindows());
305ace53f2fbc65f1e26c084c733ffbdbe3516580a6Anton Korobeynikov  }
306ace53f2fbc65f1e26c084c733ffbdbe3516580a6Anton Korobeynikov
307f9a67a894366482cb2aa70a0e4dfeb5d76f91988Duncan Sands  bool isPICStyleSet() const { return PICStyle != PICStyles::None; }
308f9a67a894366482cb2aa70a0e4dfeb5d76f91988Duncan Sands  bool isPICStyleGOT() const { return PICStyle == PICStyles::GOT; }
309f9a67a894366482cb2aa70a0e4dfeb5d76f91988Duncan Sands  bool isPICStyleRIPRel() const { return PICStyle == PICStyles::RIPRel; }
3103b67e9ba015624a9904a41d6d0fd61cac1b02055Chris Lattner
311e2c920845a407957b8ae2600feae1f4c85a0d4d0Chris Lattner  bool isPICStyleStubPIC() const {
3128097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner    return PICStyle == PICStyles::StubPIC;
3138097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner  }
3148097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner
315e2c920845a407957b8ae2600feae1f4c85a0d4d0Chris Lattner  bool isPICStyleStubNoDynamic() const {
3168097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner    return PICStyle == PICStyles::StubDynamicNoPIC;
3178097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner  }
3188097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner  bool isPICStyleStubAny() const {
3198097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner    return PICStyle == PICStyles::StubDynamicNoPIC ||
3208097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner           PICStyle == PICStyles::StubPIC; }
3215d96eb867196d8e0b70266fb5eebd9b754c90d9bMikhail Glushenkov
322d392bd97c8203ab4a770dfdd0a5565ac6cd6cacdChris Lattner  /// ClassifyGlobalReference - Classify a global variable reference for the
323d392bd97c8203ab4a770dfdd0a5565ac6cd6cacdChris Lattner  /// current subtarget according to how we should reference it in a non-pcrel
324d392bd97c8203ab4a770dfdd0a5565ac6cd6cacdChris Lattner  /// context.
325d392bd97c8203ab4a770dfdd0a5565ac6cd6cacdChris Lattner  unsigned char ClassifyGlobalReference(const GlobalValue *GV,
326d392bd97c8203ab4a770dfdd0a5565ac6cd6cacdChris Lattner                                        const TargetMachine &TM)const;
32715fccf1d9395ccf3f60404e71dc9db029d04f910Anton Korobeynikov
32829cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman  /// ClassifyBlockAddressReference - Classify a blockaddress reference for the
32929cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman  /// current subtarget according to how we should reference it in a non-pcrel
33029cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman  /// context.
33129cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman  unsigned char ClassifyBlockAddressReference() const;
33229cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman
333d7f666a869966a22b0b8f9fcd5056c1d475039ccEvan Cheng  /// IsLegalToCallImmediateAddr - Return true if the subtarget allows calls
334d7f666a869966a22b0b8f9fcd5056c1d475039ccEvan Cheng  /// to immediate address.
335d7f666a869966a22b0b8f9fcd5056c1d475039ccEvan Cheng  bool IsLegalToCallImmediateAddr(const TargetMachine &TM) const;
336d7f666a869966a22b0b8f9fcd5056c1d475039ccEvan Cheng
33768d599df37218452acd5a680d5360d3caaa1623cDan Gohman  /// This function returns the name of a function which has an interface
33868d599df37218452acd5a680d5360d3caaa1623cDan Gohman  /// like the non-standard bzero function, if such a function exists on
33968d599df37218452acd5a680d5360d3caaa1623cDan Gohman  /// the current subtarget and it is considered prefereable over
34068d599df37218452acd5a680d5360d3caaa1623cDan Gohman  /// memset with zero passed as the second argument. Otherwise it
34168d599df37218452acd5a680d5360d3caaa1623cDan Gohman  /// returns null.
3426e08738d4b1bb6c087d81bca656c24cdc1d504f8Bill Wendling  const char *getBZeroEntry() const;
3438688a58c53b46d2dda9bf50dafd5195790a7ed58Evan Cheng
3448688a58c53b46d2dda9bf50dafd5195790a7ed58Evan Cheng  /// This function returns true if the target has sincos() routine in its
3458688a58c53b46d2dda9bf50dafd5195790a7ed58Evan Cheng  /// compiler runtime or math libraries.
3468688a58c53b46d2dda9bf50dafd5195790a7ed58Evan Cheng  bool hasSinCos() const;
3478749b61178228ba1fb2668034d79da1b247173d7Dan Gohman
348922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick  /// enablePostRAScheduler - run for Atom optimization.
349922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick  bool enablePostRAScheduler(CodeGenOpt::Level OptLevel,
350922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick                             TargetSubtargetInfo::AntiDepBreakMode& Mode,
351922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick                             RegClassVector& CriticalPathRCs) const;
352922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick
3536a8c7bf8e72338e55f0f9583e1828f62da165d4aPreston Gurd  bool postRAScheduler() const { return PostRAScheduler; }
3546a8c7bf8e72338e55f0f9583e1828f62da165d4aPreston Gurd
355922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick  /// getInstrItins = Return the instruction itineraries based on the
356922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick  /// subtarget selection.
357922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick  const InstrItineraryData &getInstrItineraryData() const { return InstrItins; }
358d0da6ff3ad761dc5eb00cbe32b850de7b0bf27b6Evan Cheng};
359751c0e12dbabe90c98f1f050baea714e79c837d6Evan Cheng
360fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman} // End llvm namespace
361fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman
362fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman#endif
363