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