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 LLVM_LIB_TARGET_XCORE_XCOREISELLOWERING_H 16 #define LLVM_LIB_TARGET_XCORE_XCOREISELLOWERING_H 17 18 #include "XCore.h" 19 #include "llvm/CodeGen/SelectionDAG.h" 20 #include "llvm/Target/TargetLowering.h" 21 22 namespace 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 explicit XCoreTargetLowering(const TargetMachine &TM, 97 const XCoreSubtarget &Subtarget); 98 99 using TargetLowering::isZExtFree; 100 bool isZExtFree(SDValue Val, EVT VT2) const override; 101 102 103 unsigned getJumpTableEncoding() const override; getScalarShiftAmountTy(EVT LHSTy)104 MVT getScalarShiftAmountTy(EVT LHSTy) const override { return MVT::i32; } 105 106 /// LowerOperation - Provide custom lowering hooks for some operations. 107 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override; 108 109 /// ReplaceNodeResults - Replace the results of node with an illegal result 110 /// type with new values built out of custom code. 111 /// 112 void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results, 113 SelectionDAG &DAG) const override; 114 115 /// getTargetNodeName - This method returns the name of a target specific 116 // DAG node. 117 const char *getTargetNodeName(unsigned Opcode) const override; 118 119 MachineBasicBlock * 120 EmitInstrWithCustomInserter(MachineInstr *MI, 121 MachineBasicBlock *MBB) const override; 122 123 bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const override; 124 125 private: 126 const TargetMachine &TM; 127 const XCoreSubtarget &Subtarget; 128 129 // Lower Operand helpers 130 SDValue LowerCCCArguments(SDValue Chain, 131 CallingConv::ID CallConv, 132 bool isVarArg, 133 const SmallVectorImpl<ISD::InputArg> &Ins, 134 SDLoc dl, SelectionDAG &DAG, 135 SmallVectorImpl<SDValue> &InVals) const; 136 SDValue LowerCCCCallTo(SDValue Chain, SDValue Callee, 137 CallingConv::ID CallConv, bool isVarArg, 138 bool isTailCall, 139 const SmallVectorImpl<ISD::OutputArg> &Outs, 140 const SmallVectorImpl<SDValue> &OutVals, 141 const SmallVectorImpl<ISD::InputArg> &Ins, 142 SDLoc dl, SelectionDAG &DAG, 143 SmallVectorImpl<SDValue> &InVals) const; 144 SDValue getReturnAddressFrameIndex(SelectionDAG &DAG) const; 145 SDValue getGlobalAddressWrapper(SDValue GA, const GlobalValue *GV, 146 SelectionDAG &DAG) const; 147 SDValue lowerLoadWordFromAlignedBasePlusOffset(SDLoc DL, SDValue Chain, 148 SDValue Base, int64_t Offset, 149 SelectionDAG &DAG) const; 150 151 // Lower Operand specifics 152 SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const; 153 SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const; 154 SDValue LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const; 155 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const; 156 SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const; 157 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const; 158 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const; 159 SDValue LowerBR_JT(SDValue Op, SelectionDAG &DAG) const; 160 SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const; 161 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const; 162 SDValue LowerUMUL_LOHI(SDValue Op, SelectionDAG &DAG) const; 163 SDValue LowerSMUL_LOHI(SDValue Op, SelectionDAG &DAG) const; 164 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const; 165 SDValue LowerFRAME_TO_ARGS_OFFSET(SDValue Op, SelectionDAG &DAG) const; 166 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const; 167 SDValue LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const; 168 SDValue LowerADJUST_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const; 169 SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const; 170 SDValue LowerATOMIC_FENCE(SDValue Op, SelectionDAG &DAG) const; 171 SDValue LowerATOMIC_LOAD(SDValue Op, SelectionDAG &DAG) const; 172 SDValue LowerATOMIC_STORE(SDValue Op, SelectionDAG &DAG) const; 173 174 // Inline asm support 175 std::pair<unsigned, const TargetRegisterClass *> 176 getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, 177 const std::string &Constraint, 178 MVT VT) const override; 179 getInlineAsmMemConstraint(const std::string & ConstraintCode)180 unsigned getInlineAsmMemConstraint( 181 const std::string &ConstraintCode) const override { 182 // FIXME: Map different constraints differently. 183 return InlineAsm::Constraint_m; 184 } 185 186 // Expand specifics 187 SDValue TryExpandADDWithMul(SDNode *Op, SelectionDAG &DAG) const; 188 SDValue ExpandADDSUB(SDNode *Op, SelectionDAG &DAG) const; 189 190 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override; 191 192 void computeKnownBitsForTargetNode(const SDValue Op, 193 APInt &KnownZero, 194 APInt &KnownOne, 195 const SelectionDAG &DAG, 196 unsigned Depth = 0) const override; 197 198 SDValue 199 LowerFormalArguments(SDValue Chain, 200 CallingConv::ID CallConv, 201 bool isVarArg, 202 const SmallVectorImpl<ISD::InputArg> &Ins, 203 SDLoc dl, SelectionDAG &DAG, 204 SmallVectorImpl<SDValue> &InVals) const override; 205 206 SDValue 207 LowerCall(TargetLowering::CallLoweringInfo &CLI, 208 SmallVectorImpl<SDValue> &InVals) const override; 209 210 SDValue 211 LowerReturn(SDValue Chain, 212 CallingConv::ID CallConv, bool isVarArg, 213 const SmallVectorImpl<ISD::OutputArg> &Outs, 214 const SmallVectorImpl<SDValue> &OutVals, 215 SDLoc dl, SelectionDAG &DAG) const override; 216 217 bool 218 CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF, 219 bool isVarArg, 220 const SmallVectorImpl<ISD::OutputArg> &ArgsFlags, 221 LLVMContext &Context) const override; 222 }; 223 } 224 225 #endif 226