| //===- MipsAnalyzeImmediate.h - Analyze Immediates -------------*- C++ -*--===// | 
 | // | 
 | //                     The LLVM Compiler Infrastructure | 
 | // | 
 | // This file is distributed under the University of Illinois Open Source | 
 | // License. See LICENSE.TXT for details. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #ifndef LLVM_LIB_TARGET_MIPS_MIPSANALYZEIMMEDIATE_H | 
 | #define LLVM_LIB_TARGET_MIPS_MIPSANALYZEIMMEDIATE_H | 
 |  | 
 | #include "llvm/ADT/SmallVector.h" | 
 | #include <cstdint> | 
 |  | 
 | namespace llvm { | 
 |  | 
 |   class MipsAnalyzeImmediate { | 
 |   public: | 
 |     struct Inst { | 
 |       unsigned Opc, ImmOpnd; | 
 |  | 
 |       Inst(unsigned Opc, unsigned ImmOpnd); | 
 |     }; | 
 |     using InstSeq = SmallVector<Inst, 7>; | 
 |  | 
 |     /// Analyze - Get an instruction sequence to load immediate Imm. The last | 
 |     /// instruction in the sequence must be an ADDiu if LastInstrIsADDiu is | 
 |     /// true; | 
 |     const InstSeq &Analyze(uint64_t Imm, unsigned Size, bool LastInstrIsADDiu); | 
 |  | 
 |   private: | 
 |     using InstSeqLs = SmallVector<InstSeq, 5>; | 
 |  | 
 |     /// AddInstr - Add I to all instruction sequences in SeqLs. | 
 |     void AddInstr(InstSeqLs &SeqLs, const Inst &I); | 
 |  | 
 |     /// GetInstSeqLsADDiu - Get instruction sequences which end with an ADDiu to | 
 |     /// load immediate Imm | 
 |     void GetInstSeqLsADDiu(uint64_t Imm, unsigned RemSize, InstSeqLs &SeqLs); | 
 |  | 
 |     /// GetInstSeqLsORi - Get instrutcion sequences which end with an ORi to | 
 |     /// load immediate Imm | 
 |     void GetInstSeqLsORi(uint64_t Imm, unsigned RemSize, InstSeqLs &SeqLs); | 
 |  | 
 |     /// GetInstSeqLsSLL - Get instruction sequences which end with a SLL to | 
 |     /// load immediate Imm | 
 |     void GetInstSeqLsSLL(uint64_t Imm, unsigned RemSize, InstSeqLs &SeqLs); | 
 |  | 
 |     /// GetInstSeqLs - Get instruction sequences to load immediate Imm. | 
 |     void GetInstSeqLs(uint64_t Imm, unsigned RemSize, InstSeqLs &SeqLs); | 
 |  | 
 |     /// ReplaceADDiuSLLWithLUi - Replace an ADDiu & SLL pair with a LUi. | 
 |     void ReplaceADDiuSLLWithLUi(InstSeq &Seq); | 
 |  | 
 |     /// GetShortestSeq - Find the shortest instruction sequence in SeqLs and | 
 |     /// return it in Insts. | 
 |     void GetShortestSeq(InstSeqLs &SeqLs, InstSeq &Insts); | 
 |  | 
 |     unsigned Size; | 
 |     unsigned ADDiu, ORi, SLL, LUi; | 
 |     InstSeq Insts; | 
 |   }; | 
 |  | 
 | } // end namespace llvm | 
 |  | 
 | #endif // LLVM_LIB_TARGET_MIPS_MIPSANALYZEIMMEDIATE_H |