X86ISelLowering.h revision b65c175d32510d32aa556d1db5e6782b411d192c
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
892004eb6272d4787b9e08a83230fe022cbaf4deb0Dan Gohman      /// X86 SetCC. Operand 0 is condition code, and operand 1 is the flag
90d5781fca4f8f98863560338d4f8d017389428119Evan Cheng      /// operand 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.
95ad9c0a3d8bf625d169596547f893b9ec8b953e26Evan Cheng      SETCC_CARRY,
96ad9c0a3d8bf625d169596547f893b9ec8b953e26Evan Cheng
972b9f4349086247c58ed0bcd17c7d11b14b14f52bChris Lattner      /// X86 conditional moves. Operand 0 and operand 1 are the two values
982b9f4349086247c58ed0bcd17c7d11b14b14f52bChris Lattner      /// to select from. Operand 2 is the condition code, and operand 3 is the
992b9f4349086247c58ed0bcd17c7d11b14b14f52bChris Lattner      /// flag operand produced by a CMP or TEST instruction. It also writes a
1002b9f4349086247c58ed0bcd17c7d11b14b14f52bChris Lattner      /// flag result.
1017df96d66729d1f33934de7b52553e5f071686041Evan Cheng      CMOV,
102898101c15fa11a896deb4e2fcb73b4727e1dcc1fEvan Cheng
1032004eb6272d4787b9e08a83230fe022cbaf4deb0Dan Gohman      /// X86 conditional branches. Operand 0 is the chain operand, operand 1
1042004eb6272d4787b9e08a83230fe022cbaf4deb0Dan Gohman      /// is the block to branch if condition is true, operand 2 is the
1052004eb6272d4787b9e08a83230fe022cbaf4deb0Dan Gohman      /// condition code, and operand 3 is the flag operand produced by a CMP
106d5781fca4f8f98863560338d4f8d017389428119Evan Cheng      /// or TEST instruction.
107898101c15fa11a896deb4e2fcb73b4727e1dcc1fEvan Cheng      BRCOND,
108b077b842b64af39c8e2e9aaad327b3be446790ddEvan Cheng
1092004eb6272d4787b9e08a83230fe022cbaf4deb0Dan Gohman      /// Return with a flag operand. Operand 0 is the chain operand, operand
1102004eb6272d4787b9e08a83230fe022cbaf4deb0Dan Gohman      /// 1 is the number of bytes of stack to pop.
111b077b842b64af39c8e2e9aaad327b3be446790ddEvan Cheng      RET_FLAG,
11267f92a76497d1f50e0dd6279c81b45689bd463f5Evan Cheng
11367f92a76497d1f50e0dd6279c81b45689bd463f5Evan Cheng      /// REP_STOS - Repeat fill, corresponds to X86::REP_STOSx.
11467f92a76497d1f50e0dd6279c81b45689bd463f5Evan Cheng      REP_STOS,
11567f92a76497d1f50e0dd6279c81b45689bd463f5Evan Cheng
11667f92a76497d1f50e0dd6279c81b45689bd463f5Evan Cheng      /// REP_MOVS - Repeat move, corresponds to X86::REP_MOVSx.
11767f92a76497d1f50e0dd6279c81b45689bd463f5Evan Cheng      REP_MOVS,
118223547ab3101f32252cb704a67bd757e00fdbd16Evan Cheng
1197ccced634ae0ecdc1c4f599fd3abf188c367e231Evan Cheng      /// GlobalBaseReg - On Darwin, this node represents the result of the popl
1207ccced634ae0ecdc1c4f599fd3abf188c367e231Evan Cheng      /// at function entry, used for PIC code.
1217ccced634ae0ecdc1c4f599fd3abf188c367e231Evan Cheng      GlobalBaseReg,
122a0ea0539e359f6d82218e5aa4cdf3b50b17d6fbdEvan Cheng
123056292fd738924f3f7703725d8f630983794b5a5Bill Wendling      /// Wrapper - A wrapper node for TargetConstantPool,
124056292fd738924f3f7703725d8f630983794b5a5Bill Wendling      /// TargetExternalSymbol, and TargetGlobalAddress.
125020d2e8e7aa36692af13c1215fdd6248a6d9e950Evan Cheng      Wrapper,
12648090aa8145640c023563751a8a1e1bcc09125e5Evan Cheng
1270085a28d13f86b09ba0c83e8dce81de3ba15ca2dEvan Cheng      /// WrapperRIP - Special wrapper used under X86-64 PIC mode for RIP
1280085a28d13f86b09ba0c83e8dce81de3ba15ca2dEvan Cheng      /// relative displacements.
1290085a28d13f86b09ba0c83e8dce81de3ba15ca2dEvan Cheng      WrapperRIP,
1300085a28d13f86b09ba0c83e8dce81de3ba15ca2dEvan Cheng
1310488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      /// MOVQ2DQ - Copies a 64-bit value from an MMX vector to the low word
1320488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      /// of an XMM vector, with the high word zero filled.
133eb38ebf15c326a5bb45ca9da6329cdf19ad6df95Mon P Wang      MOVQ2DQ,
134eb38ebf15c326a5bb45ca9da6329cdf19ad6df95Mon P Wang
1350488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      /// MOVDQ2Q - Copies a 64-bit value from the low word of an XMM vector
1360488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      /// to an MMX vector.  If you think this is too close to the previous
1370488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      /// mnemonic, so do I; blame Intel.
1380488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      MOVDQ2Q,
1390488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
14014d12caf1d2de9618818646d12b30d647a860817Nate Begeman      /// PEXTRB - Extract an 8-bit value from a vector and zero extend it to
14114d12caf1d2de9618818646d12b30d647a860817Nate Begeman      /// i32, corresponds to X86::PEXTRB.
14214d12caf1d2de9618818646d12b30d647a860817Nate Begeman      PEXTRB,
14314d12caf1d2de9618818646d12b30d647a860817Nate Begeman
144b067a1e7e68c4446d3512c25d3a5ac55c6dd76f8Evan Cheng      /// PEXTRW - Extract a 16-bit value from a vector and zero extend it to
145653159f4aac61a7ad796e406a4899d27ffe5a789Evan Cheng      /// i32, corresponds to X86::PEXTRW.
146b067a1e7e68c4446d3512c25d3a5ac55c6dd76f8Evan Cheng      PEXTRW,
147653159f4aac61a7ad796e406a4899d27ffe5a789Evan Cheng
14814d12caf1d2de9618818646d12b30d647a860817Nate Begeman      /// INSERTPS - Insert any element of a 4 x float vector into any element
14914d12caf1d2de9618818646d12b30d647a860817Nate Begeman      /// of a destination 4 x floatvector.
15014d12caf1d2de9618818646d12b30d647a860817Nate Begeman      INSERTPS,
15114d12caf1d2de9618818646d12b30d647a860817Nate Begeman
15214d12caf1d2de9618818646d12b30d647a860817Nate Begeman      /// PINSRB - Insert the lower 8-bits of a 32-bit value to a vector,
15314d12caf1d2de9618818646d12b30d647a860817Nate Begeman      /// corresponds to X86::PINSRB.
15414d12caf1d2de9618818646d12b30d647a860817Nate Begeman      PINSRB,
15514d12caf1d2de9618818646d12b30d647a860817Nate Begeman
156653159f4aac61a7ad796e406a4899d27ffe5a789Evan Cheng      /// PINSRW - Insert the lower 16-bits of a 32-bit value to a vector,
157653159f4aac61a7ad796e406a4899d27ffe5a789Evan Cheng      /// corresponds to X86::PINSRW.
1588f2b4cc07161b56e56d6615761ea4ba08dc0e7d3Chris Lattner      PINSRW, MMX_PINSRW,
1598ca29326e19201075f6dc95781560ea9ad41ececEvan Cheng
160b9a47b824f6c8ef3989a796018bf974c09cd243fNate Begeman      /// PSHUFB - Shuffle 16 8-bit values within a vector.
161b9a47b824f6c8ef3989a796018bf974c09cd243fNate Begeman      PSHUFB,
162b65c175d32510d32aa556d1db5e6782b411d192cNate Begeman
163b65c175d32510d32aa556d1db5e6782b411d192cNate Begeman      /// PANDN - and with not'd value.
164b65c175d32510d32aa556d1db5e6782b411d192cNate Begeman      PANDN,
165b65c175d32510d32aa556d1db5e6782b411d192cNate Begeman
166b65c175d32510d32aa556d1db5e6782b411d192cNate Begeman      /// PSIGNB/W/D - Copy integer sign.
167b65c175d32510d32aa556d1db5e6782b411d192cNate Begeman      PSIGNB, PSIGNW, PSIGND,
168b65c175d32510d32aa556d1db5e6782b411d192cNate Begeman
1698ca29326e19201075f6dc95781560ea9ad41ececEvan Cheng      /// FMAX, FMIN - Floating point max and min.
1708ca29326e19201075f6dc95781560ea9ad41ececEvan Cheng      ///
171b3a0417cad8b625acc3033bd5e24afb9ffd0b084Lauro Ramos Venancio      FMAX, FMIN,
1722038252c6a36efd18cc0bef216fa2c5bb9236617Dan Gohman
1732038252c6a36efd18cc0bef216fa2c5bb9236617Dan Gohman      /// FRSQRT, FRCP - Floating point reciprocal-sqrt and reciprocal
1742038252c6a36efd18cc0bef216fa2c5bb9236617Dan Gohman      /// approximation.  Note that these typically require refinement
1752038252c6a36efd18cc0bef216fa2c5bb9236617Dan Gohman      /// in order to obtain suitable precision.
1762038252c6a36efd18cc0bef216fa2c5bb9236617Dan Gohman      FRSQRT, FRCP,
1772038252c6a36efd18cc0bef216fa2c5bb9236617Dan Gohman
178094fad37b90946c91a09eb9270a0dbe800f49d87Rafael Espindola      // TLSADDR - Thread Local Storage.
179094fad37b90946c91a09eb9270a0dbe800f49d87Rafael Espindola      TLSADDR,
1806e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
18130ef0e5658b0b8b04437f73f74162d5d72923f29Eric Christopher      // TLSCALL - Thread Local Storage.  When calling to an OS provided
18230ef0e5658b0b8b04437f73f74162d5d72923f29Eric Christopher      // thunk at the address from an earlier relocation.
18330ef0e5658b0b8b04437f73f74162d5d72923f29Eric Christopher      TLSCALL,
184094fad37b90946c91a09eb9270a0dbe800f49d87Rafael Espindola
1857e2ff77ef05c23db6b9c82bc7a4110e170d7f94cEvan Cheng      // EH_RETURN - Exception Handling helpers.
186c85e1716f0e45e4c18a9ef2fbe431a51ac3a4252Arnold Schwaighofer      EH_RETURN,
1876e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
1884fe3073cfb5273a3655aef0c8d50c96882f26882Arnold Schwaighofer      /// TC_RETURN - Tail call return.
1894fe3073cfb5273a3655aef0c8d50c96882f26882Arnold Schwaighofer      ///   operand #0 chain
1904fe3073cfb5273a3655aef0c8d50c96882f26882Arnold Schwaighofer      ///   operand #1 callee (register or absolute)
1914fe3073cfb5273a3655aef0c8d50c96882f26882Arnold Schwaighofer      ///   operand #2 stack adjustment
1924fe3073cfb5273a3655aef0c8d50c96882f26882Arnold Schwaighofer      ///   operand #3 optional in flag
19345b22fa9f1f085d7971cce6db4f11b353e1646c6Anton Korobeynikov      TC_RETURN,
19445b22fa9f1f085d7971cce6db4f11b353e1646c6Anton Korobeynikov
195d880b97257c7f8ec4e94948874cb87c865d9f96fEvan Cheng      // VZEXT_MOVL - Vector move low and zero extend.
196d880b97257c7f8ec4e94948874cb87c865d9f96fEvan Cheng      VZEXT_MOVL,
197d880b97257c7f8ec4e94948874cb87c865d9f96fEvan Cheng
198f26ffe987cf3643a7bd66bd9f97c34605ba7d08eEvan Cheng      // VSHL, VSRL - Vector logical left / right shift.
19930a0de94e7a5cbdcd277a93e543b0788efa78ddcNate Begeman      VSHL, VSRL,
2009008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman
2019008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman      // CMPPD, CMPPS - Vector double/float comparison.
20230a0de94e7a5cbdcd277a93e543b0788efa78ddcNate Begeman      // CMPPD, CMPPS - Vector double/float comparison.
20330a0de94e7a5cbdcd277a93e543b0788efa78ddcNate Begeman      CMPPD, CMPPS,
2046e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
20530a0de94e7a5cbdcd277a93e543b0788efa78ddcNate Begeman      // PCMP* - Vector integer comparisons.
20630a0de94e7a5cbdcd277a93e543b0788efa78ddcNate Begeman      PCMPEQB, PCMPEQW, PCMPEQD, PCMPEQQ,
207ab55ebda1c2254f98b06e770bc2dae7d05a4a366Bill Wendling      PCMPGTB, PCMPGTW, PCMPGTD, PCMPGTQ,
208ab55ebda1c2254f98b06e770bc2dae7d05a4a366Bill Wendling
209b20e0b1fddfd9099e12b84a71fbc8ccff5a12b10Chris Lattner      // ADD, SUB, SMUL, etc. - Arithmetic operations with FLAGS results.
210b20e0b1fddfd9099e12b84a71fbc8ccff5a12b10Chris Lattner      ADD, SUB, SMUL,
211e220c4b3d97bbdc9f6e8cf040942514612349c41Dan Gohman      INC, DEC, OR, XOR, AND,
212b20e0b1fddfd9099e12b84a71fbc8ccff5a12b10Chris Lattner
213b20e0b1fddfd9099e12b84a71fbc8ccff5a12b10Chris Lattner      UMUL, // LOW, HI, FLAGS = umul LHS, RHS
21473f24c9f0d9afd1fd65d544f2b7b7b7c77fc2238Evan Cheng
21573f24c9f0d9afd1fd65d544f2b7b7b7c77fc2238Evan Cheng      // MUL_IMM - X86 specific multiply by immediate.
21671c6753d03d1bb27d0cf997285c425d631e5807bEric Christopher      MUL_IMM,
2176e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
21871c6753d03d1bb27d0cf997285c425d631e5807bEric Christopher      // PTEST - Vector bitwise comparisons
219d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman      PTEST,
220d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman
221045573ce21282ee7d1c58e57d00a77ede8c732daBruno Cardoso Lopes      // TESTP - Vector packed fp sign bitwise comparisons
222045573ce21282ee7d1c58e57d00a77ede8c732daBruno Cardoso Lopes      TESTP,
223045573ce21282ee7d1c58e57d00a77ede8c732daBruno Cardoso Lopes
2243157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      // Several flavors of instructions with vector shuffle behaviors.
2253157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PALIGN,
2263157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PSHUFD,
2273157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PSHUFHW,
2283157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PSHUFLW,
2293157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PSHUFHW_LD,
2303157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PSHUFLW_LD,
2313157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      SHUFPD,
2323157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      SHUFPS,
2333157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVDDUP,
2343157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVSHDUP,
2353157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVSLDUP,
2363157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVSHDUP_LD,
2373157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVSLDUP_LD,
2383157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVLHPS,
2393157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVLHPD,
240f2db5b48d0a4f0800e83d8c3cd6dc5ad6a551bd6Bruno Cardoso Lopes      MOVHLPS,
2413157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVHLPD,
24256098f5d26ed05401bd889960deffa72eb7bbce9Bruno Cardoso Lopes      MOVLPS,
24356098f5d26ed05401bd889960deffa72eb7bbce9Bruno Cardoso Lopes      MOVLPD,
2443157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVSD,
2453157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVSS,
2463157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      UNPCKLPS,
2473157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      UNPCKLPD,
2483157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      UNPCKHPS,
2493157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      UNPCKHPD,
2503157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PUNPCKLBW,
2513157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PUNPCKLWD,
2523157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PUNPCKLDQ,
2533157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PUNPCKLQDQ,
2543157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PUNPCKHBW,
2553157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PUNPCKHWD,
2563157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PUNPCKHDQ,
2573157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PUNPCKHQDQ,
2583157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes
259d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman      // VASTART_SAVE_XMM_REGS - Save xmm argument registers to the stack,
260d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman      // according to %al. An operator is needed so that this can be expanded
261d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman      // with control flow.
262c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      VASTART_SAVE_XMM_REGS,
263c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
264e9c253e0bc01fd50bf788efb62093a5fa6ef5849Michael J. Spencer      // WIN_ALLOCA - Windows's _chkstk call to do stack probing.
265e9c253e0bc01fd50bf788efb62093a5fa6ef5849Michael J. Spencer      WIN_ALLOCA,
266043f3c2a0e286dcfd4cc5a16bf006e3c45929516Anton Korobeynikov
26759d2dad59ebba1d82e5b72f78b7a5b2c873445d7Duncan Sands      // Memory barrier
26859d2dad59ebba1d82e5b72f78b7a5b2c873445d7Duncan Sands      MEMBARRIER,
26959d2dad59ebba1d82e5b72f78b7a5b2c873445d7Duncan Sands      MFENCE,
27059d2dad59ebba1d82e5b72f78b7a5b2c873445d7Duncan Sands      SFENCE,
27159d2dad59ebba1d82e5b72f78b7a5b2c873445d7Duncan Sands      LFENCE,
27259d2dad59ebba1d82e5b72f78b7a5b2c873445d7Duncan Sands
2736e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer      // ATOMADD64_DAG, ATOMSUB64_DAG, ATOMOR64_DAG, ATOMAND64_DAG,
2746e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer      // ATOMXOR64_DAG, ATOMNAND64_DAG, ATOMSWAP64_DAG -
275c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      // Atomic 64-bit binary operations.
276c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      ATOMADD64_DAG = ISD::FIRST_TARGET_MEMORY_OPCODE,
277c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      ATOMSUB64_DAG,
278c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      ATOMOR64_DAG,
279c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      ATOMXOR64_DAG,
280c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      ATOMAND64_DAG,
281c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      ATOMNAND64_DAG,
2829a9d275dc7897dfba7f41ce1b3770ca27ac149e8Eric Christopher      ATOMSWAP64_DAG,
2836e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
28493c4a5bef780e43552d3b9d702756d3acb7801d2Chris Lattner      // LCMPXCHG_DAG, LCMPXCHG8_DAG - Compare and swap.
28593c4a5bef780e43552d3b9d702756d3acb7801d2Chris Lattner      LCMPXCHG_DAG,
2868864155a35eb59fbebfd1822aaf224128b5c5d23Chris Lattner      LCMPXCHG8_DAG,
287043f3c2a0e286dcfd4cc5a16bf006e3c45929516Anton Korobeynikov
2888864155a35eb59fbebfd1822aaf224128b5c5d23Chris Lattner      // VZEXT_LOAD - Load, scalar_to_vector, and zero extend.
2890729093cd7e15ed6469e50b74f0edd7f205b50ffChris Lattner      VZEXT_LOAD,
2906e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
2912156b79c493751f165d445535f8b598b4769b3e8Chris Lattner      // FNSTCW16m - Store FP control world into i16 memory.
2922156b79c493751f165d445535f8b598b4769b3e8Chris Lattner      FNSTCW16m,
2936e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
2940729093cd7e15ed6469e50b74f0edd7f205b50ffChris Lattner      /// FP_TO_INT*_IN_MEM - This instruction implements FP_TO_SINT with the
2950729093cd7e15ed6469e50b74f0edd7f205b50ffChris Lattner      /// integer destination in memory and a FP reg source.  This corresponds
2960729093cd7e15ed6469e50b74f0edd7f205b50ffChris Lattner      /// to the X86::FIST*m instructions and the rounding mode change stuff. It
2970729093cd7e15ed6469e50b74f0edd7f205b50ffChris Lattner      /// has two inputs (token chain and address) and two outputs (int value
2980729093cd7e15ed6469e50b74f0edd7f205b50ffChris Lattner      /// and token chain).
2990729093cd7e15ed6469e50b74f0edd7f205b50ffChris Lattner      FP_TO_INT16_IN_MEM,
3000729093cd7e15ed6469e50b74f0edd7f205b50ffChris Lattner      FP_TO_INT32_IN_MEM,
301492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner      FP_TO_INT64_IN_MEM,
3026e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
303492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner      /// FILD, FILD_FLAG - This instruction implements SINT_TO_FP with the
304492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner      /// integer source in memory and FP reg result.  This corresponds to the
305492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner      /// X86::FILD*m instructions. It has three inputs (token chain, address,
306492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner      /// and source type) and two outputs (FP value and token chain). FILD_FLAG
307492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner      /// also produces a flag).
308492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner      FILD,
309492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner      FILD_FLAG,
3106e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
311492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner      /// FLD - This instruction implements an extending load to FP stack slots.
312492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner      /// This corresponds to the X86::FLD32m / X86::FLD64m. It takes a chain
313492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner      /// operand, ptr to load from, and a ValueType node indicating the type
314492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner      /// to load to.
315492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner      FLD,
3166e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
317492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner      /// FST - This instruction implements a truncating store to FP stack
318492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner      /// slots. This corresponds to the X86::FST32m / X86::FST64m. It takes a
319492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner      /// chain operand, value to store, address, and a ValueType to store it
320492a43e6f64997a0ab26ef047dced193931fda85Chris Lattner      /// as.
321320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman      FST,
322320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman
323320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman      /// VAARG_64 - This instruction grabs the address of the next argument
324320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman      /// from a va_list. (reads and modifies the va_list in memory)
325320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman      VAARG_64
3266e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
327043f3c2a0e286dcfd4cc5a16bf006e3c45929516Anton Korobeynikov      // WARNING: Do not add anything in the end unless you want the node to
328043f3c2a0e286dcfd4cc5a16bf006e3c45929516Anton Korobeynikov      // have memop! In fact, starting from ATOMADD64_DAG all opcodes will be
329043f3c2a0e286dcfd4cc5a16bf006e3c45929516Anton Korobeynikov      // thought as target memory ops!
330dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner    };
331dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner  }
332dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner
3330d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng  /// Define some predicates that are used for node matching.
3340d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng  namespace X86 {
3350d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isPSHUFDMask - Return true if the specified VECTOR_SHUFFLE operand
3360d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// specifies a shuffle of elements that is suitable for input to PSHUFD.
3379008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isPSHUFDMask(ShuffleVectorSDNode *N);
3380d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3390d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isPSHUFHWMask - Return true if the specified VECTOR_SHUFFLE operand
3400d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// specifies a shuffle of elements that is suitable for input to PSHUFD.
3419008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isPSHUFHWMask(ShuffleVectorSDNode *N);
3420d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3430d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isPSHUFLWMask - Return true if the specified VECTOR_SHUFFLE operand
3440d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// specifies a shuffle of elements that is suitable for input to PSHUFD.
3459008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isPSHUFLWMask(ShuffleVectorSDNode *N);
3460d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3470d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isSHUFPMask - Return true if the specified VECTOR_SHUFFLE operand
3480d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// specifies a shuffle of elements that is suitable for input to SHUFP*.
3499008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isSHUFPMask(ShuffleVectorSDNode *N);
3500d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3510d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isMOVHLPSMask - Return true if the specified VECTOR_SHUFFLE operand
3520d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// specifies a shuffle of elements that is suitable for input to MOVHLPS.
3539008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isMOVHLPSMask(ShuffleVectorSDNode *N);
3540d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3550d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isMOVHLPS_v_undef_Mask - Special case of isMOVHLPSMask for canonical form
3560d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// of vector_shuffle v, v, <2, 3, 2, 3>, i.e. vector_shuffle v, undef,
3570d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// <2, 3, 2, 3>
3589008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isMOVHLPS_v_undef_Mask(ShuffleVectorSDNode *N);
3590d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3600d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isMOVLPMask - Return true if the specified VECTOR_SHUFFLE operand
3619008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    /// specifies a shuffle of elements that is suitable for MOVLP{S|D}.
3629008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isMOVLPMask(ShuffleVectorSDNode *N);
3630d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3640d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isMOVHPMask - Return true if the specified VECTOR_SHUFFLE operand
3659008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    /// specifies a shuffle of elements that is suitable for MOVHP{S|D}.
3660d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// as well as MOVLHPS.
3670b10b91465e69c4ae3649115486e1eb56b8be878Nate Begeman    bool isMOVLHPSMask(ShuffleVectorSDNode *N);
3680d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3690d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isUNPCKLMask - Return true if the specified VECTOR_SHUFFLE operand
3700d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// specifies a shuffle of elements that is suitable for input to UNPCKL.
3719008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isUNPCKLMask(ShuffleVectorSDNode *N, bool V2IsSplat = false);
3720d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3730d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isUNPCKHMask - Return true if the specified VECTOR_SHUFFLE operand
3740d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// specifies a shuffle of elements that is suitable for input to UNPCKH.
3759008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isUNPCKHMask(ShuffleVectorSDNode *N, bool V2IsSplat = false);
3760d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3770d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isUNPCKL_v_undef_Mask - Special case of isUNPCKLMask for canonical form
3780d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// of vector_shuffle v, v, <0, 4, 1, 5>, i.e. vector_shuffle v, undef,
3790d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// <0, 0, 1, 1>
3809008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isUNPCKL_v_undef_Mask(ShuffleVectorSDNode *N);
3810d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3820d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isUNPCKH_v_undef_Mask - Special case of isUNPCKHMask for canonical form
3830d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// of vector_shuffle v, v, <2, 6, 3, 7>, i.e. vector_shuffle v, undef,
3840d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// <2, 2, 3, 3>
3859008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isUNPCKH_v_undef_Mask(ShuffleVectorSDNode *N);
3860d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3870d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isMOVLMask - Return true if the specified VECTOR_SHUFFLE operand
3880d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// specifies a shuffle of elements that is suitable for input to MOVSS,
3890d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// MOVSD, and MOVD, i.e. setting the lowest element.
3909008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isMOVLMask(ShuffleVectorSDNode *N);
3910d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3920d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isMOVSHDUPMask - Return true if the specified VECTOR_SHUFFLE operand
3930d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// specifies a shuffle of elements that is suitable for input to MOVSHDUP.
3949008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isMOVSHDUPMask(ShuffleVectorSDNode *N);
3950d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3960d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isMOVSLDUPMask - Return true if the specified VECTOR_SHUFFLE operand
3970d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// specifies a shuffle of elements that is suitable for input to MOVSLDUP.
3989008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isMOVSLDUPMask(ShuffleVectorSDNode *N);
3990d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
4000b457f0c3a7e21b1fb9ac8b9f8e404e1312b6a60Evan Cheng    /// isMOVDDUPMask - Return true if the specified VECTOR_SHUFFLE operand
4010b457f0c3a7e21b1fb9ac8b9f8e404e1312b6a60Evan Cheng    /// specifies a shuffle of elements that is suitable for input to MOVDDUP.
4029008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isMOVDDUPMask(ShuffleVectorSDNode *N);
4030b457f0c3a7e21b1fb9ac8b9f8e404e1312b6a60Evan Cheng
404a09008bf6ddb61910212c31db1d714182882681eNate Begeman    /// isPALIGNRMask - Return true if the specified VECTOR_SHUFFLE operand
405a09008bf6ddb61910212c31db1d714182882681eNate Begeman    /// specifies a shuffle of elements that is suitable for input to PALIGNR.
406a09008bf6ddb61910212c31db1d714182882681eNate Begeman    bool isPALIGNRMask(ShuffleVectorSDNode *N);
407a09008bf6ddb61910212c31db1d714182882681eNate Begeman
4080d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// getShuffleSHUFImmediate - Return the appropriate immediate to shuffle
4090d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// the specified isShuffleMask VECTOR_SHUFFLE mask with PSHUF* and SHUFP*
4100d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// instructions.
4110d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    unsigned getShuffleSHUFImmediate(SDNode *N);
4120d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
4130d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// getShufflePSHUFHWImmediate - Return the appropriate immediate to shuffle
414a09008bf6ddb61910212c31db1d714182882681eNate Begeman    /// the specified VECTOR_SHUFFLE mask with PSHUFHW instruction.
4150d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    unsigned getShufflePSHUFHWImmediate(SDNode *N);
4160d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
417a09008bf6ddb61910212c31db1d714182882681eNate Begeman    /// getShufflePSHUFLWImmediate - Return the appropriate immediate to shuffle
418a09008bf6ddb61910212c31db1d714182882681eNate Begeman    /// the specified VECTOR_SHUFFLE mask with PSHUFLW instruction.
4190d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    unsigned getShufflePSHUFLWImmediate(SDNode *N);
42037b7387da90ffd42d28ad0f08fca00b684294b2cEvan Cheng
421a09008bf6ddb61910212c31db1d714182882681eNate Begeman    /// getShufflePALIGNRImmediate - Return the appropriate immediate to shuffle
422a09008bf6ddb61910212c31db1d714182882681eNate Begeman    /// the specified VECTOR_SHUFFLE mask with the PALIGNR instruction.
423a09008bf6ddb61910212c31db1d714182882681eNate Begeman    unsigned getShufflePALIGNRImmediate(SDNode *N);
424a09008bf6ddb61910212c31db1d714182882681eNate Begeman
42537b7387da90ffd42d28ad0f08fca00b684294b2cEvan Cheng    /// isZeroNode - Returns true if Elt is a constant zero or a floating point
42637b7387da90ffd42d28ad0f08fca00b684294b2cEvan Cheng    /// constant +0.0.
42737b7387da90ffd42d28ad0f08fca00b684294b2cEvan Cheng    bool isZeroNode(SDValue Elt);
428b5e01724057e6eabc45da75df3037af4ad29248cAnton Korobeynikov
429b5e01724057e6eabc45da75df3037af4ad29248cAnton Korobeynikov    /// isOffsetSuitableForCodeModel - Returns true of the given offset can be
430b5e01724057e6eabc45da75df3037af4ad29248cAnton Korobeynikov    /// fit into displacement field of the instruction.
431b5e01724057e6eabc45da75df3037af4ad29248cAnton Korobeynikov    bool isOffsetSuitableForCodeModel(int64_t Offset, CodeModel::Model M,
432b5e01724057e6eabc45da75df3037af4ad29248cAnton Korobeynikov                                      bool hasSymbolicDisplacement = true);
4330d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng  }
4340d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
43591897778690a7d683497ba3f4040ebf09345f08aChris Lattner  //===--------------------------------------------------------------------===//
436dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner  //  X86TargetLowering - X86 Implementation of the TargetLowering interface
437dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner  class X86TargetLowering : public TargetLowering {
438dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner  public:
439c9f5f3f64f896d0a8c8fa35a1dd98bc57b8960f6Dan Gohman    explicit X86TargetLowering(X86TargetMachine &TM);
440dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner
441c64daabb70a2e0cb115f78b0c1548e65c0d527ffChris Lattner    virtual unsigned getJumpTableEncoding() const;
4425e1df8d1f71f1a8a534b8b5929a7dd670fe010c6Chris Lattner
443c64daabb70a2e0cb115f78b0c1548e65c0d527ffChris Lattner    virtual const MCExpr *
444c64daabb70a2e0cb115f78b0c1548e65c0d527ffChris Lattner    LowerCustomJumpTableEntry(const MachineJumpTableInfo *MJTI,
445c64daabb70a2e0cb115f78b0c1548e65c0d527ffChris Lattner                              const MachineBasicBlock *MBB, unsigned uid,
446c64daabb70a2e0cb115f78b0c1548e65c0d527ffChris Lattner                              MCContext &Ctx) const;
4476e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
448cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng    /// getPICJumpTableRelocaBase - Returns relocation base for the given PIC
449cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng    /// jumptable.
450c64daabb70a2e0cb115f78b0c1548e65c0d527ffChris Lattner    virtual SDValue getPICJumpTableRelocBase(SDValue Table,
451c64daabb70a2e0cb115f78b0c1548e65c0d527ffChris Lattner                                             SelectionDAG &DAG) const;
452589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner    virtual const MCExpr *
453589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner    getPICJumpTableRelocBaseExpr(const MachineFunction *MF,
454589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner                                 unsigned JTI, MCContext &Ctx) const;
4556e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
45654e3efde4636dade74f95ede039091bf52ca1585Chris Lattner    /// getStackPtrReg - Return the stack pointer register we are using: either
45754e3efde4636dade74f95ede039091bf52ca1585Chris Lattner    /// ESP or RSP.
45854e3efde4636dade74f95ede039091bf52ca1585Chris Lattner    unsigned getStackPtrReg() const { return X86StackPtr; }
45929286502628867b31872ead2f2527592480f0970Evan Cheng
46029286502628867b31872ead2f2527592480f0970Evan Cheng    /// getByValTypeAlignment - Return the desired alignment for ByVal aggregate
46129286502628867b31872ead2f2527592480f0970Evan Cheng    /// function arguments in the caller parameter area. For X86, aggregates
46229286502628867b31872ead2f2527592480f0970Evan Cheng    /// that contains are placed at 16-byte boundaries while the rest are at
46329286502628867b31872ead2f2527592480f0970Evan Cheng    /// 4-byte boundaries.
46429286502628867b31872ead2f2527592480f0970Evan Cheng    virtual unsigned getByValTypeAlignment(const Type *Ty) const;
465f0df03134e698ea84e9cc1c28a853f83c02560d5Evan Cheng
466f0df03134e698ea84e9cc1c28a853f83c02560d5Evan Cheng    /// getOptimalMemOpType - Returns the target specific optimal type for load
467f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    /// and store operations as a result of memset, memcpy, and memmove
468f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    /// lowering. If DstAlign is zero that means it's safe to destination
469f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    /// alignment can satisfy any constraint. Similarly if SrcAlign is zero it
470f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    /// means there isn't a need to check it against alignment requirement,
471f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    /// probably because the source does not need to be loaded. If
472f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    /// 'NonScalarIntSafe' is true, that means it's safe to return a
473f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    /// non-scalar-integer type, e.g. empty string source, constant, or loaded
474c3b0c341e731b27b550ee9dcded9c17232b296b8Evan Cheng    /// from memory. 'MemcpyStrSrc' indicates whether the memcpy source is
475c3b0c341e731b27b550ee9dcded9c17232b296b8Evan Cheng    /// constant so it does not need to be loaded.
47637f32ee7ffe77d7c2bc1b185802e98979612f041Dan Gohman    /// It returns EVT::Other if the type should be determined using generic
47737f32ee7ffe77d7c2bc1b185802e98979612f041Dan Gohman    /// target-independent logic.
478f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    virtual EVT
479c3b0c341e731b27b550ee9dcded9c17232b296b8Evan Cheng    getOptimalMemOpType(uint64_t Size, unsigned DstAlign, unsigned SrcAlign,
480c3b0c341e731b27b550ee9dcded9c17232b296b8Evan Cheng                        bool NonScalarIntSafe, bool MemcpyStrSrc,
48137f32ee7ffe77d7c2bc1b185802e98979612f041Dan Gohman                        MachineFunction &MF) const;
482af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling
483af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling    /// allowsUnalignedMemoryAccesses - Returns true if the target allows
484af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling    /// unaligned memory accesses. of the specified type.
485af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling    virtual bool allowsUnalignedMemoryAccesses(EVT VT) const {
486af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling      return true;
487af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling    }
48820c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling
489dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner    /// LowerOperation - Provide custom lowering hooks for some operations.
490dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner    ///
491d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
492dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner
4931607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands    /// ReplaceNodeResults - Replace the results of node with an illegal result
4941607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands    /// type with new values built out of custom code.
49527a6c7380fa4dfc8e1837a8dd67967d063b26544Chris Lattner    ///
4961607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands    virtual void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results,
497d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                                    SelectionDAG &DAG) const;
49827a6c7380fa4dfc8e1837a8dd67967d063b26544Chris Lattner
4996e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
500475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const;
501206ee9d86cd4e78176fad6bfa2b016023edf5df7Evan Cheng
502e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng    /// isTypeDesirableForOp - Return true if the target has native support for
503e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng    /// the specified value type and it is 'desirable' to use the type for the
504e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng    /// given node type. e.g. On x86 i16 is legal, but undesirable since i16
505e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng    /// instruction encodings are longer and some i16 instructions are slow.
506e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng    virtual bool isTypeDesirableForOp(unsigned Opc, EVT VT) const;
507e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng
508e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng    /// isTypeDesirable - Return true if the target has native support for the
509e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng    /// specified value type and it is 'desirable' to use the type. e.g. On x86
510e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng    /// i16 is legal, but undesirable since i16 instruction encodings are longer
511e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng    /// and some i16 instructions are slow.
512e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng    virtual bool IsDesirableToPromoteOp(SDValue Op, EVT &PVT) const;
51364b7bf71e84094193b40ab81aa7dacad921ecbeaEvan Cheng
514af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman    virtual MachineBasicBlock *
515af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman      EmitInstrWithCustomInserter(MachineInstr *MI,
516af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman                                  MachineBasicBlock *MBB) const;
5174a46080fe0133c71b511805c63abfb158dcd56a5Evan Cheng
5186e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
5197226158d7e3986e55b58214a749aa4eabb3fb6d5Evan Cheng    /// getTargetNodeName - This method returns the name of a target specific
5207226158d7e3986e55b58214a749aa4eabb3fb6d5Evan Cheng    /// DAG node.
5217226158d7e3986e55b58214a749aa4eabb3fb6d5Evan Cheng    virtual const char *getTargetNodeName(unsigned Opcode) const;
5227226158d7e3986e55b58214a749aa4eabb3fb6d5Evan Cheng
5235b8f82e35b51bf007de07a7ca9347d804084ddf8Scott Michel    /// getSetCCResultType - Return the ISD::SETCC ValueType
524825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    virtual MVT::SimpleValueType getSetCCResultType(EVT VT) const;
5255b8f82e35b51bf007de07a7ca9347d804084ddf8Scott Michel
5266e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer    /// computeMaskedBitsForTargetNode - Determine which of the bits specified
5276e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer    /// in Mask are known to be either zero or one and return them in the
528368e18d56a87308045d341e85584597bfe7426e9Nate Begeman    /// KnownZero/KnownOne bitsets.
529475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    virtual void computeMaskedBitsForTargetNode(const SDValue Op,
530977a76fbb6ea1b87dfd7fbbe2ae2afb63e982ff3Dan Gohman                                                const APInt &Mask,
5316e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer                                                APInt &KnownZero,
532fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman                                                APInt &KnownOne,
533ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman                                                const SelectionDAG &DAG,
534368e18d56a87308045d341e85584597bfe7426e9Nate Begeman                                                unsigned Depth = 0) const;
535ad4196b44ae714a6b95e238d9d96303df74b0429Evan Cheng
536bc146b0a4dcee601459eee943b4133d3cf63f1ddOwen Anderson    // ComputeNumSignBitsForTargetNode - Determine the number of bits in the
537bc146b0a4dcee601459eee943b4133d3cf63f1ddOwen Anderson    // operation that are sign bits.
538bc146b0a4dcee601459eee943b4133d3cf63f1ddOwen Anderson    virtual unsigned ComputeNumSignBitsForTargetNode(SDValue Op,
539bc146b0a4dcee601459eee943b4133d3cf63f1ddOwen Anderson                                                     unsigned Depth) const;
540bc146b0a4dcee601459eee943b4133d3cf63f1ddOwen Anderson
541ad4196b44ae714a6b95e238d9d96303df74b0429Evan Cheng    virtual bool
54246510a73e977273ec67747eb34cbdb43f815e451Dan Gohman    isGAPlusOffset(SDNode *N, const GlobalValue* &GA, int64_t &Offset) const;
5436e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
544d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue getReturnAddressFrameIndex(SelectionDAG &DAG) const;
545dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner
546b8105651527670cb456eb46dd4346bacd3905361Chris Lattner    virtual bool ExpandInlineAsm(CallInst *CI) const;
5476e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
5484234f57fa02b1f04a9f52a7b3c2aa22d32ac521cChris Lattner    ConstraintType getConstraintType(const std::string &Constraint) const;
5496e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
55044ab89eb376af838d1123293a79975aede501464John Thompson    /// Examine constraint string and operand type and determine a weight value.
551eac6e1d0c748afc3d1496be0753ffbe5f5a4279bJohn Thompson    /// The operand object must already have been set up with the operand type.
55244ab89eb376af838d1123293a79975aede501464John Thompson    virtual ConstraintWeight getSingleConstraintMatchWeight(
553eac6e1d0c748afc3d1496be0753ffbe5f5a4279bJohn Thompson      AsmOperandInfo &info, const char *constraint) const;
5546e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
5556e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer    std::vector<unsigned>
5561efa40f6a4b561cf8f80fe018684236010645cd0Chris Lattner      getRegClassForInlineAsmConstraint(const std::string &Constraint,
557e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                                        EVT VT) const;
55848884cd80b52be1528618f2e9b3425ac24e7b5caChris Lattner
559e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    virtual const char *LowerXConstraint(EVT ConstraintVT) const;
560ba2a0b960ea4c73d0f81557f63ae2ea126e08905Dale Johannesen
56148884cd80b52be1528618f2e9b3425ac24e7b5caChris Lattner    /// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
562da43bcf624acb56a3d77bb5ae9a02728af032613Evan Cheng    /// vector.  If it is invalid, don't add anything to Ops. If hasMemory is
563da43bcf624acb56a3d77bb5ae9a02728af032613Evan Cheng    /// true it means one of the asm constraint of the inline asm instruction
564da43bcf624acb56a3d77bb5ae9a02728af032613Evan Cheng    /// being processed is 'm'.
565475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    virtual void LowerAsmOperandForConstraint(SDValue Op,
56648884cd80b52be1528618f2e9b3425ac24e7b5caChris Lattner                                              char ConstraintLetter,
567475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                              std::vector<SDValue> &Ops,
5685e764233f398b6929b67701672a5e78fec20ce2eChris Lattner                                              SelectionDAG &DAG) const;
5696e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
57091897778690a7d683497ba3f4040ebf09345f08aChris Lattner    /// getRegForInlineAsmConstraint - Given a physical register constraint
57191897778690a7d683497ba3f4040ebf09345f08aChris Lattner    /// (e.g. {edx}), return the register number and the register class for the
57291897778690a7d683497ba3f4040ebf09345f08aChris Lattner    /// register.  This should only be used for C_Register constraints.  On
57391897778690a7d683497ba3f4040ebf09345f08aChris Lattner    /// error, this returns a register number of 0.
5746e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer    std::pair<unsigned, const TargetRegisterClass*>
575f76d180c9595d34641f4b5d2fbba2f2c175197d8Chris Lattner      getRegForInlineAsmConstraint(const std::string &Constraint,
576e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                                   EVT VT) const;
5776e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
578c9addb74883fef318140272768422656a694341fChris Lattner    /// isLegalAddressingMode - Return true if the addressing mode represented
579c9addb74883fef318140272768422656a694341fChris Lattner    /// by AM is legal for this target, for a load/store of the specified type.
580c9addb74883fef318140272768422656a694341fChris Lattner    virtual bool isLegalAddressingMode(const AddrMode &AM, const Type *Ty)const;
581c9addb74883fef318140272768422656a694341fChris Lattner
5822bd122c4d934a70e031dc0ca5171719bac66c2c9Evan Cheng    /// isTruncateFree - Return true if it's free to truncate a value of
5832bd122c4d934a70e031dc0ca5171719bac66c2c9Evan Cheng    /// type Ty1 to type Ty2. e.g. On x86 it's free to truncate a i32 value in
5842bd122c4d934a70e031dc0ca5171719bac66c2c9Evan Cheng    /// register EAX to i16 by referencing its sub-register AX.
5852bd122c4d934a70e031dc0ca5171719bac66c2c9Evan Cheng    virtual bool isTruncateFree(const Type *Ty1, const Type *Ty2) const;
586e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    virtual bool isTruncateFree(EVT VT1, EVT VT2) const;
58797121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman
58897121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman    /// isZExtFree - Return true if any actual instruction that defines a
58997121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman    /// value of type Ty1 implicit zero-extends the value to Ty2 in the result
59097121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman    /// register. This does not necessarily include registers defined in
59197121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman    /// unknown ways, such as incoming arguments, or copies from unknown
59297121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman    /// virtual registers. Also, if isTruncateFree(Ty2, Ty1) is true, this
59397121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman    /// does not necessarily apply to truncate instructions. e.g. on x86-64,
59497121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman    /// all instructions that define 32-bit values implicit zero-extend the
59597121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman    /// result out to 64 bits.
59697121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman    virtual bool isZExtFree(const Type *Ty1, const Type *Ty2) const;
597e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    virtual bool isZExtFree(EVT VT1, EVT VT2) const;
59897121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman
5998b944d39b356135676459152385f05c496951f6cEvan Cheng    /// isNarrowingProfitable - Return true if it's profitable to narrow
6008b944d39b356135676459152385f05c496951f6cEvan Cheng    /// operations of type VT1 to VT2. e.g. on x86, it's profitable to narrow
6018b944d39b356135676459152385f05c496951f6cEvan Cheng    /// from i32 to i8 but not from i32 to i16.
602e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    virtual bool isNarrowingProfitable(EVT VT1, EVT VT2) const;
6038b944d39b356135676459152385f05c496951f6cEvan Cheng
604eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng    /// isFPImmLegal - Returns true if the target can instruction select the
605eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng    /// specified FP immediate natively. If false, the legalizer will
606eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng    /// materialize the FP immediate as a load from a constant pool.
607a1eaa3c52b75d4fe2bcd4f7c52e56c405ee91d3cEvan Cheng    virtual bool isFPImmLegal(const APFloat &Imm, EVT VT) const;
608eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng
6090188ecba85c7139f237baa4ce5612fdfc83e1b84Evan Cheng    /// isShuffleMaskLegal - Targets can use this to indicate that they only
6100188ecba85c7139f237baa4ce5612fdfc83e1b84Evan Cheng    /// support *some* VECTOR_SHUFFLE operations, those with specific masks.
61191897778690a7d683497ba3f4040ebf09345f08aChris Lattner    /// By default, if a target supports the VECTOR_SHUFFLE node, all mask
61291897778690a7d683497ba3f4040ebf09345f08aChris Lattner    /// values are assumed to be legal.
6135a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman    virtual bool isShuffleMaskLegal(const SmallVectorImpl<int> &Mask,
614e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                                    EVT VT) const;
61539623daef67090025be5cd8af7d172fd1c9e6418Evan Cheng
61639623daef67090025be5cd8af7d172fd1c9e6418Evan Cheng    /// isVectorClearMaskLegal - Similar to isShuffleMaskLegal. This is
61739623daef67090025be5cd8af7d172fd1c9e6418Evan Cheng    /// used by Targets can use this to indicate if there is a suitable
61839623daef67090025be5cd8af7d172fd1c9e6418Evan Cheng    /// VECTOR_SHUFFLE that can be used to replace a VAND with a constant
61939623daef67090025be5cd8af7d172fd1c9e6418Evan Cheng    /// pool entry.
6205a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman    virtual bool isVectorClearMaskLegal(const SmallVectorImpl<int> &Mask,
621e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                                        EVT VT) const;
6226fd599fa6916bd9438dbea7994cf2437bdf4ab8cEvan Cheng
6236fd599fa6916bd9438dbea7994cf2437bdf4ab8cEvan Cheng    /// ShouldShrinkFPConstant - If true, then instruction selection should
6246fd599fa6916bd9438dbea7994cf2437bdf4ab8cEvan Cheng    /// seek to shrink the FP constant of the specified type to a smaller type
6256fd599fa6916bd9438dbea7994cf2437bdf4ab8cEvan Cheng    /// in order to save space and / or reduce runtime.
626e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    virtual bool ShouldShrinkFPConstant(EVT VT) const {
6276fd599fa6916bd9438dbea7994cf2437bdf4ab8cEvan Cheng      // Don't shrink FP constpool if SSE2 is available since cvtss2sd is more
6286fd599fa6916bd9438dbea7994cf2437bdf4ab8cEvan Cheng      // expensive than a straight movsd. On the other hand, it's important to
6296fd599fa6916bd9438dbea7994cf2437bdf4ab8cEvan Cheng      // shrink long double fp constant since fldt is very slow.
630825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson      return !X86ScalarSSEf64 || VT == MVT::f80;
6316fd599fa6916bd9438dbea7994cf2437bdf4ab8cEvan Cheng    }
6326e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
633419e4f92635cfaa409282691437aff99062e4e0bDan Gohman    const X86Subtarget* getSubtarget() const {
634707e0184233f27e0e9f9aee0309f2daab8cfe7f8Dan Gohman      return Subtarget;
635f1ba1cad387dc52f3c2c5afc665edf9caad00992Rafael Espindola    }
636f1ba1cad387dc52f3c2c5afc665edf9caad00992Rafael Espindola
6373d66185ff8b276183fa8e9ce3d7ebb1d9ce88f74Chris Lattner    /// isScalarFPTypeInSSEReg - Return true if the specified scalar FP type is
6383d66185ff8b276183fa8e9ce3d7ebb1d9ce88f74Chris Lattner    /// computed in an SSE register, not on the X87 floating point stack.
639e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    bool isScalarFPTypeInSSEReg(EVT VT) const {
640825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson      return (VT == MVT::f64 && X86ScalarSSEf64) || // f64 is when SSE2
641825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson      (VT == MVT::f32 && X86ScalarSSEf32);   // f32 is when SSE1
6423d66185ff8b276183fa8e9ce3d7ebb1d9ce88f74Chris Lattner    }
643d9f3c480a7bc0969b08ace68af7dcde40f6caff1Dan Gohman
644d9f3c480a7bc0969b08ace68af7dcde40f6caff1Dan Gohman    /// createFastISel - This method returns a target specific FastISel object,
645d9f3c480a7bc0969b08ace68af7dcde40f6caff1Dan Gohman    /// or null if the target does not support "fast" ISel.
646a4160c3434b08288d1f79f1acbe453d1b9610b22Dan Gohman    virtual FastISel *createFastISel(FunctionLoweringInfo &funcInfo) const;
64720c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling
648b4202b84d7e54efe5e144885c7da63e6cc465f80Bill Wendling    /// getFunctionAlignment - Return the Log2 alignment of this function.
64920c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling    virtual unsigned getFunctionAlignment(const Function *F) const;
65020c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling
65170017e44cdba1946cc478ce1856a3e855a767e28Evan Cheng    unsigned getRegPressureLimit(const TargetRegisterClass *RC,
65270017e44cdba1946cc478ce1856a3e855a767e28Evan Cheng                                 MachineFunction &MF) const;
65370017e44cdba1946cc478ce1856a3e855a767e28Evan Cheng
654f7a0c7bf8bc8318ed28d889c9a56437ab3e91385Eric Christopher    /// getStackCookieLocation - Return true if the target stores stack
655f7a0c7bf8bc8318ed28d889c9a56437ab3e91385Eric Christopher    /// protector cookies at a fixed offset in some non-standard address
656f7a0c7bf8bc8318ed28d889c9a56437ab3e91385Eric Christopher    /// space, and populates the address space and offset as
657f7a0c7bf8bc8318ed28d889c9a56437ab3e91385Eric Christopher    /// appropriate.
658f7a0c7bf8bc8318ed28d889c9a56437ab3e91385Eric Christopher    virtual bool getStackCookieLocation(unsigned &AddressSpace, unsigned &Offset) const;
659f7a0c7bf8bc8318ed28d889c9a56437ab3e91385Eric Christopher
660dee81010eb4f932b76dd3f64eacba13b55d2d105Evan Cheng  protected:
661dee81010eb4f932b76dd3f64eacba13b55d2d105Evan Cheng    std::pair<const TargetRegisterClass*, uint8_t>
662dee81010eb4f932b76dd3f64eacba13b55d2d105Evan Cheng    findRepresentativeClass(EVT VT) const;
663dee81010eb4f932b76dd3f64eacba13b55d2d105Evan Cheng
664dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner  private:
6650db9fe6775853d62632ad299dd734b6ba6c6b336Evan Cheng    /// Subtarget - Keep a pointer to the X86Subtarget around so that we can
6660db9fe6775853d62632ad299dd734b6ba6c6b336Evan Cheng    /// make the right decision when generating code for different targets.
6670db9fe6775853d62632ad299dd734b6ba6c6b336Evan Cheng    const X86Subtarget *Subtarget;
668c9f5f3f64f896d0a8c8fa35a1dd98bc57b8960f6Dan Gohman    const X86RegisterInfo *RegInfo;
669bff66b0c6c8266a6f9ba6c9bd5d2541a4d4c6ec9Anton Korobeynikov    const TargetData *TD;
6700db9fe6775853d62632ad299dd734b6ba6c6b336Evan Cheng
67125ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng    /// X86StackPtr - X86 physical register used as stack ptr.
67225ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng    unsigned X86StackPtr;
6736e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
6746e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer    /// X86ScalarSSEf32, X86ScalarSSEf64 - Select between SSE or x87
675f1fc3a8fa6d4e81e30c08983d786c640acb2591cDale Johannesen    /// floating point ops.
676f1fc3a8fa6d4e81e30c08983d786c640acb2591cDale Johannesen    /// When SSE is available, use it for f32 operations.
677f1fc3a8fa6d4e81e30c08983d786c640acb2591cDale Johannesen    /// When SSE2 is available, use it for f64 operations.
678f1fc3a8fa6d4e81e30c08983d786c640acb2591cDale Johannesen    bool X86ScalarSSEf32;
679f1fc3a8fa6d4e81e30c08983d786c640acb2591cDale Johannesen    bool X86ScalarSSEf64;
6800d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
681eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng    /// LegalFPImmediates - A list of legal fp immediates.
682eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng    std::vector<APFloat> LegalFPImmediates;
683eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng
684eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng    /// addLegalFPImmediate - Indicate that this x86 target can instruction
685eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng    /// select the specified FP immediate natively.
686eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng    void addLegalFPImmediate(const APFloat& Imm) {
687eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng      LegalFPImmediates.push_back(Imm);
688eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng    }
689eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng
69098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
69165c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                            CallingConv::ID CallConv, bool isVarArg,
69298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                            const SmallVectorImpl<ISD::InputArg> &Ins,
69398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                            DebugLoc dl, SelectionDAG &DAG,
694d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                            SmallVectorImpl<SDValue> &InVals) const;
69598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    SDValue LowerMemArgument(SDValue Chain,
69665c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                             CallingConv::ID CallConv,
69798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                             const SmallVectorImpl<ISD::InputArg> &ArgInfo,
69898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                             DebugLoc dl, SelectionDAG &DAG,
69998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                             const CCValAssign &VA,  MachineFrameInfo *MFI,
700d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                              unsigned i) const;
70198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    SDValue LowerMemOpCallTo(SDValue Chain, SDValue StackPtr, SDValue Arg,
70298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                             DebugLoc dl, SelectionDAG &DAG,
70398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                             const CCValAssign &VA,
704d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                             ISD::ArgFlagsTy Flags) const;
7051b5dcc34b701639f94008658a2042abc43b9b910Rafael Espindola
70686737665b81550fdb575f7d8cc5decc801a7813dGordon Henriksen    // Call lowering helpers.
7070c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng
7080c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng    /// IsEligibleForTailCallOptimization - Check whether the call is eligible
7090c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng    /// for tail call optimization. Targets which want to do tail call
7100c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng    /// optimization should implement this function.
711022d9e1cef7586a80a96446ae8691a37def9bbf4Evan Cheng    bool IsEligibleForTailCallOptimization(SDValue Callee,
7120c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng                                           CallingConv::ID CalleeCC,
7130c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng                                           bool isVarArg,
714a375d471378b1674a9d77d180a0b05ea8c90cb4bEvan Cheng                                           bool isCalleeStructRet,
715a375d471378b1674a9d77d180a0b05ea8c90cb4bEvan Cheng                                           bool isCallerStructRet,
716b17124553d569c6f09347f2cbe072eab445d30c4Evan Cheng                                    const SmallVectorImpl<ISD::OutputArg> &Outs,
717c9403659a98bf6487ab6fbf40b81628b5695c02eDan Gohman                                    const SmallVectorImpl<SDValue> &OutVals,
718b17124553d569c6f09347f2cbe072eab445d30c4Evan Cheng                                    const SmallVectorImpl<ISD::InputArg> &Ins,
7190c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng                                           SelectionDAG& DAG) const;
720d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    bool IsCalleePop(bool isVarArg, CallingConv::ID CallConv) const;
721475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue EmitTailCallLoadRetAddr(SelectionDAG &DAG, SDValue &OutRetAddr,
722475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                SDValue Chain, bool IsTailCall, bool Is64Bit,
723d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                                int FPDiff, DebugLoc dl) const;
7244b5324ad2cbf774c9c6ed02ea0fcc864f2f5f885Arnold Schwaighofer
725d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    unsigned GetAlignedArgumentStackSize(unsigned StackSize,
726d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                                         SelectionDAG &DAG) const;
727559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng
728948e95a381bf6771639703643ef75e0115b35f53Eli Friedman    std::pair<SDValue,SDValue> FP_TO_INTHelper(SDValue Op, SelectionDAG &DAG,
729d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                                               bool isSigned) const;
730c363094e04df621d41ca570eb2a7bf8826bb8c1aEvan Cheng
731c363094e04df621d41ca570eb2a7bf8826bb8c1aEvan Cheng    SDValue LowerAsSplatVectorLoad(SDValue SrcOp, EVT VT, DebugLoc dl,
732d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                                   SelectionDAG &DAG) const;
733d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
734d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const;
735d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
736d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
737d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerEXTRACT_VECTOR_ELT_SSE4(SDValue Op, SelectionDAG &DAG) const;
738d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
739d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerINSERT_VECTOR_ELT_SSE4(SDValue Op, SelectionDAG &DAG) const;
740d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSCALAR_TO_VECTOR(SDValue Op, SelectionDAG &DAG) const;
741d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
742d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
74333c960f523f2308482d5b2816af46a7ec90a6d3dDale Johannesen    SDValue LowerGlobalAddress(const GlobalValue *GV, DebugLoc dl,
74433c960f523f2308482d5b2816af46a7ec90a6d3dDale Johannesen                               int64_t Offset, SelectionDAG &DAG) const;
745d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
746d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
747d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const;
748d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerShift(SDValue Op, SelectionDAG &DAG) const;
749e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    SDValue BuildFILD(SDValue Op, EVT SrcVT, SDValue Chain, SDValue StackSlot,
750d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                      SelectionDAG &DAG) const;
751bf17cfa3f904e488e898ac2e3af706fd1a892f08Wesley Peck    SDValue LowerBITCAST(SDValue op, SelectionDAG &DAG) const;
752d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
753d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
754d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerUINT_TO_FP_i64(SDValue Op, SelectionDAG &DAG) const;
755d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerUINT_TO_FP_i32(SDValue Op, SelectionDAG &DAG) const;
756d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG) const;
757d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerFP_TO_UINT(SDValue Op, SelectionDAG &DAG) const;
758d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerFABS(SDValue Op, SelectionDAG &DAG) const;
759d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerFNEG(SDValue Op, SelectionDAG &DAG) const;
760d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const;
7615528e7bcb1209094a68bbf6d1efeefc3ca34774fEvan Cheng    SDValue LowerToBT(SDValue And, ISD::CondCode CC,
7625528e7bcb1209094a68bbf6d1efeefc3ca34774fEvan Cheng                      DebugLoc dl, SelectionDAG &DAG) const;
763d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
764d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerVSETCC(SDValue Op, SelectionDAG &DAG) const;
765d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
766d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
767d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerMEMSET(SDValue Op, SelectionDAG &DAG) const;
768d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
769d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
770d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
771d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const;
772d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerVACOPY(SDValue Op, SelectionDAG &DAG) const;
773d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
774d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
775d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
776d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerFRAME_TO_ARGS_OFFSET(SDValue Op, SelectionDAG &DAG) const;
777d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const;
778d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerTRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
779d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerFLT_ROUNDS_(SDValue Op, SelectionDAG &DAG) const;
780d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerCTLZ(SDValue Op, SelectionDAG &DAG) const;
781d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerCTTZ(SDValue Op, SelectionDAG &DAG) const;
782d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerMUL_V2I64(SDValue Op, SelectionDAG &DAG) const;
783bdcb5afb77547337ba148ce24d5e1046c0b25cedNate Begeman    SDValue LowerSHL(SDValue Op, SelectionDAG &DAG) const;
784d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerXALUO(SDValue Op, SelectionDAG &DAG) const;
785d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman
786d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerCMP_SWAP(SDValue Op, SelectionDAG &DAG) const;
787d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerLOAD_SUB(SDValue Op, SelectionDAG &DAG) const;
788d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerREADCYCLECOUNTER(SDValue Op, SelectionDAG &DAG) const;
7899a9d275dc7897dfba7f41ce1b3770ca27ac149e8Eric Christopher    SDValue LowerMEMBARRIER(SDValue Op, SelectionDAG &DAG) const;
7901607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands
791bf8154a4395bf941f57f6453503a850cb9805a64Bruno Cardoso Lopes    // Utility functions to help LowerVECTOR_SHUFFLE
792bf8154a4395bf941f57f6453503a850cb9805a64Bruno Cardoso Lopes    SDValue LowerVECTOR_SHUFFLEv8i16(SDValue Op, SelectionDAG &DAG) const;
793bf8154a4395bf941f57f6453503a850cb9805a64Bruno Cardoso Lopes
79498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    virtual SDValue
79598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman      LowerFormalArguments(SDValue Chain,
79665c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                           CallingConv::ID CallConv, bool isVarArg,
79798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                           const SmallVectorImpl<ISD::InputArg> &Ins,
79898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                           DebugLoc dl, SelectionDAG &DAG,
799d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                           SmallVectorImpl<SDValue> &InVals) const;
80098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    virtual SDValue
801022d9e1cef7586a80a96446ae8691a37def9bbf4Evan Cheng      LowerCall(SDValue Chain, SDValue Callee,
8020c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng                CallingConv::ID CallConv, bool isVarArg, bool &isTailCall,
80398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                const SmallVectorImpl<ISD::OutputArg> &Outs,
804c9403659a98bf6487ab6fbf40b81628b5695c02eDan Gohman                const SmallVectorImpl<SDValue> &OutVals,
80598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                const SmallVectorImpl<ISD::InputArg> &Ins,
80698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                DebugLoc dl, SelectionDAG &DAG,
807d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                SmallVectorImpl<SDValue> &InVals) const;
80898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
80998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    virtual SDValue
81098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman      LowerReturn(SDValue Chain,
81165c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                  CallingConv::ID CallConv, bool isVarArg,
81298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                  const SmallVectorImpl<ISD::OutputArg> &Outs,
813c9403659a98bf6487ab6fbf40b81628b5695c02eDan Gohman                  const SmallVectorImpl<SDValue> &OutVals,
814d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                  DebugLoc dl, SelectionDAG &DAG) const;
81598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
8163d2125c9dbac695c93f42c0f59fd040e413fd711Evan Cheng    virtual bool isUsedByReturnOnly(SDNode *N) const;
8173d2125c9dbac695c93f42c0f59fd040e413fd711Evan Cheng
818b4997aeab74934ffa6fc0409afc4d8704245e372Kenneth Uildriks    virtual bool
819b4997aeab74934ffa6fc0409afc4d8704245e372Kenneth Uildriks      CanLowerReturn(CallingConv::ID CallConv, bool isVarArg,
82084023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman                     const SmallVectorImpl<ISD::OutputArg> &Outs,
821c9af33c6854afe7b082af2d892ec5f05dfa383c7Dan Gohman                     LLVMContext &Context) const;
822b4997aeab74934ffa6fc0409afc4d8704245e372Kenneth Uildriks
8231607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands    void ReplaceATOMIC_BINARY_64(SDNode *N, SmallVectorImpl<SDValue> &Results,
824d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                                 SelectionDAG &DAG, unsigned NewOp) const;
8251607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands
826b120ab4057fc66ce11ee1f108af9dbbeafa3fed9Eric Christopher    /// Utility function to emit string processing sse4.2 instructions
827b120ab4057fc66ce11ee1f108af9dbbeafa3fed9Eric Christopher    /// that return in xmm0.
828431f775bab2c1ca144e3c9c6b1e3c0767bfacc33Evan Cheng    /// This takes the instruction to expand, the associated machine basic
829431f775bab2c1ca144e3c9c6b1e3c0767bfacc33Evan Cheng    /// block, the number of args, and whether or not the second arg is
830431f775bab2c1ca144e3c9c6b1e3c0767bfacc33Evan Cheng    /// in memory or not.
831b120ab4057fc66ce11ee1f108af9dbbeafa3fed9Eric Christopher    MachineBasicBlock *EmitPCMP(MachineInstr *BInstr, MachineBasicBlock *BB,
83220adc9dc4650313f017b27d9818eb2176238113dMon P Wang                                unsigned argNum, bool inMem) const;
833b120ab4057fc66ce11ee1f108af9dbbeafa3fed9Eric Christopher
834228232b2821f8e7f9c0b874ad733414bda183db6Eric Christopher    /// Utility functions to emit monitor and mwait instructions. These
835228232b2821f8e7f9c0b874ad733414bda183db6Eric Christopher    /// need to make sure that the arguments to the intrinsic are in the
836228232b2821f8e7f9c0b874ad733414bda183db6Eric Christopher    /// correct registers.
83782be220092cfb9d432c5a6da1bd5e8c56dc21d4dEric Christopher    MachineBasicBlock *EmitMonitor(MachineInstr *MI,
83882be220092cfb9d432c5a6da1bd5e8c56dc21d4dEric Christopher                                   MachineBasicBlock *BB) const;
839228232b2821f8e7f9c0b874ad733414bda183db6Eric Christopher    MachineBasicBlock *EmitMwait(MachineInstr *MI, MachineBasicBlock *BB) const;
840228232b2821f8e7f9c0b874ad733414bda183db6Eric Christopher
84163307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang    /// Utility function to emit atomic bitwise operations (and, or, xor).
842431f775bab2c1ca144e3c9c6b1e3c0767bfacc33Evan Cheng    /// It takes the bitwise instruction to expand, the associated machine basic
843431f775bab2c1ca144e3c9c6b1e3c0767bfacc33Evan Cheng    /// block, and the associated X86 opcodes for reg/reg and reg/imm.
84463307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang    MachineBasicBlock *EmitAtomicBitwiseWithCustomInserter(
84563307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang                                                    MachineInstr *BInstr,
84663307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang                                                    MachineBasicBlock *BB,
84763307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang                                                    unsigned regOpc,
848507a58ac9b20ddcea2e56a014be26b8f8cc0ecb8Andrew Lenharth                                                    unsigned immOpc,
849140be2dfb76928cb660b7de23f8310d76ca794b5Dale Johannesen                                                    unsigned loadOpc,
850140be2dfb76928cb660b7de23f8310d76ca794b5Dale Johannesen                                                    unsigned cxchgOpc,
851140be2dfb76928cb660b7de23f8310d76ca794b5Dale Johannesen                                                    unsigned notOpc,
852140be2dfb76928cb660b7de23f8310d76ca794b5Dale Johannesen                                                    unsigned EAXreg,
853140be2dfb76928cb660b7de23f8310d76ca794b5Dale Johannesen                                                    TargetRegisterClass *RC,
8541fdbc1dd4e9cb42c79a30e8dc308c322e923cc52Dan Gohman                                                    bool invSrc = false) const;
85548c1bc2ace6481d3272ab5c18e1f19352c563be8Dale Johannesen
85648c1bc2ace6481d3272ab5c18e1f19352c563be8Dale Johannesen    MachineBasicBlock *EmitAtomicBit6432WithCustomInserter(
85748c1bc2ace6481d3272ab5c18e1f19352c563be8Dale Johannesen                                                    MachineInstr *BInstr,
85848c1bc2ace6481d3272ab5c18e1f19352c563be8Dale Johannesen                                                    MachineBasicBlock *BB,
85948c1bc2ace6481d3272ab5c18e1f19352c563be8Dale Johannesen                                                    unsigned regOpcL,
86048c1bc2ace6481d3272ab5c18e1f19352c563be8Dale Johannesen                                                    unsigned regOpcH,
86148c1bc2ace6481d3272ab5c18e1f19352c563be8Dale Johannesen                                                    unsigned immOpcL,
86248c1bc2ace6481d3272ab5c18e1f19352c563be8Dale Johannesen                                                    unsigned immOpcH,
8631fdbc1dd4e9cb42c79a30e8dc308c322e923cc52Dan Gohman                                                    bool invSrc = false) const;
8646e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
86563307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang    /// Utility function to emit atomic min and max.  It takes the min/max
866bddc442a00c2216834499f10c12d023f1751104cBill Wendling    /// instruction to expand, the associated basic block, and the associated
867bddc442a00c2216834499f10c12d023f1751104cBill Wendling    /// cmov opcode for moving the min or max value.
86863307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang    MachineBasicBlock *EmitAtomicMinMaxWithCustomInserter(MachineInstr *BInstr,
86963307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang                                                          MachineBasicBlock *BB,
8701fdbc1dd4e9cb42c79a30e8dc308c322e923cc52Dan Gohman                                                        unsigned cmovOpc) const;
871076aee32e86bc4a0c096262b3261923f25220dc6Dan Gohman
872320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman    // Utility function to emit the low-level va_arg code for X86-64.
873320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman    MachineBasicBlock *EmitVAARG64WithCustomInserter(
874320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman                       MachineInstr *MI,
875320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman                       MachineBasicBlock *MBB) const;
876320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman
877d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman    /// Utility function to emit the xmm reg save portion of va_start.
878d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman    MachineBasicBlock *EmitVAStartSaveXMMRegsWithCustomInserter(
879d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman                                                   MachineInstr *BInstr,
880d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman                                                   MachineBasicBlock *BB) const;
881d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman
88252600972832cb4ae8f4c63802f3764cbfbcb203dChris Lattner    MachineBasicBlock *EmitLoweredSelect(MachineInstr *I,
883af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman                                         MachineBasicBlock *BB) const;
884043f3c2a0e286dcfd4cc5a16bf006e3c45929516Anton Korobeynikov
885e9c253e0bc01fd50bf788efb62093a5fa6ef5849Michael J. Spencer    MachineBasicBlock *EmitLoweredWinAlloca(MachineInstr *MI,
886af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman                                              MachineBasicBlock *BB) const;
8876e56b18e575228a4f7318297155fe6ba2502a39bMichael J. Spencer
88830ef0e5658b0b8b04437f73f74162d5d72923f29Eric Christopher    MachineBasicBlock *EmitLoweredTLSCall(MachineInstr *MI,
88930ef0e5658b0b8b04437f73f74162d5d72923f29Eric Christopher                                          MachineBasicBlock *BB) const;
890043f3c2a0e286dcfd4cc5a16bf006e3c45929516Anton Korobeynikov
8915bf7c534cf057a52f30624743841fadd241c4dbbRafael Espindola    MachineBasicBlock *emitLoweredTLSAddr(MachineInstr *MI,
8925bf7c534cf057a52f30624743841fadd241c4dbbRafael Espindola                                          MachineBasicBlock *BB) const;
8935bf7c534cf057a52f30624743841fadd241c4dbbRafael Espindola
894076aee32e86bc4a0c096262b3261923f25220dc6Dan Gohman    /// Emit nodes that will be selected as "test Op0,Op0", or something
8953112581441cd22ac955b1af2d08effe3bab975daDan Gohman    /// equivalent, for use with the given x86 condition code.
896552f09a0d716a73dc70efd66384146e73ee63a3eEvan Cheng    SDValue EmitTest(SDValue Op0, unsigned X86CC, SelectionDAG &DAG) const;
897076aee32e86bc4a0c096262b3261923f25220dc6Dan Gohman
898076aee32e86bc4a0c096262b3261923f25220dc6Dan Gohman    /// Emit nodes that will be selected as "cmp Op0,Op1", or something
8993112581441cd22ac955b1af2d08effe3bab975daDan Gohman    /// equivalent, for use with the given x86 condition code.
900552f09a0d716a73dc70efd66384146e73ee63a3eEvan Cheng    SDValue EmitCmp(SDValue Op0, SDValue Op1, unsigned X86CC,
901d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                    SelectionDAG &DAG) const;
902dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner  };
903c3f44b0d636ff9a6d706ea9ac17ae77c8fa8aeffEvan Cheng
904c3f44b0d636ff9a6d706ea9ac17ae77c8fa8aeffEvan Cheng  namespace X86 {
905a4160c3434b08288d1f79f1acbe453d1b9610b22Dan Gohman    FastISel *createFastISel(FunctionLoweringInfo &funcInfo);
906c3f44b0d636ff9a6d706ea9ac17ae77c8fa8aeffEvan Cheng  }
907dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner}
908dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner
909dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner#endif    // X86ISELLOWERING_H
910