1*06f32e7eSjoerg //===- ARCISelLowering.h - ARC DAG Lowering Interface -----------*- C++ -*-===// 2*06f32e7eSjoerg // 3*06f32e7eSjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*06f32e7eSjoerg // See https://llvm.org/LICENSE.txt for license information. 5*06f32e7eSjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*06f32e7eSjoerg // 7*06f32e7eSjoerg //===----------------------------------------------------------------------===// 8*06f32e7eSjoerg // 9*06f32e7eSjoerg // This file defines the interfaces that ARC uses to lower LLVM code into a 10*06f32e7eSjoerg // selection DAG. 11*06f32e7eSjoerg // 12*06f32e7eSjoerg //===----------------------------------------------------------------------===// 13*06f32e7eSjoerg 14*06f32e7eSjoerg #ifndef LLVM_LIB_TARGET_ARC_ARCISELLOWERING_H 15*06f32e7eSjoerg #define LLVM_LIB_TARGET_ARC_ARCISELLOWERING_H 16*06f32e7eSjoerg 17*06f32e7eSjoerg #include "ARC.h" 18*06f32e7eSjoerg #include "llvm/CodeGen/SelectionDAG.h" 19*06f32e7eSjoerg #include "llvm/CodeGen/TargetLowering.h" 20*06f32e7eSjoerg 21*06f32e7eSjoerg namespace llvm { 22*06f32e7eSjoerg 23*06f32e7eSjoerg // Forward delcarations 24*06f32e7eSjoerg class ARCSubtarget; 25*06f32e7eSjoerg class ARCTargetMachine; 26*06f32e7eSjoerg 27*06f32e7eSjoerg namespace ARCISD { 28*06f32e7eSjoerg 29*06f32e7eSjoerg enum NodeType : unsigned { 30*06f32e7eSjoerg // Start the numbering where the builtin ops and target ops leave off. 31*06f32e7eSjoerg FIRST_NUMBER = ISD::BUILTIN_OP_END, 32*06f32e7eSjoerg 33*06f32e7eSjoerg // Branch and link (call) 34*06f32e7eSjoerg BL, 35*06f32e7eSjoerg 36*06f32e7eSjoerg // Jump and link (indirect call) 37*06f32e7eSjoerg JL, 38*06f32e7eSjoerg 39*06f32e7eSjoerg // CMP 40*06f32e7eSjoerg CMP, 41*06f32e7eSjoerg 42*06f32e7eSjoerg // CMOV 43*06f32e7eSjoerg CMOV, 44*06f32e7eSjoerg 45*06f32e7eSjoerg // BRcc 46*06f32e7eSjoerg BRcc, 47*06f32e7eSjoerg 48*06f32e7eSjoerg // Global Address Wrapper 49*06f32e7eSjoerg GAWRAPPER, 50*06f32e7eSjoerg 51*06f32e7eSjoerg // return, (j_s [blink]) 52*06f32e7eSjoerg RET 53*06f32e7eSjoerg }; 54*06f32e7eSjoerg 55*06f32e7eSjoerg } // end namespace ARCISD 56*06f32e7eSjoerg 57*06f32e7eSjoerg //===--------------------------------------------------------------------===// 58*06f32e7eSjoerg // TargetLowering Implementation 59*06f32e7eSjoerg //===--------------------------------------------------------------------===// 60*06f32e7eSjoerg class ARCTargetLowering : public TargetLowering { 61*06f32e7eSjoerg public: 62*06f32e7eSjoerg explicit ARCTargetLowering(const TargetMachine &TM, 63*06f32e7eSjoerg const ARCSubtarget &Subtarget); 64*06f32e7eSjoerg 65*06f32e7eSjoerg /// Provide custom lowering hooks for some operations. 66*06f32e7eSjoerg SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override; 67*06f32e7eSjoerg 68*06f32e7eSjoerg /// This method returns the name of a target specific DAG node. 69*06f32e7eSjoerg const char *getTargetNodeName(unsigned Opcode) const override; 70*06f32e7eSjoerg 71*06f32e7eSjoerg /// Return true if the addressing mode represented by AM is legal for this 72*06f32e7eSjoerg /// target, for a load/store of the specified type. 73*06f32e7eSjoerg bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty, 74*06f32e7eSjoerg unsigned AS, 75*06f32e7eSjoerg Instruction *I = nullptr) const override; 76*06f32e7eSjoerg 77*06f32e7eSjoerg private: 78*06f32e7eSjoerg const ARCSubtarget &Subtarget; 79*06f32e7eSjoerg 80*06f32e7eSjoerg // Lower Operand helpers 81*06f32e7eSjoerg SDValue LowerCallArguments(SDValue Chain, CallingConv::ID CallConv, 82*06f32e7eSjoerg bool isVarArg, 83*06f32e7eSjoerg const SmallVectorImpl<ISD::InputArg> &Ins, 84*06f32e7eSjoerg SDLoc dl, SelectionDAG &DAG, 85*06f32e7eSjoerg SmallVectorImpl<SDValue> &InVals) const; 86*06f32e7eSjoerg // Lower Operand specifics 87*06f32e7eSjoerg SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const; 88*06f32e7eSjoerg SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const; 89*06f32e7eSjoerg SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const; 90*06f32e7eSjoerg SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const; 91*06f32e7eSjoerg SDValue LowerSIGN_EXTEND_INREG(SDValue Op, SelectionDAG &DAG) const; 92*06f32e7eSjoerg SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const; 93*06f32e7eSjoerg SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override; 94*06f32e7eSjoerg 95*06f32e7eSjoerg SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, 96*06f32e7eSjoerg bool isVarArg, 97*06f32e7eSjoerg const SmallVectorImpl<ISD::InputArg> &Ins, 98*06f32e7eSjoerg const SDLoc &dl, SelectionDAG &DAG, 99*06f32e7eSjoerg SmallVectorImpl<SDValue> &InVals) const override; 100*06f32e7eSjoerg 101*06f32e7eSjoerg SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI, 102*06f32e7eSjoerg SmallVectorImpl<SDValue> &InVals) const override; 103*06f32e7eSjoerg 104*06f32e7eSjoerg SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg, 105*06f32e7eSjoerg const SmallVectorImpl<ISD::OutputArg> &Outs, 106*06f32e7eSjoerg const SmallVectorImpl<SDValue> &OutVals, const SDLoc &dl, 107*06f32e7eSjoerg SelectionDAG &DAG) const override; 108*06f32e7eSjoerg 109*06f32e7eSjoerg bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF, 110*06f32e7eSjoerg bool isVarArg, 111*06f32e7eSjoerg const SmallVectorImpl<ISD::OutputArg> &ArgsFlags, 112*06f32e7eSjoerg LLVMContext &Context) const override; 113*06f32e7eSjoerg 114*06f32e7eSjoerg bool mayBeEmittedAsTailCall(const CallInst *CI) const override; 115*06f32e7eSjoerg }; 116*06f32e7eSjoerg 117*06f32e7eSjoerg } // end namespace llvm 118*06f32e7eSjoerg 119*06f32e7eSjoerg #endif // LLVM_LIB_TARGET_ARC_ARCISELLOWERING_H 120