private void fixIncompatRegs(Insn insn, InstructionIterator allInsns) { List<Register> regs = insn.getRegs(); BitSet incompatRegs = insn.getIncompatibleRegs(); Register resultReg = regs.get(0); // do we have an incompatible result reg? boolean hasResultReg = insn.getOpcode().setsRegister() || insn.getOpcode().setsWideRegister(); boolean isResultRegIncompat = incompatRegs.get(0); // is there an incompat result reg which is not also used as a source // (like in /2addr)? if (hasResultReg && isResultRegIncompat && !insn.getOpcode().name.endsWith("/2addr") && !insn.getOpcode().name.equals("check-cast")) { // yes, so pretend result reg is compatible, since it will get a // special move incompatRegs.clear(0); } // handle normal incompatible regs, if any: add moves if (incompatRegs.cardinality() > 0) { addMovesForIncompatRegs(insn, allInsns, regs, incompatRegs); } // handle incompatible result reg. This is for three-operand // instructions // in which the result register is out of scope. For /2addr // instructions, // we need to coherently move source and result, so this is already done // in addMovesForIncompatRegs. if (hasResultReg && isResultRegIncompat) { Register resultRegClone = resultReg.clone(); addMoveForIncompatResultReg(allInsns, resultRegClone, resultReg, insn); } }
Register newRegister = null; final Register resultReg = regs.get(0); final boolean hasResultReg = curInsn.getOpcode().setsRegister() || curInsn.getOpcode().setsWideRegister(); Insn moveResultInsn = null;
public boolean setsWideRegister() { return instruction.getOpcode().setsWideRegister(); }
writer.write(", "); writeLiteral(writer); if (instruction.getOpcode().setsWideRegister()) { writeCommentIfLikelyDouble(writer); } else {
setRegisters.add(getDestinationRegister()); if (instruction.getOpcode().setsWideRegister()) { setRegisters.add(getDestinationRegister() + 1);
setRegisters.add(getDestinationRegister()); if (instruction.getOpcode().setsWideRegister()) { setRegisters.add(getDestinationRegister() + 1);
return true; if (instruction.getOpcode().setsWideRegister() && registerNumber == (destinationRegister + 1)) { return true;
return true; if (instruction.getOpcode().setsWideRegister() && registerNumber == (destinationRegister + 1)) { return true;
writer.write(", "); writeLiteral(writer); if (instruction.getOpcode().setsWideRegister()) { writeCommentIfLikelyDouble(writer); } else {
writer.write(", "); writeLiteral(writer); if (instruction.getOpcode().setsWideRegister() == false) writeResourceId(writer); break;
writer.write(", "); writeLiteral(writer); if (instruction.getOpcode().setsWideRegister()) { writeCommentIfLikelyDouble(writer); } else {