Home | History | Annotate | Download | only in Lanai
      1 //===- LanaiInstrInfo.h - Lanai 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 Lanai implementation of the TargetInstrInfo class.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef LLVM_LIB_TARGET_LANAI_LANAIINSTRINFO_H
     15 #define LLVM_LIB_TARGET_LANAI_LANAIINSTRINFO_H
     16 
     17 #include "LanaiRegisterInfo.h"
     18 #include "llvm/Target/TargetInstrInfo.h"
     19 
     20 #define GET_INSTRINFO_HEADER
     21 #include "LanaiGenInstrInfo.inc"
     22 
     23 namespace llvm {
     24 
     25 class LanaiInstrInfo : public LanaiGenInstrInfo {
     26   const LanaiRegisterInfo RegisterInfo;
     27 
     28 public:
     29   LanaiInstrInfo();
     30 
     31   // getRegisterInfo - TargetInstrInfo is a superset of MRegister info.  As
     32   // such, whenever a client has an instance of instruction info, it should
     33   // always be able to get register info as well (through this method).
     34   virtual const LanaiRegisterInfo &getRegisterInfo() const {
     35     return RegisterInfo;
     36   }
     37 
     38   bool areMemAccessesTriviallyDisjoint(MachineInstr &MIa, MachineInstr &MIb,
     39                                        AliasAnalysis *AA) const override;
     40 
     41   unsigned isLoadFromStackSlot(const MachineInstr &MI,
     42                                int &FrameIndex) const override;
     43 
     44   unsigned isLoadFromStackSlotPostFE(const MachineInstr &MI,
     45                                      int &FrameIndex) const override;
     46 
     47   unsigned isStoreToStackSlot(const MachineInstr &MI,
     48                               int &FrameIndex) const override;
     49 
     50   void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator Position,
     51                    const DebugLoc &DL, unsigned DestinationRegister,
     52                    unsigned SourceRegister, bool KillSource) const override;
     53 
     54   void
     55   storeRegToStackSlot(MachineBasicBlock &MBB,
     56                       MachineBasicBlock::iterator Position,
     57                       unsigned SourceRegister, bool IsKill, int FrameIndex,
     58                       const TargetRegisterClass *RegisterClass,
     59                       const TargetRegisterInfo *RegisterInfo) const override;
     60 
     61   void
     62   loadRegFromStackSlot(MachineBasicBlock &MBB,
     63                        MachineBasicBlock::iterator Position,
     64                        unsigned DestinationRegister, int FrameIndex,
     65                        const TargetRegisterClass *RegisterClass,
     66                        const TargetRegisterInfo *RegisterInfo) const override;
     67 
     68   bool expandPostRAPseudo(MachineInstr &MI) const override;
     69 
     70   bool getMemOpBaseRegImmOfs(MachineInstr &LdSt, unsigned &BaseReg,
     71                              int64_t &Offset,
     72                              const TargetRegisterInfo *TRI) const override;
     73 
     74   bool getMemOpBaseRegImmOfsWidth(MachineInstr &LdSt, unsigned &BaseReg,
     75                                   int64_t &Offset, unsigned &Width,
     76                                   const TargetRegisterInfo *TRI) const;
     77 
     78   std::pair<unsigned, unsigned>
     79   decomposeMachineOperandsTargetFlags(unsigned TF) const override;
     80 
     81   ArrayRef<std::pair<unsigned, const char *>>
     82   getSerializableDirectMachineOperandTargetFlags() const override;
     83 
     84   bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TrueBlock,
     85                      MachineBasicBlock *&FalseBlock,
     86                      SmallVectorImpl<MachineOperand> &Condition,
     87                      bool AllowModify) const override;
     88 
     89   unsigned RemoveBranch(MachineBasicBlock &MBB) const override;
     90 
     91   // For a comparison instruction, return the source registers in SrcReg and
     92   // SrcReg2 if having two register operands, and the value it compares against
     93   // in CmpValue. Return true if the comparison instruction can be analyzed.
     94   bool analyzeCompare(const MachineInstr &MI, unsigned &SrcReg,
     95                       unsigned &SrcReg2, int &CmpMask,
     96                       int &CmpValue) const override;
     97 
     98   // See if the comparison instruction can be converted into something more
     99   // efficient. E.g., on Lanai register-register instructions can set the flag
    100   // register, obviating the need for a separate compare.
    101   bool optimizeCompareInstr(MachineInstr &CmpInstr, unsigned SrcReg,
    102                             unsigned SrcReg2, int CmpMask, int CmpValue,
    103                             const MachineRegisterInfo *MRI) const override;
    104 
    105   // Analyze the given select instruction, returning true if it cannot be
    106   // understood. It is assumed that MI->isSelect() is true.
    107   //
    108   // When successful, return the controlling condition and the operands that
    109   // determine the true and false result values.
    110   //
    111   //   Result = SELECT Cond, TrueOp, FalseOp
    112   //
    113   // Lanai can optimize certain select instructions, for example by predicating
    114   // the instruction defining one of the operands and sets Optimizable to true.
    115   bool analyzeSelect(const MachineInstr &MI,
    116                      SmallVectorImpl<MachineOperand> &Cond, unsigned &TrueOp,
    117                      unsigned &FalseOp, bool &Optimizable) const override;
    118 
    119   // Given a select instruction that was understood by analyzeSelect and
    120   // returned Optimizable = true, attempt to optimize MI by merging it with one
    121   // of its operands. Returns NULL on failure.
    122   //
    123   // When successful, returns the new select instruction. The client is
    124   // responsible for deleting MI.
    125   //
    126   // If both sides of the select can be optimized, the TrueOp is modifed.
    127   // PreferFalse is not used.
    128   MachineInstr *optimizeSelect(MachineInstr &MI,
    129                                SmallPtrSetImpl<MachineInstr *> &SeenMIs,
    130                                bool PreferFalse) const override;
    131 
    132   bool ReverseBranchCondition(
    133       SmallVectorImpl<MachineOperand> &Condition) const override;
    134 
    135   unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TrueBlock,
    136                         MachineBasicBlock *FalseBlock,
    137                         ArrayRef<MachineOperand> Condition,
    138                         const DebugLoc &DL) const override;
    139 };
    140 
    141 static inline bool isSPLSOpcode(unsigned Opcode) {
    142   switch (Opcode) {
    143   case Lanai::LDBs_RI:
    144   case Lanai::LDBz_RI:
    145   case Lanai::LDHs_RI:
    146   case Lanai::LDHz_RI:
    147   case Lanai::STB_RI:
    148   case Lanai::STH_RI:
    149     return true;
    150   default:
    151     return false;
    152   }
    153 }
    154 
    155 static inline bool isRMOpcode(unsigned Opcode) {
    156   switch (Opcode) {
    157   case Lanai::LDW_RI:
    158   case Lanai::SW_RI:
    159     return true;
    160   default:
    161     return false;
    162   }
    163 }
    164 
    165 static inline bool isRRMOpcode(unsigned Opcode) {
    166   switch (Opcode) {
    167   case Lanai::LDBs_RR:
    168   case Lanai::LDBz_RR:
    169   case Lanai::LDHs_RR:
    170   case Lanai::LDHz_RR:
    171   case Lanai::LDWz_RR:
    172   case Lanai::LDW_RR:
    173   case Lanai::STB_RR:
    174   case Lanai::STH_RR:
    175   case Lanai::SW_RR:
    176     return true;
    177   default:
    178     return false;
    179   }
    180 }
    181 
    182 } // namespace llvm
    183 
    184 #endif // LLVM_LIB_TARGET_LANAI_LANAIINSTRINFO_H
    185