33 * are saved in a callee's frame.
34 */
35 public final class RegisterSaveLayout {
36
37 /**
38 * Keys.
39 */
40 private final Register[] registers;
41
42 /**
43 * Slot indexes relative to stack pointer.
44 */
45 private final int[] slots;
46
47 /**
48 * Creates a map from registers to frame slots.
49 *
50 * @param registers the keys in the map
51 * @param slots frame slot index for each register in {@code registers}
52 */
53 public RegisterSaveLayout(Register[] registers, int[] slots) {
54 assert registers.length == slots.length;
55 this.registers = registers;
56 this.slots = slots;
57 assert registersToSlots(false).size() == registers.length : "non-unique registers";
58 assert new HashSet<>(registersToSlots(false).values()).size() == slots.length : "non-unqiue slots";
59 }
60
61 /**
62 * Gets the frame slot index for a given register.
63 *
64 * @param register register to get the frame slot index for
65 * @return frame slot index
66 */
67 public int registerToSlot(Register register) {
68 for (int i = 0; i < registers.length; i++) {
69 if (register.equals(registers[i])) {
70 return slots[i];
71 }
72 }
|
33 * are saved in a callee's frame.
34 */
35 public final class RegisterSaveLayout {
36
37 /**
38 * Keys.
39 */
40 private final Register[] registers;
41
42 /**
43 * Slot indexes relative to stack pointer.
44 */
45 private final int[] slots;
46
47 /**
48 * Creates a map from registers to frame slots.
49 *
50 * @param registers the keys in the map
51 * @param slots frame slot index for each register in {@code registers}
52 */
53 @SuppressFBWarnings(value = "EI_EXPOSE_REP2", justification = "caller transfers ownership of `registers` and `slots`")
54 public RegisterSaveLayout(Register[] registers, int[] slots) {
55 assert registers.length == slots.length;
56 this.registers = registers;
57 this.slots = slots;
58 assert registersToSlots(false).size() == registers.length : "non-unique registers";
59 assert new HashSet<>(registersToSlots(false).values()).size() == slots.length : "non-unqiue slots";
60 }
61
62 /**
63 * Gets the frame slot index for a given register.
64 *
65 * @param register register to get the frame slot index for
66 * @return frame slot index
67 */
68 public int registerToSlot(Register register) {
69 for (int i = 0; i < registers.length; i++) {
70 if (register.equals(registers[i])) {
71 return slots[i];
72 }
73 }
|