Add bswap, rotl, and rotr nodes
[oota-llvm.git] / lib / Target / X86 / X86ISelLowering.h
1 //===-- X86ISelLowering.h - X86 DAG Lowering Interface ----------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by Chris Lattner and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines the interfaces that X86 uses to lower LLVM code into a
11 // selection DAG.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #ifndef X86ISELLOWERING_H
16 #define X86ISELLOWERING_H
17
18 #include "llvm/Target/TargetLowering.h"
19 #include "llvm/CodeGen/SelectionDAG.h"
20
21 namespace llvm {
22   namespace X86ISD {
23     // X86 Specific DAG Nodes
24     enum NodeType {
25       // Start the numbering where the builtin ops leave off.
26       FIRST_NUMBER = ISD::BUILTIN_OP_END+X86::INSTRUCTION_LIST_END,
27
28       /// ADD_FLAG, SUB_FLAG - Same as ISD::ADD and ISD::SUB except it also
29       /// produces a flag result.
30       ADD_FLAG,
31       SUB_FLAG,
32
33       /// ADC, SBB - Add with carry and subtraction with borrow. These
34       /// correspond to X86::ADCxx and X86::SBBxx instructions.
35       ADC,
36       SBB,
37
38       /// SHLD, SHRD - Double shift instructions. These correspond to
39       /// X86::SHLDxx and X86::SHRDxx instructions.
40       SHLD,
41       SHRD,
42
43       /// FILD64m - This instruction implements SINT_TO_FP with a
44       /// 64-bit source in memory and a FP reg result.  This corresponds to
45       /// the X86::FILD64m instruction.  It has two inputs (token chain and
46       /// address) and two outputs (FP value and token chain).
47       FILD64m,
48
49       /// FP_TO_INT*_IN_MEM - This instruction implements FP_TO_SINT with the
50       /// integer destination in memory and a FP reg source.  This corresponds
51       /// to the X86::FIST*m instructions and the rounding mode change stuff. It
52       /// has two inputs (token chain and address) and two outputs (FP value and
53       /// token chain).
54       FP_TO_INT16_IN_MEM,
55       FP_TO_INT32_IN_MEM,
56       FP_TO_INT64_IN_MEM,
57
58       /// FLD - This instruction implements an extending load to FP stack slots.
59       /// This corresponds to the X86::FLD32m / X86::FLD64m. It takes a chain
60       /// operand, ptr to load from, and a ValueType node indicating the type
61       /// to load to.
62       FLD,
63
64       /// FST - This instruction implements a truncating store to FP stack
65       /// slots. This corresponds to the X86::FST32m / X86::FST64m. It takes a
66       /// chain operand, value to store, address, and a ValueType to store it
67       /// as.
68       FST,
69
70       /// FP_SET_RESULT - This corresponds to FpGETRESULT pseudo instrcuction
71       /// which copies from ST(0) to the destination. It takes a chain and writes
72       /// a RFP result and a chain.
73       FP_GET_RESULT,
74
75       /// FP_SET_RESULT - This corresponds to FpSETRESULT pseudo instrcuction
76       /// which copies the source operand to ST(0). It takes a chain and writes
77       /// a chain and a flag.
78       FP_SET_RESULT,
79
80       /// CALL/TAILCALL - These operations represent an abstract X86 call
81       /// instruction, which includes a bunch of information.  In particular the
82       /// operands of these node are:
83       ///
84       ///     #0 - The incoming token chain
85       ///     #1 - The callee
86       ///     #2 - The number of arg bytes the caller pushes on the stack.
87       ///     #3 - The number of arg bytes the callee pops off the stack.
88       ///     #4 - The value to pass in AL/AX/EAX (optional)
89       ///     #5 - The value to pass in DL/DX/EDX (optional)
90       ///
91       /// The result values of these nodes are:
92       ///
93       ///     #0 - The outgoing token chain
94       ///     #1 - The first register result value (optional)
95       ///     #2 - The second register result value (optional)
96       ///
97       /// The CALL vs TAILCALL distinction boils down to whether the callee is
98       /// known not to modify the caller's stack frame, as is standard with
99       /// LLVM.
100       CALL,
101       TAILCALL,
102       
103       /// RDTSC_DAG - This operation implements the lowering for 
104       /// readcyclecounter
105       RDTSC_DAG,
106
107       /// X86 compare and logical compare instructions.
108       CMP, TEST,
109
110       /// X86 SetCC. Operand 1 is condition code, and operand 2 is the flag
111       /// operand produced by a CMP instruction.
112       SETCC,
113
114       /// X86 conditional moves. Operand 1 and operand 2 are the two values
115       /// to select from (operand 1 is a R/W operand). Operand 3 is the condition
116       /// code, and operand 4 is the flag operand produced by a CMP or TEST
117       /// instruction. It also writes a flag result.
118       CMOV,
119
120       /// X86 conditional branches. Operand 1 is the chain operand, operand 2
121       /// is the block to branch if condition is true, operand 3 is the
122       /// condition code, and operand 4 is the flag operand produced by a CMP
123       /// or TEST instruction.
124       BRCOND,
125
126       /// Return with a flag operand. Operand 1 is the number of bytes of stack
127       /// to pop, operand 2 is the chain and operand 3 is a flag operand.
128       RET_FLAG,
129     };
130
131     // X86 specific condition code. These correspond to X86_*_COND in
132     // X86InstrInfo.td. They must be kept in synch.
133     enum CondCode {
134       COND_A  = 0,
135       COND_AE = 1,
136       COND_B  = 2,
137       COND_BE = 3,
138       COND_E  = 4,
139       COND_G  = 5,
140       COND_GE = 6,
141       COND_L  = 7,
142       COND_LE = 8,
143       COND_NE = 9,
144       COND_NO = 10,
145       COND_NP = 11,
146       COND_NS = 12,
147       COND_O  = 13,
148       COND_P  = 14,
149       COND_S  = 15,
150       COND_INVALID
151     };
152   }
153
154   //===----------------------------------------------------------------------===//
155   //  X86TargetLowering - X86 Implementation of the TargetLowering interface
156   class X86TargetLowering : public TargetLowering {
157     int VarArgsFrameIndex;            // FrameIndex for start of varargs area.
158     int ReturnAddrIndex;              // FrameIndex for return slot.
159     int BytesToPopOnReturn;           // Number of arg bytes ret should pop.
160     int BytesCallerReserves;          // Number of arg bytes caller makes.
161   public:
162     X86TargetLowering(TargetMachine &TM);
163
164     // Return the number of bytes that a function should pop when it returns (in
165     // addition to the space used by the return address).
166     //
167     unsigned getBytesToPopOnReturn() const { return BytesToPopOnReturn; }
168
169     // Return the number of bytes that the caller reserves for arguments passed
170     // to this function.
171     unsigned getBytesCallerReserves() const { return BytesCallerReserves; }
172  
173     /// LowerOperation - Provide custom lowering hooks for some operations.
174     ///
175     virtual SDOperand LowerOperation(SDOperand Op, SelectionDAG &DAG);
176
177     /// LowerArguments - This hook must be implemented to indicate how we should
178     /// lower the arguments for the specified function, into the specified DAG.
179     virtual std::vector<SDOperand>
180     LowerArguments(Function &F, SelectionDAG &DAG);
181
182     /// LowerCallTo - This hook lowers an abstract call to a function into an
183     /// actual call.
184     virtual std::pair<SDOperand, SDOperand>
185     LowerCallTo(SDOperand Chain, const Type *RetTy, bool isVarArg, unsigned CC,
186                 bool isTailCall, SDOperand Callee, ArgListTy &Args,
187                 SelectionDAG &DAG);
188
189     virtual SDOperand LowerReturnTo(SDOperand Chain, SDOperand Op,
190                                     SelectionDAG &DAG);
191     
192     virtual SDOperand LowerVAStart(SDOperand Chain, SDOperand VAListP,
193                                    Value *VAListV, SelectionDAG &DAG);
194     virtual std::pair<SDOperand,SDOperand>
195     LowerVAArg(SDOperand Chain, SDOperand VAListP, Value *VAListV,
196                const Type *ArgTy, SelectionDAG &DAG);
197
198     virtual std::pair<SDOperand, SDOperand>
199     LowerFrameReturnAddress(bool isFrameAddr, SDOperand Chain, unsigned Depth,
200                             SelectionDAG &DAG);
201
202     virtual MachineBasicBlock *InsertAtEndOfBasicBlock(MachineInstr *MI,
203                                                        MachineBasicBlock *MBB);
204
205     /// getTargetNodeName - This method returns the name of a target specific
206     /// DAG node.
207     virtual const char *getTargetNodeName(unsigned Opcode) const;
208
209     /// isMaskedValueZeroForTargetNode - Return true if 'Op & Mask' is known to
210     /// be zero. Op is expected to be a target specific node. Used by DAG
211     /// combiner.
212     virtual bool isMaskedValueZeroForTargetNode(const SDOperand &Op,
213                                                 uint64_t Mask) const;
214
215     SDOperand getReturnAddressFrameIndex(SelectionDAG &DAG);
216
217   private:
218     // C Calling Convention implementation.
219     std::vector<SDOperand> LowerCCCArguments(Function &F, SelectionDAG &DAG);
220     std::pair<SDOperand, SDOperand>
221     LowerCCCCallTo(SDOperand Chain, const Type *RetTy, bool isVarArg,
222                    bool isTailCall,
223                    SDOperand Callee, ArgListTy &Args, SelectionDAG &DAG);
224
225     // Fast Calling Convention implementation.
226     std::vector<SDOperand> LowerFastCCArguments(Function &F, SelectionDAG &DAG);
227     std::pair<SDOperand, SDOperand>
228     LowerFastCCCallTo(SDOperand Chain, const Type *RetTy, bool isTailCall,
229                       SDOperand Callee, ArgListTy &Args, SelectionDAG &DAG);
230   };
231 }
232
233 #endif    // X86ISELLOWERING_H