XCoreISelLowering.h revision 36b56886974eae4f9c5ebc96befd3e7bfe5de338
1//===-- XCoreISelLowering.h - XCore 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 XCore uses to lower LLVM code into a 11// selection DAG. 12// 13//===----------------------------------------------------------------------===// 14 15#ifndef XCOREISELLOWERING_H 16#define XCOREISELLOWERING_H 17 18#include "XCore.h" 19#include "llvm/CodeGen/SelectionDAG.h" 20#include "llvm/Target/TargetLowering.h" 21 22namespace llvm { 23 24 // Forward delcarations 25 class XCoreSubtarget; 26 class XCoreTargetMachine; 27 28 namespace XCoreISD { 29 enum NodeType { 30 // Start the numbering where the builtin ops and target ops leave off. 31 FIRST_NUMBER = ISD::BUILTIN_OP_END, 32 33 // Branch and link (call) 34 BL, 35 36 // pc relative address 37 PCRelativeWrapper, 38 39 // dp relative address 40 DPRelativeWrapper, 41 42 // cp relative address 43 CPRelativeWrapper, 44 45 // Load word from stack 46 LDWSP, 47 48 // Store word to stack 49 STWSP, 50 51 // Corresponds to retsp instruction 52 RETSP, 53 54 // Corresponds to LADD instruction 55 LADD, 56 57 // Corresponds to LSUB instruction 58 LSUB, 59 60 // Corresponds to LMUL instruction 61 LMUL, 62 63 // Corresponds to MACCU instruction 64 MACCU, 65 66 // Corresponds to MACCS instruction 67 MACCS, 68 69 // Corresponds to CRC8 instruction 70 CRC8, 71 72 // Jumptable branch. 73 BR_JT, 74 75 // Jumptable branch using long branches for each entry. 76 BR_JT32, 77 78 // Offset from frame pointer to the first (possible) on-stack argument 79 FRAME_TO_ARGS_OFFSET, 80 81 // Exception handler return. The stack is restored to the first 82 // followed by a jump to the second argument. 83 EH_RETURN, 84 85 // Memory barrier. 86 MEMBARRIER 87 }; 88 } 89 90 //===--------------------------------------------------------------------===// 91 // TargetLowering Implementation 92 //===--------------------------------------------------------------------===// 93 class XCoreTargetLowering : public TargetLowering 94 { 95 public: 96 97 explicit XCoreTargetLowering(XCoreTargetMachine &TM); 98 99 using TargetLowering::isZExtFree; 100 virtual bool isZExtFree(SDValue Val, EVT VT2) const; 101 102 103 virtual unsigned getJumpTableEncoding() const; 104 virtual MVT getScalarShiftAmountTy(EVT LHSTy) const { return MVT::i32; } 105 106 /// LowerOperation - Provide custom lowering hooks for some operations. 107 virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const; 108 109 /// ReplaceNodeResults - Replace the results of node with an illegal result 110 /// type with new values built out of custom code. 111 /// 112 virtual void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results, 113 SelectionDAG &DAG) const; 114 115 /// getTargetNodeName - This method returns the name of a target specific 116 // DAG node. 117 virtual const char *getTargetNodeName(unsigned Opcode) const; 118 119 virtual MachineBasicBlock * 120 EmitInstrWithCustomInserter(MachineInstr *MI, 121 MachineBasicBlock *MBB) const; 122 123 virtual bool isLegalAddressingMode(const AddrMode &AM, 124 Type *Ty) const; 125 126 private: 127 const XCoreTargetMachine &TM; 128 const XCoreSubtarget &Subtarget; 129 130 // Lower Operand helpers 131 SDValue LowerCCCArguments(SDValue Chain, 132 CallingConv::ID CallConv, 133 bool isVarArg, 134 const SmallVectorImpl<ISD::InputArg> &Ins, 135 SDLoc dl, SelectionDAG &DAG, 136 SmallVectorImpl<SDValue> &InVals) const; 137 SDValue LowerCCCCallTo(SDValue Chain, SDValue Callee, 138 CallingConv::ID CallConv, bool isVarArg, 139 bool isTailCall, 140 const SmallVectorImpl<ISD::OutputArg> &Outs, 141 const SmallVectorImpl<SDValue> &OutVals, 142 const SmallVectorImpl<ISD::InputArg> &Ins, 143 SDLoc dl, SelectionDAG &DAG, 144 SmallVectorImpl<SDValue> &InVals) const; 145 SDValue getReturnAddressFrameIndex(SelectionDAG &DAG) const; 146 SDValue getGlobalAddressWrapper(SDValue GA, const GlobalValue *GV, 147 SelectionDAG &DAG) const; 148 SDValue lowerLoadWordFromAlignedBasePlusOffset(SDLoc DL, SDValue Chain, 149 SDValue Base, int64_t Offset, 150 SelectionDAG &DAG) const; 151 152 // Lower Operand specifics 153 SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const; 154 SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const; 155 SDValue LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const; 156 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const; 157 SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const; 158 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const; 159 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const; 160 SDValue LowerBR_JT(SDValue Op, SelectionDAG &DAG) const; 161 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const; 162 SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const; 163 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const; 164 SDValue LowerUMUL_LOHI(SDValue Op, SelectionDAG &DAG) const; 165 SDValue LowerSMUL_LOHI(SDValue Op, SelectionDAG &DAG) const; 166 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const; 167 SDValue LowerFRAME_TO_ARGS_OFFSET(SDValue Op, SelectionDAG &DAG) const; 168 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const; 169 SDValue LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const; 170 SDValue LowerADJUST_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const; 171 SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const; 172 SDValue LowerATOMIC_FENCE(SDValue Op, SelectionDAG &DAG) const; 173 SDValue LowerATOMIC_LOAD(SDValue Op, SelectionDAG &DAG) const; 174 SDValue LowerATOMIC_STORE(SDValue Op, SelectionDAG &DAG) const; 175 176 // Inline asm support 177 std::pair<unsigned, const TargetRegisterClass*> 178 getRegForInlineAsmConstraint(const std::string &Constraint, 179 MVT VT) const; 180 181 // Expand specifics 182 SDValue TryExpandADDWithMul(SDNode *Op, SelectionDAG &DAG) const; 183 SDValue ExpandADDSUB(SDNode *Op, SelectionDAG &DAG) const; 184 185 virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const; 186 187 virtual void computeMaskedBitsForTargetNode(const SDValue Op, 188 APInt &KnownZero, 189 APInt &KnownOne, 190 const SelectionDAG &DAG, 191 unsigned Depth = 0) const; 192 193 virtual SDValue 194 LowerFormalArguments(SDValue Chain, 195 CallingConv::ID CallConv, 196 bool isVarArg, 197 const SmallVectorImpl<ISD::InputArg> &Ins, 198 SDLoc dl, SelectionDAG &DAG, 199 SmallVectorImpl<SDValue> &InVals) const; 200 201 virtual SDValue 202 LowerCall(TargetLowering::CallLoweringInfo &CLI, 203 SmallVectorImpl<SDValue> &InVals) const; 204 205 virtual SDValue 206 LowerReturn(SDValue Chain, 207 CallingConv::ID CallConv, bool isVarArg, 208 const SmallVectorImpl<ISD::OutputArg> &Outs, 209 const SmallVectorImpl<SDValue> &OutVals, 210 SDLoc dl, SelectionDAG &DAG) const; 211 212 virtual bool 213 CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF, 214 bool isVarArg, 215 const SmallVectorImpl<ISD::OutputArg> &ArgsFlags, 216 LLVMContext &Context) const; 217 }; 218} 219 220#endif // XCOREISELLOWERING_H 221