xref: /freebsd/contrib/llvm-project/llvm/lib/Target/ARC/ARCISelLowering.h (revision 349cc55c9796c4596a5b9904cd3281af295f878f)
10b57cec5SDimitry Andric //===- ARCISelLowering.h - ARC DAG Lowering Interface -----------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file defines the interfaces that ARC uses to lower LLVM code into a
100b57cec5SDimitry Andric // selection DAG.
110b57cec5SDimitry Andric //
120b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
130b57cec5SDimitry Andric 
140b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_ARC_ARCISELLOWERING_H
150b57cec5SDimitry Andric #define LLVM_LIB_TARGET_ARC_ARCISELLOWERING_H
160b57cec5SDimitry Andric 
170b57cec5SDimitry Andric #include "ARC.h"
180b57cec5SDimitry Andric #include "llvm/CodeGen/SelectionDAG.h"
190b57cec5SDimitry Andric #include "llvm/CodeGen/TargetLowering.h"
200b57cec5SDimitry Andric 
210b57cec5SDimitry Andric namespace llvm {
220b57cec5SDimitry Andric 
230b57cec5SDimitry Andric // Forward delcarations
240b57cec5SDimitry Andric class ARCSubtarget;
250b57cec5SDimitry Andric class ARCTargetMachine;
260b57cec5SDimitry Andric 
270b57cec5SDimitry Andric namespace ARCISD {
280b57cec5SDimitry Andric 
290b57cec5SDimitry Andric enum NodeType : unsigned {
300b57cec5SDimitry Andric   // Start the numbering where the builtin ops and target ops leave off.
310b57cec5SDimitry Andric   FIRST_NUMBER = ISD::BUILTIN_OP_END,
320b57cec5SDimitry Andric 
330b57cec5SDimitry Andric   // Branch and link (call)
340b57cec5SDimitry Andric   BL,
350b57cec5SDimitry Andric 
360b57cec5SDimitry Andric   // Jump and link (indirect call)
370b57cec5SDimitry Andric   JL,
380b57cec5SDimitry Andric 
390b57cec5SDimitry Andric   // CMP
400b57cec5SDimitry Andric   CMP,
410b57cec5SDimitry Andric 
420b57cec5SDimitry Andric   // CMOV
430b57cec5SDimitry Andric   CMOV,
440b57cec5SDimitry Andric 
450b57cec5SDimitry Andric   // BRcc
460b57cec5SDimitry Andric   BRcc,
470b57cec5SDimitry Andric 
480b57cec5SDimitry Andric   // Global Address Wrapper
490b57cec5SDimitry Andric   GAWRAPPER,
500b57cec5SDimitry Andric 
510b57cec5SDimitry Andric   // return, (j_s [blink])
520b57cec5SDimitry Andric   RET
530b57cec5SDimitry Andric };
540b57cec5SDimitry Andric 
550b57cec5SDimitry Andric } // end namespace ARCISD
560b57cec5SDimitry Andric 
570b57cec5SDimitry Andric //===--------------------------------------------------------------------===//
580b57cec5SDimitry Andric // TargetLowering Implementation
590b57cec5SDimitry Andric //===--------------------------------------------------------------------===//
600b57cec5SDimitry Andric class ARCTargetLowering : public TargetLowering {
610b57cec5SDimitry Andric public:
620b57cec5SDimitry Andric   explicit ARCTargetLowering(const TargetMachine &TM,
630b57cec5SDimitry Andric                              const ARCSubtarget &Subtarget);
640b57cec5SDimitry Andric 
650b57cec5SDimitry Andric   /// Provide custom lowering hooks for some operations.
660b57cec5SDimitry Andric   SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
670b57cec5SDimitry Andric 
680b57cec5SDimitry Andric   /// This method returns the name of a target specific DAG node.
690b57cec5SDimitry Andric   const char *getTargetNodeName(unsigned Opcode) const override;
700b57cec5SDimitry Andric 
710b57cec5SDimitry Andric   /// Return true if the addressing mode represented by AM is legal for this
720b57cec5SDimitry Andric   /// target, for a load/store of the specified type.
730b57cec5SDimitry Andric   bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty,
740b57cec5SDimitry Andric                              unsigned AS,
750b57cec5SDimitry Andric                              Instruction *I = nullptr) const override;
760b57cec5SDimitry Andric 
770b57cec5SDimitry Andric private:
780b57cec5SDimitry Andric   const ARCSubtarget &Subtarget;
790b57cec5SDimitry Andric 
80*349cc55cSDimitry Andric   void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue> &Results,
81*349cc55cSDimitry Andric                           SelectionDAG &DAG) const override;
82*349cc55cSDimitry Andric 
830b57cec5SDimitry Andric   // Lower Operand helpers
840b57cec5SDimitry Andric   SDValue LowerCallArguments(SDValue Chain, CallingConv::ID CallConv,
850b57cec5SDimitry Andric                              bool isVarArg,
860b57cec5SDimitry Andric                              const SmallVectorImpl<ISD::InputArg> &Ins,
870b57cec5SDimitry Andric                              SDLoc dl, SelectionDAG &DAG,
880b57cec5SDimitry Andric                              SmallVectorImpl<SDValue> &InVals) const;
890b57cec5SDimitry Andric   // Lower Operand specifics
900b57cec5SDimitry Andric   SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
910b57cec5SDimitry Andric   SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
920b57cec5SDimitry Andric   SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
930b57cec5SDimitry Andric   SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
940b57cec5SDimitry Andric   SDValue LowerSIGN_EXTEND_INREG(SDValue Op, SelectionDAG &DAG) const;
950b57cec5SDimitry Andric   SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
960b57cec5SDimitry Andric   SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
970b57cec5SDimitry Andric 
980b57cec5SDimitry Andric   SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
990b57cec5SDimitry Andric                                bool isVarArg,
1000b57cec5SDimitry Andric                                const SmallVectorImpl<ISD::InputArg> &Ins,
1010b57cec5SDimitry Andric                                const SDLoc &dl, SelectionDAG &DAG,
1020b57cec5SDimitry Andric                                SmallVectorImpl<SDValue> &InVals) const override;
1030b57cec5SDimitry Andric 
1040b57cec5SDimitry Andric   SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI,
1050b57cec5SDimitry Andric                     SmallVectorImpl<SDValue> &InVals) const override;
1060b57cec5SDimitry Andric 
1070b57cec5SDimitry Andric   SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
1080b57cec5SDimitry Andric                       const SmallVectorImpl<ISD::OutputArg> &Outs,
1090b57cec5SDimitry Andric                       const SmallVectorImpl<SDValue> &OutVals, const SDLoc &dl,
1100b57cec5SDimitry Andric                       SelectionDAG &DAG) const override;
1110b57cec5SDimitry Andric 
1120b57cec5SDimitry Andric   bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF,
1130b57cec5SDimitry Andric                       bool isVarArg,
1140b57cec5SDimitry Andric                       const SmallVectorImpl<ISD::OutputArg> &ArgsFlags,
1150b57cec5SDimitry Andric                       LLVMContext &Context) const override;
1160b57cec5SDimitry Andric 
1170b57cec5SDimitry Andric   bool mayBeEmittedAsTailCall(const CallInst *CI) const override;
1180b57cec5SDimitry Andric };
1190b57cec5SDimitry Andric 
1200b57cec5SDimitry Andric } // end namespace llvm
1210b57cec5SDimitry Andric 
1220b57cec5SDimitry Andric #endif // LLVM_LIB_TARGET_ARC_ARCISELLOWERING_H
123