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