static void removeRegisterOperands(const MachineInstr *MI, MCInst &OutMI) { // Remove all uses of stackified registers to bring the instruction format // into its final stack form used thruout MC, and transition opcodes to // their _S variant. // We do this seperate from the above code that still may need these // registers for e.g. call_indirect signatures. // See comments in lib/Target/WebAssembly/WebAssemblyInstrFormats.td for // details. // TODO: the code above creates new registers which are then removed here. // That code could be slightly simplified by not doing that, though maybe // it is simpler conceptually to keep the code above in "register mode" // until this transition point. // FIXME: we are not processing inline assembly, which contains register // operands, because it is used by later target generic code. if (MI->isDebugInstr() || MI->isLabel() || MI->isInlineAsm()) return; // Transform to _S instruction. auto RegOpcode = OutMI.getOpcode(); auto StackOpcode = WebAssembly::getStackOpcode(RegOpcode); assert(StackOpcode != -1 && "Failed to stackify instruction"); OutMI.setOpcode(StackOpcode); // Remove register operands. for (auto I = OutMI.getNumOperands(); I; --I) { auto &MO = OutMI.getOperand(I - 1); if (MO.isReg()) { OutMI.erase(&MO); } } }
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); }