void HexagonMCInstrInfo::replaceDuplex(MCContext &Context, MCInst &MCB, DuplexCandidate Candidate) { assert(Candidate.packetIndexI < MCB.size()); assert(Candidate.packetIndexJ < MCB.size()); assert(isBundle(MCB)); MCInst *Duplex = deriveDuplex(Context, Candidate.iClass, *MCB.getOperand(Candidate.packetIndexJ).getInst(), *MCB.getOperand(Candidate.packetIndexI).getInst()); assert(Duplex != nullptr); MCB.getOperand(Candidate.packetIndexI).setInst(Duplex); MCB.erase(MCB.begin() + Candidate.packetIndexJ); }
int64_t HexagonMCInstrInfo::minConstant(MCInst const &MCI, size_t Index) { auto Sentinal = static_cast<int64_t>(std::numeric_limits<uint32_t>::max()) << 8; if (MCI.size() <= Index) return Sentinal; MCOperand const &MCO = MCI.getOperand(Index); if (!MCO.isExpr()) return Sentinal; int64_t Value; if (!MCO.getExpr()->evaluateAsAbsolute(Value)) return Sentinal; return Value; }
/// tryCompound - Given a bundle check for compound insns when one /// is found update the contents fo the bundle with the compound insn. /// If a compound instruction is found then the bundle will have one /// additional slot. void HexagonMCInstrInfo::tryCompound(MCInstrInfo const &MCII, MCContext &Context, MCInst &MCI) { assert(MCI.getOpcode() == Hexagon::BUNDLE && "Non-Bundle where Bundle expected"); // By definition a compound must have 2 insn. if (MCI.size() < 2) return; // Look for compounds until none are found, only update the bundle when // a compound is found. while (lookForCompound(MCII, Context, MCI)) ; return; }
bool HexagonMCInstrInfo::isBundle(MCInst const &MCI) { auto Result = Hexagon::BUNDLE == MCI.getOpcode(); assert(!Result || (MCI.size() > 0 && MCI.getOperand(0).isImm())); return Result; }
size_t HexagonMCInstrInfo::bundleSize(MCInst const &MCI) { if (HexagonMCInstrInfo::isBundle(MCI)) return (MCI.size() - bundleInstructionsOffset); else return (1); }