LCOV - code coverage report
Current view: top level - lib/Target/AVR - AVRISelLowering.h (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 4 4 100.0 %
Date: 2018-10-20 13:21:21 Functions: 2 2 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===-- AVRISelLowering.h - AVR 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 AVR uses to lower LLVM code into a
      11             : // selection DAG.
      12             : //
      13             : //===----------------------------------------------------------------------===//
      14             : 
      15             : #ifndef LLVM_AVR_ISEL_LOWERING_H
      16             : #define LLVM_AVR_ISEL_LOWERING_H
      17             : 
      18             : #include "llvm/CodeGen/CallingConvLower.h"
      19             : #include "llvm/CodeGen/TargetLowering.h"
      20             : 
      21             : namespace llvm {
      22             : 
      23             : namespace AVRISD {
      24             : 
      25             : /// AVR Specific DAG Nodes
      26             : enum NodeType {
      27             :   /// Start the numbering where the builtin ops leave off.
      28             :   FIRST_NUMBER = ISD::BUILTIN_OP_END,
      29             :   /// Return from subroutine.
      30             :   RET_FLAG,
      31             :   /// Return from ISR.
      32             :   RETI_FLAG,
      33             :   /// Represents an abstract call instruction,
      34             :   /// which includes a bunch of information.
      35             :   CALL,
      36             :   /// A wrapper node for TargetConstantPool,
      37             :   /// TargetExternalSymbol, and TargetGlobalAddress.
      38             :   WRAPPER,
      39             :   LSL,     ///< Logical shift left.
      40             :   LSR,     ///< Logical shift right.
      41             :   ASR,     ///< Arithmetic shift right.
      42             :   ROR,     ///< Bit rotate right.
      43             :   ROL,     ///< Bit rotate left.
      44             :   LSLLOOP, ///< A loop of single logical shift left instructions.
      45             :   LSRLOOP, ///< A loop of single logical shift right instructions.
      46             :   ROLLOOP, ///< A loop of single left bit rotate instructions.
      47             :   RORLOOP, ///< A loop of single right bit rotate instructions.
      48             :   ASRLOOP, ///< A loop of single arithmetic shift right instructions.
      49             :   /// AVR conditional branches. Operand 0 is the chain operand, operand 1
      50             :   /// is the block to branch if condition is true, operand 2 is the
      51             :   /// condition code, and operand 3 is the flag operand produced by a CMP
      52             :   /// or TEST instruction.
      53             :   BRCOND,
      54             :   /// Compare instruction.
      55             :   CMP,
      56             :   /// Compare with carry instruction.
      57             :   CMPC,
      58             :   /// Test for zero or minus instruction.
      59             :   TST,
      60             :   /// Operand 0 and operand 1 are selection variable, operand 2
      61             :   /// is condition code and operand 3 is flag operand.
      62             :   SELECT_CC
      63             : };
      64             : 
      65             : } // end of namespace AVRISD
      66             : 
      67             : class AVRTargetMachine;
      68             : 
      69             : /// Performs target lowering for the AVR.
      70             : class AVRTargetLowering : public TargetLowering {
      71             : public:
      72             :   explicit AVRTargetLowering(AVRTargetMachine &TM);
      73             : 
      74             : public:
      75         150 :   MVT getScalarShiftAmountTy(const DataLayout &, EVT LHSTy) const override {
      76         150 :     return MVT::i8;
      77             :   }
      78             : 
      79           1 :   MVT::SimpleValueType getCmpLibcallReturnType() const override {
      80           1 :     return MVT::i8;
      81             :   }
      82             : 
      83             :   const char *getTargetNodeName(unsigned Opcode) const override;
      84             : 
      85             :   SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
      86             : 
      87             :   void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue> &Results,
      88             :                           SelectionDAG &DAG) const override;
      89             : 
      90             :   bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty,
      91             :                              unsigned AS,
      92             :                              Instruction *I = nullptr) const override;
      93             : 
      94             :   bool getPreIndexedAddressParts(SDNode *N, SDValue &Base, SDValue &Offset,
      95             :                                  ISD::MemIndexedMode &AM,
      96             :                                  SelectionDAG &DAG) const override;
      97             : 
      98             :   bool getPostIndexedAddressParts(SDNode *N, SDNode *Op, SDValue &Base,
      99             :                                   SDValue &Offset, ISD::MemIndexedMode &AM,
     100             :                                   SelectionDAG &DAG) const override;
     101             : 
     102             :   bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override;
     103             : 
     104             :   EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context,
     105             :                          EVT VT) const override;
     106             : 
     107             :   MachineBasicBlock *
     108             :   EmitInstrWithCustomInserter(MachineInstr &MI,
     109             :                               MachineBasicBlock *MBB) const override;
     110             : 
     111             :   ConstraintType getConstraintType(StringRef Constraint) const override;
     112             : 
     113             :   ConstraintWeight
     114             :   getSingleConstraintMatchWeight(AsmOperandInfo &info,
     115             :                                  const char *constraint) const override;
     116             : 
     117             :   std::pair<unsigned, const TargetRegisterClass *>
     118             :   getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
     119             :                                StringRef Constraint, MVT VT) const override;
     120             : 
     121             :   unsigned getInlineAsmMemConstraint(StringRef ConstraintCode) const override;
     122             : 
     123             :   void LowerAsmOperandForConstraint(SDValue Op, std::string &Constraint,
     124             :                                     std::vector<SDValue> &Ops,
     125             :                                     SelectionDAG &DAG) const override;
     126             : 
     127             :   unsigned getRegisterByName(const char* RegName, EVT VT,
     128             :                              SelectionDAG &DAG) const override;
     129             : 
     130             : private:
     131             :   SDValue getAVRCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC, SDValue &AVRcc,
     132             :                     SelectionDAG &DAG, SDLoc dl) const;
     133             :   SDValue LowerShifts(SDValue Op, SelectionDAG &DAG) const;
     134             :   SDValue LowerDivRem(SDValue Op, SelectionDAG &DAG) const;
     135             :   SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
     136             :   SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
     137             :   SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
     138             :   SDValue LowerINLINEASM(SDValue Op, SelectionDAG &DAG) const;
     139             :   SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
     140             :   SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
     141             :   SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
     142             : 
     143             :   CCAssignFn *CCAssignFnForReturn(CallingConv::ID CC) const;
     144             : 
     145             :   bool CanLowerReturn(CallingConv::ID CallConv,
     146             :                       MachineFunction &MF, bool isVarArg,
     147             :                       const SmallVectorImpl<ISD::OutputArg> &Outs,
     148             :                       LLVMContext &Context) const override;
     149             : 
     150             :   SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
     151             :                       const SmallVectorImpl<ISD::OutputArg> &Outs,
     152             :                       const SmallVectorImpl<SDValue> &OutVals, const SDLoc &dl,
     153             :                       SelectionDAG &DAG) const override;
     154             :   SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
     155             :                                bool isVarArg,
     156             :                                const SmallVectorImpl<ISD::InputArg> &Ins,
     157             :                                const SDLoc &dl, SelectionDAG &DAG,
     158             :                                SmallVectorImpl<SDValue> &InVals) const override;
     159             :   SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI,
     160             :                     SmallVectorImpl<SDValue> &InVals) const override;
     161             :   SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
     162             :                           CallingConv::ID CallConv, bool isVarArg,
     163             :                           const SmallVectorImpl<ISD::InputArg> &Ins,
     164             :                           const SDLoc &dl, SelectionDAG &DAG,
     165             :                           SmallVectorImpl<SDValue> &InVals) const;
     166             : 
     167             : private:
     168             :   MachineBasicBlock *insertShift(MachineInstr &MI, MachineBasicBlock *BB) const;
     169             :   MachineBasicBlock *insertMul(MachineInstr &MI, MachineBasicBlock *BB) const;
     170             : };
     171             : 
     172             : } // end namespace llvm
     173             : 
     174             : #endif // LLVM_AVR_ISEL_LOWERING_H

Generated by: LCOV version 1.13