1 //===- MipsAnalyzeImmediate.h - Analyze Immediates -------------*- C++ -*--===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_LIB_TARGET_MIPS_MIPSANALYZEIMMEDIATE_H
10 #define LLVM_LIB_TARGET_MIPS_MIPSANALYZEIMMEDIATE_H
12 #include "llvm/ADT/SmallVector.h"
17 class MipsAnalyzeImmediate {
20 unsigned Opc, ImmOpnd;
22 Inst(unsigned Opc, unsigned ImmOpnd);
24 using InstSeq = SmallVector<Inst, 7>;
26 /// Analyze - Get an instruction sequence to load immediate Imm. The last
27 /// instruction in the sequence must be an ADDiu if LastInstrIsADDiu is
29 const InstSeq &Analyze(uint64_t Imm, unsigned Size, bool LastInstrIsADDiu);
32 using InstSeqLs = SmallVector<InstSeq, 5>;
34 /// AddInstr - Add I to all instruction sequences in SeqLs.
35 void AddInstr(InstSeqLs &SeqLs, const Inst &I);
37 /// GetInstSeqLsADDiu - Get instruction sequences which end with an ADDiu to
38 /// load immediate Imm
39 void GetInstSeqLsADDiu(uint64_t Imm, unsigned RemSize, InstSeqLs &SeqLs);
41 /// GetInstSeqLsORi - Get instrutcion sequences which end with an ORi to
42 /// load immediate Imm
43 void GetInstSeqLsORi(uint64_t Imm, unsigned RemSize, InstSeqLs &SeqLs);
45 /// GetInstSeqLsSLL - Get instruction sequences which end with a SLL to
46 /// load immediate Imm
47 void GetInstSeqLsSLL(uint64_t Imm, unsigned RemSize, InstSeqLs &SeqLs);
49 /// GetInstSeqLs - Get instruction sequences to load immediate Imm.
50 void GetInstSeqLs(uint64_t Imm, unsigned RemSize, InstSeqLs &SeqLs);
52 /// ReplaceADDiuSLLWithLUi - Replace an ADDiu & SLL pair with a LUi.
53 void ReplaceADDiuSLLWithLUi(InstSeq &Seq);
55 /// GetShortestSeq - Find the shortest instruction sequence in SeqLs and
56 /// return it in Insts.
57 void GetShortestSeq(InstSeqLs &SeqLs, InstSeq &Insts);
60 unsigned ADDiu, ORi, SLL, LUi;
64 } // end namespace llvm
66 #endif // LLVM_LIB_TARGET_MIPS_MIPSANALYZEIMMEDIATE_H