1 //===-- XCoreISelLowering.h - XCore DAG Lowering Interface ------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file defines the interfaces that XCore uses to lower LLVM code into a 10 // selection DAG. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_LIB_TARGET_XCORE_XCOREISELLOWERING_H 15 #define LLVM_LIB_TARGET_XCORE_XCOREISELLOWERING_H 16 17 #include "XCore.h" 18 #include "llvm/CodeGen/SelectionDAG.h" 19 #include "llvm/CodeGen/TargetLowering.h" 20 21 namespace llvm { 22 23 // Forward delcarations 24 class XCoreSubtarget; 25 26 namespace XCoreISD { 27 enum NodeType : unsigned { 28 // Start the numbering where the builtin ops and target ops leave off. 29 FIRST_NUMBER = ISD::BUILTIN_OP_END, 30 31 // Branch and link (call) 32 BL, 33 34 // pc relative address 35 PCRelativeWrapper, 36 37 // dp relative address 38 DPRelativeWrapper, 39 40 // cp relative address 41 CPRelativeWrapper, 42 43 // Load word from stack 44 LDWSP, 45 46 // Store word to stack 47 STWSP, 48 49 // Corresponds to retsp instruction 50 RETSP, 51 52 // Corresponds to LADD instruction 53 LADD, 54 55 // Corresponds to LSUB instruction 56 LSUB, 57 58 // Corresponds to LMUL instruction 59 LMUL, 60 61 // Corresponds to MACCU instruction 62 MACCU, 63 64 // Corresponds to MACCS instruction 65 MACCS, 66 67 // Corresponds to CRC8 instruction 68 CRC8, 69 70 // Jumptable branch. 71 BR_JT, 72 73 // Jumptable branch using long branches for each entry. 74 BR_JT32, 75 76 // Offset from frame pointer to the first (possible) on-stack argument 77 FRAME_TO_ARGS_OFFSET, 78 79 // Exception handler return. The stack is restored to the first 80 // followed by a jump to the second argument. 81 EH_RETURN, 82 83 // Memory barrier. 84 MEMBARRIER 85 }; 86 } 87 88 //===--------------------------------------------------------------------===// 89 // TargetLowering Implementation 90 //===--------------------------------------------------------------------===// 91 class XCoreTargetLowering : public TargetLowering 92 { 93 public: 94 explicit XCoreTargetLowering(const TargetMachine &TM, 95 const XCoreSubtarget &Subtarget); 96 97 using TargetLowering::isZExtFree; 98 bool isZExtFree(SDValue Val, EVT VT2) const override; 99 100 101 unsigned getJumpTableEncoding() const override; getScalarShiftAmountTy(const DataLayout & DL,EVT)102 MVT getScalarShiftAmountTy(const DataLayout &DL, EVT) const override { 103 return MVT::i32; 104 } 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 DataLayout &DL, const AddrMode &AM, 124 Type *Ty, unsigned AS, 125 Instruction *I = nullptr) const override; 126 127 /// If a physical register, this returns the register that receives the 128 /// exception address on entry to an EH pad. 129 Register getExceptionPointerRegister(const Constant * PersonalityFn)130 getExceptionPointerRegister(const Constant *PersonalityFn) const override { 131 return XCore::R0; 132 } 133 134 /// If a physical register, this returns the register that receives the 135 /// exception typeid on entry to a landing pad. 136 Register getExceptionSelectorRegister(const Constant * PersonalityFn)137 getExceptionSelectorRegister(const Constant *PersonalityFn) const override { 138 return XCore::R1; 139 } 140 141 private: 142 const TargetMachine &TM; 143 const XCoreSubtarget &Subtarget; 144 145 // Lower Operand helpers 146 SDValue LowerCCCArguments(SDValue Chain, CallingConv::ID CallConv, 147 bool isVarArg, 148 const SmallVectorImpl<ISD::InputArg> &Ins, 149 const SDLoc &dl, SelectionDAG &DAG, 150 SmallVectorImpl<SDValue> &InVals) const; 151 SDValue LowerCCCCallTo(SDValue Chain, SDValue Callee, 152 CallingConv::ID CallConv, bool isVarArg, 153 bool isTailCall, 154 const SmallVectorImpl<ISD::OutputArg> &Outs, 155 const SmallVectorImpl<SDValue> &OutVals, 156 const SmallVectorImpl<ISD::InputArg> &Ins, 157 const SDLoc &dl, SelectionDAG &DAG, 158 SmallVectorImpl<SDValue> &InVals) const; 159 SDValue getReturnAddressFrameIndex(SelectionDAG &DAG) const; 160 SDValue getGlobalAddressWrapper(SDValue GA, const GlobalValue *GV, 161 SelectionDAG &DAG) const; 162 SDValue lowerLoadWordFromAlignedBasePlusOffset(const SDLoc &DL, 163 SDValue Chain, SDValue Base, 164 int64_t Offset, 165 SelectionDAG &DAG) const; 166 167 // Lower Operand specifics 168 SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const; 169 SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const; 170 SDValue LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const; 171 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const; 172 SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const; 173 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const; 174 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const; 175 SDValue LowerBR_JT(SDValue Op, SelectionDAG &DAG) const; 176 SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const; 177 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const; 178 SDValue LowerUMUL_LOHI(SDValue Op, SelectionDAG &DAG) const; 179 SDValue LowerSMUL_LOHI(SDValue Op, SelectionDAG &DAG) const; 180 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const; 181 SDValue LowerFRAME_TO_ARGS_OFFSET(SDValue Op, SelectionDAG &DAG) const; 182 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const; 183 SDValue LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const; 184 SDValue LowerADJUST_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const; 185 SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const; 186 SDValue LowerATOMIC_FENCE(SDValue Op, SelectionDAG &DAG) const; 187 SDValue LowerATOMIC_LOAD(SDValue Op, SelectionDAG &DAG) const; 188 SDValue LowerATOMIC_STORE(SDValue Op, SelectionDAG &DAG) const; 189 190 MachineMemOperand::Flags getTargetMMOFlags( 191 const Instruction &I) const override; 192 193 // Inline asm support 194 std::pair<unsigned, const TargetRegisterClass *> 195 getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, 196 StringRef Constraint, MVT VT) const override; 197 198 // Expand specifics 199 SDValue TryExpandADDWithMul(SDNode *Op, SelectionDAG &DAG) const; 200 SDValue ExpandADDSUB(SDNode *Op, SelectionDAG &DAG) const; 201 202 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override; 203 204 void computeKnownBitsForTargetNode(const SDValue Op, 205 KnownBits &Known, 206 const APInt &DemandedElts, 207 const SelectionDAG &DAG, 208 unsigned Depth = 0) const override; 209 210 SDValue 211 LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg, 212 const SmallVectorImpl<ISD::InputArg> &Ins, 213 const SDLoc &dl, SelectionDAG &DAG, 214 SmallVectorImpl<SDValue> &InVals) const override; 215 216 SDValue 217 LowerCall(TargetLowering::CallLoweringInfo &CLI, 218 SmallVectorImpl<SDValue> &InVals) const override; 219 220 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg, 221 const SmallVectorImpl<ISD::OutputArg> &Outs, 222 const SmallVectorImpl<SDValue> &OutVals, 223 const SDLoc &dl, SelectionDAG &DAG) const override; 224 225 bool 226 CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF, 227 bool isVarArg, 228 const SmallVectorImpl<ISD::OutputArg> &ArgsFlags, 229 LLVMContext &Context) const override; shouldInsertFencesForAtomic(const Instruction * I)230 bool shouldInsertFencesForAtomic(const Instruction *I) const override { 231 return true; 232 } 233 }; 234 } 235 236 #endif 237