1dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner//===-- X86ISelLowering.h - X86 DAG Lowering Interface ----------*- C++ -*-===// 2dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner// 3dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner// The LLVM Compiler Infrastructure 4dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner// 8dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner//===----------------------------------------------------------------------===// 9dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner// 10dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner// This file defines the interfaces that X86 uses to lower LLVM code into a 11dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner// selection DAG. 12dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner// 13dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner//===----------------------------------------------------------------------===// 14dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner 15dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner#ifndef X86ISELLOWERING_H 16dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner#define X86ISELLOWERING_H 17dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner 18559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng#include "X86Subtarget.h" 192365f51ed03afe6993bae962fdc2e5a956a64cd5Anton Korobeynikov#include "X86RegisterInfo.h" 2086737665b81550fdb575f7d8cc5decc801a7813dGordon Henriksen#include "X86MachineFunctionInfo.h" 21dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner#include "llvm/Target/TargetLowering.h" 22ddc419c581ac827045d614099adaa60765ce1ebeEvan Cheng#include "llvm/Target/TargetOptions.h" 23b388eb82fb4a95e2f6d54163dfcf962b8032bae8Ted Kremenek#include "llvm/CodeGen/FastISel.h" 24dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner#include "llvm/CodeGen/SelectionDAG.h" 251b5dcc34b701639f94008658a2042abc43b9b910Rafael Espindola#include "llvm/CodeGen/CallingConvLower.h" 26dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner 27dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattnernamespace llvm { 28dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner namespace X86ISD { 29d9558e0ba6ddcf2798cfb88cc56e5f1c8135eb0dEvan Cheng // X86 Specific DAG Nodes 30dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner enum NodeType { 31dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner // Start the numbering where the builtin ops leave off. 320ba2bcfcc3149a25d08aa8aa00fb6c34a4e25bddDan Gohman FIRST_NUMBER = ISD::BUILTIN_OP_END, 33dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner 3418efe269b12624d74c0af6104e88864d6a932344Evan Cheng /// BSF - Bit scan forward. 3518efe269b12624d74c0af6104e88864d6a932344Evan Cheng /// BSR - Bit scan reverse. 3618efe269b12624d74c0af6104e88864d6a932344Evan Cheng BSF, 3718efe269b12624d74c0af6104e88864d6a932344Evan Cheng BSR, 3818efe269b12624d74c0af6104e88864d6a932344Evan Cheng 39e3413160ca2fb42854b2a23be6b2114c1da2778cEvan Cheng /// SHLD, SHRD - Double shift instructions. These correspond to 40e3413160ca2fb42854b2a23be6b2114c1da2778cEvan Cheng /// X86::SHLDxx and X86::SHRDxx instructions. 41e3413160ca2fb42854b2a23be6b2114c1da2778cEvan Cheng SHLD, 42e3413160ca2fb42854b2a23be6b2114c1da2778cEvan Cheng SHRD, 43e3413160ca2fb42854b2a23be6b2114c1da2778cEvan Cheng 44ef6ffb17c71232af5962f9926b31508eb942cddcEvan Cheng /// FAND - Bitwise logical AND of floating point values. This corresponds 45ef6ffb17c71232af5962f9926b31508eb942cddcEvan Cheng /// to X86::ANDPS or X86::ANDPD. 46ef6ffb17c71232af5962f9926b31508eb942cddcEvan Cheng FAND, 47ef6ffb17c71232af5962f9926b31508eb942cddcEvan Cheng 4868c47cba3589b2fc079bab0836d1ae6fc3a6278dEvan Cheng /// FOR - Bitwise logical OR of floating point values. This corresponds 4968c47cba3589b2fc079bab0836d1ae6fc3a6278dEvan Cheng /// to X86::ORPS or X86::ORPD. 5068c47cba3589b2fc079bab0836d1ae6fc3a6278dEvan Cheng FOR, 5168c47cba3589b2fc079bab0836d1ae6fc3a6278dEvan Cheng 52223547ab3101f32252cb704a67bd757e00fdbd16Evan Cheng /// FXOR - Bitwise logical XOR of floating point values. This corresponds 53223547ab3101f32252cb704a67bd757e00fdbd16Evan Cheng /// to X86::XORPS or X86::XORPD. 54223547ab3101f32252cb704a67bd757e00fdbd16Evan Cheng FXOR, 55223547ab3101f32252cb704a67bd757e00fdbd16Evan Cheng 5673d6cf12adfd915897cce7e1ba9de00f962502d5Evan Cheng /// FSRL - Bitwise logical right shift of floating point values. These 5773d6cf12adfd915897cce7e1ba9de00f962502d5Evan Cheng /// corresponds to X86::PSRLDQ. 5868c47cba3589b2fc079bab0836d1ae6fc3a6278dEvan Cheng FSRL, 5968c47cba3589b2fc079bab0836d1ae6fc3a6278dEvan Cheng 6098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman /// CALL - These operations represent an abstract X86 call 61dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner /// instruction, which includes a bunch of information. In particular the 62dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner /// operands of these node are: 63dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner /// 64dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner /// #0 - The incoming token chain 65dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner /// #1 - The callee 66dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner /// #2 - The number of arg bytes the caller pushes on the stack. 67dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner /// #3 - The number of arg bytes the callee pops off the stack. 68dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner /// #4 - The value to pass in AL/AX/EAX (optional) 69dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner /// #5 - The value to pass in DL/DX/EDX (optional) 70dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner /// 71dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner /// The result values of these nodes are: 72dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner /// 73dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner /// #0 - The outgoing token chain 74dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner /// #1 - The first register result value (optional) 75dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner /// #2 - The second register result value (optional) 76dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner /// 77dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner CALL, 7898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman 796e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer /// RDTSC_DAG - This operation implements the lowering for 80b873ff322c28ce097762355921100b677c71238dAndrew Lenharth /// readcyclecounter 81b873ff322c28ce097762355921100b677c71238dAndrew Lenharth RDTSC_DAG, 827df96d66729d1f33934de7b52553e5f071686041Evan Cheng 837df96d66729d1f33934de7b52553e5f071686041Evan Cheng /// X86 compare and logical compare instructions. 847d6ff3a25d9be6fae7ad95837ba8f1a8738947b6Evan Cheng CMP, COMI, UCOMI, 857df96d66729d1f33934de7b52553e5f071686041Evan Cheng 86c7a37d4ff2ee8ffb93ba97e9393ff582f0e79a9aDan Gohman /// X86 bit-test instructions. 87c7a37d4ff2ee8ffb93ba97e9393ff582f0e79a9aDan Gohman BT, 88c7a37d4ff2ee8ffb93ba97e9393ff582f0e79a9aDan Gohman 895b85654844d673939bd1ceba66cd1f5022fd7c0dChris Lattner /// X86 SetCC. Operand 0 is condition code, and operand 1 is the EFLAGS 905b85654844d673939bd1ceba66cd1f5022fd7c0dChris Lattner /// operand, usually produced by a CMP instruction. 91d5781fca4f8f98863560338d4f8d017389428119Evan Cheng SETCC, 92d5781fca4f8f98863560338d4f8d017389428119Evan Cheng 93ad9c0a3d8bf625d169596547f893b9ec8b953e26Evan Cheng // Same as SETCC except it's materialized with a sbb and the value is all 94ad9c0a3d8bf625d169596547f893b9ec8b953e26Evan Cheng // one's or all zero's. 95c19d1c3ba2b216f0f91d71cf6fc2e983fc995854Chris Lattner SETCC_CARRY, // R = carry_bit ? ~0 : 0 96ad9c0a3d8bf625d169596547f893b9ec8b953e26Evan Cheng 97865f09334f67edb2000fb38c6c3c28283b88b3bfStuart Hastings /// X86 FP SETCC, implemented with CMP{cc}SS/CMP{cc}SD. 98865f09334f67edb2000fb38c6c3c28283b88b3bfStuart Hastings /// Operands are two FP values to compare; result is a mask of 99865f09334f67edb2000fb38c6c3c28283b88b3bfStuart Hastings /// 0s or 1s. Generally DTRT for C/C++ with NaNs. 100865f09334f67edb2000fb38c6c3c28283b88b3bfStuart Hastings FSETCCss, FSETCCsd, 101865f09334f67edb2000fb38c6c3c28283b88b3bfStuart Hastings 1024fd0dee3bfe8a35bbb62c9e9dea511cbc06cec2dStuart Hastings /// X86 MOVMSK{pd|ps}, extracts sign bits of two or four FP values, 1034fd0dee3bfe8a35bbb62c9e9dea511cbc06cec2dStuart Hastings /// result in an integer GPR. Needs masking for scalar result. 1044fd0dee3bfe8a35bbb62c9e9dea511cbc06cec2dStuart Hastings FGETSIGNx86, 1054fd0dee3bfe8a35bbb62c9e9dea511cbc06cec2dStuart Hastings 1062b9f4349086247c58ed0bcd17c7d11b14b14f52bChris Lattner /// X86 conditional moves. Operand 0 and operand 1 are the two values 1072b9f4349086247c58ed0bcd17c7d11b14b14f52bChris Lattner /// to select from. Operand 2 is the condition code, and operand 3 is the 1082b9f4349086247c58ed0bcd17c7d11b14b14f52bChris Lattner /// flag operand produced by a CMP or TEST instruction. It also writes a 1092b9f4349086247c58ed0bcd17c7d11b14b14f52bChris Lattner /// flag result. 1107df96d66729d1f33934de7b52553e5f071686041Evan Cheng CMOV, 111898101c15fa11a896deb4e2fcb73b4727e1dcc1fEvan Cheng 1122004eb6272d4787b9e08a83230fe022cbaf4deb0Dan Gohman /// X86 conditional branches. Operand 0 is the chain operand, operand 1 1132004eb6272d4787b9e08a83230fe022cbaf4deb0Dan Gohman /// is the block to branch if condition is true, operand 2 is the 1142004eb6272d4787b9e08a83230fe022cbaf4deb0Dan Gohman /// condition code, and operand 3 is the flag operand produced by a CMP 115d5781fca4f8f98863560338d4f8d017389428119Evan Cheng /// or TEST instruction. 116898101c15fa11a896deb4e2fcb73b4727e1dcc1fEvan Cheng BRCOND, 117b077b842b64af39c8e2e9aaad327b3be446790ddEvan Cheng 1182004eb6272d4787b9e08a83230fe022cbaf4deb0Dan Gohman /// Return with a flag operand. Operand 0 is the chain operand, operand 1192004eb6272d4787b9e08a83230fe022cbaf4deb0Dan Gohman /// 1 is the number of bytes of stack to pop. 120b077b842b64af39c8e2e9aaad327b3be446790ddEvan Cheng RET_FLAG, 12167f92a76497d1f50e0dd6279c81b45689bd463f5Evan Cheng 12267f92a76497d1f50e0dd6279c81b45689bd463f5Evan Cheng /// REP_STOS - Repeat fill, corresponds to X86::REP_STOSx. 12367f92a76497d1f50e0dd6279c81b45689bd463f5Evan Cheng REP_STOS, 12467f92a76497d1f50e0dd6279c81b45689bd463f5Evan Cheng 12567f92a76497d1f50e0dd6279c81b45689bd463f5Evan Cheng /// REP_MOVS - Repeat move, corresponds to X86::REP_MOVSx. 12667f92a76497d1f50e0dd6279c81b45689bd463f5Evan Cheng REP_MOVS, 127223547ab3101f32252cb704a67bd757e00fdbd16Evan Cheng 1287ccced634ae0ecdc1c4f599fd3abf188c367e231Evan Cheng /// GlobalBaseReg - On Darwin, this node represents the result of the popl 1297ccced634ae0ecdc1c4f599fd3abf188c367e231Evan Cheng /// at function entry, used for PIC code. 1307ccced634ae0ecdc1c4f599fd3abf188c367e231Evan Cheng GlobalBaseReg, 131a0ea0539e359f6d82218e5aa4cdf3b50b17d6fbdEvan Cheng 132056292fd738924f3f7703725d8f630983794b5a5Bill Wendling /// Wrapper - A wrapper node for TargetConstantPool, 133056292fd738924f3f7703725d8f630983794b5a5Bill Wendling /// TargetExternalSymbol, and TargetGlobalAddress. 134020d2e8e7aa36692af13c1215fdd6248a6d9e950Evan Cheng Wrapper, 13548090aa8145640c023563751a8a1e1bcc09125e5Evan Cheng 1360085a28d13f86b09ba0c83e8dce81de3ba15ca2dEvan Cheng /// WrapperRIP - Special wrapper used under X86-64 PIC mode for RIP 1370085a28d13f86b09ba0c83e8dce81de3ba15ca2dEvan Cheng /// relative displacements. 1380085a28d13f86b09ba0c83e8dce81de3ba15ca2dEvan Cheng WrapperRIP, 1390085a28d13f86b09ba0c83e8dce81de3ba15ca2dEvan Cheng 1400488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen /// MOVQ2DQ - Copies a 64-bit value from an MMX vector to the low word 1410488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen /// of an XMM vector, with the high word zero filled. 142eb38ebf15c326a5bb45ca9da6329cdf19ad6df95Mon P Wang MOVQ2DQ, 143eb38ebf15c326a5bb45ca9da6329cdf19ad6df95Mon P Wang 1440488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen /// MOVDQ2Q - Copies a 64-bit value from the low word of an XMM vector 1450488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen /// to an MMX vector. If you think this is too close to the previous 1460488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen /// mnemonic, so do I; blame Intel. 1470488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen MOVDQ2Q, 1480488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen 14914d12caf1d2de9618818646d12b30d647a860817Nate Begeman /// PEXTRB - Extract an 8-bit value from a vector and zero extend it to 15014d12caf1d2de9618818646d12b30d647a860817Nate Begeman /// i32, corresponds to X86::PEXTRB. 15114d12caf1d2de9618818646d12b30d647a860817Nate Begeman PEXTRB, 15214d12caf1d2de9618818646d12b30d647a860817Nate Begeman 153b067a1e7e68c4446d3512c25d3a5ac55c6dd76f8Evan Cheng /// PEXTRW - Extract a 16-bit value from a vector and zero extend it to 154653159f4aac61a7ad796e406a4899d27ffe5a789Evan Cheng /// i32, corresponds to X86::PEXTRW. 155b067a1e7e68c4446d3512c25d3a5ac55c6dd76f8Evan Cheng PEXTRW, 156653159f4aac61a7ad796e406a4899d27ffe5a789Evan Cheng 15714d12caf1d2de9618818646d12b30d647a860817Nate Begeman /// INSERTPS - Insert any element of a 4 x float vector into any element 15814d12caf1d2de9618818646d12b30d647a860817Nate Begeman /// of a destination 4 x floatvector. 15914d12caf1d2de9618818646d12b30d647a860817Nate Begeman INSERTPS, 16014d12caf1d2de9618818646d12b30d647a860817Nate Begeman 16114d12caf1d2de9618818646d12b30d647a860817Nate Begeman /// PINSRB - Insert the lower 8-bits of a 32-bit value to a vector, 16214d12caf1d2de9618818646d12b30d647a860817Nate Begeman /// corresponds to X86::PINSRB. 16314d12caf1d2de9618818646d12b30d647a860817Nate Begeman PINSRB, 16414d12caf1d2de9618818646d12b30d647a860817Nate Begeman 165653159f4aac61a7ad796e406a4899d27ffe5a789Evan Cheng /// PINSRW - Insert the lower 16-bits of a 32-bit value to a vector, 166653159f4aac61a7ad796e406a4899d27ffe5a789Evan Cheng /// corresponds to X86::PINSRW. 1678f2b4cc07161b56e56d6615761ea4ba08dc0e7d3Chris Lattner PINSRW, MMX_PINSRW, 1688ca29326e19201075f6dc95781560ea9ad41ececEvan Cheng 169b9a47b824f6c8ef3989a796018bf974c09cd243fNate Begeman /// PSHUFB - Shuffle 16 8-bit values within a vector. 170b9a47b824f6c8ef3989a796018bf974c09cd243fNate Begeman PSHUFB, 17195771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson 172c1af4772f1f71a955c7c9cfbabba98a2a2c109e4Bruno Cardoso Lopes /// ANDNP - Bitwise Logical AND NOT of Packed FP values. 173c1af4772f1f71a955c7c9cfbabba98a2a2c109e4Bruno Cardoso Lopes ANDNP, 17495771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson 1753113384a346709f1c3578c4ff2bd15c920dc02a6Craig Topper /// PSIGN - Copy integer sign. 1763113384a346709f1c3578c4ff2bd15c920dc02a6Craig Topper PSIGN, 17795771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson 178e611378a6e45fcb4a039d8c0089cd8fed2d311dcNadav Rotem /// BLENDV - Blend where the selector is an XMM. 1798ffad56f8eb41c73ecf40d1aa473819eb6915c12Nadav Rotem BLENDV, 18095771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson 181e611378a6e45fcb4a039d8c0089cd8fed2d311dcNadav Rotem /// BLENDxx - Blend where the selector is an immediate. 182e611378a6e45fcb4a039d8c0089cd8fed2d311dcNadav Rotem BLENDPW, 183e611378a6e45fcb4a039d8c0089cd8fed2d311dcNadav Rotem BLENDPS, 184e611378a6e45fcb4a039d8c0089cd8fed2d311dcNadav Rotem BLENDPD, 185e611378a6e45fcb4a039d8c0089cd8fed2d311dcNadav Rotem 18654f952afac04cb1e944f4fa0c1cd494e291bef20Craig Topper /// HADD - Integer horizontal add. 18754f952afac04cb1e944f4fa0c1cd494e291bef20Craig Topper HADD, 18854f952afac04cb1e944f4fa0c1cd494e291bef20Craig Topper 18954f952afac04cb1e944f4fa0c1cd494e291bef20Craig Topper /// HSUB - Integer horizontal sub. 19054f952afac04cb1e944f4fa0c1cd494e291bef20Craig Topper HSUB, 19154f952afac04cb1e944f4fa0c1cd494e291bef20Craig Topper 19217470bee5fd18bb2eae7825dae535c060a34ee7dDuncan Sands /// FHADD - Floating point horizontal add. 19317470bee5fd18bb2eae7825dae535c060a34ee7dDuncan Sands FHADD, 19417470bee5fd18bb2eae7825dae535c060a34ee7dDuncan Sands 19517470bee5fd18bb2eae7825dae535c060a34ee7dDuncan Sands /// FHSUB - Floating point horizontal sub. 19617470bee5fd18bb2eae7825dae535c060a34ee7dDuncan Sands FHSUB, 19717470bee5fd18bb2eae7825dae535c060a34ee7dDuncan Sands 1988ca29326e19201075f6dc95781560ea9ad41ececEvan Cheng /// FMAX, FMIN - Floating point max and min. 1998ca29326e19201075f6dc95781560ea9ad41ececEvan Cheng /// 200b3a0417cad8b625acc3033bd5e24afb9ffd0b084Lauro Ramos Venancio FMAX, FMIN, 2012038252c6a36efd18cc0bef216fa2c5bb9236617Dan Gohman 2022038252c6a36efd18cc0bef216fa2c5bb9236617Dan Gohman /// FRSQRT, FRCP - Floating point reciprocal-sqrt and reciprocal 2032038252c6a36efd18cc0bef216fa2c5bb9236617Dan Gohman /// approximation. Note that these typically require refinement 2042038252c6a36efd18cc0bef216fa2c5bb9236617Dan Gohman /// in order to obtain suitable precision. 2052038252c6a36efd18cc0bef216fa2c5bb9236617Dan Gohman FRSQRT, FRCP, 2062038252c6a36efd18cc0bef216fa2c5bb9236617Dan Gohman 207094fad37b90946c91a09eb9270a0dbe800f49d87Rafael Espindola // TLSADDR - Thread Local Storage. 208094fad37b90946c91a09eb9270a0dbe800f49d87Rafael Espindola TLSADDR, 2096e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 21030ef0e5658b0b8b04437f73f74162d5d72923f29Eric Christopher // TLSCALL - Thread Local Storage. When calling to an OS provided 21130ef0e5658b0b8b04437f73f74162d5d72923f29Eric Christopher // thunk at the address from an earlier relocation. 21230ef0e5658b0b8b04437f73f74162d5d72923f29Eric Christopher TLSCALL, 213094fad37b90946c91a09eb9270a0dbe800f49d87Rafael Espindola 2147e2ff77ef05c23db6b9c82bc7a4110e170d7f94cEvan Cheng // EH_RETURN - Exception Handling helpers. 215c85e1716f0e45e4c18a9ef2fbe431a51ac3a4252Arnold Schwaighofer EH_RETURN, 2166e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 2174fe3073cfb5273a3655aef0c8d50c96882f26882Arnold Schwaighofer /// TC_RETURN - Tail call return. 2184fe3073cfb5273a3655aef0c8d50c96882f26882Arnold Schwaighofer /// operand #0 chain 2194fe3073cfb5273a3655aef0c8d50c96882f26882Arnold Schwaighofer /// operand #1 callee (register or absolute) 2204fe3073cfb5273a3655aef0c8d50c96882f26882Arnold Schwaighofer /// operand #2 stack adjustment 2214fe3073cfb5273a3655aef0c8d50c96882f26882Arnold Schwaighofer /// operand #3 optional in flag 22245b22fa9f1f085d7971cce6db4f11b353e1646c6Anton Korobeynikov TC_RETURN, 22345b22fa9f1f085d7971cce6db4f11b353e1646c6Anton Korobeynikov 224d880b97257c7f8ec4e94948874cb87c865d9f96fEvan Cheng // VZEXT_MOVL - Vector move low and zero extend. 225d880b97257c7f8ec4e94948874cb87c865d9f96fEvan Cheng VZEXT_MOVL, 226d880b97257c7f8ec4e94948874cb87c865d9f96fEvan Cheng 2275b209e84f498b0e98d7f92123eac50a651aa01e1Craig Topper // VSEXT_MOVL - Vector move low and sign extend. 228dcabc7bca9b81c384d307cbb7d28b29451e263f2Elena Demikhovsky VSEXT_MOVL, 229dcabc7bca9b81c384d307cbb7d28b29451e263f2Elena Demikhovsky 230ed2e13d66709d41a26b96e2a02b6f2797ff2e7b7Craig Topper // VSHL, VSRL - 128-bit vector logical left / right shift 231ed2e13d66709d41a26b96e2a02b6f2797ff2e7b7Craig Topper VSHLDQ, VSRLDQ, 232ed2e13d66709d41a26b96e2a02b6f2797ff2e7b7Craig Topper 233ed2e13d66709d41a26b96e2a02b6f2797ff2e7b7Craig Topper // VSHL, VSRL, VSRA - Vector shift elements 234ed2e13d66709d41a26b96e2a02b6f2797ff2e7b7Craig Topper VSHL, VSRL, VSRA, 235ed2e13d66709d41a26b96e2a02b6f2797ff2e7b7Craig Topper 236ed2e13d66709d41a26b96e2a02b6f2797ff2e7b7Craig Topper // VSHLI, VSRLI, VSRAI - Vector shift elements by immediate 237ed2e13d66709d41a26b96e2a02b6f2797ff2e7b7Craig Topper VSHLI, VSRLI, VSRAI, 2389008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman 2391906d32e55224b7481cd9e5726bd5e14b55f5cc1Craig Topper // CMPP - Vector packed double/float comparison. 2401906d32e55224b7481cd9e5726bd5e14b55f5cc1Craig Topper CMPP, 2416e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 24230a0de94e7a5cbdcd277a93e543b0788efa78ddcNate Begeman // PCMP* - Vector integer comparisons. 24367609fd0eb05a49cc4636d507398034393dcf302Craig Topper PCMPEQ, PCMPGT, 244ab55ebda1c2254f98b06e770bc2dae7d05a4a366Bill Wendling 24586c7c583a36e54ea13f2ee31d622090b4fe9c184Craig Topper // VPCOM, VPCOMU - XOP Vector integer comparisons. 24686c7c583a36e54ea13f2ee31d622090b4fe9c184Craig Topper VPCOM, VPCOMU, 24786c7c583a36e54ea13f2ee31d622090b4fe9c184Craig Topper 248b20e0b1fddfd9099e12b84a71fbc8ccff5a12b10Chris Lattner // ADD, SUB, SMUL, etc. - Arithmetic operations with FLAGS results. 2495b85654844d673939bd1ceba66cd1f5022fd7c0dChris Lattner ADD, SUB, ADC, SBB, SMUL, 250e220c4b3d97bbdc9f6e8cf040942514612349c41Dan Gohman INC, DEC, OR, XOR, AND, 25195771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson 25254a11176f6a5e07e243f1d87ba19ac3f4681976bCraig Topper ANDN, // ANDN - Bitwise AND NOT with FLAGS results. 25354a11176f6a5e07e243f1d87ba19ac3f4681976bCraig Topper 254b4c945716f232ee07ec6fd3e1146175801fa1278Craig Topper BLSI, // BLSI - Extract lowest set isolated bit 255b4c945716f232ee07ec6fd3e1146175801fa1278Craig Topper BLSMSK, // BLSMSK - Get mask up to lowest set bit 256b4c945716f232ee07ec6fd3e1146175801fa1278Craig Topper BLSR, // BLSR - Reset lowest set bit 257b4c945716f232ee07ec6fd3e1146175801fa1278Craig Topper 258b20e0b1fddfd9099e12b84a71fbc8ccff5a12b10Chris Lattner UMUL, // LOW, HI, FLAGS = umul LHS, RHS 25973f24c9f0d9afd1fd65d544f2b7b7b7c77fc2238Evan Cheng 26073f24c9f0d9afd1fd65d544f2b7b7b7c77fc2238Evan Cheng // MUL_IMM - X86 specific multiply by immediate. 26171c6753d03d1bb27d0cf997285c425d631e5807bEric Christopher MUL_IMM, 2626e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 26371c6753d03d1bb27d0cf997285c425d631e5807bEric Christopher // PTEST - Vector bitwise comparisons 264d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman PTEST, 265d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman 266045573ce21282ee7d1c58e57d00a77ede8c732daBruno Cardoso Lopes // TESTP - Vector packed fp sign bitwise comparisons 267045573ce21282ee7d1c58e57d00a77ede8c732daBruno Cardoso Lopes TESTP, 268045573ce21282ee7d1c58e57d00a77ede8c732daBruno Cardoso Lopes 2693157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes // Several flavors of instructions with vector shuffle behaviors. 2703157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes PALIGN, 2713157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes PSHUFD, 2723157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes PSHUFHW, 2733157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes PSHUFLW, 274b3982da7d219edb24795d7e01513cc55fcd7bd16Craig Topper SHUFP, 2753157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes MOVDDUP, 2763157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes MOVSHDUP, 2773157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes MOVSLDUP, 2783157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes MOVLHPS, 2793157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes MOVLHPD, 280f2db5b48d0a4f0800e83d8c3cd6dc5ad6a551bd6Bruno Cardoso Lopes MOVHLPS, 28156098f5d26ed05401bd889960deffa72eb7bbce9Bruno Cardoso Lopes MOVLPS, 28256098f5d26ed05401bd889960deffa72eb7bbce9Bruno Cardoso Lopes MOVLPD, 2833157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes MOVSD, 2843157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes MOVSS, 28534671b812a9855623fd9a02e5e2b2cb95a13ba2fCraig Topper UNPCKL, 28634671b812a9855623fd9a02e5e2b2cb95a13ba2fCraig Topper UNPCKH, 287316cd2a2c57037ecca93bb20d939b89dad4c5243Craig Topper VPERMILP, 2888325c11d473a340217fa0de648ba8f733f2d626eCraig Topper VPERMV, 2898325c11d473a340217fa0de648ba8f733f2d626eCraig Topper VPERMI, 290ec24e61ab0a22f58fedac374ef0df3e69d9a2587Craig Topper VPERM2X128, 2910e6d230abdbf6ba67a2676c118431a4df8fb15ddBruno Cardoso Lopes VBROADCAST, 2923157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes 2935b209e84f498b0e98d7f92123eac50a651aa01e1Craig Topper // PMULUDQ - Vector multiply packed unsigned doubleword integers 2945b209e84f498b0e98d7f92123eac50a651aa01e1Craig Topper PMULUDQ, 2955b209e84f498b0e98d7f92123eac50a651aa01e1Craig Topper 296d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman // VASTART_SAVE_XMM_REGS - Save xmm argument registers to the stack, 297d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman // according to %al. An operator is needed so that this can be expanded 298d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman // with control flow. 299c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman VASTART_SAVE_XMM_REGS, 300c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman 301e9c253e0bc01fd50bf788efb62093a5fa6ef5849Michael J. Spencer // WIN_ALLOCA - Windows's _chkstk call to do stack probing. 302e9c253e0bc01fd50bf788efb62093a5fa6ef5849Michael J. Spencer WIN_ALLOCA, 303043f3c2a0e286dcfd4cc5a16bf006e3c45929516Anton Korobeynikov 304d07b7ec77203d4dbaf426786912a700cc07f0142Rafael Espindola // SEG_ALLOCA - For allocating variable amounts of stack space when using 305d07b7ec77203d4dbaf426786912a700cc07f0142Rafael Espindola // segmented stacks. Check if the current stacklet has enough space, and 3065c984df26b0391fec853f76722df7b2bb2c9ee4cRafael Espindola // falls back to heap allocation if not. 307d07b7ec77203d4dbaf426786912a700cc07f0142Rafael Espindola SEG_ALLOCA, 308d07b7ec77203d4dbaf426786912a700cc07f0142Rafael Espindola 3091a2d061ec08b86ba91d7009b6ffcf08d5bac3f42Michael J. Spencer // WIN_FTOL - Windows's _ftol2 runtime routine to do fptoui. 3101a2d061ec08b86ba91d7009b6ffcf08d5bac3f42Michael J. Spencer WIN_FTOL, 3111a2d061ec08b86ba91d7009b6ffcf08d5bac3f42Michael J. Spencer 31259d2dad59ebba1d82e5b72f78b7a5b2c873445d7Duncan Sands // Memory barrier 31359d2dad59ebba1d82e5b72f78b7a5b2c873445d7Duncan Sands MEMBARRIER, 31459d2dad59ebba1d82e5b72f78b7a5b2c873445d7Duncan Sands MFENCE, 31559d2dad59ebba1d82e5b72f78b7a5b2c873445d7Duncan Sands SFENCE, 31659d2dad59ebba1d82e5b72f78b7a5b2c873445d7Duncan Sands LFENCE, 31759d2dad59ebba1d82e5b72f78b7a5b2c873445d7Duncan Sands 3186e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer // ATOMADD64_DAG, ATOMSUB64_DAG, ATOMOR64_DAG, ATOMAND64_DAG, 3196e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer // ATOMXOR64_DAG, ATOMNAND64_DAG, ATOMSWAP64_DAG - 320c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman // Atomic 64-bit binary operations. 321c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman ATOMADD64_DAG = ISD::FIRST_TARGET_MEMORY_OPCODE, 322c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman ATOMSUB64_DAG, 323c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman ATOMOR64_DAG, 324c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman ATOMXOR64_DAG, 325c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman ATOMAND64_DAG, 326c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman ATOMNAND64_DAG, 3279a9d275dc7897dfba7f41ce1b3770ca27ac149e8Eric Christopher ATOMSWAP64_DAG, 3286e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 32943f51aeca8367ea35adad963c00bd2bc5b8d1391Eli Friedman // LCMPXCHG_DAG, LCMPXCHG8_DAG, LCMPXCHG16_DAG - Compare and swap. 33093c4a5bef780e43552d3b9d702756d3acb7801d2Chris Lattner LCMPXCHG_DAG, 3318864155a35eb59fbebfd1822aaf224128b5c5d23Chris Lattner LCMPXCHG8_DAG, 33243f51aeca8367ea35adad963c00bd2bc5b8d1391Eli Friedman LCMPXCHG16_DAG, 333043f3c2a0e286dcfd4cc5a16bf006e3c45929516Anton Korobeynikov 3348864155a35eb59fbebfd1822aaf224128b5c5d23Chris Lattner // VZEXT_LOAD - Load, scalar_to_vector, and zero extend. 3350729093cd7e15ed6469e50b74f0edd7f205b50ffChris Lattner VZEXT_LOAD, 3366e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 3372156b79c493751f165d445535f8b598b4769b3e8Chris Lattner // FNSTCW16m - Store FP control world into i16 memory. 3382156b79c493751f165d445535f8b598b4769b3e8Chris Lattner FNSTCW16m, 3396e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 3400729093cd7e15ed6469e50b74f0edd7f205b50ffChris Lattner /// FP_TO_INT*_IN_MEM - This instruction implements FP_TO_SINT with the 3410729093cd7e15ed6469e50b74f0edd7f205b50ffChris Lattner /// integer destination in memory and a FP reg source. This corresponds 3420729093cd7e15ed6469e50b74f0edd7f205b50ffChris Lattner /// to the X86::FIST*m instructions and the rounding mode change stuff. It 3430729093cd7e15ed6469e50b74f0edd7f205b50ffChris Lattner /// has two inputs (token chain and address) and two outputs (int value 3440729093cd7e15ed6469e50b74f0edd7f205b50ffChris Lattner /// and token chain). 3450729093cd7e15ed6469e50b74f0edd7f205b50ffChris Lattner FP_TO_INT16_IN_MEM, 3460729093cd7e15ed6469e50b74f0edd7f205b50ffChris Lattner FP_TO_INT32_IN_MEM, 347492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner FP_TO_INT64_IN_MEM, 3486e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 349492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner /// FILD, FILD_FLAG - This instruction implements SINT_TO_FP with the 350492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner /// integer source in memory and FP reg result. This corresponds to the 351492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner /// X86::FILD*m instructions. It has three inputs (token chain, address, 352492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner /// and source type) and two outputs (FP value and token chain). FILD_FLAG 353492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner /// also produces a flag). 354492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner FILD, 355492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner FILD_FLAG, 3566e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 357492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner /// FLD - This instruction implements an extending load to FP stack slots. 358492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner /// This corresponds to the X86::FLD32m / X86::FLD64m. It takes a chain 359492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner /// operand, ptr to load from, and a ValueType node indicating the type 360492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner /// to load to. 361492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner FLD, 3626e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 363492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner /// FST - This instruction implements a truncating store to FP stack 364492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner /// slots. This corresponds to the X86::FST32m / X86::FST64m. It takes a 365492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner /// chain operand, value to store, address, and a ValueType to store it 366492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner /// as. 367320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman FST, 368320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman 369320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman /// VAARG_64 - This instruction grabs the address of the next argument 370320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman /// from a va_list. (reads and modifies the va_list in memory) 371320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman VAARG_64 3726e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 373043f3c2a0e286dcfd4cc5a16bf006e3c45929516Anton Korobeynikov // WARNING: Do not add anything in the end unless you want the node to 374043f3c2a0e286dcfd4cc5a16bf006e3c45929516Anton Korobeynikov // have memop! In fact, starting from ATOMADD64_DAG all opcodes will be 375043f3c2a0e286dcfd4cc5a16bf006e3c45929516Anton Korobeynikov // thought as target memory ops! 376dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner }; 377dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner } 378dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner 3790d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng /// Define some predicates that are used for node matching. 3800d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng namespace X86 { 381c38a03eeca3a506577b2d5a29629a81a0cefff03David Greene /// isVEXTRACTF128Index - Return true if the specified 382c38a03eeca3a506577b2d5a29629a81a0cefff03David Greene /// EXTRACT_SUBVECTOR operand specifies a vector extract that is 383c38a03eeca3a506577b2d5a29629a81a0cefff03David Greene /// suitable for input to VEXTRACTF128. 384c38a03eeca3a506577b2d5a29629a81a0cefff03David Greene bool isVEXTRACTF128Index(SDNode *N); 385c38a03eeca3a506577b2d5a29629a81a0cefff03David Greene 386ccacdc1952d022108d51b1c8270eb85b2b862c9dDavid Greene /// isVINSERTF128Index - Return true if the specified 387ccacdc1952d022108d51b1c8270eb85b2b862c9dDavid Greene /// INSERT_SUBVECTOR operand specifies a subvector insert that is 388ccacdc1952d022108d51b1c8270eb85b2b862c9dDavid Greene /// suitable for input to VINSERTF128. 389ccacdc1952d022108d51b1c8270eb85b2b862c9dDavid Greene bool isVINSERTF128Index(SDNode *N); 390ccacdc1952d022108d51b1c8270eb85b2b862c9dDavid Greene 391c38a03eeca3a506577b2d5a29629a81a0cefff03David Greene /// getExtractVEXTRACTF128Immediate - Return the appropriate 392c38a03eeca3a506577b2d5a29629a81a0cefff03David Greene /// immediate to extract the specified EXTRACT_SUBVECTOR index 393c38a03eeca3a506577b2d5a29629a81a0cefff03David Greene /// with VEXTRACTF128 instructions. 394c38a03eeca3a506577b2d5a29629a81a0cefff03David Greene unsigned getExtractVEXTRACTF128Immediate(SDNode *N); 395c38a03eeca3a506577b2d5a29629a81a0cefff03David Greene 396ccacdc1952d022108d51b1c8270eb85b2b862c9dDavid Greene /// getInsertVINSERTF128Immediate - Return the appropriate 397ccacdc1952d022108d51b1c8270eb85b2b862c9dDavid Greene /// immediate to insert at the specified INSERT_SUBVECTOR index 398ccacdc1952d022108d51b1c8270eb85b2b862c9dDavid Greene /// with VINSERTF128 instructions. 399ccacdc1952d022108d51b1c8270eb85b2b862c9dDavid Greene unsigned getInsertVINSERTF128Immediate(SDNode *N); 400ccacdc1952d022108d51b1c8270eb85b2b862c9dDavid Greene 40137b7387da90ffd42d28ad0f08fca00b684294b2cEvan Cheng /// isZeroNode - Returns true if Elt is a constant zero or a floating point 40237b7387da90ffd42d28ad0f08fca00b684294b2cEvan Cheng /// constant +0.0. 40337b7387da90ffd42d28ad0f08fca00b684294b2cEvan Cheng bool isZeroNode(SDValue Elt); 404b5e01724057e6eabc45da75df3037af4ad29248cAnton Korobeynikov 405b5e01724057e6eabc45da75df3037af4ad29248cAnton Korobeynikov /// isOffsetSuitableForCodeModel - Returns true of the given offset can be 406b5e01724057e6eabc45da75df3037af4ad29248cAnton Korobeynikov /// fit into displacement field of the instruction. 407b5e01724057e6eabc45da75df3037af4ad29248cAnton Korobeynikov bool isOffsetSuitableForCodeModel(int64_t Offset, CodeModel::Model M, 408b5e01724057e6eabc45da75df3037af4ad29248cAnton Korobeynikov bool hasSymbolicDisplacement = true); 409ef41ff618f2537539b538e6c7bf471c753391f92Evan Cheng 410ef41ff618f2537539b538e6c7bf471c753391f92Evan Cheng 411ef41ff618f2537539b538e6c7bf471c753391f92Evan Cheng /// isCalleePop - Determines whether the callee is required to pop its 412ef41ff618f2537539b538e6c7bf471c753391f92Evan Cheng /// own arguments. Callee pop is necessary to support tail calls. 413ef41ff618f2537539b538e6c7bf471c753391f92Evan Cheng bool isCalleePop(CallingConv::ID CallingConv, 414ef41ff618f2537539b538e6c7bf471c753391f92Evan Cheng bool is64Bit, bool IsVarArg, bool TailCallOpt); 4150d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng } 4160d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng 41791897778690a7d683497ba3f4040ebf09345f08aChris Lattner //===--------------------------------------------------------------------===// 418dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner // X86TargetLowering - X86 Implementation of the TargetLowering interface 419dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner class X86TargetLowering : public TargetLowering { 420dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner public: 421c9f5f3f64f896d0a8c8fa35a1dd98bc57b8960f6Dan Gohman explicit X86TargetLowering(X86TargetMachine &TM); 422dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner 423c64daabb70a2e0cb115f78b0c1548e65c0d527ffChris Lattner virtual unsigned getJumpTableEncoding() const; 4245e1df8d1f71f1a8a534b8b5929a7dd670fe010c6Chris Lattner 42595771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson virtual MVT getShiftAmountTy(EVT LHSTy) const { return MVT::i8; } 42695771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson 427c64daabb70a2e0cb115f78b0c1548e65c0d527ffChris Lattner virtual const MCExpr * 428c64daabb70a2e0cb115f78b0c1548e65c0d527ffChris Lattner LowerCustomJumpTableEntry(const MachineJumpTableInfo *MJTI, 429c64daabb70a2e0cb115f78b0c1548e65c0d527ffChris Lattner const MachineBasicBlock *MBB, unsigned uid, 430c64daabb70a2e0cb115f78b0c1548e65c0d527ffChris Lattner MCContext &Ctx) const; 4316e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 432cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng /// getPICJumpTableRelocaBase - Returns relocation base for the given PIC 433cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng /// jumptable. 434c64daabb70a2e0cb115f78b0c1548e65c0d527ffChris Lattner virtual SDValue getPICJumpTableRelocBase(SDValue Table, 435c64daabb70a2e0cb115f78b0c1548e65c0d527ffChris Lattner SelectionDAG &DAG) const; 436589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner virtual const MCExpr * 437589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner getPICJumpTableRelocBaseExpr(const MachineFunction *MF, 438589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner unsigned JTI, MCContext &Ctx) const; 4396e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 44054e3efde4636dade74f95ede039091bf52ca1585Chris Lattner /// getStackPtrReg - Return the stack pointer register we are using: either 44154e3efde4636dade74f95ede039091bf52ca1585Chris Lattner /// ESP or RSP. 44254e3efde4636dade74f95ede039091bf52ca1585Chris Lattner unsigned getStackPtrReg() const { return X86StackPtr; } 44329286502628867b31872ead2f2527592480f0970Evan Cheng 44429286502628867b31872ead2f2527592480f0970Evan Cheng /// getByValTypeAlignment - Return the desired alignment for ByVal aggregate 44529286502628867b31872ead2f2527592480f0970Evan Cheng /// function arguments in the caller parameter area. For X86, aggregates 44629286502628867b31872ead2f2527592480f0970Evan Cheng /// that contains are placed at 16-byte boundaries while the rest are at 44729286502628867b31872ead2f2527592480f0970Evan Cheng /// 4-byte boundaries. 448db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner virtual unsigned getByValTypeAlignment(Type *Ty) const; 449f0df03134e698ea84e9cc1c28a853f83c02560d5Evan Cheng 450f0df03134e698ea84e9cc1c28a853f83c02560d5Evan Cheng /// getOptimalMemOpType - Returns the target specific optimal type for load 451f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng /// and store operations as a result of memset, memcpy, and memmove 452f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng /// lowering. If DstAlign is zero that means it's safe to destination 453f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng /// alignment can satisfy any constraint. Similarly if SrcAlign is zero it 454f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng /// means there isn't a need to check it against alignment requirement, 455f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng /// probably because the source does not need to be loaded. If 45615701f8969fcb36899a75ca2df6fdcbc52141106Lang Hames /// 'IsZeroVal' is true, that means it's safe to return a 457f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng /// non-scalar-integer type, e.g. empty string source, constant, or loaded 458c3b0c341e731b27b550ee9dcded9c17232b296b8Evan Cheng /// from memory. 'MemcpyStrSrc' indicates whether the memcpy source is 459c3b0c341e731b27b550ee9dcded9c17232b296b8Evan Cheng /// constant so it does not need to be loaded. 46037f32ee7ffe77d7c2bc1b185802e98979612f041Dan Gohman /// It returns EVT::Other if the type should be determined using generic 46137f32ee7ffe77d7c2bc1b185802e98979612f041Dan Gohman /// target-independent logic. 462f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng virtual EVT 463c3b0c341e731b27b550ee9dcded9c17232b296b8Evan Cheng getOptimalMemOpType(uint64_t Size, unsigned DstAlign, unsigned SrcAlign, 46415701f8969fcb36899a75ca2df6fdcbc52141106Lang Hames bool IsZeroVal, bool MemcpyStrSrc, 46537f32ee7ffe77d7c2bc1b185802e98979612f041Dan Gohman MachineFunction &MF) const; 466af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling 467af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling /// allowsUnalignedMemoryAccesses - Returns true if the target allows 468af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling /// unaligned memory accesses. of the specified type. 469af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling virtual bool allowsUnalignedMemoryAccesses(EVT VT) const { 470af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling return true; 471af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling } 47220c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling 473dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner /// LowerOperation - Provide custom lowering hooks for some operations. 474dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner /// 475d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const; 476dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner 4771607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands /// ReplaceNodeResults - Replace the results of node with an illegal result 4781607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands /// type with new values built out of custom code. 47927a6c7380fa4dfc8e1837a8dd67967d063b26544Chris Lattner /// 4801607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands virtual void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results, 481d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SelectionDAG &DAG) const; 48227a6c7380fa4dfc8e1837a8dd67967d063b26544Chris Lattner 4836e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 484475871a144eb604ddaf37503397ba0941442e5fbDan Gohman virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const; 485206ee9d86cd4e78176fad6bfa2b016023edf5df7Evan Cheng 486e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng /// isTypeDesirableForOp - Return true if the target has native support for 487e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng /// the specified value type and it is 'desirable' to use the type for the 488e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng /// given node type. e.g. On x86 i16 is legal, but undesirable since i16 489e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng /// instruction encodings are longer and some i16 instructions are slow. 490e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng virtual bool isTypeDesirableForOp(unsigned Opc, EVT VT) const; 491e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng 492e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng /// isTypeDesirable - Return true if the target has native support for the 493e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng /// specified value type and it is 'desirable' to use the type. e.g. On x86 494e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng /// i16 is legal, but undesirable since i16 instruction encodings are longer 495e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng /// and some i16 instructions are slow. 496e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng virtual bool IsDesirableToPromoteOp(SDValue Op, EVT &PVT) const; 49764b7bf71e84094193b40ab81aa7dacad921ecbeaEvan Cheng 498af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman virtual MachineBasicBlock * 499af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman EmitInstrWithCustomInserter(MachineInstr *MI, 500af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman MachineBasicBlock *MBB) const; 5014a46080fe0133c71b511805c63abfb158dcd56a5Evan Cheng 5026e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 5037226158d7e3986e55b58214a749aa4eabb3fb6d5Evan Cheng /// getTargetNodeName - This method returns the name of a target specific 5047226158d7e3986e55b58214a749aa4eabb3fb6d5Evan Cheng /// DAG node. 5057226158d7e3986e55b58214a749aa4eabb3fb6d5Evan Cheng virtual const char *getTargetNodeName(unsigned Opcode) const; 5067226158d7e3986e55b58214a749aa4eabb3fb6d5Evan Cheng 50728b77e968d2b01fc9da724762bd8ddcd80650e32Duncan Sands /// getSetCCResultType - Return the value type to use for ISD::SETCC. 50828b77e968d2b01fc9da724762bd8ddcd80650e32Duncan Sands virtual EVT getSetCCResultType(EVT VT) const; 5095b8f82e35b51bf007de07a7ca9347d804084ddf8Scott Michel 5106e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer /// computeMaskedBitsForTargetNode - Determine which of the bits specified 5116e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer /// in Mask are known to be either zero or one and return them in the 512368e18d56a87308045d341e85584597bfe7426e9Nate Begeman /// KnownZero/KnownOne bitsets. 513475871a144eb604ddaf37503397ba0941442e5fbDan Gohman virtual void computeMaskedBitsForTargetNode(const SDValue Op, 5146e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer APInt &KnownZero, 515fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman APInt &KnownOne, 516ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman const SelectionDAG &DAG, 517368e18d56a87308045d341e85584597bfe7426e9Nate Begeman unsigned Depth = 0) const; 518ad4196b44ae714a6b95e238d9d96303df74b0429Evan Cheng 519bc146b0a4dcee601459eee943b4133d3cf63f1ddOwen Anderson // ComputeNumSignBitsForTargetNode - Determine the number of bits in the 520bc146b0a4dcee601459eee943b4133d3cf63f1ddOwen Anderson // operation that are sign bits. 521bc146b0a4dcee601459eee943b4133d3cf63f1ddOwen Anderson virtual unsigned ComputeNumSignBitsForTargetNode(SDValue Op, 522bc146b0a4dcee601459eee943b4133d3cf63f1ddOwen Anderson unsigned Depth) const; 523bc146b0a4dcee601459eee943b4133d3cf63f1ddOwen Anderson 524ad4196b44ae714a6b95e238d9d96303df74b0429Evan Cheng virtual bool 52546510a73e977273ec67747eb34cbdb43f815e451Dan Gohman isGAPlusOffset(SDNode *N, const GlobalValue* &GA, int64_t &Offset) const; 5266e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 527d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue getReturnAddressFrameIndex(SelectionDAG &DAG) const; 528dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner 529b8105651527670cb456eb46dd4346bacd3905361Chris Lattner virtual bool ExpandInlineAsm(CallInst *CI) const; 5306e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 5314234f57fa02b1f04a9f52a7b3c2aa22d32ac521cChris Lattner ConstraintType getConstraintType(const std::string &Constraint) const; 5326e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 53344ab89eb376af838d1123293a79975aede501464John Thompson /// Examine constraint string and operand type and determine a weight value. 534eac6e1d0c748afc3d1496be0753ffbe5f5a4279bJohn Thompson /// The operand object must already have been set up with the operand type. 53544ab89eb376af838d1123293a79975aede501464John Thompson virtual ConstraintWeight getSingleConstraintMatchWeight( 536eac6e1d0c748afc3d1496be0753ffbe5f5a4279bJohn Thompson AsmOperandInfo &info, const char *constraint) const; 5376e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 538e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson virtual const char *LowerXConstraint(EVT ConstraintVT) const; 539ba2a0b960ea4c73d0f81557f63ae2ea126e08905Dale Johannesen 54048884cd80b52be1528618f2e9b3425ac24e7b5caChris Lattner /// LowerAsmOperandForConstraint - Lower the specified operand into the Ops 541da43bcf624acb56a3d77bb5ae9a02728af032613Evan Cheng /// vector. If it is invalid, don't add anything to Ops. If hasMemory is 542da43bcf624acb56a3d77bb5ae9a02728af032613Evan Cheng /// true it means one of the asm constraint of the inline asm instruction 543da43bcf624acb56a3d77bb5ae9a02728af032613Evan Cheng /// being processed is 'm'. 544475871a144eb604ddaf37503397ba0941442e5fbDan Gohman virtual void LowerAsmOperandForConstraint(SDValue Op, 545100c83341676d8aae8fc34b5452563ed08b14f3eEric Christopher std::string &Constraint, 546475871a144eb604ddaf37503397ba0941442e5fbDan Gohman std::vector<SDValue> &Ops, 5475e764233f398b6929b67701672a5e78fec20ce2eChris Lattner SelectionDAG &DAG) const; 5486e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 54991897778690a7d683497ba3f4040ebf09345f08aChris Lattner /// getRegForInlineAsmConstraint - Given a physical register constraint 55091897778690a7d683497ba3f4040ebf09345f08aChris Lattner /// (e.g. {edx}), return the register number and the register class for the 55191897778690a7d683497ba3f4040ebf09345f08aChris Lattner /// register. This should only be used for C_Register constraints. On 55291897778690a7d683497ba3f4040ebf09345f08aChris Lattner /// error, this returns a register number of 0. 5536e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer std::pair<unsigned, const TargetRegisterClass*> 554f76d180c9595d34641f4b5d2fbba2f2c175197d8Chris Lattner getRegForInlineAsmConstraint(const std::string &Constraint, 555e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson EVT VT) const; 5566e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 557c9addb74883fef318140272768422656a694341fChris Lattner /// isLegalAddressingMode - Return true if the addressing mode represented 558c9addb74883fef318140272768422656a694341fChris Lattner /// by AM is legal for this target, for a load/store of the specified type. 559db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner virtual bool isLegalAddressingMode(const AddrMode &AM, Type *Ty)const; 560c9addb74883fef318140272768422656a694341fChris Lattner 5612bd122c4d934a70e031dc0ca5171719bac66c2c9Evan Cheng /// isTruncateFree - Return true if it's free to truncate a value of 5622bd122c4d934a70e031dc0ca5171719bac66c2c9Evan Cheng /// type Ty1 to type Ty2. e.g. On x86 it's free to truncate a i32 value in 5632bd122c4d934a70e031dc0ca5171719bac66c2c9Evan Cheng /// register EAX to i16 by referencing its sub-register AX. 564db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner virtual bool isTruncateFree(Type *Ty1, Type *Ty2) const; 565e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson virtual bool isTruncateFree(EVT VT1, EVT VT2) const; 56697121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman 56797121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman /// isZExtFree - Return true if any actual instruction that defines a 56897121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman /// value of type Ty1 implicit zero-extends the value to Ty2 in the result 56997121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman /// register. This does not necessarily include registers defined in 57097121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman /// unknown ways, such as incoming arguments, or copies from unknown 57197121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman /// virtual registers. Also, if isTruncateFree(Ty2, Ty1) is true, this 57297121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman /// does not necessarily apply to truncate instructions. e.g. on x86-64, 57397121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman /// all instructions that define 32-bit values implicit zero-extend the 57497121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman /// result out to 64 bits. 575db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner virtual bool isZExtFree(Type *Ty1, Type *Ty2) const; 576e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson virtual bool isZExtFree(EVT VT1, EVT VT2) const; 57797121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman 5788b944d39b356135676459152385f05c496951f6cEvan Cheng /// isNarrowingProfitable - Return true if it's profitable to narrow 5798b944d39b356135676459152385f05c496951f6cEvan Cheng /// operations of type VT1 to VT2. e.g. on x86, it's profitable to narrow 5808b944d39b356135676459152385f05c496951f6cEvan Cheng /// from i32 to i8 but not from i32 to i16. 581e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson virtual bool isNarrowingProfitable(EVT VT1, EVT VT2) const; 5828b944d39b356135676459152385f05c496951f6cEvan Cheng 583eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng /// isFPImmLegal - Returns true if the target can instruction select the 584eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng /// specified FP immediate natively. If false, the legalizer will 585eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng /// materialize the FP immediate as a load from a constant pool. 586a1eaa3c52b75d4fe2bcd4f7c52e56c405ee91d3cEvan Cheng virtual bool isFPImmLegal(const APFloat &Imm, EVT VT) const; 587eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng 5880188ecba85c7139f237baa4ce5612fdfc83e1b84Evan Cheng /// isShuffleMaskLegal - Targets can use this to indicate that they only 5890188ecba85c7139f237baa4ce5612fdfc83e1b84Evan Cheng /// support *some* VECTOR_SHUFFLE operations, those with specific masks. 59091897778690a7d683497ba3f4040ebf09345f08aChris Lattner /// By default, if a target supports the VECTOR_SHUFFLE node, all mask 59191897778690a7d683497ba3f4040ebf09345f08aChris Lattner /// values are assumed to be legal. 5925a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman virtual bool isShuffleMaskLegal(const SmallVectorImpl<int> &Mask, 593e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson EVT VT) const; 59439623daef67090025be5cd8af7d172fd1c9e6418Evan Cheng 59539623daef67090025be5cd8af7d172fd1c9e6418Evan Cheng /// isVectorClearMaskLegal - Similar to isShuffleMaskLegal. This is 59639623daef67090025be5cd8af7d172fd1c9e6418Evan Cheng /// used by Targets can use this to indicate if there is a suitable 59739623daef67090025be5cd8af7d172fd1c9e6418Evan Cheng /// VECTOR_SHUFFLE that can be used to replace a VAND with a constant 59839623daef67090025be5cd8af7d172fd1c9e6418Evan Cheng /// pool entry. 5995a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman virtual bool isVectorClearMaskLegal(const SmallVectorImpl<int> &Mask, 600e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson EVT VT) const; 6016fd599fa6916bd9438dbea7994cf2437bdf4ab8cEvan Cheng 6026fd599fa6916bd9438dbea7994cf2437bdf4ab8cEvan Cheng /// ShouldShrinkFPConstant - If true, then instruction selection should 6036fd599fa6916bd9438dbea7994cf2437bdf4ab8cEvan Cheng /// seek to shrink the FP constant of the specified type to a smaller type 6046fd599fa6916bd9438dbea7994cf2437bdf4ab8cEvan Cheng /// in order to save space and / or reduce runtime. 605e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson virtual bool ShouldShrinkFPConstant(EVT VT) const { 6066fd599fa6916bd9438dbea7994cf2437bdf4ab8cEvan Cheng // Don't shrink FP constpool if SSE2 is available since cvtss2sd is more 6076fd599fa6916bd9438dbea7994cf2437bdf4ab8cEvan Cheng // expensive than a straight movsd. On the other hand, it's important to 6086fd599fa6916bd9438dbea7994cf2437bdf4ab8cEvan Cheng // shrink long double fp constant since fldt is very slow. 609825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson return !X86ScalarSSEf64 || VT == MVT::f80; 6106fd599fa6916bd9438dbea7994cf2437bdf4ab8cEvan Cheng } 6116e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 612419e4f92635cfaa409282691437aff99062e4e0bDan Gohman const X86Subtarget* getSubtarget() const { 613707e0184233f27e0e9f9aee0309f2daab8cfe7f8Dan Gohman return Subtarget; 614f1ba1cad387dc52f3c2c5afc665edf9caad00992Rafael Espindola } 615f1ba1cad387dc52f3c2c5afc665edf9caad00992Rafael Espindola 6163d66185ff8b276183fa8e9ce3d7ebb1d9ce88f74Chris Lattner /// isScalarFPTypeInSSEReg - Return true if the specified scalar FP type is 6173d66185ff8b276183fa8e9ce3d7ebb1d9ce88f74Chris Lattner /// computed in an SSE register, not on the X87 floating point stack. 618e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson bool isScalarFPTypeInSSEReg(EVT VT) const { 619825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson return (VT == MVT::f64 && X86ScalarSSEf64) || // f64 is when SSE2 620825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson (VT == MVT::f32 && X86ScalarSSEf32); // f32 is when SSE1 6213d66185ff8b276183fa8e9ce3d7ebb1d9ce88f74Chris Lattner } 622d9f3c480a7bc0969b08ace68af7dcde40f6caff1Dan Gohman 6231a2d061ec08b86ba91d7009b6ffcf08d5bac3f42Michael J. Spencer /// isTargetFTOL - Return true if the target uses the MSVC _ftol2 routine 6241a2d061ec08b86ba91d7009b6ffcf08d5bac3f42Michael J. Spencer /// for fptoui. 6251a2d061ec08b86ba91d7009b6ffcf08d5bac3f42Michael J. Spencer bool isTargetFTOL() const { 6261a2d061ec08b86ba91d7009b6ffcf08d5bac3f42Michael J. Spencer return Subtarget->isTargetWindows() && !Subtarget->is64Bit(); 6271a2d061ec08b86ba91d7009b6ffcf08d5bac3f42Michael J. Spencer } 6281a2d061ec08b86ba91d7009b6ffcf08d5bac3f42Michael J. Spencer 6291a2d061ec08b86ba91d7009b6ffcf08d5bac3f42Michael J. Spencer /// isIntegerTypeFTOL - Return true if the MSVC _ftol2 routine should be 6301a2d061ec08b86ba91d7009b6ffcf08d5bac3f42Michael J. Spencer /// used for fptoui to the given type. 6311a2d061ec08b86ba91d7009b6ffcf08d5bac3f42Michael J. Spencer bool isIntegerTypeFTOL(EVT VT) const { 6321a2d061ec08b86ba91d7009b6ffcf08d5bac3f42Michael J. Spencer return isTargetFTOL() && VT == MVT::i64; 6331a2d061ec08b86ba91d7009b6ffcf08d5bac3f42Michael J. Spencer } 6341a2d061ec08b86ba91d7009b6ffcf08d5bac3f42Michael J. Spencer 635d9f3c480a7bc0969b08ace68af7dcde40f6caff1Dan Gohman /// createFastISel - This method returns a target specific FastISel object, 636d9f3c480a7bc0969b08ace68af7dcde40f6caff1Dan Gohman /// or null if the target does not support "fast" ISel. 637a4160c3434b08288d1f79f1acbe453d1b9610b22Dan Gohman virtual FastISel *createFastISel(FunctionLoweringInfo &funcInfo) const; 63820c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling 639f7a0c7bf8bc8318ed28d889c9a56437ab3e91385Eric Christopher /// getStackCookieLocation - Return true if the target stores stack 640f7a0c7bf8bc8318ed28d889c9a56437ab3e91385Eric Christopher /// protector cookies at a fixed offset in some non-standard address 641f7a0c7bf8bc8318ed28d889c9a56437ab3e91385Eric Christopher /// space, and populates the address space and offset as 642f7a0c7bf8bc8318ed28d889c9a56437ab3e91385Eric Christopher /// appropriate. 643f7a0c7bf8bc8318ed28d889c9a56437ab3e91385Eric Christopher virtual bool getStackCookieLocation(unsigned &AddressSpace, unsigned &Offset) const; 644f7a0c7bf8bc8318ed28d889c9a56437ab3e91385Eric Christopher 645f99a4b82a4ff0383138ccaf9e22511eb786168fbStuart Hastings SDValue BuildFILD(SDValue Op, EVT SrcVT, SDValue Chain, SDValue StackSlot, 646f99a4b82a4ff0383138ccaf9e22511eb786168fbStuart Hastings SelectionDAG &DAG) const; 647f99a4b82a4ff0383138ccaf9e22511eb786168fbStuart Hastings 648dee81010eb4f932b76dd3f64eacba13b55d2d105Evan Cheng protected: 649dee81010eb4f932b76dd3f64eacba13b55d2d105Evan Cheng std::pair<const TargetRegisterClass*, uint8_t> 650dee81010eb4f932b76dd3f64eacba13b55d2d105Evan Cheng findRepresentativeClass(EVT VT) const; 651dee81010eb4f932b76dd3f64eacba13b55d2d105Evan Cheng 652dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner private: 6530db9fe6775853d62632ad299dd734b6ba6c6b336Evan Cheng /// Subtarget - Keep a pointer to the X86Subtarget around so that we can 6540db9fe6775853d62632ad299dd734b6ba6c6b336Evan Cheng /// make the right decision when generating code for different targets. 6550db9fe6775853d62632ad299dd734b6ba6c6b336Evan Cheng const X86Subtarget *Subtarget; 656c9f5f3f64f896d0a8c8fa35a1dd98bc57b8960f6Dan Gohman const X86RegisterInfo *RegInfo; 657bff66b0c6c8266a6f9ba6c9bd5d2541a4d4c6ec9Anton Korobeynikov const TargetData *TD; 6580db9fe6775853d62632ad299dd734b6ba6c6b336Evan Cheng 65925ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng /// X86StackPtr - X86 physical register used as stack ptr. 66025ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng unsigned X86StackPtr; 6616e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 6626e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer /// X86ScalarSSEf32, X86ScalarSSEf64 - Select between SSE or x87 663f1fc3a8fa6d4e81e30c08983d786c640acb2591cDale Johannesen /// floating point ops. 664f1fc3a8fa6d4e81e30c08983d786c640acb2591cDale Johannesen /// When SSE is available, use it for f32 operations. 665f1fc3a8fa6d4e81e30c08983d786c640acb2591cDale Johannesen /// When SSE2 is available, use it for f64 operations. 666f1fc3a8fa6d4e81e30c08983d786c640acb2591cDale Johannesen bool X86ScalarSSEf32; 667f1fc3a8fa6d4e81e30c08983d786c640acb2591cDale Johannesen bool X86ScalarSSEf64; 6680d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng 669eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng /// LegalFPImmediates - A list of legal fp immediates. 670eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng std::vector<APFloat> LegalFPImmediates; 671eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng 672eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng /// addLegalFPImmediate - Indicate that this x86 target can instruction 673eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng /// select the specified FP immediate natively. 674eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng void addLegalFPImmediate(const APFloat& Imm) { 675eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng LegalFPImmediates.push_back(Imm); 676eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng } 677eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng 67898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SDValue LowerCallResult(SDValue Chain, SDValue InFlag, 67965c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID CallConv, bool isVarArg, 68098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::InputArg> &Ins, 68198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman DebugLoc dl, SelectionDAG &DAG, 682d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SmallVectorImpl<SDValue> &InVals) const; 68398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SDValue LowerMemArgument(SDValue Chain, 68465c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID CallConv, 68598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::InputArg> &ArgInfo, 68698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman DebugLoc dl, SelectionDAG &DAG, 68798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const CCValAssign &VA, MachineFrameInfo *MFI, 688d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman unsigned i) const; 68998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SDValue LowerMemOpCallTo(SDValue Chain, SDValue StackPtr, SDValue Arg, 69098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman DebugLoc dl, SelectionDAG &DAG, 69198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const CCValAssign &VA, 692d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman ISD::ArgFlagsTy Flags) const; 6931b5dcc34b701639f94008658a2042abc43b9b910Rafael Espindola 69486737665b81550fdb575f7d8cc5decc801a7813dGordon Henriksen // Call lowering helpers. 6950c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng 6960c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng /// IsEligibleForTailCallOptimization - Check whether the call is eligible 6970c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng /// for tail call optimization. Targets which want to do tail call 6980c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng /// optimization should implement this function. 699022d9e1cef7586a80a96446ae8691a37def9bbf4Evan Cheng bool IsEligibleForTailCallOptimization(SDValue Callee, 7000c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng CallingConv::ID CalleeCC, 7010c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng bool isVarArg, 702a375d471378b1674a9d77d180a0b05ea8c90cb4bEvan Cheng bool isCalleeStructRet, 703a375d471378b1674a9d77d180a0b05ea8c90cb4bEvan Cheng bool isCallerStructRet, 704b17124553d569c6f09347f2cbe072eab445d30c4Evan Cheng const SmallVectorImpl<ISD::OutputArg> &Outs, 705c9403659a98bf6487ab6fbf40b81628b5695c02eDan Gohman const SmallVectorImpl<SDValue> &OutVals, 706b17124553d569c6f09347f2cbe072eab445d30c4Evan Cheng const SmallVectorImpl<ISD::InputArg> &Ins, 7070c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng SelectionDAG& DAG) const; 708d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman bool IsCalleePop(bool isVarArg, CallingConv::ID CallConv) const; 709475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue EmitTailCallLoadRetAddr(SelectionDAG &DAG, SDValue &OutRetAddr, 710475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue Chain, bool IsTailCall, bool Is64Bit, 711d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman int FPDiff, DebugLoc dl) const; 7124b5324ad2cbf774c9c6ed02ea0fcc864f2f5f885Arnold Schwaighofer 713d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman unsigned GetAlignedArgumentStackSize(unsigned StackSize, 714d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SelectionDAG &DAG) const; 715559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng 716948e95a381bf6771639703643ef75e0115b35f53Eli Friedman std::pair<SDValue,SDValue> FP_TO_INTHelper(SDValue Op, SelectionDAG &DAG, 7179a68fdc7f8211a9330537d44e3406d79fc5562afNAKAMURA Takumi bool isSigned, 7189a68fdc7f8211a9330537d44e3406d79fc5562afNAKAMURA Takumi bool isReplace) const; 719c363094e04df621d41ca570eb2a7bf8826bb8c1aEvan Cheng 720c363094e04df621d41ca570eb2a7bf8826bb8c1aEvan Cheng SDValue LowerAsSplatVectorLoad(SDValue SrcOp, EVT VT, DebugLoc dl, 721d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SelectionDAG &DAG) const; 722d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const; 723d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const; 724d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const; 725d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const; 726d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerEXTRACT_VECTOR_ELT_SSE4(SDValue Op, SelectionDAG &DAG) const; 727d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const; 728d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerINSERT_VECTOR_ELT_SSE4(SDValue Op, SelectionDAG &DAG) const; 729d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerSCALAR_TO_VECTOR(SDValue Op, SelectionDAG &DAG) const; 73091585098eff1f0acdefa2667e091742b60dcbf15David Greene SDValue LowerEXTRACT_SUBVECTOR(SDValue Op, SelectionDAG &DAG) const; 731cfe33c46aa50f04adb0431243e7d25f79b719ac6David Greene SDValue LowerINSERT_SUBVECTOR(SDValue Op, SelectionDAG &DAG) const; 732d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const; 733d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const; 73433c960f523f2308482d5b2816af46a7ec90a6d3dDale Johannesen SDValue LowerGlobalAddress(const GlobalValue *GV, DebugLoc dl, 73533c960f523f2308482d5b2816af46a7ec90a6d3dDale Johannesen int64_t Offset, SelectionDAG &DAG) const; 736d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const; 737d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const; 738d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const; 7394301222525b565028850030835b8db9ce6d153dbNadav Rotem SDValue LowerShiftParts(SDValue Op, SelectionDAG &DAG) const; 740bf17cfa3f904e488e898ac2e3af706fd1a892f08Wesley Peck SDValue LowerBITCAST(SDValue op, SelectionDAG &DAG) const; 741d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG) const; 742d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG) const; 743d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerUINT_TO_FP_i64(SDValue Op, SelectionDAG &DAG) const; 744d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerUINT_TO_FP_i32(SDValue Op, SelectionDAG &DAG) const; 745d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG) const; 746d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerFP_TO_UINT(SDValue Op, SelectionDAG &DAG) const; 747d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerFABS(SDValue Op, SelectionDAG &DAG) const; 748d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerFNEG(SDValue Op, SelectionDAG &DAG) const; 749d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const; 7504fd0dee3bfe8a35bbb62c9e9dea511cbc06cec2dStuart Hastings SDValue LowerFGETSIGN(SDValue Op, SelectionDAG &DAG) const; 7515528e7bcb1209094a68bbf6d1efeefc3ca34774fEvan Cheng SDValue LowerToBT(SDValue And, ISD::CondCode CC, 7525528e7bcb1209094a68bbf6d1efeefc3ca34774fEvan Cheng DebugLoc dl, SelectionDAG &DAG) const; 753d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const; 754d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerVSETCC(SDValue Op, SelectionDAG &DAG) const; 755d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const; 756d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const; 757d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerMEMSET(SDValue Op, SelectionDAG &DAG) const; 758d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const; 759d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const; 760d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const; 761d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const; 762d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerVACOPY(SDValue Op, SelectionDAG &DAG) const; 763d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const; 764d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const; 765d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const; 766d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerFRAME_TO_ARGS_OFFSET(SDValue Op, SelectionDAG &DAG) const; 767d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const; 7684a544a79bd735967f1d33fe675ae4566dbd17813Duncan Sands SDValue LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const; 7694a544a79bd735967f1d33fe675ae4566dbd17813Duncan Sands SDValue LowerADJUST_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const; 770d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerFLT_ROUNDS_(SDValue Op, SelectionDAG &DAG) const; 771d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerCTLZ(SDValue Op, SelectionDAG &DAG) const; 772acc068e873a1a2afa1edef20452722d97eec8f71Chandler Carruth SDValue LowerCTLZ_ZERO_UNDEF(SDValue Op, SelectionDAG &DAG) const; 773d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerCTTZ(SDValue Op, SelectionDAG &DAG) const; 77413894fa135d33151072ddf5e80abe4540ec2afcdCraig Topper SDValue LowerADD(SDValue Op, SelectionDAG &DAG) const; 77513894fa135d33151072ddf5e80abe4540ec2afcdCraig Topper SDValue LowerSUB(SDValue Op, SelectionDAG &DAG) const; 77613894fa135d33151072ddf5e80abe4540ec2afcdCraig Topper SDValue LowerMUL(SDValue Op, SelectionDAG &DAG) const; 7774301222525b565028850030835b8db9ce6d153dbNadav Rotem SDValue LowerShift(SDValue Op, SelectionDAG &DAG) const; 778d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerXALUO(SDValue Op, SelectionDAG &DAG) const; 779d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman 780d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerCMP_SWAP(SDValue Op, SelectionDAG &DAG) const; 781d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerLOAD_SUB(SDValue Op, SelectionDAG &DAG) const; 782d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerREADCYCLECOUNTER(SDValue Op, SelectionDAG &DAG) const; 7839a9d275dc7897dfba7f41ce1b3770ca27ac149e8Eric Christopher SDValue LowerMEMBARRIER(SDValue Op, SelectionDAG &DAG) const; 78414648468011c92a4210f8118721d58c25043daf8Eli Friedman SDValue LowerATOMIC_FENCE(SDValue Op, SelectionDAG &DAG) const; 785d0f3ef807ee4210b97a7a6bc4231e89403145b83Nadav Rotem SDValue LowerSIGN_EXTEND_INREG(SDValue Op, SelectionDAG &DAG) const; 7863ae98150e3e3c4770644a33cf38fe42a582509bbElena Demikhovsky SDValue PerformTruncateCombine(SDNode* N, SelectionDAG &DAG, DAGCombinerInfo &DCI) const; 7871607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands 788bf8154a4395bf941f57f6453503a850cb9805a64Bruno Cardoso Lopes // Utility functions to help LowerVECTOR_SHUFFLE 789bf8154a4395bf941f57f6453503a850cb9805a64Bruno Cardoso Lopes SDValue LowerVECTOR_SHUFFLEv8i16(SDValue Op, SelectionDAG &DAG) const; 790154819dd6f60d0d1d1c75a22e8902c5125fad49bNadav Rotem SDValue LowerVectorBroadcast(SDValue &Op, SelectionDAG &DAG) const; 791154819dd6f60d0d1d1c75a22e8902c5125fad49bNadav Rotem SDValue NormalizeVectorShuffle(SDValue Op, SelectionDAG &DAG) const; 792bf8154a4395bf941f57f6453503a850cb9805a64Bruno Cardoso Lopes 79398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman virtual SDValue 79498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman LowerFormalArguments(SDValue Chain, 79565c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID CallConv, bool isVarArg, 79698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::InputArg> &Ins, 79798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman DebugLoc dl, SelectionDAG &DAG, 798d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SmallVectorImpl<SDValue> &InVals) const; 79998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman virtual SDValue 8004bfcd4acbc7d12aa55f8de9af84a38422f0f6d83Evan Cheng LowerCall(SDValue Chain, SDValue Callee, CallingConv::ID CallConv, 8014bfcd4acbc7d12aa55f8de9af84a38422f0f6d83Evan Cheng bool isVarArg, bool doesNotRet, bool &isTailCall, 80298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::OutputArg> &Outs, 803c9403659a98bf6487ab6fbf40b81628b5695c02eDan Gohman const SmallVectorImpl<SDValue> &OutVals, 80498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::InputArg> &Ins, 80598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman DebugLoc dl, SelectionDAG &DAG, 806d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SmallVectorImpl<SDValue> &InVals) const; 80798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman 80898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman virtual SDValue 80998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman LowerReturn(SDValue Chain, 81065c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID CallConv, bool isVarArg, 81198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::OutputArg> &Outs, 812c9403659a98bf6487ab6fbf40b81628b5695c02eDan Gohman const SmallVectorImpl<SDValue> &OutVals, 813d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman DebugLoc dl, SelectionDAG &DAG) const; 81498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman 815bf010eb9110009d745382bf15131fbe556562ffeEvan Cheng virtual bool isUsedByReturnOnly(SDNode *N, SDValue &Chain) const; 8163d2125c9dbac695c93f42c0f59fd040e413fd711Evan Cheng 817485fafc8406db8552ba5e3ff871a6ee32694ad90Evan Cheng virtual bool mayBeEmittedAsTailCall(CallInst *CI) const; 818485fafc8406db8552ba5e3ff871a6ee32694ad90Evan Cheng 8197bbf0ee97c77f7712154648a44ac6eeb57886462Cameron Zwarich virtual EVT 8207bbf0ee97c77f7712154648a44ac6eeb57886462Cameron Zwarich getTypeForExtArgOrReturn(LLVMContext &Context, EVT VT, 8217bbf0ee97c77f7712154648a44ac6eeb57886462Cameron Zwarich ISD::NodeType ExtendKind) const; 822ebe8173941238cfbabadb1c63bca7fb7dcf2adbeCameron Zwarich 823b4997aeab74934ffa6fc0409afc4d8704245e372Kenneth Uildriks virtual bool 824471e4224809f51652c71f319532697a879a75a0dEric Christopher CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF, 825471e4224809f51652c71f319532697a879a75a0dEric Christopher bool isVarArg, 826471e4224809f51652c71f319532697a879a75a0dEric Christopher const SmallVectorImpl<ISD::OutputArg> &Outs, 827471e4224809f51652c71f319532697a879a75a0dEric Christopher LLVMContext &Context) const; 828b4997aeab74934ffa6fc0409afc4d8704245e372Kenneth Uildriks 8291607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands void ReplaceATOMIC_BINARY_64(SDNode *N, SmallVectorImpl<SDValue> &Results, 830d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SelectionDAG &DAG, unsigned NewOp) const; 8311607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands 832b120ab4057fc66ce11ee1f108af9dbbeafa3fed9Eric Christopher /// Utility function to emit string processing sse4.2 instructions 833b120ab4057fc66ce11ee1f108af9dbbeafa3fed9Eric Christopher /// that return in xmm0. 834431f775bab2c1ca144e3c9c6b1e3c0767bfacc33Evan Cheng /// This takes the instruction to expand, the associated machine basic 835431f775bab2c1ca144e3c9c6b1e3c0767bfacc33Evan Cheng /// block, the number of args, and whether or not the second arg is 836431f775bab2c1ca144e3c9c6b1e3c0767bfacc33Evan Cheng /// in memory or not. 837b120ab4057fc66ce11ee1f108af9dbbeafa3fed9Eric Christopher MachineBasicBlock *EmitPCMP(MachineInstr *BInstr, MachineBasicBlock *BB, 83820adc9dc4650313f017b27d9818eb2176238113dMon P Wang unsigned argNum, bool inMem) const; 839b120ab4057fc66ce11ee1f108af9dbbeafa3fed9Eric Christopher 840228232b2821f8e7f9c0b874ad733414bda183db6Eric Christopher /// Utility functions to emit monitor and mwait instructions. These 841228232b2821f8e7f9c0b874ad733414bda183db6Eric Christopher /// need to make sure that the arguments to the intrinsic are in the 842228232b2821f8e7f9c0b874ad733414bda183db6Eric Christopher /// correct registers. 84382be220092cfb9d432c5a6da1bd5e8c56dc21d4dEric Christopher MachineBasicBlock *EmitMonitor(MachineInstr *MI, 84482be220092cfb9d432c5a6da1bd5e8c56dc21d4dEric Christopher MachineBasicBlock *BB) const; 845228232b2821f8e7f9c0b874ad733414bda183db6Eric Christopher MachineBasicBlock *EmitMwait(MachineInstr *MI, MachineBasicBlock *BB) const; 846228232b2821f8e7f9c0b874ad733414bda183db6Eric Christopher 84763307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang /// Utility function to emit atomic bitwise operations (and, or, xor). 848431f775bab2c1ca144e3c9c6b1e3c0767bfacc33Evan Cheng /// It takes the bitwise instruction to expand, the associated machine basic 849431f775bab2c1ca144e3c9c6b1e3c0767bfacc33Evan Cheng /// block, and the associated X86 opcodes for reg/reg and reg/imm. 85063307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang MachineBasicBlock *EmitAtomicBitwiseWithCustomInserter( 85163307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang MachineInstr *BInstr, 85263307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang MachineBasicBlock *BB, 85363307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang unsigned regOpc, 854507a58ac9b20ddcea2e56a014be26b8f8cc0ecb8Andrew Lenharth unsigned immOpc, 855140be2dfb76928cb660b7de23f8310d76ca794b5Dale Johannesen unsigned loadOpc, 856140be2dfb76928cb660b7de23f8310d76ca794b5Dale Johannesen unsigned cxchgOpc, 857140be2dfb76928cb660b7de23f8310d76ca794b5Dale Johannesen unsigned notOpc, 858140be2dfb76928cb660b7de23f8310d76ca794b5Dale Johannesen unsigned EAXreg, 85944d23825d61d530b8d562329ec8fc2d4f843bb8dCraig Topper const TargetRegisterClass *RC, 86042fc29e7176ff51d649eccf82c836510fde4438fRichard Smith bool Invert = false) const; 86148c1bc2ace6481d3272ab5c18e1f19352c563be8Dale Johannesen 86248c1bc2ace6481d3272ab5c18e1f19352c563be8Dale Johannesen MachineBasicBlock *EmitAtomicBit6432WithCustomInserter( 86348c1bc2ace6481d3272ab5c18e1f19352c563be8Dale Johannesen MachineInstr *BInstr, 86448c1bc2ace6481d3272ab5c18e1f19352c563be8Dale Johannesen MachineBasicBlock *BB, 86548c1bc2ace6481d3272ab5c18e1f19352c563be8Dale Johannesen unsigned regOpcL, 86648c1bc2ace6481d3272ab5c18e1f19352c563be8Dale Johannesen unsigned regOpcH, 86748c1bc2ace6481d3272ab5c18e1f19352c563be8Dale Johannesen unsigned immOpcL, 86848c1bc2ace6481d3272ab5c18e1f19352c563be8Dale Johannesen unsigned immOpcH, 86942fc29e7176ff51d649eccf82c836510fde4438fRichard Smith bool Invert = false) const; 8706e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 87163307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang /// Utility function to emit atomic min and max. It takes the min/max 872bddc442a00c2216834499f10c12d023f1751104cBill Wendling /// instruction to expand, the associated basic block, and the associated 873bddc442a00c2216834499f10c12d023f1751104cBill Wendling /// cmov opcode for moving the min or max value. 87463307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang MachineBasicBlock *EmitAtomicMinMaxWithCustomInserter(MachineInstr *BInstr, 87563307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang MachineBasicBlock *BB, 8761fdbc1dd4e9cb42c79a30e8dc308c322e923cc52Dan Gohman unsigned cmovOpc) const; 877076aee32e86bc4a0c096262b3261923f25220dc6Dan Gohman 878320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman // Utility function to emit the low-level va_arg code for X86-64. 879320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman MachineBasicBlock *EmitVAARG64WithCustomInserter( 880320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman MachineInstr *MI, 881320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman MachineBasicBlock *MBB) const; 882320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman 883d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman /// Utility function to emit the xmm reg save portion of va_start. 884d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman MachineBasicBlock *EmitVAStartSaveXMMRegsWithCustomInserter( 885d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman MachineInstr *BInstr, 886d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman MachineBasicBlock *BB) const; 887d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman 88852600972832cb4ae8f4c63802f3764cbfbcb203dChris Lattner MachineBasicBlock *EmitLoweredSelect(MachineInstr *I, 889af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman MachineBasicBlock *BB) const; 890043f3c2a0e286dcfd4cc5a16bf006e3c45929516Anton Korobeynikov 891e9c253e0bc01fd50bf788efb62093a5fa6ef5849Michael J. Spencer MachineBasicBlock *EmitLoweredWinAlloca(MachineInstr *MI, 892af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman MachineBasicBlock *BB) const; 8936e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer 894151ab3e2f7b69d2b46fdc25cbad9d43f4a827ef1Rafael Espindola MachineBasicBlock *EmitLoweredSegAlloca(MachineInstr *MI, 895151ab3e2f7b69d2b46fdc25cbad9d43f4a827ef1Rafael Espindola MachineBasicBlock *BB, 896151ab3e2f7b69d2b46fdc25cbad9d43f4a827ef1Rafael Espindola bool Is64Bit) const; 897151ab3e2f7b69d2b46fdc25cbad9d43f4a827ef1Rafael Espindola 89830ef0e5658b0b8b04437f73f74162d5d72923f29Eric Christopher MachineBasicBlock *EmitLoweredTLSCall(MachineInstr *MI, 89930ef0e5658b0b8b04437f73f74162d5d72923f29Eric Christopher MachineBasicBlock *BB) const; 900043f3c2a0e286dcfd4cc5a16bf006e3c45929516Anton Korobeynikov 9015bf7c534cf057a52f30624743841fadd241c4dbbRafael Espindola MachineBasicBlock *emitLoweredTLSAddr(MachineInstr *MI, 9025bf7c534cf057a52f30624743841fadd241c4dbbRafael Espindola MachineBasicBlock *BB) const; 9035bf7c534cf057a52f30624743841fadd241c4dbbRafael Espindola 904076aee32e86bc4a0c096262b3261923f25220dc6Dan Gohman /// Emit nodes that will be selected as "test Op0,Op0", or something 9053112581441cd22ac955b1af2d08effe3bab975daDan Gohman /// equivalent, for use with the given x86 condition code. 906552f09a0d716a73dc70efd66384146e73ee63a3eEvan Cheng SDValue EmitTest(SDValue Op0, unsigned X86CC, SelectionDAG &DAG) const; 907076aee32e86bc4a0c096262b3261923f25220dc6Dan Gohman 908076aee32e86bc4a0c096262b3261923f25220dc6Dan Gohman /// Emit nodes that will be selected as "cmp Op0,Op1", or something 9093112581441cd22ac955b1af2d08effe3bab975daDan Gohman /// equivalent, for use with the given x86 condition code. 910552f09a0d716a73dc70efd66384146e73ee63a3eEvan Cheng SDValue EmitCmp(SDValue Op0, SDValue Op1, unsigned X86CC, 911d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SelectionDAG &DAG) const; 912dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner }; 913c3f44b0d636ff9a6d706ea9ac17ae77c8fa8aeffEvan Cheng 914c3f44b0d636ff9a6d706ea9ac17ae77c8fa8aeffEvan Cheng namespace X86 { 915a4160c3434b08288d1f79f1acbe453d1b9610b22Dan Gohman FastISel *createFastISel(FunctionLoweringInfo &funcInfo); 916c3f44b0d636ff9a6d706ea9ac17ae77c8fa8aeffEvan Cheng } 917dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner} 918dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner 919dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner#endif // X86ISELLOWERING_H 920