Home | History | Annotate | Download | only in AVR
      1 //===-- AVRInstrInfo.h - AVR Instruction Information ------------*- 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 contains the AVR implementation of the TargetInstrInfo class.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef LLVM_AVR_INSTR_INFO_H
     15 #define LLVM_AVR_INSTR_INFO_H
     16 
     17 #include "llvm/CodeGen/TargetInstrInfo.h"
     18 
     19 #include "AVRRegisterInfo.h"
     20 
     21 #define GET_INSTRINFO_HEADER
     22 #include "AVRGenInstrInfo.inc"
     23 #undef GET_INSTRINFO_HEADER
     24 
     25 namespace llvm {
     26 
     27 namespace AVRCC {
     28 
     29 /// AVR specific condition codes.
     30 /// These correspond to `AVR_*_COND` in `AVRInstrInfo.td`.
     31 /// They must be kept in synch.
     32 enum CondCodes {
     33   COND_EQ, //!< Equal
     34   COND_NE, //!< Not equal
     35   COND_GE, //!< Greater than or equal
     36   COND_LT, //!< Less than
     37   COND_SH, //!< Unsigned same or higher
     38   COND_LO, //!< Unsigned lower
     39   COND_MI, //!< Minus
     40   COND_PL, //!< Plus
     41   COND_INVALID
     42 };
     43 
     44 } // end of namespace AVRCC
     45 
     46 namespace AVRII {
     47 
     48 /// Specifies a target operand flag.
     49 enum TOF {
     50   MO_NO_FLAG,
     51 
     52   /// On a symbol operand, this represents the lo part.
     53   MO_LO = (1 << 1),
     54 
     55   /// On a symbol operand, this represents the hi part.
     56   MO_HI = (1 << 2),
     57 
     58   /// On a symbol operand, this represents it has to be negated.
     59   MO_NEG = (1 << 3)
     60 };
     61 
     62 } // end of namespace AVRII
     63 
     64 /// Utilities related to the AVR instruction set.
     65 class AVRInstrInfo : public AVRGenInstrInfo {
     66 public:
     67   explicit AVRInstrInfo();
     68 
     69   const AVRRegisterInfo &getRegisterInfo() const { return RI; }
     70   const MCInstrDesc &getBrCond(AVRCC::CondCodes CC) const;
     71   AVRCC::CondCodes getCondFromBranchOpc(unsigned Opc) const;
     72   AVRCC::CondCodes getOppositeCondition(AVRCC::CondCodes CC) const;
     73   unsigned getInstSizeInBytes(const MachineInstr &MI) const override;
     74 
     75   void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
     76                    const DebugLoc &DL, unsigned DestReg, unsigned SrcReg,
     77                    bool KillSrc) const override;
     78   void storeRegToStackSlot(MachineBasicBlock &MBB,
     79                            MachineBasicBlock::iterator MI, unsigned SrcReg,
     80                            bool isKill, int FrameIndex,
     81                            const TargetRegisterClass *RC,
     82                            const TargetRegisterInfo *TRI) const override;
     83   void loadRegFromStackSlot(MachineBasicBlock &MBB,
     84                             MachineBasicBlock::iterator MI, unsigned DestReg,
     85                             int FrameIndex, const TargetRegisterClass *RC,
     86                             const TargetRegisterInfo *TRI) const override;
     87   unsigned isLoadFromStackSlot(const MachineInstr &MI,
     88                                int &FrameIndex) const override;
     89   unsigned isStoreToStackSlot(const MachineInstr &MI,
     90                               int &FrameIndex) const override;
     91 
     92   // Branch analysis.
     93   bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB,
     94                      MachineBasicBlock *&FBB,
     95                      SmallVectorImpl<MachineOperand> &Cond,
     96                      bool AllowModify = false) const override;
     97   unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
     98                         MachineBasicBlock *FBB, ArrayRef<MachineOperand> Cond,
     99                         const DebugLoc &DL,
    100                         int *BytesAdded = nullptr) const override;
    101   unsigned removeBranch(MachineBasicBlock &MBB,
    102                         int *BytesRemoved = nullptr) const override;
    103   bool
    104   reverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const override;
    105 
    106   MachineBasicBlock *getBranchDestBlock(const MachineInstr &MI) const override;
    107 
    108   bool isBranchOffsetInRange(unsigned BranchOpc,
    109                              int64_t BrOffset) const override;
    110 
    111   unsigned insertIndirectBranch(MachineBasicBlock &MBB,
    112                                 MachineBasicBlock &NewDestBB,
    113                                 const DebugLoc &DL,
    114                                 int64_t BrOffset,
    115                                 RegScavenger *RS) const override;
    116 private:
    117   const AVRRegisterInfo RI;
    118 };
    119 
    120 } // end namespace llvm
    121 
    122 #endif // LLVM_AVR_INSTR_INFO_H
    123