< prev index next >
src/jdk.vm.ci/share/classes/jdk.vm.ci.code/src/jdk/vm/ci/code/RegisterAttributes.java
Print this page
*** 21,30 ****
--- 21,32 ----
* 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,67 ****
* @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];
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));
if (map.length <= reg.number) {
map = Arrays.copyOf(map, reg.number + 1);
}
map[reg.number] = attr;
}
--- 53,70 ----
* @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, 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) {
! 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,99 ****
}
return map;
}
/**
! * @return Denotes a register that is available for use by a register allocator.
*/
public boolean isAllocatable() {
return allocatable;
}
/**
! * @return Denotes a register whose value preservation (if required) across a call is the
! * responsibility of the callee.
*/
public boolean isCalleeSave() {
return calleeSave;
}
/**
! * @return Denotes a register whose value preservation (if required) across a call is the
! * responsibility of the caller.
*/
public boolean isCallerSave() {
return callerSave;
}
}
--- 76,103 ----
}
return map;
}
/**
! * @return {@code true} if a register is available for use by a register allocator otherwise
! * {@code false}
*/
public boolean isAllocatable() {
return allocatable;
}
/**
! * @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 {@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 >