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
1879aa3417eb6f58d668aadfedf075240a41d35a26Craig Topper#include "Hexagon.h"
19b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/CodeGen/CallingConvLower.h"
200b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/CallingConv.h"
21a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/Target/TargetLowering.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.
30b6716187ca8cc33817fb7446d9d9bdcb708c3f35Jyotsna Verma      CONST32_Int_Real,
317517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande      FCONST32,
32b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      SETCC,
33b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      ADJDYNALLOC,
34b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      ARGEXTEND,
35b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
36b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      CMPICC,      // Compare two GPR operands, set icc.
37b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      CMPFCC,      // Compare two FP operands, set fcc.
38b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      BRICC,       // Branch to dest on icc condition
39b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      BRFCC,       // Branch to dest on fcc condition
40b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      SELECT_ICC,  // Select between two values using the current ICC flags.
41b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      SELECT_FCC,  // Select between two values using the current FCC flags.
42b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
43b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      Hi, Lo,      // Hi/Lo operations, typically on a global address.
44b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
45b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      FTOI,        // FP to Int within a FP register.
46b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      ITOF,        // Int to FP within a FP register.
47b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
48b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      CALL,        // A call instruction.
49b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      RET_FLAG,    // Return with a flag operand.
50b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      BR_JT,       // Jump table.
51b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      BARRIER,     // Memory barrier.
52b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum      WrapperJT,
537517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande      WrapperCP,
544b3aafb4b2ce9c04eae86617d305f6358ebb662eJyotsna Verma      WrapperCombineII,
554b3aafb4b2ce9c04eae86617d305f6358ebb662eJyotsna Verma      WrapperCombineRR,
563e1635d08ce786d32dd53f772ccc6a8b4f720ff3Jyotsna Verma      WrapperCombineRI_V4,
573e1635d08ce786d32dd53f772ccc6a8b4f720ff3Jyotsna Verma      WrapperCombineIR_V4,
584b3aafb4b2ce9c04eae86617d305f6358ebb662eJyotsna Verma      WrapperPackhl,
594b3aafb4b2ce9c04eae86617d305f6358ebb662eJyotsna Verma      WrapperSplatB,
604b3aafb4b2ce9c04eae86617d305f6358ebb662eJyotsna Verma      WrapperSplatH,
614b3aafb4b2ce9c04eae86617d305f6358ebb662eJyotsna Verma      WrapperShuffEB,
624b3aafb4b2ce9c04eae86617d305f6358ebb662eJyotsna Verma      WrapperShuffEH,
634b3aafb4b2ce9c04eae86617d305f6358ebb662eJyotsna Verma      WrapperShuffOB,
644b3aafb4b2ce9c04eae86617d305f6358ebb662eJyotsna Verma      WrapperShuffOH,
656ea706e40e841c148bc47bcac4dcca5e0f0245ebJyotsna Verma      TC_RETURN,
666ea706e40e841c148bc47bcac4dcca5e0f0245ebJyotsna Verma      EH_RETURN
67b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    };
68b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  }
69b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
70b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  class HexagonTargetLowering : public TargetLowering {
71b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    int VarArgsFrameOffset;   // Frame offset to start of varargs area.
72b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
73b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    bool CanReturnSmallStruct(const Function* CalleeFn,
74b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                              unsigned& RetSize) const;
75b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
76b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  public:
77cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    const TargetMachine &TM;
78cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    explicit HexagonTargetLowering(const TargetMachine &targetmachine);
79b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
80b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    /// IsEligibleForTailCallOptimization - Check whether the call is eligible
81b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    /// for tail call optimization. Targets which want to do tail call
82b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    /// optimization should implement this function.
83b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    bool
84b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    IsEligibleForTailCallOptimization(SDValue Callee,
85b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                      CallingConv::ID CalleeCC,
86b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                      bool isVarArg,
87b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                      bool isCalleeStructRet,
88b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                      bool isCallerStructRet,
89b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                      const
90b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                      SmallVectorImpl<ISD::OutputArg> &Outs,
91b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                      const SmallVectorImpl<SDValue> &OutVals,
92b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                      const SmallVectorImpl<ISD::InputArg> &Ins,
93b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                      SelectionDAG& DAG) const;
94b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
95dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    bool isTruncateFree(Type *Ty1, Type *Ty2) const override;
96dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    bool isTruncateFree(EVT VT1, EVT VT2) const override;
97b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
98dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    bool allowTruncateForTailCall(Type *Ty1, Type *Ty2) const override;
99d113448c1dd5f40522c3c02db96e87a9eb59eaf4Tim Northover
100dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
101b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
102dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    const char *getTargetNodeName(unsigned Opcode) const override;
103b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue  LowerBR_JT(SDValue Op, SelectionDAG &DAG) const;
104b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
105b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue LowerINLINEASM(SDValue Op, SelectionDAG &DAG) const;
106b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue LowerEH_LABEL(SDValue Op, SelectionDAG &DAG) const;
1076ea706e40e841c148bc47bcac4dcca5e0f0245ebJyotsna Verma    SDValue LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const;
108b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue LowerFormalArguments(SDValue Chain,
109b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                 CallingConv::ID CallConv, bool isVarArg,
110b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                                 const SmallVectorImpl<ISD::InputArg> &Ins,
111ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                                 SDLoc dl, SelectionDAG &DAG,
112dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                 SmallVectorImpl<SDValue> &InVals) const override;
113b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue LowerGLOBALADDRESS(SDValue Op, SelectionDAG &DAG) const;
114b6716187ca8cc33817fb7446d9d9bdcb708c3f35Jyotsna Verma    SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
115b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
116d2ea0e10cbd158c93fb870cdd03001b9cd1156b8Justin Holewinski    SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI,
117dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                      SmallVectorImpl<SDValue> &InVals) const override;
118b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
119b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
120b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                            CallingConv::ID CallConv, bool isVarArg,
121b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                            const SmallVectorImpl<ISD::InputArg> &Ins,
122ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                            SDLoc dl, SelectionDAG &DAG,
123b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                            SmallVectorImpl<SDValue> &InVals,
124b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                            const SmallVectorImpl<SDValue> &OutVals,
125b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                            SDValue Callee) const;
126b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
127b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
128b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue LowerATOMIC_FENCE(SDValue Op, SelectionDAG& DAG) const;
129b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
130b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
131b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue LowerReturn(SDValue Chain,
132b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                        CallingConv::ID CallConv, bool isVarArg,
133b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                        const SmallVectorImpl<ISD::OutputArg> &Outs,
134b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                        const SmallVectorImpl<SDValue> &OutVals,
135dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                        SDLoc dl, SelectionDAG &DAG) const override;
136b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
137dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MachineBasicBlock *
138dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    EmitInstrWithCustomInserter(MachineInstr *MI,
139dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                MachineBasicBlock *BB) const override;
140b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
141b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    SDValue  LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
1427517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande    SDValue  LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
143dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    EVT getSetCCResultType(LLVMContext &C, EVT VT) const override {
144c7e77f91fecd662b198939a9a8ee0a0cc3828fc4Juergen Ributzka      if (!VT.isVector())
145c7e77f91fecd662b198939a9a8ee0a0cc3828fc4Juergen Ributzka        return MVT::i1;
146c7e77f91fecd662b198939a9a8ee0a0cc3828fc4Juergen Ributzka      else
147c7e77f91fecd662b198939a9a8ee0a0cc3828fc4Juergen Ributzka        return EVT::getVectorVT(C, MVT::i1, VT.getVectorNumElements());
148b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    }
149b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
150dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    bool getPostIndexedAddressParts(SDNode *N, SDNode *Op,
151dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                    SDValue &Base, SDValue &Offset,
152dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                    ISD::MemIndexedMode &AM,
153dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                    SelectionDAG &DAG) const override;
154b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
155b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    std::pair<unsigned, const TargetRegisterClass*>
156b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    getRegForInlineAsmConstraint(const std::string &Constraint,
157dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                 MVT VT) const override;
158b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
159b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    // Intrinsics
160dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
161b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    /// isLegalAddressingMode - Return true if the addressing mode represented
162b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    /// by AM is legal for this target, for a load/store of the specified type.
163b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    /// The type may be VoidTy, in which case only return true if the addressing
164b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    /// mode is legal for a load/store of any legal type.
165b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    /// TODO: Handle pre/postinc as well.
166dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const override;
167dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    bool isFPImmLegal(const APFloat &Imm, EVT VT) const override;
168b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
169b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    /// isLegalICmpImmediate - Return true if the specified immediate is legal
170b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    /// icmp immediate, that is the target has icmp instructions which can
171b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    /// compare a register against the immediate without having to materialize
172b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum    /// the immediate into a register.
173dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    bool isLegalICmpImmediate(int64_t Imm) const override;
174b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  };
175b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} // end namespace llvm
176b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
177b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#endif    // Hexagon_ISELLOWERING_H
178