/** * Finds unreserved rop registers with a specific category. * * @param startReg {@code >= 0;} a rop register to start the search at * @param regCategory {@code > 0;} category of the searched registers. * @return {@code >= 0;} start of available registers. */ private int findNextUnreservedRopReg(int startReg, int regCategory) { return findNextUnreservedRopReg(startReg, regCategory, getAlignment(regCategory)); }
/** * Finds unreserved rop registers with a specific category. * * @param startReg {@code >= 0;} a rop register to start the search at * @param regCategory {@code > 0;} category of the searched registers. * @return {@code >= 0;} start of available registers. */ private int findNextUnreservedRopReg(int startReg, int regCategory) { return findNextUnreservedRopReg(startReg, regCategory, getAlignment(regCategory)); }
/** * Finds unreserved rop registers with a specific category. * * @param startReg {@code >= 0;} a rop register to start the search at * @param regCategory {@code > 0;} category of the searched registers. * @return {@code >= 0;} start of available registers. */ private int findNextUnreservedRopReg(int startReg, int regCategory) { return findNextUnreservedRopReg(startReg, regCategory, getAlignment(regCategory)); }
/** * Finds unreserved rop registers with a specific category. * * @param startReg {@code >= 0;} a rop register to start the search at * @param regCategory {@code > 0;} category of the searched registers. * @return {@code >= 0;} start of available registers. */ private int findNextUnreservedRopReg(int startReg, int regCategory) { return findNextUnreservedRopReg(startReg, regCategory, getAlignment(regCategory)); }
/** * Finds an unreserved range that will fit the sources of the * specified instruction. Does not bother trying to center the range * around an already-mapped source register; * * @param insn {@code non-null;} insn to build range for * @param rangeLength {@code >=0;} length required in register units * @param categoriesForIndex {@code non-null;} indexed by source index; * the category for each source * @param outMovesRequired {@code non-null;} an output parameter indexed by * source index that will contain the set of sources which need * moves inserted * @return the rop register that starts the fitting range */ private int findAnyFittingRange(NormalSsaInsn insn, int rangeLength, int[] categoriesForIndex, BitSet outMovesRequired) { int rangeStart = paramRangeEnd; while (true) { rangeStart = findNextUnreservedRopReg(rangeStart, rangeLength); int fitWidth = fitPlanForRange(rangeStart, insn, categoriesForIndex, outMovesRequired); if (fitWidth >= 0) { break; } rangeStart++; outMovesRequired.clear(); } return rangeStart; }
/** * Finds an unreserved range that will fit the sources of the * specified instruction. Does not bother trying to center the range * around an already-mapped source register; * * @param insn {@code non-null;} insn to build range for * @param rangeLength {@code >=0;} length required in register units * @param categoriesForIndex {@code non-null;} indexed by source index; * the category for each source * @param outMovesRequired {@code non-null;} an output parameter indexed by * source index that will contain the set of sources which need * moves inserted * @return the rop register that starts the fitting range */ private int findAnyFittingRange(NormalSsaInsn insn, int rangeLength, int[] categoriesForIndex, BitSet outMovesRequired) { int rangeStart = paramRangeEnd; while (true) { rangeStart = findNextUnreservedRopReg(rangeStart, rangeLength); int fitWidth = fitPlanForRange(rangeStart, insn, categoriesForIndex, outMovesRequired); if (fitWidth >= 0) { break; } rangeStart++; outMovesRequired.clear(); } return rangeStart; }
/** * Finds an unreserved range that will fit the sources of the * specified instruction. Does not bother trying to center the range * around an already-mapped source register; * * @param insn {@code non-null;} insn to build range for * @param rangeLength {@code >=0;} length required in register units * @param categoriesForIndex {@code non-null;} indexed by source index; * the category for each source * @param outMovesRequired {@code non-null;} an output parameter indexed by * source index that will contain the set of sources which need * moves inserted * @return the rop register that starts the fitting range */ private int findAnyFittingRange(NormalSsaInsn insn, int rangeLength, int[] categoriesForIndex, BitSet outMovesRequired) { int rangeStart = 0; while (true) { rangeStart = findNextUnreservedRopReg(rangeStart, rangeLength); int fitWidth = fitPlanForRange(rangeStart, insn, categoriesForIndex, outMovesRequired); if (fitWidth >= 0) { break; } rangeStart++; outMovesRequired.clear(); } return rangeStart; }
/** * Finds an unreserved range that will fit the sources of the * specified instruction. Does not bother trying to center the range * around an already-mapped source register; * * @param insn {@code non-null;} insn to build range for * @param rangeLength {@code >=0;} length required in register units * @param categoriesForIndex {@code non-null;} indexed by source index; * the category for each source * @param outMovesRequired {@code non-null;} an output parameter indexed by * source index that will contain the set of sources which need * moves inserted * @return the rop register that starts the fitting range */ private int findAnyFittingRange(NormalSsaInsn insn, int rangeLength, int[] categoriesForIndex, BitSet outMovesRequired) { int rangeStart = paramRangeEnd; while (true) { rangeStart = findNextUnreservedRopReg(rangeStart, rangeLength); int fitWidth = fitPlanForRange(rangeStart, insn, categoriesForIndex, outMovesRequired); if (fitWidth >= 0) { break; } rangeStart++; outMovesRequired.clear(); } return rangeStart; }
/** * Maps all non-parameter, non-local variable registers. */ private void handleNormalUnassociated() { int szSsaRegs = ssaMeth.getRegCount(); for (int ssaReg = 0; ssaReg < szSsaRegs; ssaReg++) { if (ssaRegsMapped.get(ssaReg)) { // We already did this one continue; } RegisterSpec ssaSpec = getDefinitionSpecForSsaReg(ssaReg); if (ssaSpec == null) continue; int category = ssaSpec.getCategory(); // Find a rop reg that does not interfere int ropReg = findNextUnreservedRopReg(paramRangeEnd, category); while (!canMapReg(ssaSpec, ropReg)) { ropReg = findNextUnreservedRopReg(ropReg + 1, category); } addMapping(ssaSpec, ropReg); } }
/** * Maps all non-parameter, non-local variable registers. */ private void handleNormalUnassociated() { int szSsaRegs = ssaMeth.getRegCount(); for (int ssaReg = 0; ssaReg < szSsaRegs; ssaReg++) { if (ssaRegsMapped.get(ssaReg)) { // We already did this one continue; } RegisterSpec ssaSpec = getDefinitionSpecForSsaReg(ssaReg); if (ssaSpec == null) continue; int category = ssaSpec.getCategory(); // Find a rop reg that does not interfere int ropReg = findNextUnreservedRopReg(paramRangeEnd, category); while (!canMapReg(ssaSpec, ropReg)) { ropReg = findNextUnreservedRopReg(ropReg + 1, category); } addMapping(ssaSpec, ropReg); } }
/** * Maps all non-parameter, non-local variable registers. */ private void handleNormalUnassociated() { int szSsaRegs = ssaMeth.getRegCount(); for (int ssaReg = 0; ssaReg < szSsaRegs; ssaReg++) { if (ssaRegsMapped.get(ssaReg)) { // We already did this one continue; } RegisterSpec ssaSpec = getDefinitionSpecForSsaReg(ssaReg); if (ssaSpec == null) continue; int category = ssaSpec.getCategory(); // Find a rop reg that does not interfere int ropReg = findNextUnreservedRopReg(paramRangeEnd, category); while (!canMapReg(ssaSpec, ropReg)) { ropReg = findNextUnreservedRopReg(ropReg + 1, category); } addMapping(ssaSpec, ropReg); } }
/** * Maps all non-parameter, non-local variable registers. */ private void handleNormalUnassociated() { int szSsaRegs = ssaMeth.getRegCount(); for (int ssaReg = 0; ssaReg < szSsaRegs; ssaReg++) { if (ssaRegsMapped.get(ssaReg)) { // We already did this one continue; } RegisterSpec ssaSpec = getDefinitionSpecForSsaReg(ssaReg); if (ssaSpec == null) continue; int category = ssaSpec.getCategory(); // Find a rop reg that does not interfere int ropReg = findNextUnreservedRopReg(paramRangeEnd, category); while (!canMapReg(ssaSpec, ropReg)) { ropReg = findNextUnreservedRopReg(ropReg + 1, category); } addMapping(ssaSpec, ropReg); } }
/** * Maps all non-parameter, non-local variable registers. */ private void handleNormalUnassociated() { int szSsaRegs = ssaMeth.getRegCount(); for (int ssaReg = 0; ssaReg < szSsaRegs; ssaReg++) { if (ssaRegsMapped.get(ssaReg)) { // We already did this one continue; } RegisterSpec ssaSpec = getDefinitionSpecForSsaReg(ssaReg); if (ssaSpec == null) continue; int category = ssaSpec.getCategory(); // Find a rop reg that does not interfere int ropReg = findNextUnreservedRopReg(0, category); while (!canMapReg(ssaSpec, ropReg)) { ropReg = findNextUnreservedRopReg(ropReg + 1, category); } addMapping(ssaSpec, ropReg); } }
/** * Maps all non-parameter, non-local variable registers. */ private void handleNormalUnassociated() { int szSsaRegs = ssaMeth.getRegCount(); for (int ssaReg = 0; ssaReg < szSsaRegs; ssaReg++) { if (ssaRegsMapped.get(ssaReg)) { // We already did this one continue; } RegisterSpec ssaSpec = getDefinitionSpecForSsaReg(ssaReg); if (ssaSpec == null) continue; int category = ssaSpec.getCategory(); // Find a rop reg that does not interfere int ropReg = findNextUnreservedRopReg(paramRangeEnd, category); while (!canMapReg(ssaSpec, ropReg)) { ropReg = findNextUnreservedRopReg(ropReg + 1, category); } addMapping(ssaSpec, ropReg); } }
/** * Maps all non-parameter, non-local variable registers. */ private void handleNormalUnassociated() { int szSsaRegs = ssaMeth.getRegCount(); for (int ssaReg = 0; ssaReg < szSsaRegs; ssaReg++) { if (ssaRegsMapped.get(ssaReg)) { // We already did this one continue; } RegisterSpec ssaSpec = getDefinitionSpecForSsaReg(ssaReg); if (ssaSpec == null) continue; int category = ssaSpec.getCategory(); // Find a rop reg that does not interfere int ropReg = findNextUnreservedRopReg(paramRangeEnd, category); while (!canMapReg(ssaSpec, ropReg)) { ropReg = findNextUnreservedRopReg(ropReg + 1, category); } addMapping(ssaSpec, ropReg); } }
/** * Maps all non-parameter, non-local variable registers. */ private void handleNormalUnassociated() { int szSsaRegs = ssaMeth.getRegCount(); for (int ssaReg = 0; ssaReg < szSsaRegs; ssaReg++) { if (ssaRegsMapped.get(ssaReg)) { // We already did this one continue; } RegisterSpec ssaSpec = getDefinitionSpecForSsaReg(ssaReg); if (ssaSpec == null) continue; int category = ssaSpec.getCategory(); // Find a rop reg that does not interfere int ropReg = findNextUnreservedRopReg(paramRangeEnd, category); while (!canMapReg(ssaSpec, ropReg)) { ropReg = findNextUnreservedRopReg(ropReg + 1, category); } addMapping(ssaSpec, ropReg); } }
ropReg = findNextUnreservedRopReg(ropReg + 1, category);
int mapReg = findNextUnreservedRopReg(paramRangeEnd, category); while (!tryMapRegs(ssaRegs, mapReg, category, false)) { mapReg = findNextUnreservedRopReg(mapReg + 1, category);
int mapReg = findNextUnreservedRopReg(paramRangeEnd, category); while (!tryMapRegs(ssaRegs, mapReg, category, false)) { mapReg = findNextUnreservedRopReg(mapReg + 1, category);
int mapReg = findNextUnreservedRopReg(paramRangeEnd, category); while (!tryMapRegs(ssaRegs, mapReg, category, false)) { mapReg = findNextUnreservedRopReg(mapReg + 1, category);