MipsISelLowering.h revision 58d1e3f72a61b5f8ace620c9e16baaecbb3f53f1
1//===-- MipsISelLowering.h - Mips DAG Lowering Interface --------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the interfaces that Mips uses to lower LLVM code into a
11// selection DAG.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef MipsISELLOWERING_H
16#define MipsISELLOWERING_H
17
18#include "Mips.h"
19#include "MipsSubtarget.h"
20#include "llvm/CodeGen/SelectionDAG.h"
21#include "llvm/Target/TargetLowering.h"
22
23namespace llvm {
24  namespace MipsISD {
25    enum NodeType {
26      // Start the numbering from where ISD NodeType finishes.
27      FIRST_NUMBER = ISD::BUILTIN_OP_END,
28
29      // Jump and link (call)
30      JmpLink,
31
32      // Tail call
33      TailCall,
34
35      // Get the Higher 16 bits from a 32-bit immediate
36      // No relation with Mips Hi register
37      Hi,
38
39      // Get the Lower 16 bits from a 32-bit immediate
40      // No relation with Mips Lo register
41      Lo,
42
43      // Handle gp_rel (small data/bss sections) relocation.
44      GPRel,
45
46      // Thread Pointer
47      ThreadPointer,
48
49      // Floating Point Branch Conditional
50      FPBrcond,
51
52      // Floating Point Compare
53      FPCmp,
54
55      // Floating Point Conditional Moves
56      CMovFP_T,
57      CMovFP_F,
58
59      // Floating Point Rounding
60      FPRound,
61
62      // Return
63      Ret,
64
65      // MAdd/Sub nodes
66      MAdd,
67      MAddu,
68      MSub,
69      MSubu,
70
71      // DivRem(u)
72      DivRem,
73      DivRemU,
74
75      BuildPairF64,
76      ExtractElementF64,
77
78      Wrapper,
79
80      DynAlloc,
81
82      Sync,
83
84      Ext,
85      Ins,
86
87      // EXTR.W instrinsic nodes.
88      EXTP,
89      EXTPDP,
90      EXTR_S_H,
91      EXTR_W,
92      EXTR_R_W,
93      EXTR_RS_W,
94      SHILO,
95      MTHLIP,
96
97      // DPA.W intrinsic nodes.
98      MULSAQ_S_W_PH,
99      MAQ_S_W_PHL,
100      MAQ_S_W_PHR,
101      MAQ_SA_W_PHL,
102      MAQ_SA_W_PHR,
103      DPAU_H_QBL,
104      DPAU_H_QBR,
105      DPSU_H_QBL,
106      DPSU_H_QBR,
107      DPAQ_S_W_PH,
108      DPSQ_S_W_PH,
109      DPAQ_SA_L_W,
110      DPSQ_SA_L_W,
111      DPA_W_PH,
112      DPS_W_PH,
113      DPAQX_S_W_PH,
114      DPAQX_SA_W_PH,
115      DPAX_W_PH,
116      DPSX_W_PH,
117      DPSQX_S_W_PH,
118      DPSQX_SA_W_PH,
119      MULSA_W_PH,
120
121      MULT,
122      MULTU,
123      MADD_DSP,
124      MADDU_DSP,
125      MSUB_DSP,
126      MSUBU_DSP,
127
128      // Load/Store Left/Right nodes.
129      LWL = ISD::FIRST_TARGET_MEMORY_OPCODE,
130      LWR,
131      SWL,
132      SWR,
133      LDL,
134      LDR,
135      SDL,
136      SDR
137    };
138  }
139
140  //===--------------------------------------------------------------------===//
141  // TargetLowering Implementation
142  //===--------------------------------------------------------------------===//
143
144  class MipsTargetLowering : public TargetLowering  {
145  public:
146    explicit MipsTargetLowering(MipsTargetMachine &TM);
147
148    virtual MVT getShiftAmountTy(EVT LHSTy) const { return MVT::i32; }
149
150    virtual bool allowsUnalignedMemoryAccesses (EVT VT) const;
151
152    virtual void LowerOperationWrapper(SDNode *N,
153                                       SmallVectorImpl<SDValue> &Results,
154                                       SelectionDAG &DAG) const;
155
156    /// LowerOperation - Provide custom lowering hooks for some operations.
157    virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
158
159    /// ReplaceNodeResults - Replace the results of node with an illegal result
160    /// type with new values built out of custom code.
161    ///
162    virtual void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results,
163                                    SelectionDAG &DAG) const;
164
165    /// getTargetNodeName - This method returns the name of a target specific
166    //  DAG node.
167    virtual const char *getTargetNodeName(unsigned Opcode) const;
168
169    /// getSetCCResultType - get the ISD::SETCC result ValueType
170    EVT getSetCCResultType(EVT VT) const;
171
172    virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const;
173  private:
174    // Subtarget Info
175    const MipsSubtarget *Subtarget;
176
177    bool HasMips64, IsN64, IsO32;
178
179    // Lower Operand helpers
180    SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
181                            CallingConv::ID CallConv, bool isVarArg,
182                            const SmallVectorImpl<ISD::InputArg> &Ins,
183                            DebugLoc dl, SelectionDAG &DAG,
184                            SmallVectorImpl<SDValue> &InVals) const;
185
186    // Lower Operand specifics
187    SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
188    SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
189    SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
190    SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
191    SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
192    SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
193    SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
194    SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
195    SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
196    SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
197    SDValue LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const;
198    SDValue LowerFABS(SDValue Op, SelectionDAG &DAG) const;
199    SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
200    SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
201    SDValue LowerMEMBARRIER(SDValue Op, SelectionDAG& DAG) const;
202    SDValue LowerATOMIC_FENCE(SDValue Op, SelectionDAG& DAG) const;
203    SDValue LowerShiftLeftParts(SDValue Op, SelectionDAG& DAG) const;
204    SDValue LowerShiftRightParts(SDValue Op, SelectionDAG& DAG,
205                                 bool IsSRA) const;
206    SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
207    SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
208    SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
209    SDValue LowerINTRINSIC_W_CHAIN(SDValue Op, SelectionDAG &DAG) const;
210
211    virtual SDValue
212      LowerFormalArguments(SDValue Chain,
213                           CallingConv::ID CallConv, bool isVarArg,
214                           const SmallVectorImpl<ISD::InputArg> &Ins,
215                           DebugLoc dl, SelectionDAG &DAG,
216                           SmallVectorImpl<SDValue> &InVals) const;
217
218    virtual SDValue
219      LowerCall(TargetLowering::CallLoweringInfo &CLI,
220                SmallVectorImpl<SDValue> &InVals) const;
221
222    virtual bool
223      CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF,
224                     bool isVarArg,
225                     const SmallVectorImpl<ISD::OutputArg> &Outs,
226                     LLVMContext &Context) const;
227
228    virtual SDValue
229      LowerReturn(SDValue Chain,
230                  CallingConv::ID CallConv, bool isVarArg,
231                  const SmallVectorImpl<ISD::OutputArg> &Outs,
232                  const SmallVectorImpl<SDValue> &OutVals,
233                  DebugLoc dl, SelectionDAG &DAG) const;
234
235    virtual MachineBasicBlock *
236      EmitInstrWithCustomInserter(MachineInstr *MI,
237                                  MachineBasicBlock *MBB) const;
238
239    // Inline asm support
240    ConstraintType getConstraintType(const std::string &Constraint) const;
241
242    /// Examine constraint string and operand type and determine a weight value.
243    /// The operand object must already have been set up with the operand type.
244    ConstraintWeight getSingleConstraintMatchWeight(
245      AsmOperandInfo &info, const char *constraint) const;
246
247    std::pair<unsigned, const TargetRegisterClass*>
248              getRegForInlineAsmConstraint(const std::string &Constraint,
249              EVT VT) const;
250
251    /// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
252    /// vector.  If it is invalid, don't add anything to Ops. If hasMemory is
253    /// true it means one of the asm constraint of the inline asm instruction
254    /// being processed is 'm'.
255    virtual void LowerAsmOperandForConstraint(SDValue Op,
256                                              std::string &Constraint,
257                                              std::vector<SDValue> &Ops,
258                                              SelectionDAG &DAG) const;
259
260    virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
261
262    virtual EVT getOptimalMemOpType(uint64_t Size, unsigned DstAlign,
263                                    unsigned SrcAlign, bool IsZeroVal,
264                                    bool MemcpyStrSrc,
265                                    MachineFunction &MF) const;
266
267    /// isFPImmLegal - Returns true if the target can instruction select the
268    /// specified FP immediate natively. If false, the legalizer will
269    /// materialize the FP immediate as a load from a constant pool.
270    virtual bool isFPImmLegal(const APFloat &Imm, EVT VT) const;
271
272    virtual unsigned getJumpTableEncoding() const;
273
274    MachineBasicBlock *EmitBPOSGE32(MachineInstr *MI,
275                                    MachineBasicBlock *BB) const;
276    MachineBasicBlock *EmitAtomicBinary(MachineInstr *MI, MachineBasicBlock *BB,
277                    unsigned Size, unsigned BinOpcode, bool Nand = false) const;
278    MachineBasicBlock *EmitAtomicBinaryPartword(MachineInstr *MI,
279                    MachineBasicBlock *BB, unsigned Size, unsigned BinOpcode,
280                    bool Nand = false) const;
281    MachineBasicBlock *EmitAtomicCmpSwap(MachineInstr *MI,
282                                  MachineBasicBlock *BB, unsigned Size) const;
283    MachineBasicBlock *EmitAtomicCmpSwapPartword(MachineInstr *MI,
284                                  MachineBasicBlock *BB, unsigned Size) const;
285  };
286}
287
288#endif // MipsISELLOWERING_H
289