/** * Finds a range of unreserved rop registers. * * @param startReg {@code >= 0;} a rop register to start the search at * @param width {@code > 0;} the width, in registers, required. * @param alignment the alignment constraint. * @return {@code >= 0;} start of available register range. */ private int findNextUnreservedRopReg(int startReg, int width, Alignment alignment) { int reg = alignment.nextClearBit(reservedRopRegs, startReg); while (true) { int i = 1; while (i < width && !reservedRopRegs.get(reg + i)) { i++; } if (i == width) { return reg; } reg = alignment.nextClearBit(reservedRopRegs, reg + i); } }
/** * Finds rop registers that can be used for local variables. * If {@code MIX_LOCALS_AND_OTHER} is {@code false}, this means any * rop register that has not yet been used. * * @param startReg {@code >= 0;} a rop register to start the search at * @param category {@code > 0;} the register category required. * @return {@code >= 0;} start of available registers. */ private int findRopRegForLocal(int startReg, int category) { Alignment alignment = getAlignment(category); int reg = alignment.nextClearBit(usedRopRegs, startReg); while (true) { int i = 1; while (i < category && !usedRopRegs.get(reg + i)) { i++; } if (i == category) { return reg; } reg = alignment.nextClearBit(usedRopRegs, reg + i); } }
/** * Finds rop registers that can be used for local variables. * If {@code MIX_LOCALS_AND_OTHER} is {@code false}, this means any * rop register that has not yet been used. * * @param startReg {@code >= 0;} a rop register to start the search at * @param category {@code > 0;} the register category required. * @return {@code >= 0;} start of available registers. */ private int findRopRegForLocal(int startReg, int category) { Alignment alignment = getAlignment(category); int reg = alignment.nextClearBit(usedRopRegs, startReg); while (true) { int i = 1; while (i < category && !usedRopRegs.get(reg + i)) { i++; } if (i == category) { return reg; } reg = alignment.nextClearBit(usedRopRegs, reg + i); } }
/** * Finds rop registers that can be used for local variables. * If {@code MIX_LOCALS_AND_OTHER} is {@code false}, this means any * rop register that has not yet been used. * * @param startReg {@code >= 0;} a rop register to start the search at * @param category {@code > 0;} the register category required. * @return {@code >= 0;} start of available registers. */ private int findRopRegForLocal(int startReg, int category) { Alignment alignment = getAlignment(category); int reg = alignment.nextClearBit(usedRopRegs, startReg); while (true) { int i = 1; while (i < category && !usedRopRegs.get(reg + i)) { i++; } if (i == category) { return reg; } reg = alignment.nextClearBit(usedRopRegs, reg + i); } }
/** * Finds rop registers that can be used for local variables. * If {@code MIX_LOCALS_AND_OTHER} is {@code false}, this means any * rop register that has not yet been used. * * @param startReg {@code >= 0;} a rop register to start the search at * @param category {@code > 0;} the register category required. * @return {@code >= 0;} start of available registers. */ private int findRopRegForLocal(int startReg, int category) { Alignment alignment = getAlignment(category); int reg = alignment.nextClearBit(usedRopRegs, startReg); while (true) { int i = 1; while (i < category && !usedRopRegs.get(reg + i)) { i++; } if (i == category) { return reg; } reg = alignment.nextClearBit(usedRopRegs, reg + i); } }
/** * Finds a range of unreserved rop registers. * * @param startReg {@code >= 0;} a rop register to start the search at * @param width {@code > 0;} the width, in registers, required. * @param alignment the alignment constraint. * @return {@code >= 0;} start of available register range. */ private int findNextUnreservedRopReg(int startReg, int width, Alignment alignment) { int reg = alignment.nextClearBit(reservedRopRegs, startReg); while (true) { int i = 1; while (i < width && !reservedRopRegs.get(reg + i)) { i++; } if (i == width) { return reg; } reg = alignment.nextClearBit(reservedRopRegs, reg + i); } }
/** * Finds a range of unreserved rop registers. * * @param startReg {@code >= 0;} a rop register to start the search at * @param width {@code > 0;} the width, in registers, required. * @param alignment the alignment constraint. * @return {@code >= 0;} start of available register range. */ private int findNextUnreservedRopReg(int startReg, int width, Alignment alignment) { int reg = alignment.nextClearBit(reservedRopRegs, startReg); while (true) { int i = 1; while (i < width && !reservedRopRegs.get(reg + i)) { i++; } if (i == width) { return reg; } reg = alignment.nextClearBit(reservedRopRegs, reg + i); } }
/** * Finds a range of unreserved rop registers. * * @param startReg {@code >= 0;} a rop register to start the search at * @param width {@code > 0;} the width, in registers, required. * @param alignment the alignment constraint. * @return {@code >= 0;} start of available register range. */ private int findNextUnreservedRopReg(int startReg, int width, Alignment alignment) { int reg = alignment.nextClearBit(reservedRopRegs, startReg); while (true) { int i = 1; while (i < width && !reservedRopRegs.get(reg + i)) { i++; } if (i == width) { return reg; } reg = alignment.nextClearBit(reservedRopRegs, reg + i); } }