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