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