< prev index next >
src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/RegisterAttributes.java
Print this page
@@ -21,10 +21,12 @@
* questions.
*/
package jdk.vm.ci.code;
import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
/**
* A collection of register attributes. The specific attribute values for a register may be local to
* a compilation context. For example, a {@link RegisterConfig} in use during a compilation will
* determine which registers are callee saved.
@@ -51,17 +53,18 @@
* @param registerConfig a register configuration
* @param registers a set of registers
* @return an array whose length is the max register number in {@code registers} plus 1. An
* element at index i holds the attributes of the register whose number is i.
*/
- public static RegisterAttributes[] createMap(RegisterConfig registerConfig, Register[] registers) {
- RegisterAttributes[] map = new RegisterAttributes[registers.length];
+ public static RegisterAttributes[] createMap(RegisterConfig registerConfig, RegisterArray registers) {
+ RegisterAttributes[] map = new RegisterAttributes[registers.size()];
+ List<Register> callerSaveRegisters = registerConfig.getCallerSaveRegisters().asList();
+ List<Register> calleeSaveRegisters = registerConfig.getCalleeSaveRegisters() == null ? Collections.emptyList() : registerConfig.getCalleeSaveRegisters().asList();
+ List<Register> allocatableRegisters = registerConfig.getAllocatableRegisters().asList();
for (Register reg : registers) {
if (reg != null) {
- Register[] csr = registerConfig.getCalleeSaveRegisters();
- RegisterAttributes attr = new RegisterAttributes(Arrays.asList(registerConfig.getCallerSaveRegisters()).contains(reg), csr == null ? false : Arrays.asList(csr).contains(reg),
- Arrays.asList(registerConfig.getAllocatableRegisters()).contains(reg));
+ RegisterAttributes attr = new RegisterAttributes(callerSaveRegisters.contains(reg), calleeSaveRegisters.contains(reg), allocatableRegisters.contains(reg));
if (map.length <= reg.number) {
map = Arrays.copyOf(map, reg.number + 1);
}
map[reg.number] = attr;
}
@@ -73,27 +76,28 @@
}
return map;
}
/**
- * @return Denotes a register that is available for use by a register allocator.
+ * @return {@code true} if a register is available for use by a register allocator otherwise
+ * {@code false}
*/
public boolean isAllocatable() {
return allocatable;
}
/**
- * @return Denotes a register whose value preservation (if required) across a call is the
- * responsibility of the callee.
+ * @return {@code true} if a register whose value preservation (if required) across a call is
+ * the responsibility of the callee otherwise {@code false}
*/
public boolean isCalleeSave() {
return calleeSave;
}
/**
- * @return Denotes a register whose value preservation (if required) across a call is the
- * responsibility of the caller.
+ * @return {@code true} if a register whose value preservation (if required) across a call is
+ * the responsibility of the caller otherwise {@code false}
*/
public boolean isCallerSave() {
return callerSave;
}
}
< prev index next >