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 17cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "X86FrameLowering.h" 18cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "X86ISelLowering.h" 19cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "X86InstrInfo.h" 20cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "X86JITInfo.h" 21cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "X86SelectionDAGInfo.h" 2262f35a2c133cd7de818dfc366a393282f01b111cEric Christopher#include "llvm/ADT/Triple.h" 230b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/CallingConv.h" 245b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng#include "llvm/Target/TargetSubtargetInfo.h" 25b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey#include <string> 26b1e1180ca0b32f37aa74d7ad703eeaf91e66c8faJim Laskey 2794214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng#define GET_SUBTARGETINFO_HEADER 28385e930d55f3ecd3c9538823dfa5896a12461845Evan Cheng#include "X86GenSubtargetInfo.inc" 2994214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng 30fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begemannamespace llvm { 317784ebc239202bba4859855c3f438319144535f0Anton Korobeynikovclass GlobalValue; 320ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Chengclass StringRef; 332b2bc688849234b9ee5e0c8704a2984f0e9cbba3Anton Korobeynikovclass TargetMachine; 345d96eb867196d8e0b70266fb5eebd9b754c90d9bMikhail Glushenkov 35e4df756289b6d80dcfd67b9f97fd464f62fd4902Chris Lattner/// PICStyles - The X86 backend supports a number of different styles of PIC. 365d96eb867196d8e0b70266fb5eebd9b754c90d9bMikhail Glushenkov/// 37f9a67a894366482cb2aa70a0e4dfeb5d76f91988Duncan Sandsnamespace PICStyles { 387f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikovenum Style { 398097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner StubPIC, // Used on i386-darwin in -fPIC mode. 408097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner StubDynamicNoPIC, // Used on i386-darwin in -mdynamic-no-pic mode. 418097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner GOT, // Used on many 32-bit unices in -fPIC mode. 428097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner RIPRel, // Used on X86-64 when not in -static mode. 438097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner None // Set when in -static mode (not PIC or DynamicNoPIC mode). 447f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov}; 457f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov} 46fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman 4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass X86Subtarget final : public X86GenSubtargetInfo { 48cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 49fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begemanprotected: 50559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng enum X86SSEEnum { 5133b5fe7f160886a0718e8cad4ac0d896d5d5c46fCraig Topper NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F 52559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng }; 53559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng 54a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng enum X863DNowEnum { 55a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng NoThreeDNow, ThreeDNow, ThreeDNowA 56a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng }; 57a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng 58922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick enum X86ProcFamilyEnum { 5994dc6540a8f3aaadb43dda50e49fc79141fae8edPreston Gurd Others, IntelAtom, IntelSLM 60922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick }; 61922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick 62922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick /// X86ProcFamily - X86 processor family: Intel Atom, and others 63922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick X86ProcFamilyEnum X86ProcFamily; 64a20e1e7ef596842127794372244fd5c646f71296Chad Rosier 657f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov /// PICStyle - Which PIC style to use 66f6844ca0e4a02fae3b100db7b0c62170d05e5b53Evan Cheng /// 67f9a67a894366482cb2aa70a0e4dfeb5d76f91988Duncan Sands PICStyles::Style PICStyle; 685d96eb867196d8e0b70266fb5eebd9b754c90d9bMikhail Glushenkov 69add251754cd18f4ef9f4eb1ead16a0c98887066eEvan Cheng /// X86SSELevel - MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, or 70add251754cd18f4ef9f4eb1ead16a0c98887066eEvan Cheng /// none supported. 71559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng X86SSEEnum X86SSELevel; 72559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng 73a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng /// X863DNowLevel - 3DNow or 3DNow Athlon, or none supported. 74f6844ca0e4a02fae3b100db7b0c62170d05e5b53Evan Cheng /// 75a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng X863DNowEnum X863DNowLevel; 76a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng 77700841617a9cfdc08323449ab14f42513c106430Chris Lattner /// HasCMov - True if this processor has conditional move instructions 78700841617a9cfdc08323449ab14f42513c106430Chris Lattner /// (generally pentium pro+). 79700841617a9cfdc08323449ab14f42513c106430Chris Lattner bool HasCMov; 805d96eb867196d8e0b70266fb5eebd9b754c90d9bMikhail Glushenkov 8125ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng /// HasX86_64 - True if the processor supports X86-64 instructions. 82f6844ca0e4a02fae3b100db7b0c62170d05e5b53Evan Cheng /// 8325ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng bool HasX86_64; 84ccb6976a69a6e146db049fff8e6338e31c91b6f8Evan Cheng 851292c226458b68a119d3a387a0527f453b2065c2Benjamin Kramer /// HasPOPCNT - True if the processor supports POPCNT. 861292c226458b68a119d3a387a0527f453b2065c2Benjamin Kramer bool HasPOPCNT; 871292c226458b68a119d3a387a0527f453b2065c2Benjamin Kramer 888cf5ab153d3873d8565d5433527bd0219f7b8043Stefanus Du Toit /// HasSSE4A - True if the processor supports SSE4A instructions. 898cf5ab153d3873d8565d5433527bd0219f7b8043Stefanus Du Toit bool HasSSE4A; 908cf5ab153d3873d8565d5433527bd0219f7b8043Stefanus Du Toit 916d1cd1cd04abb1828a14980e15252985c8c728b2Eric Christopher /// HasAES - Target has AES instructions 926d1cd1cd04abb1828a14980e15252985c8c728b2Eric Christopher bool HasAES; 936d1cd1cd04abb1828a14980e15252985c8c728b2Eric Christopher 94c8e340da823e8ff10b947429ef99e34ffc3067d8Benjamin Kramer /// HasPCLMUL - Target has carry-less multiplication 95c8e340da823e8ff10b947429ef99e34ffc3067d8Benjamin Kramer bool HasPCLMUL; 96cdae7e8244e37f539a5f1c9b780de7817b40de52Bruno Cardoso Lopes 97a15f9d53114a86005b260cbc451b0c63aa92bc1dCraig Topper /// HasFMA - Target has 3-operand fused multiply-add 98a15f9d53114a86005b260cbc451b0c63aa92bc1dCraig Topper bool HasFMA; 99343dadbb368ec4de546c2cc3ffb1dac4cdbe14b9David Greene 100343dadbb368ec4de546c2cc3ffb1dac4cdbe14b9David Greene /// HasFMA4 - Target has 4-operand fused multiply-add 101343dadbb368ec4de546c2cc3ffb1dac4cdbe14b9David Greene bool HasFMA4; 102343dadbb368ec4de546c2cc3ffb1dac4cdbe14b9David Greene 103ce25d26b400d25c9e20ac9fe2d5b0cafb9d7fa15Jan Sjödin /// HasXOP - Target has XOP instructions 104ce25d26b400d25c9e20ac9fe2d5b0cafb9d7fa15Jan Sjödin bool HasXOP; 105ce25d26b400d25c9e20ac9fe2d5b0cafb9d7fa15Jan Sjödin 1064da61345ec553a4f3ab3cedf6f21452374f1fda1Yunzhong Gao /// HasTBM - Target has TBM instructions. 1074da61345ec553a4f3ab3cedf6f21452374f1fda1Yunzhong Gao bool HasTBM; 1084da61345ec553a4f3ab3cedf6f21452374f1fda1Yunzhong Gao 109da394041c409cb06008e60b9f9f845e845215b03Craig Topper /// HasMOVBE - True if the processor has the MOVBE instruction. 110581fe82c84839f769a7275cf4cde7ea209f5ed04Craig Topper bool HasMOVBE; 111581fe82c84839f769a7275cf4cde7ea209f5ed04Craig Topper 112da394041c409cb06008e60b9f9f845e845215b03Craig Topper /// HasRDRAND - True if the processor has the RDRAND instruction. 113581fe82c84839f769a7275cf4cde7ea209f5ed04Craig Topper bool HasRDRAND; 114581fe82c84839f769a7275cf4cde7ea209f5ed04Craig Topper 115da394041c409cb06008e60b9f9f845e845215b03Craig Topper /// HasF16C - Processor has 16-bit floating point conversion instructions. 116da394041c409cb06008e60b9f9f845e845215b03Craig Topper bool HasF16C; 117da394041c409cb06008e60b9f9f845e845215b03Craig Topper 118e7b05504faa86a5c0b80a62ddb60cbb0cf163d5dCraig Topper /// HasFSGSBase - Processor has FS/GS base insturctions. 119e7b05504faa86a5c0b80a62ddb60cbb0cf163d5dCraig Topper bool HasFSGSBase; 120e7b05504faa86a5c0b80a62ddb60cbb0cf163d5dCraig Topper 12137f2167f15608ff56d202ff21954a456aab6e534Craig Topper /// HasLZCNT - Processor has LZCNT instruction. 12237f2167f15608ff56d202ff21954a456aab6e534Craig Topper bool HasLZCNT; 12337f2167f15608ff56d202ff21954a456aab6e534Craig Topper 124909652f6876a97d63db20606cd1b37e95d016cafCraig Topper /// HasBMI - Processor has BMI1 instructions. 125909652f6876a97d63db20606cd1b37e95d016cafCraig Topper bool HasBMI; 126909652f6876a97d63db20606cd1b37e95d016cafCraig Topper 127b53fa8bf19a51f0c49a9f8b6ede3e2ff3bdfb961Craig Topper /// HasBMI2 - Processor has BMI2 instructions. 128b53fa8bf19a51f0c49a9f8b6ede3e2ff3bdfb961Craig Topper bool HasBMI2; 129b53fa8bf19a51f0c49a9f8b6ede3e2ff3bdfb961Craig Topper 130be02a90de17f857ba65bbd8a11653ca1bad30adcMichael Liao /// HasRTM - Processor has RTM instructions. 131be02a90de17f857ba65bbd8a11653ca1bad30adcMichael Liao bool HasRTM; 132be02a90de17f857ba65bbd8a11653ca1bad30adcMichael Liao 1330ca1a7f177ffd29c0af49f23cc7bd5f0b56a60d0Michael Liao /// HasHLE - Processor has HLE. 1340ca1a7f177ffd29c0af49f23cc7bd5f0b56a60d0Michael Liao bool HasHLE; 1350ca1a7f177ffd29c0af49f23cc7bd5f0b56a60d0Michael Liao 1367b672ed380cf44894f8b96c52558dcfc136af383Kay Tiong Khoo /// HasADX - Processor has ADX instructions. 1377b672ed380cf44894f8b96c52558dcfc136af383Kay Tiong Khoo bool HasADX; 1387b672ed380cf44894f8b96c52558dcfc136af383Kay Tiong Khoo 1391f1bd9a54d25d4e2c5da13c2cae7fa5e3d8acc9fBen Langmuir /// HasSHA - Processor has SHA instructions. 1401f1bd9a54d25d4e2c5da13c2cae7fa5e3d8acc9fBen Langmuir bool HasSHA; 1411f1bd9a54d25d4e2c5da13c2cae7fa5e3d8acc9fBen Langmuir 142675eb3b9ac547119f6db676ebdd172d40a797b1cMichael Liao /// HasPRFCHW - Processor has PRFCHW instructions. 143675eb3b9ac547119f6db676ebdd172d40a797b1cMichael Liao bool HasPRFCHW; 144675eb3b9ac547119f6db676ebdd172d40a797b1cMichael Liao 145c26392aa5d9c2dbca2909d6874d181455f8aeb8fMichael Liao /// HasRDSEED - Processor has RDSEED instructions. 146c26392aa5d9c2dbca2909d6874d181455f8aeb8fMichael Liao bool HasRDSEED; 147c26392aa5d9c2dbca2909d6874d181455f8aeb8fMichael Liao 148343dadbb368ec4de546c2cc3ffb1dac4cdbe14b9David Greene /// IsBTMemSlow - True if BT (bit test) of memory instructions are slow. 149343dadbb368ec4de546c2cc3ffb1dac4cdbe14b9David Greene bool IsBTMemSlow; 150400073d5467b79534d8c63b0d996a55e4252ff4bEvan Cheng 15136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// IsSHLDSlow - True if SHLD instructions are slow. 15236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool IsSHLDSlow; 15336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 15448c58bb8610cd475d1acb073694e0d2b4dd7cc8cEvan Cheng /// IsUAMemFast - True if unaligned memory access is fast. 15548c58bb8610cd475d1acb073694e0d2b4dd7cc8cEvan Cheng bool IsUAMemFast; 15648c58bb8610cd475d1acb073694e0d2b4dd7cc8cEvan Cheng 1575d96eb867196d8e0b70266fb5eebd9b754c90d9bMikhail Glushenkov /// HasVectorUAMem - True if SIMD operations can have unaligned memory 1585528e7bcb1209094a68bbf6d1efeefc3ca34774fEvan Cheng /// operands. This may require setting a feature bit in the processor. 15995eb2eeea65fbae223ffd517f3984f14b034fcb8David Greene bool HasVectorUAMem; 16095eb2eeea65fbae223ffd517f3984f14b034fcb8David Greene 16143f51aeca8367ea35adad963c00bd2bc5b8d1391Eli Friedman /// HasCmpxchg16b - True if this processor has the CMPXCHG16B instruction; 16243f51aeca8367ea35adad963c00bd2bc5b8d1391Eli Friedman /// this is true for most x86-64 chips, but not the first AMD chips. 16343f51aeca8367ea35adad963c00bd2bc5b8d1391Eli Friedman bool HasCmpxchg16b; 16443f51aeca8367ea35adad963c00bd2bc5b8d1391Eli Friedman 165de1df103b9c578d0a1609054a5944342c5d0ba23Evan Cheng /// UseLeaForSP - True if the LEA instruction should be used for adjusting 166de1df103b9c578d0a1609054a5944342c5d0ba23Evan Cheng /// the stack pointer. This is an optimization for Intel Atom processors. 167de1df103b9c578d0a1609054a5944342c5d0ba23Evan Cheng bool UseLeaForSP; 168de1df103b9c578d0a1609054a5944342c5d0ba23Evan Cheng 1692e2efd960056bbb7e4bbd843c8de55116d52aa7dPreston Gurd /// HasSlowDivide - True if smaller divides are significantly faster than 1702e2efd960056bbb7e4bbd843c8de55116d52aa7dPreston Gurd /// full divides and should be used when possible. 1712e2efd960056bbb7e4bbd843c8de55116d52aa7dPreston Gurd bool HasSlowDivide; 1722e2efd960056bbb7e4bbd843c8de55116d52aa7dPreston Gurd 173922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick /// PostRAScheduler - True if using post-register-allocation scheduler. 174922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick bool PostRAScheduler; 175922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick 176c7b902e7fe3498503efbfd98cabb1b1c67cadda6Preston Gurd /// PadShortFunctions - True if the short functions should be padded to prevent 177c7b902e7fe3498503efbfd98cabb1b1c67cadda6Preston Gurd /// a stall when returning too early. 178c7b902e7fe3498503efbfd98cabb1b1c67cadda6Preston Gurd bool PadShortFunctions; 179c7b902e7fe3498503efbfd98cabb1b1c67cadda6Preston Gurd 1801edadea42f6f5c393b4fdb9d7ce1cf7eb9c24ab4Preston Gurd /// CallRegIndirect - True if the Calls with memory reference should be converted 1811edadea42f6f5c393b4fdb9d7ce1cf7eb9c24ab4Preston Gurd /// to a register-based indirect call. 1821edadea42f6f5c393b4fdb9d7ce1cf7eb9c24ab4Preston Gurd bool CallRegIndirect; 183d6ac8e9a03d8fa7115079d86192bc4529e8281aaPreston Gurd /// LEAUsesAG - True if the LEA instruction inputs have to be ready at 184d6ac8e9a03d8fa7115079d86192bc4529e8281aaPreston Gurd /// address generation (AG) time. 185d6ac8e9a03d8fa7115079d86192bc4529e8281aaPreston Gurd bool LEAUsesAG; 1861edadea42f6f5c393b4fdb9d7ce1cf7eb9c24ab4Preston Gurd 187dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// SlowLEA - True if the LEA instruction with certain arguments is slow 188dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool SlowLEA; 189dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 190cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines /// SlowIncDec - True if INC and DEC instructions are slow when writing to flags 191cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool SlowIncDec; 192cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 193e3809eed34f000581a464689596eefde2a6d1f24Elena Demikhovsky /// Processor has AVX-512 PreFetch Instructions 194e3809eed34f000581a464689596eefde2a6d1f24Elena Demikhovsky bool HasPFI; 195e3809eed34f000581a464689596eefde2a6d1f24Elena Demikhovsky 196e3809eed34f000581a464689596eefde2a6d1f24Elena Demikhovsky /// Processor has AVX-512 Exponential and Reciprocal Instructions 197e3809eed34f000581a464689596eefde2a6d1f24Elena Demikhovsky bool HasERI; 198e3809eed34f000581a464689596eefde2a6d1f24Elena Demikhovsky 199e3809eed34f000581a464689596eefde2a6d1f24Elena Demikhovsky /// Processor has AVX-512 Conflict Detection Instructions 200e3809eed34f000581a464689596eefde2a6d1f24Elena Demikhovsky bool HasCDI; 201e3809eed34f000581a464689596eefde2a6d1f24Elena Demikhovsky 202b151acadc85011961e24d98fa6ce626ea45cd074Chris Lattner /// stackAlignment - The minimum alignment known to hold of the stack frame on 203b151acadc85011961e24d98fa6ce626ea45cd074Chris Lattner /// entry to the function and which must be maintained by every function. 204fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman unsigned stackAlignment; 2059eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen 206fc05f402ea22e8a9ae465d209b65be7e857a89ffRafael Espindola /// Max. memset / memcpy size that is turned into rep/movs, rep/stos ops. 207f6844ca0e4a02fae3b100db7b0c62170d05e5b53Evan Cheng /// 208fc05f402ea22e8a9ae465d209b65be7e857a89ffRafael Espindola unsigned MaxInlineSizeThreshold; 209e310b3a2a32d356f3f890fb138b1694b53d15f4eNAKAMURA Takumi 21062f35a2c133cd7de818dfc366a393282f01b111cEric Christopher /// TargetTriple - What processor and OS we're targeting. 21162f35a2c133cd7de818dfc366a393282f01b111cEric Christopher Triple TargetTriple; 212a20e1e7ef596842127794372244fd5c646f71296Chad Rosier 213922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick /// Instruction itineraries for scheduling 214922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick InstrItineraryData InstrItins; 21518a8452f3d2cc0bbfea427b10e2c7dccc86f2188Evan Cheng 21625ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Chengprivate: 217789cb5df9ca61f8a3794a4fbde7cc020fd00a02aBill Wendling /// StackAlignOverride - Override the stack alignment. 218789cb5df9ca61f8a3794a4fbde7cc020fd00a02aBill Wendling unsigned StackAlignOverride; 219789cb5df9ca61f8a3794a4fbde7cc020fd00a02aBill Wendling 22036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// In64BitMode - True if compiling for 64-bit, false for 16-bit or 32-bit. 22118fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng bool In64BitMode; 22225ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng 22336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// In32BitMode - True if compiling for 32-bit, false for 16-bit or 64-bit. 22436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool In32BitMode; 22536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 22636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// In16BitMode - True if compiling for 16-bit, false for 32-bit or 64-bit. 22736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool In16BitMode; 22836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 229cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Calculates type size & alignment 230cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const DataLayout DL; 231cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines X86SelectionDAGInfo TSInfo; 232cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // Ordering here is important. X86InstrInfo initializes X86RegisterInfo which 233cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // X86TargetLowering needs. 234cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines X86InstrInfo InstrInfo; 235cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines X86TargetLowering TLInfo; 236cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines X86FrameLowering FrameLowering; 237cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines X86JITInfo JITInfo; 238cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 239fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begemanpublic: 2409eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen /// This constructor initializes the data members to match that 2413be03406c9c3b2075d5ae416499af2f15f703d6fDaniel Dunbar /// of the specified triple. 242fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman /// 243276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng X86Subtarget(const std::string &TT, const std::string &CPU, 244cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const std::string &FS, X86TargetMachine &TM, 24536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned StackAlignOverride); 246b151acadc85011961e24d98fa6ce626ea45cd074Chris Lattner 247cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const X86TargetLowering *getTargetLowering() const { return &TLInfo; } 248cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const X86InstrInfo *getInstrInfo() const { return &InstrInfo; } 249cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const DataLayout *getDataLayout() const { return &DL; } 250cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const X86FrameLowering *getFrameLowering() const { return &FrameLowering; } 251cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const X86SelectionDAGInfo *getSelectionDAGInfo() const { return &TSInfo; } 252cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines X86JITInfo *getJITInfo() { return &JITInfo; } 253cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 254b151acadc85011961e24d98fa6ce626ea45cd074Chris Lattner /// getStackAlignment - Returns the minimum alignment known to hold of the 255b151acadc85011961e24d98fa6ce626ea45cd074Chris Lattner /// stack frame on entry to the function and which must be maintained by every 256b151acadc85011961e24d98fa6ce626ea45cd074Chris Lattner /// function for this subtarget. 257fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman unsigned getStackAlignment() const { return stackAlignment; } 2589eb59ec548b861d6ede05b4e6dc22aabf645e665Jeff Cohen 259fc05f402ea22e8a9ae465d209b65be7e857a89ffRafael Espindola /// getMaxInlineSizeThreshold - Returns the maximum memset / memcpy size 260fc05f402ea22e8a9ae465d209b65be7e857a89ffRafael Espindola /// that still makes it profitable to inline the call. 261fc05f402ea22e8a9ae465d209b65be7e857a89ffRafael Espindola unsigned getMaxInlineSizeThreshold() const { return MaxInlineSizeThreshold; } 26212c49af81e370df835ca1b72cdcefcadafcede4bAnton Korobeynikov 26312c49af81e370df835ca1b72cdcefcadafcede4bAnton Korobeynikov /// ParseSubtargetFeatures - Parses features string setting specified 264a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng /// subtarget options. Definition of function is auto generated by tblgen. 2650ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng void ParseSubtargetFeatures(StringRef CPU, StringRef FS); 266a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng 267789cb5df9ca61f8a3794a4fbde7cc020fd00a02aBill Wendling /// \brief Reset the features for the X86 target. 26836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void resetSubtargetFeatures(const MachineFunction *MF) override; 269901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendlingprivate: 270cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines /// \brief Initialize the full set of dependencies so we can use an initializer 271cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines /// list for X86Subtarget. 272cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines X86Subtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS); 273901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendling void initializeEnvironment(); 274789cb5df9ca61f8a3794a4fbde7cc020fd00a02aBill Wendling void resetSubtargetFeatures(StringRef CPU, StringRef FS); 275901d80065c9afa0ba33e8546c2e1e99a00aceb14Bill Wendlingpublic: 276a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky /// Is this x86_64? (disregarding specific ABI / programming model) 277a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky bool is64Bit() const { 278a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky return In64BitMode; 279a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky } 280a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky 28136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool is32Bit() const { 28236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return In32BitMode; 28336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 28436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 28536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool is16Bit() const { 28636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return In16BitMode; 28736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 28836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 289a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky /// Is this x86_64 with the ILP32 programming model (x32 ABI)? 290a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky bool isTarget64BitILP32() const { 29136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return In64BitMode && (TargetTriple.getEnvironment() == Triple::GNUX32 || 29236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines TargetTriple.getOS() == Triple::NaCl); 293a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky } 294a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky 295a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky /// Is this x86_64 with the LP64 programming model (standard AMD64, no x32)? 296a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky bool isTarget64BitLP64() const { 297a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky return In64BitMode && (TargetTriple.getEnvironment() != Triple::GNUX32); 298a5597f0eaf1f93c6d0bc641a0cc54ecffb33955aEli Bendersky } 29997c7fc351e4dd73041bc7e47c8a144216a50a648Evan Cheng 300f9a67a894366482cb2aa70a0e4dfeb5d76f91988Duncan Sands PICStyles::Style getPICStyle() const { return PICStyle; } 301f9a67a894366482cb2aa70a0e4dfeb5d76f91988Duncan Sands void setPICStyle(PICStyles::Style Style) { PICStyle = Style; } 3027f70559bc47877bafc6dfa92b7df6b64650445fbAnton Korobeynikov 303314a11318404569efaee74b7208d4b8ab1f64510Chris Lattner bool hasCMov() const { return HasCMov; } 304559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng bool hasMMX() const { return X86SSELevel >= MMX; } 305c6d59954d8b4bc63aa8e6333d902a3fffc774189Craig Topper bool hasSSE1() const { return X86SSELevel >= SSE1; } 306c6d59954d8b4bc63aa8e6333d902a3fffc774189Craig Topper bool hasSSE2() const { return X86SSELevel >= SSE2; } 307c6d59954d8b4bc63aa8e6333d902a3fffc774189Craig Topper bool hasSSE3() const { return X86SSELevel >= SSE3; } 308c6d59954d8b4bc63aa8e6333d902a3fffc774189Craig Topper bool hasSSSE3() const { return X86SSELevel >= SSSE3; } 309c6d59954d8b4bc63aa8e6333d902a3fffc774189Craig Topper bool hasSSE41() const { return X86SSELevel >= SSE41; } 310c6d59954d8b4bc63aa8e6333d902a3fffc774189Craig Topper bool hasSSE42() const { return X86SSELevel >= SSE42; } 3111accb7ed98d823c291a4d5df172d0538451aba9eCraig Topper bool hasAVX() const { return X86SSELevel >= AVX; } 3121accb7ed98d823c291a4d5df172d0538451aba9eCraig Topper bool hasAVX2() const { return X86SSELevel >= AVX2; } 31333b5fe7f160886a0718e8cad4ac0d896d5d5c46fCraig Topper bool hasAVX512() const { return X86SSELevel >= AVX512F; } 3148564dc67b5840da1633e29bade33185f4a36bb2dElena Demikhovsky bool hasFp256() const { return hasAVX(); } 3158564dc67b5840da1633e29bade33185f4a36bb2dElena Demikhovsky bool hasInt256() const { return hasAVX2(); } 3168cf5ab153d3873d8565d5433527bd0219f7b8043Stefanus Du Toit bool hasSSE4A() const { return HasSSE4A; } 317a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng bool has3DNow() const { return X863DNowLevel >= ThreeDNow; } 318a26eb5e1a7e36521caff281da687764a0c43e428Evan Cheng bool has3DNowA() const { return X863DNowLevel >= ThreeDNowA; } 3191292c226458b68a119d3a387a0527f453b2065c2Benjamin Kramer bool hasPOPCNT() const { return HasPOPCNT; } 3206d1cd1cd04abb1828a14980e15252985c8c728b2Eric Christopher bool hasAES() const { return HasAES; } 321c8e340da823e8ff10b947429ef99e34ffc3067d8Benjamin Kramer bool hasPCLMUL() const { return HasPCLMUL; } 322a15f9d53114a86005b260cbc451b0c63aa92bc1dCraig Topper bool hasFMA() const { return HasFMA; } 3230e292376d09223d791ed2ccc8935e98cbd36f1f8Craig Topper // FIXME: Favor FMA when both are enabled. Is this the right thing to do? 3249b54141cae0d3f429c414f28cd8c3dc1e819eb92Craig Topper bool hasFMA4() const { return HasFMA4 && !HasFMA; } 325ce25d26b400d25c9e20ac9fe2d5b0cafb9d7fa15Jan Sjödin bool hasXOP() const { return HasXOP; } 3264da61345ec553a4f3ab3cedf6f21452374f1fda1Yunzhong Gao bool hasTBM() const { return HasTBM; } 327581fe82c84839f769a7275cf4cde7ea209f5ed04Craig Topper bool hasMOVBE() const { return HasMOVBE; } 328581fe82c84839f769a7275cf4cde7ea209f5ed04Craig Topper bool hasRDRAND() const { return HasRDRAND; } 329da394041c409cb06008e60b9f9f845e845215b03Craig Topper bool hasF16C() const { return HasF16C; } 330e7b05504faa86a5c0b80a62ddb60cbb0cf163d5dCraig Topper bool hasFSGSBase() const { return HasFSGSBase; } 33137f2167f15608ff56d202ff21954a456aab6e534Craig Topper bool hasLZCNT() const { return HasLZCNT; } 332909652f6876a97d63db20606cd1b37e95d016cafCraig Topper bool hasBMI() const { return HasBMI; } 333b53fa8bf19a51f0c49a9f8b6ede3e2ff3bdfb961Craig Topper bool hasBMI2() const { return HasBMI2; } 334be02a90de17f857ba65bbd8a11653ca1bad30adcMichael Liao bool hasRTM() const { return HasRTM; } 3350ca1a7f177ffd29c0af49f23cc7bd5f0b56a60d0Michael Liao bool hasHLE() const { return HasHLE; } 3367b672ed380cf44894f8b96c52558dcfc136af383Kay Tiong Khoo bool hasADX() const { return HasADX; } 3371f1bd9a54d25d4e2c5da13c2cae7fa5e3d8acc9fBen Langmuir bool hasSHA() const { return HasSHA; } 338675eb3b9ac547119f6db676ebdd172d40a797b1cMichael Liao bool hasPRFCHW() const { return HasPRFCHW; } 339c26392aa5d9c2dbca2909d6874d181455f8aeb8fMichael Liao bool hasRDSEED() const { return HasRDSEED; } 340ccb6976a69a6e146db049fff8e6338e31c91b6f8Evan Cheng bool isBTMemSlow() const { return IsBTMemSlow; } 34136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isSHLDSlow() const { return IsSHLDSlow; } 34248c58bb8610cd475d1acb073694e0d2b4dd7cc8cEvan Cheng bool isUnalignedMemAccessFast() const { return IsUAMemFast; } 34395eb2eeea65fbae223ffd517f3984f14b034fcb8David Greene bool hasVectorUAMem() const { return HasVectorUAMem; } 34443f51aeca8367ea35adad963c00bd2bc5b8d1391Eli Friedman bool hasCmpxchg16b() const { return HasCmpxchg16b; } 345de1df103b9c578d0a1609054a5944342c5d0ba23Evan Cheng bool useLeaForSP() const { return UseLeaForSP; } 3462e2efd960056bbb7e4bbd843c8de55116d52aa7dPreston Gurd bool hasSlowDivide() const { return HasSlowDivide; } 347c7b902e7fe3498503efbfd98cabb1b1c67cadda6Preston Gurd bool padShortFunctions() const { return PadShortFunctions; } 3481edadea42f6f5c393b4fdb9d7ce1cf7eb9c24ab4Preston Gurd bool callRegIndirect() const { return CallRegIndirect; } 349d6ac8e9a03d8fa7115079d86192bc4529e8281aaPreston Gurd bool LEAusesAG() const { return LEAUsesAG; } 350dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool slowLEA() const { return SlowLEA; } 351cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool slowIncDec() const { return SlowIncDec; } 352e3809eed34f000581a464689596eefde2a6d1f24Elena Demikhovsky bool hasCDI() const { return HasCDI; } 353e3809eed34f000581a464689596eefde2a6d1f24Elena Demikhovsky bool hasPFI() const { return HasPFI; } 354e3809eed34f000581a464689596eefde2a6d1f24Elena Demikhovsky bool hasERI() const { return HasERI; } 355ccb6976a69a6e146db049fff8e6338e31c91b6f8Evan Cheng 356922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick bool isAtom() const { return X86ProcFamily == IntelAtom; } 357dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool isSLM() const { return X86ProcFamily == IntelSLM; } 358922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick 35924cfd06d031da285286a330c1fbc61127643dd2dDaniel Dunbar const Triple &getTargetTriple() const { return TargetTriple; } 36024cfd06d031da285286a330c1fbc61127643dd2dDaniel Dunbar 361912225e18559a73228099330a4c253fdccf9fa3dDaniel Dunbar bool isTargetDarwin() const { return TargetTriple.isOSDarwin(); } 362912225e18559a73228099330a4c253fdccf9fa3dDaniel Dunbar bool isTargetFreeBSD() const { 363912225e18559a73228099330a4c253fdccf9fa3dDaniel Dunbar return TargetTriple.getOS() == Triple::FreeBSD; 364912225e18559a73228099330a4c253fdccf9fa3dDaniel Dunbar } 365912225e18559a73228099330a4c253fdccf9fa3dDaniel Dunbar bool isTargetSolaris() const { 366912225e18559a73228099330a4c253fdccf9fa3dDaniel Dunbar return TargetTriple.getOS() == Triple::Solaris; 367912225e18559a73228099330a4c253fdccf9fa3dDaniel Dunbar } 36836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 36936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); } 37036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isTargetCOFF() const { return TargetTriple.isOSBinFormatCOFF(); } 37136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isTargetMacho() const { return TargetTriple.isOSBinFormatMachO(); } 37236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 373441c557708b5dbe91f1799baf790ad418c23ea70Cameron Esfahani bool isTargetLinux() const { return TargetTriple.isOSLinux(); } 374441c557708b5dbe91f1799baf790ad418c23ea70Cameron Esfahani bool isTargetNaCl() const { return TargetTriple.isOSNaCl(); } 3751fac6b50ea720d75fc2bf01a288e99f239869e90Nick Lewycky bool isTargetNaCl32() const { return isTargetNaCl() && !is64Bit(); } 3761fac6b50ea720d75fc2bf01a288e99f239869e90Nick Lewycky bool isTargetNaCl64() const { return isTargetNaCl() && is64Bit(); } 37736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 37836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isTargetWindowsMSVC() const { 37936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return TargetTriple.isWindowsMSVCEnvironment(); 38036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 38136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 38236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isTargetKnownWindowsMSVC() const { 38336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return TargetTriple.isKnownWindowsMSVCEnvironment(); 38436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 38536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 38636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isTargetWindowsCygwin() const { 38736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return TargetTriple.isWindowsCygwinEnvironment(); 38836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 38936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 39036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isTargetWindowsGNU() const { 39136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return TargetTriple.isWindowsGNUEnvironment(); 3927bbd6e366b39157445cc921024a987e61ea68c00Andrew Kaylor } 39336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 39436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isTargetCygMing() const { return TargetTriple.isOSCygMing(); } 3955d96eb867196d8e0b70266fb5eebd9b754c90d9bMikhail Glushenkov 396faf1415c4fa88b6233bca488b8ac3bb8e6a73c72Yaron Keren bool isOSWindows() const { return TargetTriple.isOSWindows(); } 397faf1415c4fa88b6233bca488b8ac3bb8e6a73c72Yaron Keren 3981a979d9eab68b353208cdff87b09ff703d5bf15dAnton Korobeynikov bool isTargetWin64() const { 39969f44692bf5fea1d908fc06487e173837d06ea58Chandler Carruth return In64BitMode && TargetTriple.isOSWindows(); 4002bffee2ee725047137d2523e31db9ecc7b246cbbEvan Cheng } 4012bffee2ee725047137d2523e31db9ecc7b246cbbEvan Cheng 402ace53f2fbc65f1e26c084c733ffbdbe3516580a6Anton Korobeynikov bool isTargetWin32() const { 40336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return !In64BitMode && (isTargetCygMing() || isTargetKnownWindowsMSVC()); 404ace53f2fbc65f1e26c084c733ffbdbe3516580a6Anton Korobeynikov } 405ace53f2fbc65f1e26c084c733ffbdbe3516580a6Anton Korobeynikov 406f9a67a894366482cb2aa70a0e4dfeb5d76f91988Duncan Sands bool isPICStyleSet() const { return PICStyle != PICStyles::None; } 407f9a67a894366482cb2aa70a0e4dfeb5d76f91988Duncan Sands bool isPICStyleGOT() const { return PICStyle == PICStyles::GOT; } 408f9a67a894366482cb2aa70a0e4dfeb5d76f91988Duncan Sands bool isPICStyleRIPRel() const { return PICStyle == PICStyles::RIPRel; } 4093b67e9ba015624a9904a41d6d0fd61cac1b02055Chris Lattner 410e2c920845a407957b8ae2600feae1f4c85a0d4d0Chris Lattner bool isPICStyleStubPIC() const { 4118097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner return PICStyle == PICStyles::StubPIC; 4128097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner } 4138097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner 414e2c920845a407957b8ae2600feae1f4c85a0d4d0Chris Lattner bool isPICStyleStubNoDynamic() const { 4158097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner return PICStyle == PICStyles::StubDynamicNoPIC; 4168097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner } 4178097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner bool isPICStyleStubAny() const { 4188097b65c432c3cc39339b6bb0ead9e1e09232ff7Chris Lattner return PICStyle == PICStyles::StubDynamicNoPIC || 419ac226bbf457f6b5e5210a4a82b1ce678298b2d89Charles Davis PICStyle == PICStyles::StubPIC; 420ac226bbf457f6b5e5210a4a82b1ce678298b2d89Charles Davis } 421ac226bbf457f6b5e5210a4a82b1ce678298b2d89Charles Davis 422ac226bbf457f6b5e5210a4a82b1ce678298b2d89Charles Davis bool isCallingConvWin64(CallingConv::ID CC) const { 423ac226bbf457f6b5e5210a4a82b1ce678298b2d89Charles Davis return (isTargetWin64() && CC != CallingConv::X86_64_SysV) || 424ac226bbf457f6b5e5210a4a82b1ce678298b2d89Charles Davis CC == CallingConv::X86_64_Win64; 425ac226bbf457f6b5e5210a4a82b1ce678298b2d89Charles Davis } 4265d96eb867196d8e0b70266fb5eebd9b754c90d9bMikhail Glushenkov 427d392bd97c8203ab4a770dfdd0a5565ac6cd6cacdChris Lattner /// ClassifyGlobalReference - Classify a global variable reference for the 428d392bd97c8203ab4a770dfdd0a5565ac6cd6cacdChris Lattner /// current subtarget according to how we should reference it in a non-pcrel 429d392bd97c8203ab4a770dfdd0a5565ac6cd6cacdChris Lattner /// context. 430d392bd97c8203ab4a770dfdd0a5565ac6cd6cacdChris Lattner unsigned char ClassifyGlobalReference(const GlobalValue *GV, 431d392bd97c8203ab4a770dfdd0a5565ac6cd6cacdChris Lattner const TargetMachine &TM)const; 43215fccf1d9395ccf3f60404e71dc9db029d04f910Anton Korobeynikov 43329cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman /// ClassifyBlockAddressReference - Classify a blockaddress reference for the 43429cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman /// current subtarget according to how we should reference it in a non-pcrel 43529cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman /// context. 43629cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman unsigned char ClassifyBlockAddressReference() const; 43729cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman 438d7f666a869966a22b0b8f9fcd5056c1d475039ccEvan Cheng /// IsLegalToCallImmediateAddr - Return true if the subtarget allows calls 439d7f666a869966a22b0b8f9fcd5056c1d475039ccEvan Cheng /// to immediate address. 440d7f666a869966a22b0b8f9fcd5056c1d475039ccEvan Cheng bool IsLegalToCallImmediateAddr(const TargetMachine &TM) const; 441d7f666a869966a22b0b8f9fcd5056c1d475039ccEvan Cheng 44268d599df37218452acd5a680d5360d3caaa1623cDan Gohman /// This function returns the name of a function which has an interface 44368d599df37218452acd5a680d5360d3caaa1623cDan Gohman /// like the non-standard bzero function, if such a function exists on 44468d599df37218452acd5a680d5360d3caaa1623cDan Gohman /// the current subtarget and it is considered prefereable over 44568d599df37218452acd5a680d5360d3caaa1623cDan Gohman /// memset with zero passed as the second argument. Otherwise it 44668d599df37218452acd5a680d5360d3caaa1623cDan Gohman /// returns null. 4476e08738d4b1bb6c087d81bca656c24cdc1d504f8Bill Wendling const char *getBZeroEntry() const; 4486a7770b7ae43d784dec6f4d3c73ffed6166f3882Andrew Trick 4498688a58c53b46d2dda9bf50dafd5195790a7ed58Evan Cheng /// This function returns true if the target has sincos() routine in its 4508688a58c53b46d2dda9bf50dafd5195790a7ed58Evan Cheng /// compiler runtime or math libraries. 4518688a58c53b46d2dda9bf50dafd5195790a7ed58Evan Cheng bool hasSinCos() const; 4528749b61178228ba1fb2668034d79da1b247173d7Dan Gohman 4536a7770b7ae43d784dec6f4d3c73ffed6166f3882Andrew Trick /// Enable the MachineScheduler pass for all X86 subtargets. 45436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool enableMachineScheduler() const override { return true; } 4556a7770b7ae43d784dec6f4d3c73ffed6166f3882Andrew Trick 456922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick /// enablePostRAScheduler - run for Atom optimization. 457922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick bool enablePostRAScheduler(CodeGenOpt::Level OptLevel, 458922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick TargetSubtargetInfo::AntiDepBreakMode& Mode, 45936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RegClassVector& CriticalPathRCs) const override; 460922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick 4616a8c7bf8e72338e55f0f9583e1828f62da165d4aPreston Gurd bool postRAScheduler() const { return PostRAScheduler; } 4626a8c7bf8e72338e55f0f9583e1828f62da165d4aPreston Gurd 463dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool enableEarlyIfConversion() const override; 464dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 465922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick /// getInstrItins = Return the instruction itineraries based on the 466922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick /// subtarget selection. 467922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick const InstrItineraryData &getInstrItineraryData() const { return InstrItins; } 468d0da6ff3ad761dc5eb00cbe32b850de7b0bf27b6Evan Cheng}; 469751c0e12dbabe90c98f1f050baea714e79c837d6Evan Cheng 470fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman} // End llvm namespace 471fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman 472fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman#endif 473