18 void MipsAnalyzeImmediate::AddInstr(
InstSeqLs &SeqLs,
const Inst &
I) {
29 void MipsAnalyzeImmediate::GetInstSeqLsADDiu(uint64_t Imm,
unsigned RemSize,
31 GetInstSeqLs((Imm + 0x8000ULL) & 0xffffffffffff0000ULL, RemSize, SeqLs);
32 AddInstr(SeqLs, Inst(ADDiu, Imm & 0xffffULL));
35 void MipsAnalyzeImmediate::GetInstSeqLsORi(uint64_t Imm,
unsigned RemSize,
37 GetInstSeqLs(Imm & 0xffffffffffff0000ULL, RemSize, SeqLs);
38 AddInstr(SeqLs, Inst(ORi, Imm & 0xffffULL));
41 void MipsAnalyzeImmediate::GetInstSeqLsSLL(uint64_t Imm,
unsigned RemSize,
44 GetInstSeqLs(Imm >> Shamt, RemSize - Shamt, SeqLs);
45 AddInstr(SeqLs, Inst(SLL, Shamt));
48 void MipsAnalyzeImmediate::GetInstSeqLs(uint64_t Imm,
unsigned RemSize,
50 uint64_t MaskedImm = Imm & (0xffffffffffffffffULL >> (64 - Size));
58 AddInstr(SeqLs, Inst(ADDiu, MaskedImm));
63 if (!(Imm & 0xffff)) {
64 GetInstSeqLsSLL(Imm, RemSize, SeqLs);
68 GetInstSeqLsADDiu(Imm, RemSize, SeqLs);
74 GetInstSeqLsORi(Imm, RemSize, SeqLsORi);
75 SeqLs.insert(SeqLs.end(), SeqLsORi.begin(), SeqLsORi.end());
85 void MipsAnalyzeImmediate::ReplaceADDiuSLLWithLUi(
InstSeq &Seq) {
88 if ((Seq.size() < 2) || (Seq[0].Opc != ADDiu) ||
89 (Seq[1].Opc != SLL) || (Seq[1].ImmOpnd < 16))
93 int64_t Imm = SignExtend64<16>(Seq[0].ImmOpnd);
94 int64_t ShiftedImm = (uint64_t)Imm << (Seq[1].ImmOpnd - 16);
101 Seq[0].ImmOpnd = (
unsigned)(ShiftedImm & 0xffff);
102 Seq.erase(Seq.begin() + 1);
105 void MipsAnalyzeImmediate::GetShortestSeq(InstSeqLs &SeqLs,
InstSeq &Insts) {
108 unsigned ShortestLength = 8;
111 ReplaceADDiuSLLWithLUi(*S);
112 assert(S->size() <= 7);
114 if (S->size() < ShortestLength) {
116 ShortestLength = S->size();
121 Insts.append(ShortestSeq->begin(), ShortestSeq->end());
126 bool LastInstrIsADDiu) {
135 ADDiu = Mips::DADDiu;
144 if (LastInstrIsADDiu | !Imm)
145 GetInstSeqLsADDiu(Imm, Size, SeqLs);
147 GetInstSeqLs(Imm, Size, SeqLs);
150 GetShortestSeq(SeqLs, Insts);
SuperClass::iterator iterator
void push_back(const T &Elt)
bool LLVM_ATTRIBUTE_UNUSED_RESULT empty() const
enable_if_c< std::numeric_limits< T >::is_integer &&!std::numeric_limits< T >::is_signed, std::size_t >::type countTrailingZeros(T Val, ZeroBehavior ZB=ZB_Width)
Count number of 0's from the least significant bit to the most stopping at the first 1...
bool isInt< 16 >(int64_t x)