X86ISelLowering.h revision 3157ef1c13376f669a32bc152f2c3000480cedd3
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
60e3de85b447b0a94c82f147159a0c903ea47e0069Evan Cheng      /// FILD, FILD_FLAG - This instruction implements SINT_TO_FP with the
61e3de85b447b0a94c82f147159a0c903ea47e0069Evan Cheng      /// integer source in memory and FP reg result.  This corresponds to the
62e3de85b447b0a94c82f147159a0c903ea47e0069Evan Cheng      /// X86::FILD*m instructions. It has three inputs (token chain, address,
63e3de85b447b0a94c82f147159a0c903ea47e0069Evan Cheng      /// and source type) and two outputs (FP value and token chain). FILD_FLAG
64e3de85b447b0a94c82f147159a0c903ea47e0069Evan Cheng      /// also produces a flag).
65a3195e86439896ecba9b3f2afce40919b20a987aEvan Cheng      FILD,
66e3de85b447b0a94c82f147159a0c903ea47e0069Evan Cheng      FILD_FLAG,
67dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner
68dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner      /// FP_TO_INT*_IN_MEM - This instruction implements FP_TO_SINT with the
69dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner      /// integer destination in memory and a FP reg source.  This corresponds
70dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner      /// to the X86::FIST*m instructions and the rounding mode change stuff. It
7191897778690a7d683497ba3f4040ebf09345f08aChris Lattner      /// has two inputs (token chain and address) and two outputs (int value
7291897778690a7d683497ba3f4040ebf09345f08aChris Lattner      /// and token chain).
73dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner      FP_TO_INT16_IN_MEM,
74dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner      FP_TO_INT32_IN_MEM,
75dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner      FP_TO_INT64_IN_MEM,
76dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner
77b077b842b64af39c8e2e9aaad327b3be446790ddEvan Cheng      /// FLD - This instruction implements an extending load to FP stack slots.
78b077b842b64af39c8e2e9aaad327b3be446790ddEvan Cheng      /// This corresponds to the X86::FLD32m / X86::FLD64m. It takes a chain
7938bcbaf23e8836c8f64e7fd66ebebc44a2b921a1Evan Cheng      /// operand, ptr to load from, and a ValueType node indicating the type
8038bcbaf23e8836c8f64e7fd66ebebc44a2b921a1Evan Cheng      /// to load to.
81b077b842b64af39c8e2e9aaad327b3be446790ddEvan Cheng      FLD,
82b077b842b64af39c8e2e9aaad327b3be446790ddEvan Cheng
83d90eb7fb2435e2abedb4694edc44fa45642edbe9Evan Cheng      /// FST - This instruction implements a truncating store to FP stack
84d90eb7fb2435e2abedb4694edc44fa45642edbe9Evan Cheng      /// slots. This corresponds to the X86::FST32m / X86::FST64m. It takes a
85d90eb7fb2435e2abedb4694edc44fa45642edbe9Evan Cheng      /// chain operand, value to store, address, and a ValueType to store it
86d90eb7fb2435e2abedb4694edc44fa45642edbe9Evan Cheng      /// as.
87d90eb7fb2435e2abedb4694edc44fa45642edbe9Evan Cheng      FST,
88d90eb7fb2435e2abedb4694edc44fa45642edbe9Evan Cheng
8998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman      /// CALL - These operations represent an abstract X86 call
90dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner      /// instruction, which includes a bunch of information.  In particular the
91dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner      /// operands of these node are:
92dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner      ///
93dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner      ///     #0 - The incoming token chain
94dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner      ///     #1 - The callee
95dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner      ///     #2 - The number of arg bytes the caller pushes on the stack.
96dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner      ///     #3 - The number of arg bytes the callee pops off the stack.
97dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner      ///     #4 - The value to pass in AL/AX/EAX (optional)
98dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner      ///     #5 - The value to pass in DL/DX/EDX (optional)
99dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner      ///
100dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner      /// The result values of these nodes are:
101dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner      ///
102dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner      ///     #0 - The outgoing token chain
103dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner      ///     #1 - The first register result value (optional)
104dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner      ///     #2 - The second register result value (optional)
105dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner      ///
106dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner      CALL,
10798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
108b873ff322c28ce097762355921100b677c71238dAndrew Lenharth      /// RDTSC_DAG - This operation implements the lowering for
109b873ff322c28ce097762355921100b677c71238dAndrew Lenharth      /// readcyclecounter
110b873ff322c28ce097762355921100b677c71238dAndrew Lenharth      RDTSC_DAG,
1117df96d66729d1f33934de7b52553e5f071686041Evan Cheng
1127df96d66729d1f33934de7b52553e5f071686041Evan Cheng      /// X86 compare and logical compare instructions.
1137d6ff3a25d9be6fae7ad95837ba8f1a8738947b6Evan Cheng      CMP, COMI, UCOMI,
1147df96d66729d1f33934de7b52553e5f071686041Evan Cheng
115c7a37d4ff2ee8ffb93ba97e9393ff582f0e79a9aDan Gohman      /// X86 bit-test instructions.
116c7a37d4ff2ee8ffb93ba97e9393ff582f0e79a9aDan Gohman      BT,
117c7a37d4ff2ee8ffb93ba97e9393ff582f0e79a9aDan Gohman
1182004eb6272d4787b9e08a83230fe022cbaf4deb0Dan Gohman      /// X86 SetCC. Operand 0 is condition code, and operand 1 is the flag
119d5781fca4f8f98863560338d4f8d017389428119Evan Cheng      /// operand produced by a CMP instruction.
120d5781fca4f8f98863560338d4f8d017389428119Evan Cheng      SETCC,
121d5781fca4f8f98863560338d4f8d017389428119Evan Cheng
122ad9c0a3d8bf625d169596547f893b9ec8b953e26Evan Cheng      // Same as SETCC except it's materialized with a sbb and the value is all
123ad9c0a3d8bf625d169596547f893b9ec8b953e26Evan Cheng      // one's or all zero's.
124ad9c0a3d8bf625d169596547f893b9ec8b953e26Evan Cheng      SETCC_CARRY,
125ad9c0a3d8bf625d169596547f893b9ec8b953e26Evan Cheng
1262b9f4349086247c58ed0bcd17c7d11b14b14f52bChris Lattner      /// X86 conditional moves. Operand 0 and operand 1 are the two values
1272b9f4349086247c58ed0bcd17c7d11b14b14f52bChris Lattner      /// to select from. Operand 2 is the condition code, and operand 3 is the
1282b9f4349086247c58ed0bcd17c7d11b14b14f52bChris Lattner      /// flag operand produced by a CMP or TEST instruction. It also writes a
1292b9f4349086247c58ed0bcd17c7d11b14b14f52bChris Lattner      /// flag result.
1307df96d66729d1f33934de7b52553e5f071686041Evan Cheng      CMOV,
131898101c15fa11a896deb4e2fcb73b4727e1dcc1fEvan Cheng
1322004eb6272d4787b9e08a83230fe022cbaf4deb0Dan Gohman      /// X86 conditional branches. Operand 0 is the chain operand, operand 1
1332004eb6272d4787b9e08a83230fe022cbaf4deb0Dan Gohman      /// is the block to branch if condition is true, operand 2 is the
1342004eb6272d4787b9e08a83230fe022cbaf4deb0Dan Gohman      /// condition code, and operand 3 is the flag operand produced by a CMP
135d5781fca4f8f98863560338d4f8d017389428119Evan Cheng      /// or TEST instruction.
136898101c15fa11a896deb4e2fcb73b4727e1dcc1fEvan Cheng      BRCOND,
137b077b842b64af39c8e2e9aaad327b3be446790ddEvan Cheng
1382004eb6272d4787b9e08a83230fe022cbaf4deb0Dan Gohman      /// Return with a flag operand. Operand 0 is the chain operand, operand
1392004eb6272d4787b9e08a83230fe022cbaf4deb0Dan Gohman      /// 1 is the number of bytes of stack to pop.
140b077b842b64af39c8e2e9aaad327b3be446790ddEvan Cheng      RET_FLAG,
14167f92a76497d1f50e0dd6279c81b45689bd463f5Evan Cheng
14267f92a76497d1f50e0dd6279c81b45689bd463f5Evan Cheng      /// REP_STOS - Repeat fill, corresponds to X86::REP_STOSx.
14367f92a76497d1f50e0dd6279c81b45689bd463f5Evan Cheng      REP_STOS,
14467f92a76497d1f50e0dd6279c81b45689bd463f5Evan Cheng
14567f92a76497d1f50e0dd6279c81b45689bd463f5Evan Cheng      /// REP_MOVS - Repeat move, corresponds to X86::REP_MOVSx.
14667f92a76497d1f50e0dd6279c81b45689bd463f5Evan Cheng      REP_MOVS,
147223547ab3101f32252cb704a67bd757e00fdbd16Evan Cheng
1487ccced634ae0ecdc1c4f599fd3abf188c367e231Evan Cheng      /// GlobalBaseReg - On Darwin, this node represents the result of the popl
1497ccced634ae0ecdc1c4f599fd3abf188c367e231Evan Cheng      /// at function entry, used for PIC code.
1507ccced634ae0ecdc1c4f599fd3abf188c367e231Evan Cheng      GlobalBaseReg,
151a0ea0539e359f6d82218e5aa4cdf3b50b17d6fbdEvan Cheng
152056292fd738924f3f7703725d8f630983794b5a5Bill Wendling      /// Wrapper - A wrapper node for TargetConstantPool,
153056292fd738924f3f7703725d8f630983794b5a5Bill Wendling      /// TargetExternalSymbol, and TargetGlobalAddress.
154020d2e8e7aa36692af13c1215fdd6248a6d9e950Evan Cheng      Wrapper,
15548090aa8145640c023563751a8a1e1bcc09125e5Evan Cheng
1560085a28d13f86b09ba0c83e8dce81de3ba15ca2dEvan Cheng      /// WrapperRIP - Special wrapper used under X86-64 PIC mode for RIP
1570085a28d13f86b09ba0c83e8dce81de3ba15ca2dEvan Cheng      /// relative displacements.
1580085a28d13f86b09ba0c83e8dce81de3ba15ca2dEvan Cheng      WrapperRIP,
1590085a28d13f86b09ba0c83e8dce81de3ba15ca2dEvan Cheng
160eb38ebf15c326a5bb45ca9da6329cdf19ad6df95Mon P Wang      /// MOVQ2DQ - Copies a 64-bit value from a vector to another vector.
161eb38ebf15c326a5bb45ca9da6329cdf19ad6df95Mon P Wang      /// Can be used to move a vector value from a MMX register to a XMM
162eb38ebf15c326a5bb45ca9da6329cdf19ad6df95Mon P Wang      /// register.
163eb38ebf15c326a5bb45ca9da6329cdf19ad6df95Mon P Wang      MOVQ2DQ,
164eb38ebf15c326a5bb45ca9da6329cdf19ad6df95Mon P Wang
16514d12caf1d2de9618818646d12b30d647a860817Nate Begeman      /// PEXTRB - Extract an 8-bit value from a vector and zero extend it to
16614d12caf1d2de9618818646d12b30d647a860817Nate Begeman      /// i32, corresponds to X86::PEXTRB.
16714d12caf1d2de9618818646d12b30d647a860817Nate Begeman      PEXTRB,
16814d12caf1d2de9618818646d12b30d647a860817Nate Begeman
169b067a1e7e68c4446d3512c25d3a5ac55c6dd76f8Evan Cheng      /// PEXTRW - Extract a 16-bit value from a vector and zero extend it to
170653159f4aac61a7ad796e406a4899d27ffe5a789Evan Cheng      /// i32, corresponds to X86::PEXTRW.
171b067a1e7e68c4446d3512c25d3a5ac55c6dd76f8Evan Cheng      PEXTRW,
172653159f4aac61a7ad796e406a4899d27ffe5a789Evan Cheng
17314d12caf1d2de9618818646d12b30d647a860817Nate Begeman      /// INSERTPS - Insert any element of a 4 x float vector into any element
17414d12caf1d2de9618818646d12b30d647a860817Nate Begeman      /// of a destination 4 x floatvector.
17514d12caf1d2de9618818646d12b30d647a860817Nate Begeman      INSERTPS,
17614d12caf1d2de9618818646d12b30d647a860817Nate Begeman
17714d12caf1d2de9618818646d12b30d647a860817Nate Begeman      /// PINSRB - Insert the lower 8-bits of a 32-bit value to a vector,
17814d12caf1d2de9618818646d12b30d647a860817Nate Begeman      /// corresponds to X86::PINSRB.
17914d12caf1d2de9618818646d12b30d647a860817Nate Begeman      PINSRB,
18014d12caf1d2de9618818646d12b30d647a860817Nate Begeman
181653159f4aac61a7ad796e406a4899d27ffe5a789Evan Cheng      /// PINSRW - Insert the lower 16-bits of a 32-bit value to a vector,
182653159f4aac61a7ad796e406a4899d27ffe5a789Evan Cheng      /// corresponds to X86::PINSRW.
1838f2b4cc07161b56e56d6615761ea4ba08dc0e7d3Chris Lattner      PINSRW, MMX_PINSRW,
1848ca29326e19201075f6dc95781560ea9ad41ececEvan Cheng
185b9a47b824f6c8ef3989a796018bf974c09cd243fNate Begeman      /// PSHUFB - Shuffle 16 8-bit values within a vector.
186b9a47b824f6c8ef3989a796018bf974c09cd243fNate Begeman      PSHUFB,
187b9a47b824f6c8ef3989a796018bf974c09cd243fNate Begeman
1888ca29326e19201075f6dc95781560ea9ad41ececEvan Cheng      /// FMAX, FMIN - Floating point max and min.
1898ca29326e19201075f6dc95781560ea9ad41ececEvan Cheng      ///
190b3a0417cad8b625acc3033bd5e24afb9ffd0b084Lauro Ramos Venancio      FMAX, FMIN,
1912038252c6a36efd18cc0bef216fa2c5bb9236617Dan Gohman
1922038252c6a36efd18cc0bef216fa2c5bb9236617Dan Gohman      /// FRSQRT, FRCP - Floating point reciprocal-sqrt and reciprocal
1932038252c6a36efd18cc0bef216fa2c5bb9236617Dan Gohman      /// approximation.  Note that these typically require refinement
1942038252c6a36efd18cc0bef216fa2c5bb9236617Dan Gohman      /// in order to obtain suitable precision.
1952038252c6a36efd18cc0bef216fa2c5bb9236617Dan Gohman      FRSQRT, FRCP,
1962038252c6a36efd18cc0bef216fa2c5bb9236617Dan Gohman
197094fad37b90946c91a09eb9270a0dbe800f49d87Rafael Espindola      // TLSADDR - Thread Local Storage.
198094fad37b90946c91a09eb9270a0dbe800f49d87Rafael Espindola      TLSADDR,
19930ef0e5658b0b8b04437f73f74162d5d72923f29Eric Christopher
20030ef0e5658b0b8b04437f73f74162d5d72923f29Eric Christopher      // TLSCALL - Thread Local Storage.  When calling to an OS provided
20130ef0e5658b0b8b04437f73f74162d5d72923f29Eric Christopher      // thunk at the address from an earlier relocation.
20230ef0e5658b0b8b04437f73f74162d5d72923f29Eric Christopher      TLSCALL,
203094fad37b90946c91a09eb9270a0dbe800f49d87Rafael Espindola
204094fad37b90946c91a09eb9270a0dbe800f49d87Rafael Espindola      // SegmentBaseAddress - The address segment:0
205094fad37b90946c91a09eb9270a0dbe800f49d87Rafael Espindola      SegmentBaseAddress,
2062365f51ed03afe6993bae962fdc2e5a956a64cd5Anton Korobeynikov
2077e2ff77ef05c23db6b9c82bc7a4110e170d7f94cEvan Cheng      // EH_RETURN - Exception Handling helpers.
208c85e1716f0e45e4c18a9ef2fbe431a51ac3a4252Arnold Schwaighofer      EH_RETURN,
209c85e1716f0e45e4c18a9ef2fbe431a51ac3a4252Arnold Schwaighofer
2104fe3073cfb5273a3655aef0c8d50c96882f26882Arnold Schwaighofer      /// TC_RETURN - Tail call return.
2114fe3073cfb5273a3655aef0c8d50c96882f26882Arnold Schwaighofer      ///   operand #0 chain
2124fe3073cfb5273a3655aef0c8d50c96882f26882Arnold Schwaighofer      ///   operand #1 callee (register or absolute)
2134fe3073cfb5273a3655aef0c8d50c96882f26882Arnold Schwaighofer      ///   operand #2 stack adjustment
2144fe3073cfb5273a3655aef0c8d50c96882f26882Arnold Schwaighofer      ///   operand #3 optional in flag
21545b22fa9f1f085d7971cce6db4f11b353e1646c6Anton Korobeynikov      TC_RETURN,
21645b22fa9f1f085d7971cce6db4f11b353e1646c6Anton Korobeynikov
2177e2ff77ef05c23db6b9c82bc7a4110e170d7f94cEvan Cheng      // LCMPXCHG_DAG, LCMPXCHG8_DAG - Compare and swap.
21826ed8697d4733f4ad588ef117ec4387560770ad0Andrew Lenharth      LCMPXCHG_DAG,
219d19189e9905e14a4001a8ca6fc4effb6a3f88e45Andrew Lenharth      LCMPXCHG8_DAG,
22026ed8697d4733f4ad588ef117ec4387560770ad0Andrew Lenharth
2217e2ff77ef05c23db6b9c82bc7a4110e170d7f94cEvan Cheng      // FNSTCW16m - Store FP control world into i16 memory.
2227e2ff77ef05c23db6b9c82bc7a4110e170d7f94cEvan Cheng      FNSTCW16m,
2237e2ff77ef05c23db6b9c82bc7a4110e170d7f94cEvan Cheng
224d880b97257c7f8ec4e94948874cb87c865d9f96fEvan Cheng      // VZEXT_MOVL - Vector move low and zero extend.
225d880b97257c7f8ec4e94948874cb87c865d9f96fEvan Cheng      VZEXT_MOVL,
226d880b97257c7f8ec4e94948874cb87c865d9f96fEvan Cheng
227d880b97257c7f8ec4e94948874cb87c865d9f96fEvan Cheng      // VZEXT_LOAD - Load, scalar_to_vector, and zero extend.
228f26ffe987cf3643a7bd66bd9f97c34605ba7d08eEvan Cheng      VZEXT_LOAD,
229f26ffe987cf3643a7bd66bd9f97c34605ba7d08eEvan Cheng
230f26ffe987cf3643a7bd66bd9f97c34605ba7d08eEvan Cheng      // VSHL, VSRL - Vector logical left / right shift.
23130a0de94e7a5cbdcd277a93e543b0788efa78ddcNate Begeman      VSHL, VSRL,
2329008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman
2339008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman      // CMPPD, CMPPS - Vector double/float comparison.
23430a0de94e7a5cbdcd277a93e543b0788efa78ddcNate Begeman      // CMPPD, CMPPS - Vector double/float comparison.
23530a0de94e7a5cbdcd277a93e543b0788efa78ddcNate Begeman      CMPPD, CMPPS,
23630a0de94e7a5cbdcd277a93e543b0788efa78ddcNate Begeman
23730a0de94e7a5cbdcd277a93e543b0788efa78ddcNate Begeman      // PCMP* - Vector integer comparisons.
23830a0de94e7a5cbdcd277a93e543b0788efa78ddcNate Begeman      PCMPEQB, PCMPEQW, PCMPEQD, PCMPEQQ,
239ab55ebda1c2254f98b06e770bc2dae7d05a4a366Bill Wendling      PCMPGTB, PCMPGTW, PCMPGTD, PCMPGTQ,
240ab55ebda1c2254f98b06e770bc2dae7d05a4a366Bill Wendling
241076aee32e86bc4a0c096262b3261923f25220dc6Dan Gohman      // ADD, SUB, SMUL, UMUL, etc. - Arithmetic operations with FLAGS results.
242076aee32e86bc4a0c096262b3261923f25220dc6Dan Gohman      ADD, SUB, SMUL, UMUL,
243e220c4b3d97bbdc9f6e8cf040942514612349c41Dan Gohman      INC, DEC, OR, XOR, AND,
24473f24c9f0d9afd1fd65d544f2b7b7b7c77fc2238Evan Cheng
24573f24c9f0d9afd1fd65d544f2b7b7b7c77fc2238Evan Cheng      // MUL_IMM - X86 specific multiply by immediate.
24671c6753d03d1bb27d0cf997285c425d631e5807bEric Christopher      MUL_IMM,
24771c6753d03d1bb27d0cf997285c425d631e5807bEric Christopher
24871c6753d03d1bb27d0cf997285c425d631e5807bEric Christopher      // PTEST - Vector bitwise comparisons
249d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman      PTEST,
250d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman
251045573ce21282ee7d1c58e57d00a77ede8c732daBruno Cardoso Lopes      // TESTP - Vector packed fp sign bitwise comparisons
252045573ce21282ee7d1c58e57d00a77ede8c732daBruno Cardoso Lopes      TESTP,
253045573ce21282ee7d1c58e57d00a77ede8c732daBruno Cardoso Lopes
2543157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      // Several flavors of instructions with vector shuffle behaviors.
2553157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PALIGN,
2563157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PSHUFD,
2573157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PSHUFHW,
2583157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PSHUFLW,
2593157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PSHUFHW_LD,
2603157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PSHUFLW_LD,
2613157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      SHUFPD,
2623157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      SHUFPS,
2633157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVDDUP,
2643157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVSHDUP,
2653157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVSLDUP,
2663157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVSHDUP_LD,
2673157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVSLDUP_LD,
2683157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVLHPS,
2693157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVHLPS,
2703157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVLHPD,
2713157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVHLPD,
2723157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVHPS,
2733157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVHPD,
2743157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVLPS,
2753157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVLPD,
2763157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVSD,
2773157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      MOVSS,
2783157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      UNPCKLPS,
2793157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      UNPCKLPD,
2803157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      UNPCKHPS,
2813157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      UNPCKHPD,
2823157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PUNPCKLBW,
2833157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PUNPCKLWD,
2843157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PUNPCKLDQ,
2853157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PUNPCKLQDQ,
2863157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PUNPCKHBW,
2873157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PUNPCKHWD,
2883157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PUNPCKHDQ,
2893157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes      PUNPCKHQDQ,
2903157ef1c13376f669a32bc152f2c3000480cedd3Bruno Cardoso Lopes
291d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman      // VASTART_SAVE_XMM_REGS - Save xmm argument registers to the stack,
292d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman      // according to %al. An operator is needed so that this can be expanded
293d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman      // with control flow.
294c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      VASTART_SAVE_XMM_REGS,
295c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
296043f3c2a0e286dcfd4cc5a16bf006e3c45929516Anton Korobeynikov      // MINGW_ALLOCA - MingW's __alloca call to do stack probing.
297043f3c2a0e286dcfd4cc5a16bf006e3c45929516Anton Korobeynikov      MINGW_ALLOCA,
298043f3c2a0e286dcfd4cc5a16bf006e3c45929516Anton Korobeynikov
299c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      // ATOMADD64_DAG, ATOMSUB64_DAG, ATOMOR64_DAG, ATOMAND64_DAG,
300c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      // ATOMXOR64_DAG, ATOMNAND64_DAG, ATOMSWAP64_DAG -
301c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      // Atomic 64-bit binary operations.
302c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      ATOMADD64_DAG = ISD::FIRST_TARGET_MEMORY_OPCODE,
303c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      ATOMSUB64_DAG,
304c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      ATOMOR64_DAG,
305c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      ATOMXOR64_DAG,
306c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      ATOMAND64_DAG,
307c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      ATOMNAND64_DAG,
3089a9d275dc7897dfba7f41ce1b3770ca27ac149e8Eric Christopher      ATOMSWAP64_DAG,
3099a9d275dc7897dfba7f41ce1b3770ca27ac149e8Eric Christopher
3109a9d275dc7897dfba7f41ce1b3770ca27ac149e8Eric Christopher      // Memory barrier
3119a9d275dc7897dfba7f41ce1b3770ca27ac149e8Eric Christopher      MEMBARRIER,
3129a9d275dc7897dfba7f41ce1b3770ca27ac149e8Eric Christopher      MFENCE,
3139a9d275dc7897dfba7f41ce1b3770ca27ac149e8Eric Christopher      SFENCE,
3149a9d275dc7897dfba7f41ce1b3770ca27ac149e8Eric Christopher      LFENCE
315043f3c2a0e286dcfd4cc5a16bf006e3c45929516Anton Korobeynikov
316043f3c2a0e286dcfd4cc5a16bf006e3c45929516Anton Korobeynikov      // WARNING: Do not add anything in the end unless you want the node to
317043f3c2a0e286dcfd4cc5a16bf006e3c45929516Anton Korobeynikov      // have memop! In fact, starting from ATOMADD64_DAG all opcodes will be
318043f3c2a0e286dcfd4cc5a16bf006e3c45929516Anton Korobeynikov      // thought as target memory ops!
319dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner    };
320dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner  }
321dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner
3220d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng  /// Define some predicates that are used for node matching.
3230d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng  namespace X86 {
3240d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isPSHUFDMask - Return true if the specified VECTOR_SHUFFLE operand
3250d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// specifies a shuffle of elements that is suitable for input to PSHUFD.
3269008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isPSHUFDMask(ShuffleVectorSDNode *N);
3270d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3280d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isPSHUFHWMask - Return true if the specified VECTOR_SHUFFLE operand
3290d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// specifies a shuffle of elements that is suitable for input to PSHUFD.
3309008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isPSHUFHWMask(ShuffleVectorSDNode *N);
3310d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3320d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isPSHUFLWMask - Return true if the specified VECTOR_SHUFFLE operand
3330d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// specifies a shuffle of elements that is suitable for input to PSHUFD.
3349008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isPSHUFLWMask(ShuffleVectorSDNode *N);
3350d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3360d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isSHUFPMask - Return true if the specified VECTOR_SHUFFLE operand
3370d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// specifies a shuffle of elements that is suitable for input to SHUFP*.
3389008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isSHUFPMask(ShuffleVectorSDNode *N);
3390d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3400d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isMOVHLPSMask - Return true if the specified VECTOR_SHUFFLE operand
3410d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// specifies a shuffle of elements that is suitable for input to MOVHLPS.
3429008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isMOVHLPSMask(ShuffleVectorSDNode *N);
3430d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3440d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isMOVHLPS_v_undef_Mask - Special case of isMOVHLPSMask for canonical form
3450d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// of vector_shuffle v, v, <2, 3, 2, 3>, i.e. vector_shuffle v, undef,
3460d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// <2, 3, 2, 3>
3479008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isMOVHLPS_v_undef_Mask(ShuffleVectorSDNode *N);
3480d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3490d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isMOVLPMask - Return true if the specified VECTOR_SHUFFLE operand
3509008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    /// specifies a shuffle of elements that is suitable for MOVLP{S|D}.
3519008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isMOVLPMask(ShuffleVectorSDNode *N);
3520d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3530d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isMOVHPMask - Return true if the specified VECTOR_SHUFFLE operand
3549008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    /// specifies a shuffle of elements that is suitable for MOVHP{S|D}.
3550d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// as well as MOVLHPS.
3560b10b91465e69c4ae3649115486e1eb56b8be878Nate Begeman    bool isMOVLHPSMask(ShuffleVectorSDNode *N);
3570d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3580d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isUNPCKLMask - Return true if the specified VECTOR_SHUFFLE operand
3590d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// specifies a shuffle of elements that is suitable for input to UNPCKL.
3609008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isUNPCKLMask(ShuffleVectorSDNode *N, bool V2IsSplat = false);
3610d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3620d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isUNPCKHMask - Return true if the specified VECTOR_SHUFFLE operand
3630d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// specifies a shuffle of elements that is suitable for input to UNPCKH.
3649008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isUNPCKHMask(ShuffleVectorSDNode *N, bool V2IsSplat = false);
3650d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3660d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isUNPCKL_v_undef_Mask - Special case of isUNPCKLMask for canonical form
3670d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// of vector_shuffle v, v, <0, 4, 1, 5>, i.e. vector_shuffle v, undef,
3680d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// <0, 0, 1, 1>
3699008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isUNPCKL_v_undef_Mask(ShuffleVectorSDNode *N);
3700d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3710d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isUNPCKH_v_undef_Mask - Special case of isUNPCKHMask for canonical form
3720d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// of vector_shuffle v, v, <2, 6, 3, 7>, i.e. vector_shuffle v, undef,
3730d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// <2, 2, 3, 3>
3749008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isUNPCKH_v_undef_Mask(ShuffleVectorSDNode *N);
3750d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3760d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isMOVLMask - Return true if the specified VECTOR_SHUFFLE operand
3770d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// specifies a shuffle of elements that is suitable for input to MOVSS,
3780d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// MOVSD, and MOVD, i.e. setting the lowest element.
3799008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isMOVLMask(ShuffleVectorSDNode *N);
3800d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3810d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isMOVSHDUPMask - Return true if the specified VECTOR_SHUFFLE operand
3820d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// specifies a shuffle of elements that is suitable for input to MOVSHDUP.
3839008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isMOVSHDUPMask(ShuffleVectorSDNode *N);
3840d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3850d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// isMOVSLDUPMask - Return true if the specified VECTOR_SHUFFLE operand
3860d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// specifies a shuffle of elements that is suitable for input to MOVSLDUP.
3879008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isMOVSLDUPMask(ShuffleVectorSDNode *N);
3880d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
3890b457f0c3a7e21b1fb9ac8b9f8e404e1312b6a60Evan Cheng    /// isMOVDDUPMask - Return true if the specified VECTOR_SHUFFLE operand
3900b457f0c3a7e21b1fb9ac8b9f8e404e1312b6a60Evan Cheng    /// specifies a shuffle of elements that is suitable for input to MOVDDUP.
3919008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isMOVDDUPMask(ShuffleVectorSDNode *N);
3920b457f0c3a7e21b1fb9ac8b9f8e404e1312b6a60Evan Cheng
393a09008bf6ddb61910212c31db1d714182882681eNate Begeman    /// isPALIGNRMask - Return true if the specified VECTOR_SHUFFLE operand
394a09008bf6ddb61910212c31db1d714182882681eNate Begeman    /// specifies a shuffle of elements that is suitable for input to PALIGNR.
395a09008bf6ddb61910212c31db1d714182882681eNate Begeman    bool isPALIGNRMask(ShuffleVectorSDNode *N);
396a09008bf6ddb61910212c31db1d714182882681eNate Begeman
3970d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// getShuffleSHUFImmediate - Return the appropriate immediate to shuffle
3980d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// the specified isShuffleMask VECTOR_SHUFFLE mask with PSHUF* and SHUFP*
3990d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// instructions.
4000d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    unsigned getShuffleSHUFImmediate(SDNode *N);
4010d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
4020d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    /// getShufflePSHUFHWImmediate - Return the appropriate immediate to shuffle
403a09008bf6ddb61910212c31db1d714182882681eNate Begeman    /// the specified VECTOR_SHUFFLE mask with PSHUFHW instruction.
4040d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    unsigned getShufflePSHUFHWImmediate(SDNode *N);
4050d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
406a09008bf6ddb61910212c31db1d714182882681eNate Begeman    /// getShufflePSHUFLWImmediate - Return the appropriate immediate to shuffle
407a09008bf6ddb61910212c31db1d714182882681eNate Begeman    /// the specified VECTOR_SHUFFLE mask with PSHUFLW instruction.
4080d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng    unsigned getShufflePSHUFLWImmediate(SDNode *N);
40937b7387da90ffd42d28ad0f08fca00b684294b2cEvan Cheng
410a09008bf6ddb61910212c31db1d714182882681eNate Begeman    /// getShufflePALIGNRImmediate - Return the appropriate immediate to shuffle
411a09008bf6ddb61910212c31db1d714182882681eNate Begeman    /// the specified VECTOR_SHUFFLE mask with the PALIGNR instruction.
412a09008bf6ddb61910212c31db1d714182882681eNate Begeman    unsigned getShufflePALIGNRImmediate(SDNode *N);
413a09008bf6ddb61910212c31db1d714182882681eNate Begeman
41437b7387da90ffd42d28ad0f08fca00b684294b2cEvan Cheng    /// isZeroNode - Returns true if Elt is a constant zero or a floating point
41537b7387da90ffd42d28ad0f08fca00b684294b2cEvan Cheng    /// constant +0.0.
41637b7387da90ffd42d28ad0f08fca00b684294b2cEvan Cheng    bool isZeroNode(SDValue Elt);
417b5e01724057e6eabc45da75df3037af4ad29248cAnton Korobeynikov
418b5e01724057e6eabc45da75df3037af4ad29248cAnton Korobeynikov    /// isOffsetSuitableForCodeModel - Returns true of the given offset can be
419b5e01724057e6eabc45da75df3037af4ad29248cAnton Korobeynikov    /// fit into displacement field of the instruction.
420b5e01724057e6eabc45da75df3037af4ad29248cAnton Korobeynikov    bool isOffsetSuitableForCodeModel(int64_t Offset, CodeModel::Model M,
421b5e01724057e6eabc45da75df3037af4ad29248cAnton Korobeynikov                                      bool hasSymbolicDisplacement = true);
4220d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng  }
4230d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
42491897778690a7d683497ba3f4040ebf09345f08aChris Lattner  //===--------------------------------------------------------------------===//
425dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner  //  X86TargetLowering - X86 Implementation of the TargetLowering interface
426dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner  class X86TargetLowering : public TargetLowering {
427dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner  public:
428c9f5f3f64f896d0a8c8fa35a1dd98bc57b8960f6Dan Gohman    explicit X86TargetLowering(X86TargetMachine &TM);
429dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner
430589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner    /// getPICBaseSymbol - Return the X86-32 PIC base.
431589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner    MCSymbol *getPICBaseSymbol(const MachineFunction *MF, MCContext &Ctx) const;
432589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner
433c64daabb70a2e0cb115f78b0c1548e65c0d527ffChris Lattner    virtual unsigned getJumpTableEncoding() const;
4345e1df8d1f71f1a8a534b8b5929a7dd670fe010c6Chris Lattner
435c64daabb70a2e0cb115f78b0c1548e65c0d527ffChris Lattner    virtual const MCExpr *
436c64daabb70a2e0cb115f78b0c1548e65c0d527ffChris Lattner    LowerCustomJumpTableEntry(const MachineJumpTableInfo *MJTI,
437c64daabb70a2e0cb115f78b0c1548e65c0d527ffChris Lattner                              const MachineBasicBlock *MBB, unsigned uid,
438c64daabb70a2e0cb115f78b0c1548e65c0d527ffChris Lattner                              MCContext &Ctx) const;
439c64daabb70a2e0cb115f78b0c1548e65c0d527ffChris Lattner
440cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng    /// getPICJumpTableRelocaBase - Returns relocation base for the given PIC
441cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng    /// jumptable.
442c64daabb70a2e0cb115f78b0c1548e65c0d527ffChris Lattner    virtual SDValue getPICJumpTableRelocBase(SDValue Table,
443c64daabb70a2e0cb115f78b0c1548e65c0d527ffChris Lattner                                             SelectionDAG &DAG) const;
444589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner    virtual const MCExpr *
445589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner    getPICJumpTableRelocBaseExpr(const MachineFunction *MF,
446589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner                                 unsigned JTI, MCContext &Ctx) const;
447589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner
44854e3efde4636dade74f95ede039091bf52ca1585Chris Lattner    /// getStackPtrReg - Return the stack pointer register we are using: either
44954e3efde4636dade74f95ede039091bf52ca1585Chris Lattner    /// ESP or RSP.
45054e3efde4636dade74f95ede039091bf52ca1585Chris Lattner    unsigned getStackPtrReg() const { return X86StackPtr; }
45129286502628867b31872ead2f2527592480f0970Evan Cheng
45229286502628867b31872ead2f2527592480f0970Evan Cheng    /// getByValTypeAlignment - Return the desired alignment for ByVal aggregate
45329286502628867b31872ead2f2527592480f0970Evan Cheng    /// function arguments in the caller parameter area. For X86, aggregates
45429286502628867b31872ead2f2527592480f0970Evan Cheng    /// that contains are placed at 16-byte boundaries while the rest are at
45529286502628867b31872ead2f2527592480f0970Evan Cheng    /// 4-byte boundaries.
45629286502628867b31872ead2f2527592480f0970Evan Cheng    virtual unsigned getByValTypeAlignment(const Type *Ty) const;
457f0df03134e698ea84e9cc1c28a853f83c02560d5Evan Cheng
458f0df03134e698ea84e9cc1c28a853f83c02560d5Evan Cheng    /// getOptimalMemOpType - Returns the target specific optimal type for load
459f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    /// and store operations as a result of memset, memcpy, and memmove
460f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    /// lowering. If DstAlign is zero that means it's safe to destination
461f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    /// alignment can satisfy any constraint. Similarly if SrcAlign is zero it
462f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    /// means there isn't a need to check it against alignment requirement,
463f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    /// probably because the source does not need to be loaded. If
464f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    /// 'NonScalarIntSafe' is true, that means it's safe to return a
465f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    /// non-scalar-integer type, e.g. empty string source, constant, or loaded
466c3b0c341e731b27b550ee9dcded9c17232b296b8Evan Cheng    /// from memory. 'MemcpyStrSrc' indicates whether the memcpy source is
467c3b0c341e731b27b550ee9dcded9c17232b296b8Evan Cheng    /// constant so it does not need to be loaded.
46837f32ee7ffe77d7c2bc1b185802e98979612f041Dan Gohman    /// It returns EVT::Other if the type should be determined using generic
46937f32ee7ffe77d7c2bc1b185802e98979612f041Dan Gohman    /// target-independent logic.
470f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    virtual EVT
471c3b0c341e731b27b550ee9dcded9c17232b296b8Evan Cheng    getOptimalMemOpType(uint64_t Size, unsigned DstAlign, unsigned SrcAlign,
472c3b0c341e731b27b550ee9dcded9c17232b296b8Evan Cheng                        bool NonScalarIntSafe, bool MemcpyStrSrc,
47337f32ee7ffe77d7c2bc1b185802e98979612f041Dan Gohman                        MachineFunction &MF) const;
474af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling
475af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling    /// allowsUnalignedMemoryAccesses - Returns true if the target allows
476af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling    /// unaligned memory accesses. of the specified type.
477af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling    virtual bool allowsUnalignedMemoryAccesses(EVT VT) const {
478af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling      return true;
479af5663405834ca7cf4a847f2efa2d624ce99b1d8Bill Wendling    }
48020c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling
481dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner    /// LowerOperation - Provide custom lowering hooks for some operations.
482dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner    ///
483d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
484dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner
4851607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands    /// ReplaceNodeResults - Replace the results of node with an illegal result
4861607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands    /// type with new values built out of custom code.
48727a6c7380fa4dfc8e1837a8dd67967d063b26544Chris Lattner    ///
4881607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands    virtual void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results,
489d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                                    SelectionDAG &DAG) const;
49027a6c7380fa4dfc8e1837a8dd67967d063b26544Chris Lattner
49127a6c7380fa4dfc8e1837a8dd67967d063b26544Chris Lattner
492475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const;
493206ee9d86cd4e78176fad6bfa2b016023edf5df7Evan Cheng
494e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng    /// isTypeDesirableForOp - Return true if the target has native support for
495e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng    /// the specified value type and it is 'desirable' to use the type for the
496e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng    /// given node type. e.g. On x86 i16 is legal, but undesirable since i16
497e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng    /// instruction encodings are longer and some i16 instructions are slow.
498e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng    virtual bool isTypeDesirableForOp(unsigned Opc, EVT VT) const;
499e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng
500e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng    /// isTypeDesirable - Return true if the target has native support for the
501e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng    /// specified value type and it is 'desirable' to use the type. e.g. On x86
502e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng    /// i16 is legal, but undesirable since i16 instruction encodings are longer
503e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng    /// and some i16 instructions are slow.
504e5b51ac7708402473f0a558f4aac74fab63d4f7eEvan Cheng    virtual bool IsDesirableToPromoteOp(SDValue Op, EVT &PVT) const;
50564b7bf71e84094193b40ab81aa7dacad921ecbeaEvan Cheng
506af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman    virtual MachineBasicBlock *
507af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman      EmitInstrWithCustomInserter(MachineInstr *MI,
508af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman                                  MachineBasicBlock *MBB) const;
5094a46080fe0133c71b511805c63abfb158dcd56a5Evan Cheng
51063307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang
5117226158d7e3986e55b58214a749aa4eabb3fb6d5Evan Cheng    /// getTargetNodeName - This method returns the name of a target specific
5127226158d7e3986e55b58214a749aa4eabb3fb6d5Evan Cheng    /// DAG node.
5137226158d7e3986e55b58214a749aa4eabb3fb6d5Evan Cheng    virtual const char *getTargetNodeName(unsigned Opcode) const;
5147226158d7e3986e55b58214a749aa4eabb3fb6d5Evan Cheng
5155b8f82e35b51bf007de07a7ca9347d804084ddf8Scott Michel    /// getSetCCResultType - Return the ISD::SETCC ValueType
516825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    virtual MVT::SimpleValueType getSetCCResultType(EVT VT) const;
5175b8f82e35b51bf007de07a7ca9347d804084ddf8Scott Michel
518368e18d56a87308045d341e85584597bfe7426e9Nate Begeman    /// computeMaskedBitsForTargetNode - Determine which of the bits specified
519368e18d56a87308045d341e85584597bfe7426e9Nate Begeman    /// in Mask are known to be either zero or one and return them in the
520368e18d56a87308045d341e85584597bfe7426e9Nate Begeman    /// KnownZero/KnownOne bitsets.
521475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    virtual void computeMaskedBitsForTargetNode(const SDValue Op,
522977a76fbb6ea1b87dfd7fbbe2ae2afb63e982ff3Dan Gohman                                                const APInt &Mask,
523fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman                                                APInt &KnownZero,
524fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman                                                APInt &KnownOne,
525ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman                                                const SelectionDAG &DAG,
526368e18d56a87308045d341e85584597bfe7426e9Nate Begeman                                                unsigned Depth = 0) const;
527ad4196b44ae714a6b95e238d9d96303df74b0429Evan Cheng
528ad4196b44ae714a6b95e238d9d96303df74b0429Evan Cheng    virtual bool
52946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman    isGAPlusOffset(SDNode *N, const GlobalValue* &GA, int64_t &Offset) const;
530368e18d56a87308045d341e85584597bfe7426e9Nate Begeman
531d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue getReturnAddressFrameIndex(SelectionDAG &DAG) const;
532dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner
533b8105651527670cb456eb46dd4346bacd3905361Chris Lattner    virtual bool ExpandInlineAsm(CallInst *CI) const;
534b8105651527670cb456eb46dd4346bacd3905361Chris Lattner
5354234f57fa02b1f04a9f52a7b3c2aa22d32ac521cChris Lattner    ConstraintType getConstraintType(const std::string &Constraint) const;
536f4dff84c8614fc2106d821e4687c933d8d4b9420Chris Lattner
537259e97cc725011a3c138563d421a4654b082a64cChris Lattner    std::vector<unsigned>
5381efa40f6a4b561cf8f80fe018684236010645cd0Chris Lattner      getRegClassForInlineAsmConstraint(const std::string &Constraint,
539e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                                        EVT VT) const;
54048884cd80b52be1528618f2e9b3425ac24e7b5caChris Lattner
541e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    virtual const char *LowerXConstraint(EVT ConstraintVT) const;
542ba2a0b960ea4c73d0f81557f63ae2ea126e08905Dale Johannesen
54348884cd80b52be1528618f2e9b3425ac24e7b5caChris Lattner    /// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
544da43bcf624acb56a3d77bb5ae9a02728af032613Evan Cheng    /// vector.  If it is invalid, don't add anything to Ops. If hasMemory is
545da43bcf624acb56a3d77bb5ae9a02728af032613Evan Cheng    /// true it means one of the asm constraint of the inline asm instruction
546da43bcf624acb56a3d77bb5ae9a02728af032613Evan Cheng    /// being processed is 'm'.
547475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    virtual void LowerAsmOperandForConstraint(SDValue Op,
54848884cd80b52be1528618f2e9b3425ac24e7b5caChris Lattner                                              char ConstraintLetter,
549475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                              std::vector<SDValue> &Ops,
5505e764233f398b6929b67701672a5e78fec20ce2eChris Lattner                                              SelectionDAG &DAG) const;
55122aaf1d61c6a752d66f7ee10a7a5d99c7160e007Chris Lattner
55291897778690a7d683497ba3f4040ebf09345f08aChris Lattner    /// getRegForInlineAsmConstraint - Given a physical register constraint
55391897778690a7d683497ba3f4040ebf09345f08aChris Lattner    /// (e.g. {edx}), return the register number and the register class for the
55491897778690a7d683497ba3f4040ebf09345f08aChris Lattner    /// register.  This should only be used for C_Register constraints.  On
55591897778690a7d683497ba3f4040ebf09345f08aChris Lattner    /// error, this returns a register number of 0.
556f76d180c9595d34641f4b5d2fbba2f2c175197d8Chris Lattner    std::pair<unsigned, const TargetRegisterClass*>
557f76d180c9595d34641f4b5d2fbba2f2c175197d8Chris Lattner      getRegForInlineAsmConstraint(const std::string &Constraint,
558e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                                   EVT VT) const;
559f76d180c9595d34641f4b5d2fbba2f2c175197d8Chris Lattner
560c9addb74883fef318140272768422656a694341fChris Lattner    /// isLegalAddressingMode - Return true if the addressing mode represented
561c9addb74883fef318140272768422656a694341fChris Lattner    /// by AM is legal for this target, for a load/store of the specified type.
562c9addb74883fef318140272768422656a694341fChris Lattner    virtual bool isLegalAddressingMode(const AddrMode &AM, const Type *Ty)const;
563c9addb74883fef318140272768422656a694341fChris Lattner
5642bd122c4d934a70e031dc0ca5171719bac66c2c9Evan Cheng    /// isTruncateFree - Return true if it's free to truncate a value of
5652bd122c4d934a70e031dc0ca5171719bac66c2c9Evan Cheng    /// type Ty1 to type Ty2. e.g. On x86 it's free to truncate a i32 value in
5662bd122c4d934a70e031dc0ca5171719bac66c2c9Evan Cheng    /// register EAX to i16 by referencing its sub-register AX.
5672bd122c4d934a70e031dc0ca5171719bac66c2c9Evan Cheng    virtual bool isTruncateFree(const Type *Ty1, const Type *Ty2) const;
568e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    virtual bool isTruncateFree(EVT VT1, EVT VT2) const;
56997121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman
57097121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman    /// isZExtFree - Return true if any actual instruction that defines a
57197121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman    /// value of type Ty1 implicit zero-extends the value to Ty2 in the result
57297121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman    /// register. This does not necessarily include registers defined in
57397121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman    /// unknown ways, such as incoming arguments, or copies from unknown
57497121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman    /// virtual registers. Also, if isTruncateFree(Ty2, Ty1) is true, this
57597121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman    /// does not necessarily apply to truncate instructions. e.g. on x86-64,
57697121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman    /// all instructions that define 32-bit values implicit zero-extend the
57797121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman    /// result out to 64 bits.
57897121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman    virtual bool isZExtFree(const Type *Ty1, const Type *Ty2) const;
579e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    virtual bool isZExtFree(EVT VT1, EVT VT2) const;
58097121ba2afb8d566ff1bf5c4e8fc5d4077940a7fDan Gohman
5818b944d39b356135676459152385f05c496951f6cEvan Cheng    /// isNarrowingProfitable - Return true if it's profitable to narrow
5828b944d39b356135676459152385f05c496951f6cEvan Cheng    /// operations of type VT1 to VT2. e.g. on x86, it's profitable to narrow
5838b944d39b356135676459152385f05c496951f6cEvan Cheng    /// from i32 to i8 but not from i32 to i16.
584e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    virtual bool isNarrowingProfitable(EVT VT1, EVT VT2) const;
5858b944d39b356135676459152385f05c496951f6cEvan Cheng
586eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng    /// isFPImmLegal - Returns true if the target can instruction select the
587eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng    /// specified FP immediate natively. If false, the legalizer will
588eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng    /// materialize the FP immediate as a load from a constant pool.
589a1eaa3c52b75d4fe2bcd4f7c52e56c405ee91d3cEvan Cheng    virtual bool isFPImmLegal(const APFloat &Imm, EVT VT) const;
590eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng
5910188ecba85c7139f237baa4ce5612fdfc83e1b84Evan Cheng    /// isShuffleMaskLegal - Targets can use this to indicate that they only
5920188ecba85c7139f237baa4ce5612fdfc83e1b84Evan Cheng    /// support *some* VECTOR_SHUFFLE operations, those with specific masks.
59391897778690a7d683497ba3f4040ebf09345f08aChris Lattner    /// By default, if a target supports the VECTOR_SHUFFLE node, all mask
59491897778690a7d683497ba3f4040ebf09345f08aChris Lattner    /// values are assumed to be legal.
5955a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman    virtual bool isShuffleMaskLegal(const SmallVectorImpl<int> &Mask,
596e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                                    EVT VT) const;
59739623daef67090025be5cd8af7d172fd1c9e6418Evan Cheng
59839623daef67090025be5cd8af7d172fd1c9e6418Evan Cheng    /// isVectorClearMaskLegal - Similar to isShuffleMaskLegal. This is
59939623daef67090025be5cd8af7d172fd1c9e6418Evan Cheng    /// used by Targets can use this to indicate if there is a suitable
60039623daef67090025be5cd8af7d172fd1c9e6418Evan Cheng    /// VECTOR_SHUFFLE that can be used to replace a VAND with a constant
60139623daef67090025be5cd8af7d172fd1c9e6418Evan Cheng    /// pool entry.
6025a5ca1519e04310f585197c20e7ae584b7f2d11fNate Begeman    virtual bool isVectorClearMaskLegal(const SmallVectorImpl<int> &Mask,
603e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                                        EVT VT) const;
6046fd599fa6916bd9438dbea7994cf2437bdf4ab8cEvan Cheng
6056fd599fa6916bd9438dbea7994cf2437bdf4ab8cEvan Cheng    /// ShouldShrinkFPConstant - If true, then instruction selection should
6066fd599fa6916bd9438dbea7994cf2437bdf4ab8cEvan Cheng    /// seek to shrink the FP constant of the specified type to a smaller type
6076fd599fa6916bd9438dbea7994cf2437bdf4ab8cEvan Cheng    /// in order to save space and / or reduce runtime.
608e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    virtual bool ShouldShrinkFPConstant(EVT VT) const {
6096fd599fa6916bd9438dbea7994cf2437bdf4ab8cEvan Cheng      // Don't shrink FP constpool if SSE2 is available since cvtss2sd is more
6106fd599fa6916bd9438dbea7994cf2437bdf4ab8cEvan Cheng      // expensive than a straight movsd. On the other hand, it's important to
6116fd599fa6916bd9438dbea7994cf2437bdf4ab8cEvan Cheng      // shrink long double fp constant since fldt is very slow.
612825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson      return !X86ScalarSSEf64 || VT == MVT::f80;
6136fd599fa6916bd9438dbea7994cf2437bdf4ab8cEvan Cheng    }
614c85e1716f0e45e4c18a9ef2fbe431a51ac3a4252Arnold Schwaighofer
615419e4f92635cfaa409282691437aff99062e4e0bDan Gohman    const X86Subtarget* getSubtarget() const {
616707e0184233f27e0e9f9aee0309f2daab8cfe7f8Dan Gohman      return Subtarget;
617f1ba1cad387dc52f3c2c5afc665edf9caad00992Rafael Espindola    }
618f1ba1cad387dc52f3c2c5afc665edf9caad00992Rafael Espindola
6193d66185ff8b276183fa8e9ce3d7ebb1d9ce88f74Chris Lattner    /// isScalarFPTypeInSSEReg - Return true if the specified scalar FP type is
6203d66185ff8b276183fa8e9ce3d7ebb1d9ce88f74Chris Lattner    /// computed in an SSE register, not on the X87 floating point stack.
621e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    bool isScalarFPTypeInSSEReg(EVT VT) const {
622825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson      return (VT == MVT::f64 && X86ScalarSSEf64) || // f64 is when SSE2
623825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson      (VT == MVT::f32 && X86ScalarSSEf32);   // f32 is when SSE1
6243d66185ff8b276183fa8e9ce3d7ebb1d9ce88f74Chris Lattner    }
625d9f3c480a7bc0969b08ace68af7dcde40f6caff1Dan Gohman
626d9f3c480a7bc0969b08ace68af7dcde40f6caff1Dan Gohman    /// createFastISel - This method returns a target specific FastISel object,
627d9f3c480a7bc0969b08ace68af7dcde40f6caff1Dan Gohman    /// or null if the target does not support "fast" ISel.
628a4160c3434b08288d1f79f1acbe453d1b9610b22Dan Gohman    virtual FastISel *createFastISel(FunctionLoweringInfo &funcInfo) const;
62920c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling
630b4202b84d7e54efe5e144885c7da63e6cc465f80Bill Wendling    /// getFunctionAlignment - Return the Log2 alignment of this function.
63120c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling    virtual unsigned getFunctionAlignment(const Function *F) const;
63220c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling
63370017e44cdba1946cc478ce1856a3e855a767e28Evan Cheng    unsigned getRegPressureLimit(const TargetRegisterClass *RC,
63470017e44cdba1946cc478ce1856a3e855a767e28Evan Cheng                                 MachineFunction &MF) const;
63570017e44cdba1946cc478ce1856a3e855a767e28Evan Cheng
636f7a0c7bf8bc8318ed28d889c9a56437ab3e91385Eric Christopher    /// getStackCookieLocation - Return true if the target stores stack
637f7a0c7bf8bc8318ed28d889c9a56437ab3e91385Eric Christopher    /// protector cookies at a fixed offset in some non-standard address
638f7a0c7bf8bc8318ed28d889c9a56437ab3e91385Eric Christopher    /// space, and populates the address space and offset as
639f7a0c7bf8bc8318ed28d889c9a56437ab3e91385Eric Christopher    /// appropriate.
640f7a0c7bf8bc8318ed28d889c9a56437ab3e91385Eric Christopher    virtual bool getStackCookieLocation(unsigned &AddressSpace, unsigned &Offset) const;
641f7a0c7bf8bc8318ed28d889c9a56437ab3e91385Eric Christopher
642dee81010eb4f932b76dd3f64eacba13b55d2d105Evan Cheng  protected:
643dee81010eb4f932b76dd3f64eacba13b55d2d105Evan Cheng    std::pair<const TargetRegisterClass*, uint8_t>
644dee81010eb4f932b76dd3f64eacba13b55d2d105Evan Cheng    findRepresentativeClass(EVT VT) const;
645dee81010eb4f932b76dd3f64eacba13b55d2d105Evan Cheng
646dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner  private:
6470db9fe6775853d62632ad299dd734b6ba6c6b336Evan Cheng    /// Subtarget - Keep a pointer to the X86Subtarget around so that we can
6480db9fe6775853d62632ad299dd734b6ba6c6b336Evan Cheng    /// make the right decision when generating code for different targets.
6490db9fe6775853d62632ad299dd734b6ba6c6b336Evan Cheng    const X86Subtarget *Subtarget;
650c9f5f3f64f896d0a8c8fa35a1dd98bc57b8960f6Dan Gohman    const X86RegisterInfo *RegInfo;
651bff66b0c6c8266a6f9ba6c9bd5d2541a4d4c6ec9Anton Korobeynikov    const TargetData *TD;
6520db9fe6775853d62632ad299dd734b6ba6c6b336Evan Cheng
65325ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng    /// X86StackPtr - X86 physical register used as stack ptr.
65425ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng    unsigned X86StackPtr;
655c85e1716f0e45e4c18a9ef2fbe431a51ac3a4252Arnold Schwaighofer
656f1fc3a8fa6d4e81e30c08983d786c640acb2591cDale Johannesen    /// X86ScalarSSEf32, X86ScalarSSEf64 - Select between SSE or x87
657f1fc3a8fa6d4e81e30c08983d786c640acb2591cDale Johannesen    /// floating point ops.
658f1fc3a8fa6d4e81e30c08983d786c640acb2591cDale Johannesen    /// When SSE is available, use it for f32 operations.
659f1fc3a8fa6d4e81e30c08983d786c640acb2591cDale Johannesen    /// When SSE2 is available, use it for f64 operations.
660f1fc3a8fa6d4e81e30c08983d786c640acb2591cDale Johannesen    bool X86ScalarSSEf32;
661f1fc3a8fa6d4e81e30c08983d786c640acb2591cDale Johannesen    bool X86ScalarSSEf64;
6620d9e976ad2c5479f3d67f8cb09a5908cfc29985cEvan Cheng
663eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng    /// LegalFPImmediates - A list of legal fp immediates.
664eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng    std::vector<APFloat> LegalFPImmediates;
665eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng
666eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng    /// addLegalFPImmediate - Indicate that this x86 target can instruction
667eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng    /// select the specified FP immediate natively.
668eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng    void addLegalFPImmediate(const APFloat& Imm) {
669eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng      LegalFPImmediates.push_back(Imm);
670eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng    }
671eb2f969a4ddfb0bc8fdcb5bce3b52e53abff321dEvan Cheng
67298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
67365c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                            CallingConv::ID CallConv, bool isVarArg,
67498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                            const SmallVectorImpl<ISD::InputArg> &Ins,
67598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                            DebugLoc dl, SelectionDAG &DAG,
676d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                            SmallVectorImpl<SDValue> &InVals) const;
67798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    SDValue LowerMemArgument(SDValue Chain,
67865c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                             CallingConv::ID CallConv,
67998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                             const SmallVectorImpl<ISD::InputArg> &ArgInfo,
68098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                             DebugLoc dl, SelectionDAG &DAG,
68198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                             const CCValAssign &VA,  MachineFrameInfo *MFI,
682d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                              unsigned i) const;
68398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    SDValue LowerMemOpCallTo(SDValue Chain, SDValue StackPtr, SDValue Arg,
68498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                             DebugLoc dl, SelectionDAG &DAG,
68598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                             const CCValAssign &VA,
686d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                             ISD::ArgFlagsTy Flags) const;
6871b5dcc34b701639f94008658a2042abc43b9b910Rafael Espindola
68886737665b81550fdb575f7d8cc5decc801a7813dGordon Henriksen    // Call lowering helpers.
6890c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng
6900c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng    /// IsEligibleForTailCallOptimization - Check whether the call is eligible
6910c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng    /// for tail call optimization. Targets which want to do tail call
6920c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng    /// optimization should implement this function.
693022d9e1cef7586a80a96446ae8691a37def9bbf4Evan Cheng    bool IsEligibleForTailCallOptimization(SDValue Callee,
6940c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng                                           CallingConv::ID CalleeCC,
6950c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng                                           bool isVarArg,
696a375d471378b1674a9d77d180a0b05ea8c90cb4bEvan Cheng                                           bool isCalleeStructRet,
697a375d471378b1674a9d77d180a0b05ea8c90cb4bEvan Cheng                                           bool isCallerStructRet,
698b17124553d569c6f09347f2cbe072eab445d30c4Evan Cheng                                    const SmallVectorImpl<ISD::OutputArg> &Outs,
699c9403659a98bf6487ab6fbf40b81628b5695c02eDan Gohman                                    const SmallVectorImpl<SDValue> &OutVals,
700b17124553d569c6f09347f2cbe072eab445d30c4Evan Cheng                                    const SmallVectorImpl<ISD::InputArg> &Ins,
7010c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng                                           SelectionDAG& DAG) const;
702d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    bool IsCalleePop(bool isVarArg, CallingConv::ID CallConv) const;
703475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue EmitTailCallLoadRetAddr(SelectionDAG &DAG, SDValue &OutRetAddr,
704475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                SDValue Chain, bool IsTailCall, bool Is64Bit,
705d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                                int FPDiff, DebugLoc dl) const;
7064b5324ad2cbf774c9c6ed02ea0fcc864f2f5f885Arnold Schwaighofer
70765c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel    CCAssignFn *CCAssignFnForNode(CallingConv::ID CallConv) const;
708d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    unsigned GetAlignedArgumentStackSize(unsigned StackSize,
709d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                                         SelectionDAG &DAG) const;
710559806f575297866609c7bef0e5c1084dcdda9a5Evan Cheng
711948e95a381bf6771639703643ef75e0115b35f53Eli Friedman    std::pair<SDValue,SDValue> FP_TO_INTHelper(SDValue Op, SelectionDAG &DAG,
712d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                                               bool isSigned) const;
713c363094e04df621d41ca570eb2a7bf8826bb8c1aEvan Cheng
714c363094e04df621d41ca570eb2a7bf8826bb8c1aEvan Cheng    SDValue LowerAsSplatVectorLoad(SDValue SrcOp, EVT VT, DebugLoc dl,
715d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                                   SelectionDAG &DAG) const;
716d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
717d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const;
718d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
719d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
720d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerEXTRACT_VECTOR_ELT_SSE4(SDValue Op, SelectionDAG &DAG) const;
721d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
722d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerINSERT_VECTOR_ELT_SSE4(SDValue Op, SelectionDAG &DAG) const;
723d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSCALAR_TO_VECTOR(SDValue Op, SelectionDAG &DAG) const;
724d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
725d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
72633c960f523f2308482d5b2816af46a7ec90a6d3dDale Johannesen    SDValue LowerGlobalAddress(const GlobalValue *GV, DebugLoc dl,
72733c960f523f2308482d5b2816af46a7ec90a6d3dDale Johannesen                               int64_t Offset, SelectionDAG &DAG) const;
728d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
729d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
730d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const;
731d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerShift(SDValue Op, SelectionDAG &DAG) const;
732e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    SDValue BuildFILD(SDValue Op, EVT SrcVT, SDValue Chain, SDValue StackSlot,
733d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                      SelectionDAG &DAG) const;
7347d07b48b26370153246de179efe5548365d31054Dale Johannesen    SDValue LowerBIT_CONVERT(SDValue op, SelectionDAG &DAG) const;
735d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
736d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
737d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerUINT_TO_FP_i64(SDValue Op, SelectionDAG &DAG) const;
738d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerUINT_TO_FP_i32(SDValue Op, SelectionDAG &DAG) const;
739d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG) const;
740d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerFP_TO_UINT(SDValue Op, SelectionDAG &DAG) const;
741d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerFABS(SDValue Op, SelectionDAG &DAG) const;
742d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerFNEG(SDValue Op, SelectionDAG &DAG) const;
743d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const;
7445528e7bcb1209094a68bbf6d1efeefc3ca34774fEvan Cheng    SDValue LowerToBT(SDValue And, ISD::CondCode CC,
7455528e7bcb1209094a68bbf6d1efeefc3ca34774fEvan Cheng                      DebugLoc dl, SelectionDAG &DAG) const;
746d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
747d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerVSETCC(SDValue Op, SelectionDAG &DAG) const;
748d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
749d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
750d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerMEMSET(SDValue Op, SelectionDAG &DAG) const;
751d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
752d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
753d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
754d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const;
755d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerVACOPY(SDValue Op, SelectionDAG &DAG) const;
756d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
757d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
758d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
759d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerFRAME_TO_ARGS_OFFSET(SDValue Op, SelectionDAG &DAG) const;
760d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const;
761d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerTRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
762d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerFLT_ROUNDS_(SDValue Op, SelectionDAG &DAG) const;
763d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerCTLZ(SDValue Op, SelectionDAG &DAG) const;
764d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerCTTZ(SDValue Op, SelectionDAG &DAG) const;
765d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerMUL_V2I64(SDValue Op, SelectionDAG &DAG) const;
766bdcb5afb77547337ba148ce24d5e1046c0b25cedNate Begeman    SDValue LowerSHL(SDValue Op, SelectionDAG &DAG) const;
767d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerXALUO(SDValue Op, SelectionDAG &DAG) const;
768d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman
769d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerCMP_SWAP(SDValue Op, SelectionDAG &DAG) const;
770d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerLOAD_SUB(SDValue Op, SelectionDAG &DAG) const;
771d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerREADCYCLECOUNTER(SDValue Op, SelectionDAG &DAG) const;
7729a9d275dc7897dfba7f41ce1b3770ca27ac149e8Eric Christopher    SDValue LowerMEMBARRIER(SDValue Op, SelectionDAG &DAG) const;
7731607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands
77498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    virtual SDValue
77598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman      LowerFormalArguments(SDValue Chain,
77665c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                           CallingConv::ID CallConv, bool isVarArg,
77798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                           const SmallVectorImpl<ISD::InputArg> &Ins,
77898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                           DebugLoc dl, SelectionDAG &DAG,
779d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                           SmallVectorImpl<SDValue> &InVals) const;
78098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    virtual SDValue
781022d9e1cef7586a80a96446ae8691a37def9bbf4Evan Cheng      LowerCall(SDValue Chain, SDValue Callee,
7820c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng                CallingConv::ID CallConv, bool isVarArg, bool &isTailCall,
78398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                const SmallVectorImpl<ISD::OutputArg> &Outs,
784c9403659a98bf6487ab6fbf40b81628b5695c02eDan Gohman                const SmallVectorImpl<SDValue> &OutVals,
78598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                const SmallVectorImpl<ISD::InputArg> &Ins,
78698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                DebugLoc dl, SelectionDAG &DAG,
787d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                SmallVectorImpl<SDValue> &InVals) const;
78898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
78998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    virtual SDValue
79098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman      LowerReturn(SDValue Chain,
79165c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                  CallingConv::ID CallConv, bool isVarArg,
79298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                  const SmallVectorImpl<ISD::OutputArg> &Outs,
793c9403659a98bf6487ab6fbf40b81628b5695c02eDan Gohman                  const SmallVectorImpl<SDValue> &OutVals,
794d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                  DebugLoc dl, SelectionDAG &DAG) const;
79598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
796b4997aeab74934ffa6fc0409afc4d8704245e372Kenneth Uildriks    virtual bool
797b4997aeab74934ffa6fc0409afc4d8704245e372Kenneth Uildriks      CanLowerReturn(CallingConv::ID CallConv, bool isVarArg,
79884023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman                     const SmallVectorImpl<ISD::OutputArg> &Outs,
799c9af33c6854afe7b082af2d892ec5f05dfa383c7Dan Gohman                     LLVMContext &Context) const;
800b4997aeab74934ffa6fc0409afc4d8704245e372Kenneth Uildriks
8011607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands    void ReplaceATOMIC_BINARY_64(SDNode *N, SmallVectorImpl<SDValue> &Results,
802d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                                 SelectionDAG &DAG, unsigned NewOp) const;
8031607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands
804b120ab4057fc66ce11ee1f108af9dbbeafa3fed9Eric Christopher    /// Utility function to emit string processing sse4.2 instructions
805b120ab4057fc66ce11ee1f108af9dbbeafa3fed9Eric Christopher    /// that return in xmm0.
806431f775bab2c1ca144e3c9c6b1e3c0767bfacc33Evan Cheng    /// This takes the instruction to expand, the associated machine basic
807431f775bab2c1ca144e3c9c6b1e3c0767bfacc33Evan Cheng    /// block, the number of args, and whether or not the second arg is
808431f775bab2c1ca144e3c9c6b1e3c0767bfacc33Evan Cheng    /// in memory or not.
809b120ab4057fc66ce11ee1f108af9dbbeafa3fed9Eric Christopher    MachineBasicBlock *EmitPCMP(MachineInstr *BInstr, MachineBasicBlock *BB,
81020adc9dc4650313f017b27d9818eb2176238113dMon P Wang                                unsigned argNum, bool inMem) const;
811b120ab4057fc66ce11ee1f108af9dbbeafa3fed9Eric Christopher
81263307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang    /// Utility function to emit atomic bitwise operations (and, or, xor).
813431f775bab2c1ca144e3c9c6b1e3c0767bfacc33Evan Cheng    /// It takes the bitwise instruction to expand, the associated machine basic
814431f775bab2c1ca144e3c9c6b1e3c0767bfacc33Evan Cheng    /// block, and the associated X86 opcodes for reg/reg and reg/imm.
81563307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang    MachineBasicBlock *EmitAtomicBitwiseWithCustomInserter(
81663307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang                                                    MachineInstr *BInstr,
81763307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang                                                    MachineBasicBlock *BB,
81863307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang                                                    unsigned regOpc,
819507a58ac9b20ddcea2e56a014be26b8f8cc0ecb8Andrew Lenharth                                                    unsigned immOpc,
820140be2dfb76928cb660b7de23f8310d76ca794b5Dale Johannesen                                                    unsigned loadOpc,
821140be2dfb76928cb660b7de23f8310d76ca794b5Dale Johannesen                                                    unsigned cxchgOpc,
822140be2dfb76928cb660b7de23f8310d76ca794b5Dale Johannesen                                                    unsigned notOpc,
823140be2dfb76928cb660b7de23f8310d76ca794b5Dale Johannesen                                                    unsigned EAXreg,
824140be2dfb76928cb660b7de23f8310d76ca794b5Dale Johannesen                                                    TargetRegisterClass *RC,
8251fdbc1dd4e9cb42c79a30e8dc308c322e923cc52Dan Gohman                                                    bool invSrc = false) const;
82648c1bc2ace6481d3272ab5c18e1f19352c563be8Dale Johannesen
82748c1bc2ace6481d3272ab5c18e1f19352c563be8Dale Johannesen    MachineBasicBlock *EmitAtomicBit6432WithCustomInserter(
82848c1bc2ace6481d3272ab5c18e1f19352c563be8Dale Johannesen                                                    MachineInstr *BInstr,
82948c1bc2ace6481d3272ab5c18e1f19352c563be8Dale Johannesen                                                    MachineBasicBlock *BB,
83048c1bc2ace6481d3272ab5c18e1f19352c563be8Dale Johannesen                                                    unsigned regOpcL,
83148c1bc2ace6481d3272ab5c18e1f19352c563be8Dale Johannesen                                                    unsigned regOpcH,
83248c1bc2ace6481d3272ab5c18e1f19352c563be8Dale Johannesen                                                    unsigned immOpcL,
83348c1bc2ace6481d3272ab5c18e1f19352c563be8Dale Johannesen                                                    unsigned immOpcH,
8341fdbc1dd4e9cb42c79a30e8dc308c322e923cc52Dan Gohman                                                    bool invSrc = false) const;
83563307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang
83663307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang    /// Utility function to emit atomic min and max.  It takes the min/max
837bddc442a00c2216834499f10c12d023f1751104cBill Wendling    /// instruction to expand, the associated basic block, and the associated
838bddc442a00c2216834499f10c12d023f1751104cBill Wendling    /// cmov opcode for moving the min or max value.
83963307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang    MachineBasicBlock *EmitAtomicMinMaxWithCustomInserter(MachineInstr *BInstr,
84063307c335aa08b0d6a75f81d64d79af7e90eb78bMon P Wang                                                          MachineBasicBlock *BB,
8411fdbc1dd4e9cb42c79a30e8dc308c322e923cc52Dan Gohman                                                        unsigned cmovOpc) const;
842076aee32e86bc4a0c096262b3261923f25220dc6Dan Gohman
843d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman    /// Utility function to emit the xmm reg save portion of va_start.
844d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman    MachineBasicBlock *EmitVAStartSaveXMMRegsWithCustomInserter(
845d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman                                                   MachineInstr *BInstr,
846d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman                                                   MachineBasicBlock *BB) const;
847d6708eade079c30b0790789a00a8d737d84f52b7Dan Gohman
84852600972832cb4ae8f4c63802f3764cbfbcb203dChris Lattner    MachineBasicBlock *EmitLoweredSelect(MachineInstr *I,
849af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman                                         MachineBasicBlock *BB) const;
850043f3c2a0e286dcfd4cc5a16bf006e3c45929516Anton Korobeynikov
851043f3c2a0e286dcfd4cc5a16bf006e3c45929516Anton Korobeynikov    MachineBasicBlock *EmitLoweredMingwAlloca(MachineInstr *MI,
852af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman                                              MachineBasicBlock *BB) const;
85330ef0e5658b0b8b04437f73f74162d5d72923f29Eric Christopher
85430ef0e5658b0b8b04437f73f74162d5d72923f29Eric Christopher    MachineBasicBlock *EmitLoweredTLSCall(MachineInstr *MI,
85530ef0e5658b0b8b04437f73f74162d5d72923f29Eric Christopher                                          MachineBasicBlock *BB) const;
856043f3c2a0e286dcfd4cc5a16bf006e3c45929516Anton Korobeynikov
857076aee32e86bc4a0c096262b3261923f25220dc6Dan Gohman    /// Emit nodes that will be selected as "test Op0,Op0", or something
8583112581441cd22ac955b1af2d08effe3bab975daDan Gohman    /// equivalent, for use with the given x86 condition code.
859552f09a0d716a73dc70efd66384146e73ee63a3eEvan Cheng    SDValue EmitTest(SDValue Op0, unsigned X86CC, SelectionDAG &DAG) const;
860076aee32e86bc4a0c096262b3261923f25220dc6Dan Gohman
861076aee32e86bc4a0c096262b3261923f25220dc6Dan Gohman    /// Emit nodes that will be selected as "cmp Op0,Op1", or something
8623112581441cd22ac955b1af2d08effe3bab975daDan Gohman    /// equivalent, for use with the given x86 condition code.
863552f09a0d716a73dc70efd66384146e73ee63a3eEvan Cheng    SDValue EmitCmp(SDValue Op0, SDValue Op1, unsigned X86CC,
864d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                    SelectionDAG &DAG) const;
865dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner  };
866c3f44b0d636ff9a6d706ea9ac17ae77c8fa8aeffEvan Cheng
867c3f44b0d636ff9a6d706ea9ac17ae77c8fa8aeffEvan Cheng  namespace X86 {
868a4160c3434b08288d1f79f1acbe453d1b9610b22Dan Gohman    FastISel *createFastISel(FunctionLoweringInfo &funcInfo);
869c3f44b0d636ff9a6d706ea9ac17ae77c8fa8aeffEvan Cheng  }
870dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner}
871dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner
872dbdbf0ce2eef7b6585397121f56d3845e04866d1Chris Lattner#endif    // X86ISELLOWERING_H
873