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.append(std::make_move_iterator(SeqLsORi.begin()),
76 std::make_move_iterator(SeqLsORi.end()));
86 void MipsAnalyzeImmediate::ReplaceADDiuSLLWithLUi(
InstSeq &Seq) {
89 if ((Seq.size() < 2) || (Seq[0].Opc != ADDiu) ||
90 (Seq[1].Opc != SLL) || (Seq[1].ImmOpnd < 16))
94 int64_t Imm = SignExtend64<16>(Seq[0].ImmOpnd);
95 int64_t ShiftedImm = (uint64_t)Imm << (Seq[1].ImmOpnd - 16);
102 Seq[0].ImmOpnd = (
unsigned)(ShiftedImm & 0xffff);
103 Seq.erase(Seq.begin() + 1);
106 void MipsAnalyzeImmediate::GetShortestSeq(InstSeqLs &SeqLs,
InstSeq &Insts) {
109 unsigned ShortestLength = 8;
112 ReplaceADDiuSLLWithLUi(*S);
113 assert(S->size() <= 7);
115 if (S->size() < ShortestLength) {
117 ShortestLength = S->size();
122 Insts.append(ShortestSeq->begin(), ShortestSeq->end());
127 bool LastInstrIsADDiu) {
136 ADDiu = Mips::DADDiu;
145 if (LastInstrIsADDiu | !Imm)
146 GetInstSeqLsADDiu(Imm, Size, SeqLs);
148 GetInstSeqLs(Imm, Size, SeqLs);
151 GetShortestSeq(SeqLs, Insts);
SuperClass::iterator iterator
void push_back(const T &Elt)
bool LLVM_ATTRIBUTE_UNUSED_RESULT empty() const
std::size_t 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...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small...
bool isInt< 16 >(int64_t x)