HexagonISelLowering.h revision 31d157ae1ac2cd9c787dc3c1d28e64c682803844
131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- HexagonISelLowering.h - Hexagon DAG Lowering Interface --*- C++ -*-===//
2b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
3b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//                     The LLVM Compiler Infrastructure
4b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
5b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// This file is distributed under the University of Illinois Open Source
6b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// License. See LICENSE.TXT for details.
7b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
8b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//===----------------------------------------------------------------------===//
9b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
10b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// This file defines the interfaces that Hexagon uses to lower LLVM code into a
11b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// selection DAG.
12b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
13b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//===----------------------------------------------------------------------===//
14b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
15b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#ifndef Hexagon_ISELLOWERING_H
16b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#define Hexagon_ISELLOWERING_H
17b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
18b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/Target/TargetLowering.h"
19b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/CallingConv.h"
20b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/CodeGen/CallingConvLower.h"
21b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "Hexagon.h"
22b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
23b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumnamespace llvm {
24b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  namespace HexagonISD {
25b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    enum {
26b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      FIRST_NUMBER = ISD::BUILTIN_OP_END,
27b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
28b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      CONST32,
29b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      CONST32_GP,  // For marking data present in GP.
30b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      SETCC,
31b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      ADJDYNALLOC,
32b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      ARGEXTEND,
33b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
34b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      CMPICC,      // Compare two GPR operands, set icc.
35b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      CMPFCC,      // Compare two FP operands, set fcc.
36b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      BRICC,       // Branch to dest on icc condition
37b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      BRFCC,       // Branch to dest on fcc condition
38b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      SELECT_ICC,  // Select between two values using the current ICC flags.
39b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      SELECT_FCC,  // Select between two values using the current FCC flags.
40b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
41b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      Hi, Lo,      // Hi/Lo operations, typically on a global address.
42b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
43b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      FTOI,        // FP to Int within a FP register.
44b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      ITOF,        // Int to FP within a FP register.
45b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
46b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      CALL,        // A call instruction.
47b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      RET_FLAG,    // Return with a flag operand.
48b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      BR_JT,       // Jump table.
49b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      BARRIER,     // Memory barrier.
50b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      WrapperJT,
51b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      TC_RETURN
52b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    };
53b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  }
54b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
55b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  class HexagonTargetLowering : public TargetLowering {
56b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    int VarArgsFrameOffset;   // Frame offset to start of varargs area.
57b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
58b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    bool CanReturnSmallStruct(const Function* CalleeFn,
59b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                              unsigned& RetSize) const;
60b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
61b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  public:
62b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    HexagonTargetMachine &TM;
63b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    explicit HexagonTargetLowering(HexagonTargetMachine &targetmachine);
64b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
65b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    /// IsEligibleForTailCallOptimization - Check whether the call is eligible
66b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    /// for tail call optimization. Targets which want to do tail call
67b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    /// optimization should implement this function.
68b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    bool
69b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    IsEligibleForTailCallOptimization(SDValue Callee,
70b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                      CallingConv::ID CalleeCC,
71b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                      bool isVarArg,
72b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                      bool isCalleeStructRet,
73b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                      bool isCallerStructRet,
74b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                      const
75b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                      SmallVectorImpl<ISD::OutputArg> &Outs,
76b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                      const SmallVectorImpl<SDValue> &OutVals,
77b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                      const SmallVectorImpl<ISD::InputArg> &Ins,
78b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                      SelectionDAG& DAG) const;
79b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
80b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    virtual bool isTruncateFree(Type *Ty1, Type *Ty2) const;
81b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    virtual bool isTruncateFree(EVT VT1, EVT VT2) const;
82b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
83b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
84b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
85b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    virtual const char *getTargetNodeName(unsigned Opcode) const;
86b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue  LowerBR_JT(SDValue Op, SelectionDAG &DAG) const;
87b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
88b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue LowerINLINEASM(SDValue Op, SelectionDAG &DAG) const;
89b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue LowerEH_LABEL(SDValue Op, SelectionDAG &DAG) const;
90b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue LowerFormalArguments(SDValue Chain,
91b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                 CallingConv::ID CallConv, bool isVarArg,
92b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                 const SmallVectorImpl<ISD::InputArg> &Ins,
93b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                 DebugLoc dl, SelectionDAG &DAG,
94b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                 SmallVectorImpl<SDValue> &InVals) const;
95b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue LowerGLOBALADDRESS(SDValue Op, SelectionDAG &DAG) const;
96b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
97b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue LowerCall(SDValue Chain, SDValue Callee,
98b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                      CallingConv::ID CallConv, bool isVarArg,
99b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                      bool &isTailCall,
100b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                      const SmallVectorImpl<ISD::OutputArg> &Outs,
101b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                      const SmallVectorImpl<SDValue> &OutVals,
102b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                      const SmallVectorImpl<ISD::InputArg> &Ins,
103b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                      DebugLoc dl, SelectionDAG &DAG,
104b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                      SmallVectorImpl<SDValue> &InVals) const;
105b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
106b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
107b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                            CallingConv::ID CallConv, bool isVarArg,
108b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                            const SmallVectorImpl<ISD::InputArg> &Ins,
109b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                            DebugLoc dl, SelectionDAG &DAG,
110b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                            SmallVectorImpl<SDValue> &InVals,
111b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                            const SmallVectorImpl<SDValue> &OutVals,
112b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                            SDValue Callee) const;
113b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
114b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
115b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
116b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue LowerMEMBARRIER(SDValue Op, SelectionDAG& DAG) const;
117b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue LowerATOMIC_FENCE(SDValue Op, SelectionDAG& DAG) const;
118b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
119b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
120b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue LowerReturn(SDValue Chain,
121b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                        CallingConv::ID CallConv, bool isVarArg,
122b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                        const SmallVectorImpl<ISD::OutputArg> &Outs,
123b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                        const SmallVectorImpl<SDValue> &OutVals,
124b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                        DebugLoc dl, SelectionDAG &DAG) const;
125b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
126b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    virtual MachineBasicBlock
127b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    *EmitInstrWithCustomInserter(MachineInstr *MI,
128b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                 MachineBasicBlock *BB) const;
129b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
130b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue  LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
131b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    virtual EVT getSetCCResultType(EVT VT) const {
132b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      return MVT::i1;
133b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    }
134b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
135b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    virtual bool getPostIndexedAddressParts(SDNode *N, SDNode *Op,
136b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                            SDValue &Base, SDValue &Offset,
137b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                            ISD::MemIndexedMode &AM,
138b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                            SelectionDAG &DAG) const;
139b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
140b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    std::pair<unsigned, const TargetRegisterClass*>
141b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    getRegForInlineAsmConstraint(const std::string &Constraint,
142b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                 EVT VT) const;
143b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
144b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    // Intrinsics
145b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    virtual SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op,
146b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                            SelectionDAG &DAG) const;
147b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    /// isLegalAddressingMode - Return true if the addressing mode represented
148b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    /// by AM is legal for this target, for a load/store of the specified type.
149b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    /// The type may be VoidTy, in which case only return true if the addressing
150b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    /// mode is legal for a load/store of any legal type.
151b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    /// TODO: Handle pre/postinc as well.
152b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    virtual bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const;
153b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
154b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    /// isLegalICmpImmediate - Return true if the specified immediate is legal
155b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    /// icmp immediate, that is the target has icmp instructions which can
156b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    /// compare a register against the immediate without having to materialize
157b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    /// the immediate into a register.
158b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    virtual bool isLegalICmpImmediate(int64_t Imm) const;
159b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  };
160b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} // end namespace llvm
161b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
162b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#endif    // Hexagon_ISELLOWERING_H
163